blob: 46deb655e3a0e23f8bfcb64f50ef1c5ec470b661 [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
Ian Elliott1c32c772016-04-28 14:47:13 -06001254TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1255 VkResult err;
1256 bool pass;
1257
Ian Elliott489eec02016-05-05 14:12:44 -06001258// FIXME: After we turn on this code for non-Linux platforms, uncomment the
1259// following declaration (which is temporarily being moved below):
1260// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001261 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
1262 VkSwapchainCreateInfoKHR swapchain_create_info = {};
1263 uint32_t swapchain_image_count = 0;
1264// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
1265 uint32_t image_index = 0;
1266// VkPresentInfoKHR present_info = {};
1267
1268 ASSERT_NO_FATAL_FAILURE(InitState());
1269
Ian Elliott3f06ce52016-04-29 14:46:21 -06001270#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1271#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1272 // Use the functions from the VK_KHR_android_surface extension without
1273 // enabling that extension:
1274
1275 // Create a surface:
1276 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06001277 m_errorMonitor->SetDesiredFailureMsg(
1278 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1279 "extension was not enabled for this");
1280 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
1281 &surface);
1282 pass = (err != VK_SUCCESS);
1283 ASSERT_TRUE(pass);
1284 m_errorMonitor->VerifyFound();
1285#endif // VK_USE_PLATFORM_ANDROID_KHR
1286
1287
1288#if defined(VK_USE_PLATFORM_MIR_KHR)
1289 // Use the functions from the VK_KHR_mir_surface extension without enabling
1290 // that extension:
1291
1292 // Create a surface:
1293 VkMirSurfaceCreateInfoKHR mir_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06001294 m_errorMonitor->SetDesiredFailureMsg(
1295 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1296 "extension was not enabled for this");
1297 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1298 pass = (err != VK_SUCCESS);
1299 ASSERT_TRUE(pass);
1300 m_errorMonitor->VerifyFound();
1301
1302 // Tell whether an mir_connection supports presentation:
1303 MirConnection *mir_connection = NULL;
1304 m_errorMonitor->SetDesiredFailureMsg(
1305 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1306 "extension was not enabled for this");
1307 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
1308 visual_id);
1309 m_errorMonitor->VerifyFound();
1310#endif // VK_USE_PLATFORM_MIR_KHR
1311
1312
1313#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1314 // Use the functions from the VK_KHR_wayland_surface extension without
1315 // enabling that extension:
1316
1317 // Create a surface:
1318 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06001319 m_errorMonitor->SetDesiredFailureMsg(
1320 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1321 "extension was not enabled for this");
1322 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
1323 &surface);
1324 pass = (err != VK_SUCCESS);
1325 ASSERT_TRUE(pass);
1326 m_errorMonitor->VerifyFound();
1327
1328 // Tell whether an wayland_display supports presentation:
1329 struct wl_display wayland_display = {};
1330 m_errorMonitor->SetDesiredFailureMsg(
1331 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1332 "extension was not enabled for this");
1333 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
1334 &wayland_display);
1335 m_errorMonitor->VerifyFound();
1336#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06001337#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001338
1339
1340#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06001341// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1342// TO NON-LINUX PLATFORMS:
1343VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001344 // Use the functions from the VK_KHR_win32_surface extension without
1345 // enabling that extension:
1346
1347 // Create a surface:
1348 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06001349 m_errorMonitor->SetDesiredFailureMsg(
1350 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1351 "extension was not enabled for this");
1352 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
1353 &surface);
1354 pass = (err != VK_SUCCESS);
1355 ASSERT_TRUE(pass);
1356 m_errorMonitor->VerifyFound();
1357
1358 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001359 m_errorMonitor->SetDesiredFailureMsg(
1360 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1361 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001362 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001363 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001364// Set this (for now, until all platforms are supported and tested):
1365#define NEED_TO_TEST_THIS_ON_PLATFORM
1366#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001367
1368
Ian Elliott1c32c772016-04-28 14:47:13 -06001369#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06001370// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1371// TO NON-LINUX PLATFORMS:
1372VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001373 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1374 // that extension:
1375
1376 // Create a surface:
1377 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001378 m_errorMonitor->SetDesiredFailureMsg(
1379 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1380 "extension was not enabled for this");
1381 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1382 pass = (err != VK_SUCCESS);
1383 ASSERT_TRUE(pass);
1384 m_errorMonitor->VerifyFound();
1385
1386 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001387 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001388 xcb_visualid_t visual_id = 0;
1389 m_errorMonitor->SetDesiredFailureMsg(
1390 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1391 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001392 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -06001393 visual_id);
1394 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001395// Set this (for now, until all platforms are supported and tested):
1396#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001397#endif // VK_USE_PLATFORM_XCB_KHR
1398
1399
Ian Elliott12630812016-04-29 14:35:43 -06001400#if defined(VK_USE_PLATFORM_XLIB_KHR)
1401 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1402 // that extension:
1403
1404 // Create a surface:
1405 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
Ian Elliott12630812016-04-29 14:35:43 -06001406 m_errorMonitor->SetDesiredFailureMsg(
1407 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1408 "extension was not enabled for this");
1409 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1410 pass = (err != VK_SUCCESS);
1411 ASSERT_TRUE(pass);
1412 m_errorMonitor->VerifyFound();
1413
1414 // Tell whether an Xlib VisualID supports presentation:
1415 Display *dpy = NULL;
1416 VisualID visual = 0;
1417 m_errorMonitor->SetDesiredFailureMsg(
1418 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1419 "extension was not enabled for this");
1420 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1421 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001422// Set this (for now, until all platforms are supported and tested):
1423#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06001424#endif // VK_USE_PLATFORM_XLIB_KHR
1425
1426
Ian Elliott1c32c772016-04-28 14:47:13 -06001427 // Use the functions from the VK_KHR_surface extension without enabling
1428 // that extension:
1429
Ian Elliott489eec02016-05-05 14:12:44 -06001430#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001431 // Destroy a surface:
1432 m_errorMonitor->SetDesiredFailureMsg(
1433 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1434 "extension was not enabled for this");
1435 vkDestroySurfaceKHR(instance(), surface, NULL);
1436 m_errorMonitor->VerifyFound();
1437
1438 // Check if surface supports presentation:
1439 VkBool32 supported = false;
1440 m_errorMonitor->SetDesiredFailureMsg(
1441 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1442 "extension was not enabled for this");
1443 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1444 pass = (err != VK_SUCCESS);
1445 ASSERT_TRUE(pass);
1446 m_errorMonitor->VerifyFound();
1447
1448 // Check surface capabilities:
1449 VkSurfaceCapabilitiesKHR capabilities = {};
1450 m_errorMonitor->SetDesiredFailureMsg(
1451 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1452 "extension was not enabled for this");
1453 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
1454 &capabilities);
1455 pass = (err != VK_SUCCESS);
1456 ASSERT_TRUE(pass);
1457 m_errorMonitor->VerifyFound();
1458
1459 // Check surface formats:
1460 uint32_t format_count = 0;
1461 VkSurfaceFormatKHR *formats = NULL;
1462 m_errorMonitor->SetDesiredFailureMsg(
1463 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1464 "extension was not enabled for this");
1465 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1466 &format_count, formats);
1467 pass = (err != VK_SUCCESS);
1468 ASSERT_TRUE(pass);
1469 m_errorMonitor->VerifyFound();
1470
1471 // Check surface present modes:
1472 uint32_t present_mode_count = 0;
1473 VkSurfaceFormatKHR *present_modes = NULL;
1474 m_errorMonitor->SetDesiredFailureMsg(
1475 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1476 "extension was not enabled for this");
1477 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1478 &present_mode_count, present_modes);
1479 pass = (err != VK_SUCCESS);
1480 ASSERT_TRUE(pass);
1481 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001482#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001483
1484
1485 // Use the functions from the VK_KHR_swapchain extension without enabling
1486 // that extension:
1487
1488 // Create a swapchain:
1489 m_errorMonitor->SetDesiredFailureMsg(
1490 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1491 "extension was not enabled for this");
1492 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1493 swapchain_create_info.pNext = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001494 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1495 NULL, &swapchain);
1496 pass = (err != VK_SUCCESS);
1497 ASSERT_TRUE(pass);
1498 m_errorMonitor->VerifyFound();
1499
1500 // Get the images from the swapchain:
1501 m_errorMonitor->SetDesiredFailureMsg(
1502 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1503 "extension was not enabled for this");
1504 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
1505 &swapchain_image_count, NULL);
1506 pass = (err != VK_SUCCESS);
1507 ASSERT_TRUE(pass);
1508 m_errorMonitor->VerifyFound();
1509
1510 // Try to acquire an image:
1511 m_errorMonitor->SetDesiredFailureMsg(
1512 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1513 "extension was not enabled for this");
1514 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
1515 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
1516 pass = (err != VK_SUCCESS);
1517 ASSERT_TRUE(pass);
1518 m_errorMonitor->VerifyFound();
1519
1520 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001521 //
1522 // NOTE: Currently can't test this because a real swapchain is needed (as
1523 // opposed to the fake one we created) in order for the layer to lookup the
1524 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001525
1526 // Destroy the swapchain:
1527 m_errorMonitor->SetDesiredFailureMsg(
1528 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1529 "extension was not enabled for this");
1530 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1531 m_errorMonitor->VerifyFound();
1532}
1533
Ian Elliott2c1daf52016-05-12 09:41:46 -06001534TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
1535 VkResult err;
1536 bool pass;
1537
1538 VkSurfaceKHR surface = VK_NULL_HANDLE;
1539#if defined(VK_USE_PLATFORM_XCB_KHR)
1540 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
1541 VkSwapchainCreateInfoKHR swapchain_create_info = {};
1542// uint32_t swapchain_image_count = 0;
1543// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
1544// uint32_t image_index = 0;
1545// VkPresentInfoKHR present_info = {};
1546
1547 ASSERT_NO_FATAL_FAILURE(InitState());
1548
1549 // Use the create function from one of the VK_KHR_*_surface extension in
1550 // order to create a surface, testing all known errors in the process,
1551 // before successfully creating a surface:
1552 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
1553 m_errorMonitor->SetDesiredFailureMsg(
1554 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1555 "called with NULL pointer");
1556 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
1557 pass = (err != VK_SUCCESS);
1558 ASSERT_TRUE(pass);
1559 m_errorMonitor->VerifyFound();
1560
1561 // Next, try to create a surface with the wrong
1562 // VkXcbSurfaceCreateInfoKHR::sType:
1563 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
1564 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
1565 m_errorMonitor->SetDesiredFailureMsg(
1566 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1567 "called with the wrong value for");
1568 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1569 pass = (err != VK_SUCCESS);
1570 ASSERT_TRUE(pass);
1571 m_errorMonitor->VerifyFound();
1572
1573
1574 // Create a native window, and then correctly create a surface:
1575 xcb_connection_t *connection;
1576 xcb_screen_t *screen;
1577 xcb_window_t xcb_window;
1578 xcb_intern_atom_reply_t *atom_wm_delete_window;
1579
1580 const xcb_setup_t *setup;
1581 xcb_screen_iterator_t iter;
1582 int scr;
1583 uint32_t value_mask, value_list[32];
1584 int width = 1;
1585 int height = 1;
1586
1587 connection = xcb_connect(NULL, &scr);
1588 ASSERT_TRUE(connection != NULL);
1589 setup = xcb_get_setup(connection);
1590 iter = xcb_setup_roots_iterator(setup);
1591 while (scr-- > 0)
1592 xcb_screen_next(&iter);
1593 screen = iter.data;
1594
1595 xcb_window = xcb_generate_id(connection);
1596
1597 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
1598 value_list[0] = screen->black_pixel;
1599 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE |
1600 XCB_EVENT_MASK_STRUCTURE_NOTIFY;
1601
1602 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window,
1603 screen->root, 0, 0, width, height, 0,
1604 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual,
1605 value_mask, value_list);
1606
1607 /* Magic code that will send notification when window is destroyed */
1608 xcb_intern_atom_cookie_t cookie =
1609 xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
1610 xcb_intern_atom_reply_t *reply =
1611 xcb_intern_atom_reply(connection, cookie, 0);
1612
1613 xcb_intern_atom_cookie_t cookie2 =
1614 xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
1615 atom_wm_delete_window =
1616 xcb_intern_atom_reply(connection, cookie2, 0);
1617 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window,
1618 (*reply).atom, 4, 32, 1,
1619 &(*atom_wm_delete_window).atom);
1620 free(reply);
1621
1622 xcb_map_window(connection, xcb_window);
1623
1624 // Force the x/y coordinates to 100,100 results are identical in consecutive
1625 // runs
1626 const uint32_t coords[] = {100, 100};
1627 xcb_configure_window(connection, xcb_window,
1628 XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
1629
1630
1631
1632 // Finally, try to correctly create a surface:
1633 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
1634 xcb_create_info.pNext = NULL;
1635 xcb_create_info.flags = 0;
1636 xcb_create_info.connection = connection;
1637 xcb_create_info.window = xcb_window;
1638 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1639 pass = (err == VK_SUCCESS);
1640 ASSERT_TRUE(pass);
1641
1642
1643
1644 // Check if surface supports presentation:
1645
1646 // 1st, do so without having queried the queue families:
1647 VkBool32 supported = false;
1648 // TODO: Get the following error to come out:
1649 m_errorMonitor->SetDesiredFailureMsg(
1650 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1651 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
1652 "function");
1653 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1654 pass = (err != VK_SUCCESS);
1655// ASSERT_TRUE(pass);
1656// m_errorMonitor->VerifyFound();
1657
1658 // Next, query a queue family index that's too large:
1659 m_errorMonitor->SetDesiredFailureMsg(
1660 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1661 "called with a queueFamilyIndex that is too large");
1662 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
1663 pass = (err != VK_SUCCESS);
1664 ASSERT_TRUE(pass);
1665 m_errorMonitor->VerifyFound();
1666
1667 // Finally, do so correctly:
1668// FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S SUPPORTED
1669 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1670 pass = (err == VK_SUCCESS);
1671 ASSERT_TRUE(pass);
1672
1673
1674
1675 // Before proceeding, try to create a swapchain without having called
1676 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
1677 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1678 swapchain_create_info.pNext = NULL;
1679 swapchain_create_info.flags = 0;
1680 m_errorMonitor->SetDesiredFailureMsg(
1681 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1682 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
1683 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1684 NULL, &swapchain);
1685 pass = (err != VK_SUCCESS);
1686 ASSERT_TRUE(pass);
1687 m_errorMonitor->VerifyFound();
1688
1689
1690
1691 // Get the surface capabilities:
1692 VkSurfaceCapabilitiesKHR surface_capabilities;
1693
1694 // Do so correctly (only error logged by this entrypoint is if the
1695 // extension isn't enabled):
1696 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
1697 &surface_capabilities);
1698 pass = (err == VK_SUCCESS);
1699 ASSERT_TRUE(pass);
1700
1701
1702
1703 // Get the surface formats:
1704 uint32_t surface_format_count;
1705
1706 // First, try without a pointer to surface_format_count:
1707 m_errorMonitor->SetDesiredFailureMsg(
1708 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1709 "called with NULL pointer");
1710 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
1711 pass = (err == VK_SUCCESS);
1712 ASSERT_TRUE(pass);
1713 m_errorMonitor->VerifyFound();
1714
1715 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
1716 // correctly done a 1st try (to get the count):
1717 m_errorMonitor->SetDesiredFailureMsg(
1718 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1719 "but no prior positive value has been seen for");
1720 surface_format_count = 0;
1721 vkGetPhysicalDeviceSurfaceFormatsKHR(
1722 gpu(),
1723 surface,
1724 &surface_format_count,
1725 (VkSurfaceFormatKHR *) &surface_format_count);
1726 pass = (err == VK_SUCCESS);
1727 ASSERT_TRUE(pass);
1728 m_errorMonitor->VerifyFound();
1729
1730 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
1731 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1732 &surface_format_count, NULL);
1733 pass = (err == VK_SUCCESS);
1734 ASSERT_TRUE(pass);
1735
1736 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
1737 VkSurfaceFormatKHR *surface_formats =
1738 (VkSurfaceFormatKHR *)malloc(surface_format_count *
1739 sizeof(VkSurfaceFormatKHR));
1740
1741 // Next, do a 2nd try with surface_format_count being set too high:
1742 surface_format_count += 5;
1743 m_errorMonitor->SetDesiredFailureMsg(
1744 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1745 "that is greater than the value");
1746 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1747 &surface_format_count,
1748 surface_formats);
1749 pass = (err == VK_SUCCESS);
1750 ASSERT_TRUE(pass);
1751 m_errorMonitor->VerifyFound();
1752
1753 // Finally, do a correct 1st and 2nd try:
1754 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1755 &surface_format_count, NULL);
1756 pass = (err == VK_SUCCESS);
1757 ASSERT_TRUE(pass);
1758 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1759 &surface_format_count,
1760 surface_formats);
1761 pass = (err == VK_SUCCESS);
1762 ASSERT_TRUE(pass);
1763
1764
1765
1766 // Get the surface present modes:
1767 uint32_t surface_present_mode_count;
1768
1769 // First, try without a pointer to surface_format_count:
1770 m_errorMonitor->SetDesiredFailureMsg(
1771 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1772 "called with NULL pointer");
1773 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
1774 pass = (err == VK_SUCCESS);
1775 ASSERT_TRUE(pass);
1776 m_errorMonitor->VerifyFound();
1777
1778 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
1779 // correctly done a 1st try (to get the count):
1780 m_errorMonitor->SetDesiredFailureMsg(
1781 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1782 "but no prior positive value has been seen for");
1783 surface_present_mode_count = 0;
1784 vkGetPhysicalDeviceSurfacePresentModesKHR(
1785 gpu(),
1786 surface,
1787 &surface_present_mode_count,
1788 (VkPresentModeKHR *) &surface_present_mode_count);
1789 pass = (err == VK_SUCCESS);
1790 ASSERT_TRUE(pass);
1791 m_errorMonitor->VerifyFound();
1792
1793 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
1794 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface,
1795 &surface_present_mode_count,
1796 NULL);
1797 pass = (err == VK_SUCCESS);
1798 ASSERT_TRUE(pass);
1799
1800 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
1801 VkPresentModeKHR *surface_present_modes =
1802 (VkPresentModeKHR *)malloc(surface_present_mode_count *
1803 sizeof(VkPresentModeKHR));
1804
1805 // Next, do a 2nd try with surface_format_count being set too high:
1806 surface_present_mode_count += 5;
1807 m_errorMonitor->SetDesiredFailureMsg(
1808 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1809 "that is greater than the value");
1810 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface,
1811 &surface_present_mode_count,
1812 surface_present_modes);
1813 pass = (err == VK_SUCCESS);
1814 ASSERT_TRUE(pass);
1815 m_errorMonitor->VerifyFound();
1816
1817 // Finally, do a correct 1st and 2nd try:
1818 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface,
1819 &surface_present_mode_count,
1820 NULL);
1821 pass = (err == VK_SUCCESS);
1822 ASSERT_TRUE(pass);
1823 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface,
1824 &surface_present_mode_count,
1825 surface_present_modes);
1826 pass = (err == VK_SUCCESS);
1827 ASSERT_TRUE(pass);
1828
1829
1830
1831 // Create a swapchain:
1832
1833 // First, try without a pointer to swapchain_create_info:
1834 m_errorMonitor->SetDesiredFailureMsg(
1835 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1836 "called with NULL pointer");
1837 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
1838 pass = (err != VK_SUCCESS);
1839 ASSERT_TRUE(pass);
1840 m_errorMonitor->VerifyFound();
1841
1842 // Next, call with a non-NULL swapchain_create_info, that has the wrong
1843 // sType:
1844 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
1845 m_errorMonitor->SetDesiredFailureMsg(
1846 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1847 "called with the wrong value for");
1848 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1849 NULL, &swapchain);
1850 pass = (err != VK_SUCCESS);
1851 ASSERT_TRUE(pass);
1852 m_errorMonitor->VerifyFound();
1853
1854 // Next, call with a NULL swapchain pointer:
1855 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1856 swapchain_create_info.pNext = NULL;
1857 swapchain_create_info.flags = 0;
1858 m_errorMonitor->SetDesiredFailureMsg(
1859 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1860 "called with NULL pointer");
1861 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1862 NULL, NULL);
1863 pass = (err != VK_SUCCESS);
1864 ASSERT_TRUE(pass);
1865 m_errorMonitor->VerifyFound();
1866
1867// TODO: Enhance swapchain layer so that
1868// swapchain_create_info.queueFamilyIndexCount is checked against something?
1869
1870 // Next, call with a queue family index that's too large:
1871 uint32_t queueFamilyIndex[2] = {100000, 0};
1872 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
1873 swapchain_create_info.queueFamilyIndexCount = 2;
1874 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
1875 m_errorMonitor->SetDesiredFailureMsg(
1876 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1877 "called with a queueFamilyIndex that is too large");
1878 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1879 NULL, &swapchain);
1880 pass = (err != VK_SUCCESS);
1881 ASSERT_TRUE(pass);
1882 m_errorMonitor->VerifyFound();
1883
1884 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
1885 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
1886 swapchain_create_info.queueFamilyIndexCount = 1;
1887 m_errorMonitor->SetDesiredFailureMsg(
1888 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1889 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
1890 "pCreateInfo->pQueueFamilyIndices).");
1891 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1892 NULL, &swapchain);
1893 pass = (err != VK_SUCCESS);
1894 ASSERT_TRUE(pass);
1895 m_errorMonitor->VerifyFound();
1896
1897 // Next, call with an invalid imageSharingMode:
1898 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
1899 swapchain_create_info.queueFamilyIndexCount = 1;
1900 m_errorMonitor->SetDesiredFailureMsg(
1901 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1902 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
1903 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1904 NULL, &swapchain);
1905 pass = (err != VK_SUCCESS);
1906 ASSERT_TRUE(pass);
1907 m_errorMonitor->VerifyFound();
1908 // Fix for the future:
1909// FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S SUPPORTED
1910 swapchain_create_info.queueFamilyIndexCount = 0;
1911 queueFamilyIndex[0] = 0;
1912 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
1913
1914// TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
1915
1916
1917
1918 // Get the images from a swapchain:
1919
1920
1921
1922 // Acquire an image from a swapchain:
1923
1924
1925
1926 // Present an image to a swapchain:
1927
1928
1929
1930 // Destroy the swapchain:
1931
1932
1933
1934// TODOs:
1935//
1936// - Try destroying the device without first destroying the swapchain
1937//
1938// - Try destroying the device without first destroying the surface
1939//
1940// - Try destroying the surface without first destroying the swapchain
1941
1942
1943 // Destroy the surface:
1944 vkDestroySurfaceKHR(instance(), surface, NULL);
1945
1946
1947 // Tear down the window:
1948 xcb_destroy_window(connection, xcb_window);
1949 xcb_disconnect(connection);
1950
1951#else // VK_USE_PLATFORM_XCB_KHR
1952 err = (surface == VK_NULL_HANDLE) ? VK_SUCCESS : VK_SUCCESS;
1953 pass = (err != VK_SUCCESS);
1954 ASSERT_TRUE(pass);
1955#endif // VK_USE_PLATFORM_XCB_KHR
1956}
1957
Karl Schultz6addd812016-02-02 17:17:23 -07001958TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1959 VkResult err;
1960 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001961
Karl Schultz6addd812016-02-02 17:17:23 -07001962 m_errorMonitor->SetDesiredFailureMsg(
1963 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001964 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
1965
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001966 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001967
1968 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001969 VkImage image;
1970 VkDeviceMemory mem;
1971 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001972
Karl Schultz6addd812016-02-02 17:17:23 -07001973 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1974 const int32_t tex_width = 32;
1975 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001976
Tony Barboureb254902015-07-15 12:50:33 -06001977 VkImageCreateInfo image_create_info = {};
1978 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001979 image_create_info.pNext = NULL;
1980 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1981 image_create_info.format = tex_format;
1982 image_create_info.extent.width = tex_width;
1983 image_create_info.extent.height = tex_height;
1984 image_create_info.extent.depth = 1;
1985 image_create_info.mipLevels = 1;
1986 image_create_info.arrayLayers = 1;
1987 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1988 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1989 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1990 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001991
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001992 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001993 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001994 mem_alloc.pNext = NULL;
1995 mem_alloc.allocationSize = 0;
1996 // Introduce failure, do NOT set memProps to
1997 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
1998 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001999
Chia-I Wuf7458c52015-10-26 21:10:41 +08002000 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002001 ASSERT_VK_SUCCESS(err);
2002
Karl Schultz6addd812016-02-02 17:17:23 -07002003 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002004
Mark Lobodzinski23065352015-05-29 09:32:35 -05002005 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002006
Karl Schultz6addd812016-02-02 17:17:23 -07002007 pass =
2008 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
2009 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2010 if (!pass) { // If we can't find any unmappable memory this test doesn't
2011 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002012 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002013 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002014 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002015
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002016 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002017 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002018 ASSERT_VK_SUCCESS(err);
2019
2020 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002021 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002022 ASSERT_VK_SUCCESS(err);
2023
2024 // Map memory as if to initialize the image
2025 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07002026 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
2027 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002028
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002029 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002030
Chia-I Wuf7458c52015-10-26 21:10:41 +08002031 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002032}
2033
Karl Schultz6addd812016-02-02 17:17:23 -07002034TEST_F(VkLayerTest, RebindMemory) {
2035 VkResult err;
2036 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002037
Karl Schultz6addd812016-02-02 17:17:23 -07002038 m_errorMonitor->SetDesiredFailureMsg(
2039 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002040 "which has already been bound to mem object");
2041
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002042 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002043
2044 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002045 VkImage image;
2046 VkDeviceMemory mem1;
2047 VkDeviceMemory mem2;
2048 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002049
Karl Schultz6addd812016-02-02 17:17:23 -07002050 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2051 const int32_t tex_width = 32;
2052 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002053
Tony Barboureb254902015-07-15 12:50:33 -06002054 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002055 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2056 image_create_info.pNext = NULL;
2057 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2058 image_create_info.format = tex_format;
2059 image_create_info.extent.width = tex_width;
2060 image_create_info.extent.height = tex_height;
2061 image_create_info.extent.depth = 1;
2062 image_create_info.mipLevels = 1;
2063 image_create_info.arrayLayers = 1;
2064 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2065 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2066 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2067 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002068
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002069 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002070 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2071 mem_alloc.pNext = NULL;
2072 mem_alloc.allocationSize = 0;
2073 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002074
Karl Schultz6addd812016-02-02 17:17:23 -07002075 // Introduce failure, do NOT set memProps to
2076 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002077 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002078 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002079 ASSERT_VK_SUCCESS(err);
2080
Karl Schultz6addd812016-02-02 17:17:23 -07002081 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002082
2083 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002084 pass =
2085 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002086 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002087
2088 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002089 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002090 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002091 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002092 ASSERT_VK_SUCCESS(err);
2093
2094 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002095 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002096 ASSERT_VK_SUCCESS(err);
2097
Karl Schultz6addd812016-02-02 17:17:23 -07002098 // Introduce validation failure, try to bind a different memory object to
2099 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002100 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002101
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002102 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002103
Chia-I Wuf7458c52015-10-26 21:10:41 +08002104 vkDestroyImage(m_device->device(), image, NULL);
2105 vkFreeMemory(m_device->device(), mem1, NULL);
2106 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002107}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002108
Karl Schultz6addd812016-02-02 17:17:23 -07002109TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002110 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002111
Karl Schultz6addd812016-02-02 17:17:23 -07002112 m_errorMonitor->SetDesiredFailureMsg(
2113 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
2114 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002115
2116 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002117 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2118 fenceInfo.pNext = NULL;
2119 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002120
Tony Barbour300a6082015-04-07 13:44:53 -06002121 ASSERT_NO_FATAL_FAILURE(InitState());
2122 ASSERT_NO_FATAL_FAILURE(InitViewport());
2123 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2124
Tony Barbourfe3351b2015-07-28 10:17:20 -06002125 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002126 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2127 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06002128 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002129
2130 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002131
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002132 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002133 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2134 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002135 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002136 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002137 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002138 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002139 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002140 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002141 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002142
2143 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002144 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002145
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002146 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002147}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002148// This is a positive test. We used to expect error in this case but spec now
2149// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07002150TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002151 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002152 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002153 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002154 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2155 fenceInfo.pNext = NULL;
2156
Tony Barbour0b4d9562015-04-09 10:48:04 -06002157 ASSERT_NO_FATAL_FAILURE(InitState());
2158 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08002159 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002160 VkResult result = vkResetFences(m_device->device(), 1, fences);
2161 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06002162
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002163 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06002164}
Tobin Ehlis41376e12015-07-03 08:45:14 -06002165
2166TEST_F(VkLayerTest, InvalidUsageBits)
2167{
Tony Barbourf92621a2016-05-02 14:28:12 -06002168 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002169 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06002170 "Initialize buffer with wrong usage then perform copy expecting errors "
2171 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002173 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002174
2175 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06002176 VkImageObj image(m_device);
2177 // Initialize image with USAGE_INPUT_ATTACHMENT
2178 image.init(128, 128, VK_FORMAT_D32_SFLOAT_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002179 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2180 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002181
Tony Barbourf92621a2016-05-02 14:28:12 -06002182 VkImageView dsv;
2183 VkImageViewCreateInfo dsvci = {};
2184 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2185 dsvci.image = image.handle();
2186 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
2187 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
2188 dsvci.subresourceRange.layerCount = 1;
2189 dsvci.subresourceRange.baseMipLevel = 0;
2190 dsvci.subresourceRange.levelCount = 1;
2191 dsvci.subresourceRange.aspectMask =
2192 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002193
Tony Barbourf92621a2016-05-02 14:28:12 -06002194 // Create a view with depth / stencil aspect for image with different usage
2195 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002196
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002197 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002198
2199 // Initialize buffer with TRANSFER_DST usage
2200 vk_testing::Buffer buffer;
2201 VkMemoryPropertyFlags reqs = 0;
2202 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2203 VkBufferImageCopy region = {};
2204 region.bufferRowLength = 128;
2205 region.bufferImageHeight = 128;
2206 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2207 region.imageSubresource.layerCount = 1;
2208 region.imageExtent.height = 16;
2209 region.imageExtent.width = 16;
2210 region.imageExtent.depth = 1;
2211
2212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2213 "Invalid usage flag for buffer ");
2214 // Buffer usage not set to TRANSFER_SRC and image usage not set to
2215 // TRANSFER_DST
2216 BeginCommandBuffer();
2217 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
2218 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
2219 1, &region);
2220 m_errorMonitor->VerifyFound();
2221
2222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2223 "Invalid usage flag for image ");
2224 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
2225 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
2226 1, &region);
2227 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002228}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002229#endif // MEM_TRACKER_TESTS
2230
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06002231#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002232
2233TEST_F(VkLayerTest, LeakAnObject) {
2234 VkResult err;
2235
2236 TEST_DESCRIPTION(
2237 "Create a fence and destroy its device without first destroying the fence.");
2238
2239 // Note that we have to create a new device since destroying the
2240 // framework's device causes Teardown() to fail and just calling Teardown
2241 // will destroy the errorMonitor.
2242
2243 m_errorMonitor->SetDesiredFailureMsg(
2244 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2245 "OBJ ERROR : VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT object");
2246
2247 ASSERT_NO_FATAL_FAILURE(InitState());
2248
2249 const std::vector<VkQueueFamilyProperties> queue_props =
2250 m_device->queue_props;
2251 std::vector<VkDeviceQueueCreateInfo> queue_info;
2252 queue_info.reserve(queue_props.size());
2253 std::vector<std::vector<float>> queue_priorities;
2254 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2255 VkDeviceQueueCreateInfo qi = {};
2256 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2257 qi.pNext = NULL;
2258 qi.queueFamilyIndex = i;
2259 qi.queueCount = queue_props[i].queueCount;
2260 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2261 qi.pQueuePriorities = queue_priorities[i].data();
2262 queue_info.push_back(qi);
2263 }
2264
2265 std::vector<const char *> device_layer_names;
2266 std::vector<const char *> device_extension_names;
2267 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
2268 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
2269 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
2270 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
2271 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
2272 device_layer_names.push_back("VK_LAYER_LUNARG_image");
2273 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
2274
2275 // The sacrificial device object
2276 VkDevice testDevice;
2277 VkDeviceCreateInfo device_create_info = {};
2278 auto features = m_device->phy().features();
2279 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2280 device_create_info.pNext = NULL;
2281 device_create_info.queueCreateInfoCount = queue_info.size();
2282 device_create_info.pQueueCreateInfos = queue_info.data();
2283 device_create_info.enabledLayerCount = device_layer_names.size();
2284 device_create_info.ppEnabledLayerNames = device_layer_names.data();
2285 device_create_info.pEnabledFeatures = &features;
2286 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2287 ASSERT_VK_SUCCESS(err);
2288
2289 VkFence fence;
2290 VkFenceCreateInfo fence_create_info = {};
2291 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2292 fence_create_info.pNext = NULL;
2293 fence_create_info.flags = 0;
2294 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2295 ASSERT_VK_SUCCESS(err);
2296
2297 // Induce failure by not calling vkDestroyFence
2298 vkDestroyDevice(testDevice, NULL);
2299 m_errorMonitor->VerifyFound();
2300}
2301
2302TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
2303
2304 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
2305 "attempt to delete them from another.");
2306
2307 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2308 "FreeCommandBuffers is attempting to free Command Buffer");
2309
2310 VkCommandPool command_pool_one;
2311 VkCommandPool command_pool_two;
2312
2313 VkCommandPoolCreateInfo pool_create_info{};
2314 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2315 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2316 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2317
2318 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2319 &command_pool_one);
2320
2321 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2322 &command_pool_two);
2323
2324 VkCommandBuffer command_buffer[9];
2325 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2326 command_buffer_allocate_info.sType =
2327 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2328 command_buffer_allocate_info.commandPool = command_pool_one;
2329 command_buffer_allocate_info.commandBufferCount = 9;
2330 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2331 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2332 command_buffer);
2333
2334 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
2335 &command_buffer[3]);
2336
2337 m_errorMonitor->VerifyFound();
2338
2339 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2340 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2341}
2342
2343TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2344 VkResult err;
2345
2346 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
2347 "attempt to delete them from another.");
2348
2349 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2350 "FreeDescriptorSets is attempting to free descriptorSet");
2351
2352 ASSERT_NO_FATAL_FAILURE(InitState());
2353 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2354
2355 VkDescriptorPoolSize ds_type_count = {};
2356 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2357 ds_type_count.descriptorCount = 1;
2358
2359 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2360 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2361 ds_pool_ci.pNext = NULL;
2362 ds_pool_ci.flags = 0;
2363 ds_pool_ci.maxSets = 1;
2364 ds_pool_ci.poolSizeCount = 1;
2365 ds_pool_ci.pPoolSizes = &ds_type_count;
2366
2367 VkDescriptorPool ds_pool_one;
2368 err =
2369 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
2370 ASSERT_VK_SUCCESS(err);
2371
2372 // Create a second descriptor pool
2373 VkDescriptorPool ds_pool_two;
2374 err =
2375 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
2376 ASSERT_VK_SUCCESS(err);
2377
2378 VkDescriptorSetLayoutBinding dsl_binding = {};
2379 dsl_binding.binding = 0;
2380 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2381 dsl_binding.descriptorCount = 1;
2382 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2383 dsl_binding.pImmutableSamplers = NULL;
2384
2385 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2386 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2387 ds_layout_ci.pNext = NULL;
2388 ds_layout_ci.bindingCount = 1;
2389 ds_layout_ci.pBindings = &dsl_binding;
2390
2391 VkDescriptorSetLayout ds_layout;
2392 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2393 &ds_layout);
2394 ASSERT_VK_SUCCESS(err);
2395
2396 VkDescriptorSet descriptorSet;
2397 VkDescriptorSetAllocateInfo alloc_info = {};
2398 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2399 alloc_info.descriptorSetCount = 1;
2400 alloc_info.descriptorPool = ds_pool_one;
2401 alloc_info.pSetLayouts = &ds_layout;
2402 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2403 &descriptorSet);
2404 ASSERT_VK_SUCCESS(err);
2405
2406 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2407
2408 m_errorMonitor->VerifyFound();
2409
2410 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2411 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2412 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2413}
2414
2415TEST_F(VkLayerTest, CreateUnknownObject) {
2416 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2417 "Invalid VkImage Object ");
2418
2419 TEST_DESCRIPTION(
2420 "Pass an invalid image object handle into a Vulkan API call.");
2421
2422 ASSERT_NO_FATAL_FAILURE(InitState());
2423
2424 // Pass bogus handle into GetImageMemoryRequirements
2425 VkMemoryRequirements mem_reqs;
2426 uint64_t fakeImageHandle = 0xCADECADE;
2427 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2428
2429 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2430
2431 m_errorMonitor->VerifyFound();
2432}
2433
Karl Schultz6addd812016-02-02 17:17:23 -07002434TEST_F(VkLayerTest, PipelineNotBound) {
2435 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002436
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002437 TEST_DESCRIPTION(
2438 "Pass in an invalid pipeline object handle into a Vulkan API call.");
2439
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002441 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002442
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002443 ASSERT_NO_FATAL_FAILURE(InitState());
2444 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002445
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002446 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002447 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2448 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002449
2450 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002451 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2452 ds_pool_ci.pNext = NULL;
2453 ds_pool_ci.maxSets = 1;
2454 ds_pool_ci.poolSizeCount = 1;
2455 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002456
2457 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002458 err =
2459 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002460 ASSERT_VK_SUCCESS(err);
2461
2462 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002463 dsl_binding.binding = 0;
2464 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2465 dsl_binding.descriptorCount = 1;
2466 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2467 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002468
2469 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002470 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2471 ds_layout_ci.pNext = NULL;
2472 ds_layout_ci.bindingCount = 1;
2473 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002474
2475 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002476 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2477 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002478 ASSERT_VK_SUCCESS(err);
2479
2480 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002481 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002482 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002483 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002484 alloc_info.descriptorPool = ds_pool;
2485 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002486 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2487 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002488 ASSERT_VK_SUCCESS(err);
2489
2490 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002491 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2492 pipeline_layout_ci.pNext = NULL;
2493 pipeline_layout_ci.setLayoutCount = 1;
2494 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002495
2496 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002497 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2498 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002499 ASSERT_VK_SUCCESS(err);
2500
Mark Youngad779052016-01-06 14:26:04 -07002501 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002502
2503 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002504 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2505 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002506
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002507 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002508
Chia-I Wuf7458c52015-10-26 21:10:41 +08002509 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2510 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2511 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002512}
2513
Karl Schultz6addd812016-02-02 17:17:23 -07002514TEST_F(VkLayerTest, BindInvalidMemory) {
2515 VkResult err;
2516 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002517
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002518 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002519 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002520
Tobin Ehlisec598302015-09-15 15:02:17 -06002521 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002522
2523 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002524 VkImage image;
2525 VkDeviceMemory mem;
2526 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002527
Karl Schultz6addd812016-02-02 17:17:23 -07002528 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2529 const int32_t tex_width = 32;
2530 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002531
2532 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002533 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2534 image_create_info.pNext = NULL;
2535 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2536 image_create_info.format = tex_format;
2537 image_create_info.extent.width = tex_width;
2538 image_create_info.extent.height = tex_height;
2539 image_create_info.extent.depth = 1;
2540 image_create_info.mipLevels = 1;
2541 image_create_info.arrayLayers = 1;
2542 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2543 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2544 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2545 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002546
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002547 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002548 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2549 mem_alloc.pNext = NULL;
2550 mem_alloc.allocationSize = 0;
2551 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002552
Chia-I Wuf7458c52015-10-26 21:10:41 +08002553 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002554 ASSERT_VK_SUCCESS(err);
2555
Karl Schultz6addd812016-02-02 17:17:23 -07002556 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002557
2558 mem_alloc.allocationSize = mem_reqs.size;
2559
Karl Schultz6addd812016-02-02 17:17:23 -07002560 pass =
2561 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002562 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002563
2564 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002565 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002566 ASSERT_VK_SUCCESS(err);
2567
2568 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002569 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002570
2571 // Try to bind free memory that has been freed
2572 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2573 // This may very well return an error.
2574 (void)err;
2575
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002576 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002577
Chia-I Wuf7458c52015-10-26 21:10:41 +08002578 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002579}
2580
Karl Schultz6addd812016-02-02 17:17:23 -07002581TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2582 VkResult err;
2583 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002584
Karl Schultz6addd812016-02-02 17:17:23 -07002585 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2586 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002587
Tobin Ehlisec598302015-09-15 15:02:17 -06002588 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002589
Karl Schultz6addd812016-02-02 17:17:23 -07002590 // Create an image object, allocate memory, destroy the object and then try
2591 // to bind it
2592 VkImage image;
2593 VkDeviceMemory mem;
2594 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002595
Karl Schultz6addd812016-02-02 17:17:23 -07002596 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2597 const int32_t tex_width = 32;
2598 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002599
2600 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002601 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2602 image_create_info.pNext = NULL;
2603 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2604 image_create_info.format = tex_format;
2605 image_create_info.extent.width = tex_width;
2606 image_create_info.extent.height = tex_height;
2607 image_create_info.extent.depth = 1;
2608 image_create_info.mipLevels = 1;
2609 image_create_info.arrayLayers = 1;
2610 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2611 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2612 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2613 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002614
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002615 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002616 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2617 mem_alloc.pNext = NULL;
2618 mem_alloc.allocationSize = 0;
2619 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002620
Chia-I Wuf7458c52015-10-26 21:10:41 +08002621 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002622 ASSERT_VK_SUCCESS(err);
2623
Karl Schultz6addd812016-02-02 17:17:23 -07002624 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002625
2626 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002627 pass =
2628 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002629 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002630
2631 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002632 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002633 ASSERT_VK_SUCCESS(err);
2634
2635 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002636 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002637 ASSERT_VK_SUCCESS(err);
2638
2639 // Now Try to bind memory to this destroyed object
2640 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2641 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002642 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002643
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002644 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002645
Chia-I Wuf7458c52015-10-26 21:10:41 +08002646 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002647}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06002648
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002649#endif // OBJ_TRACKER_TESTS
2650
Tobin Ehlis0788f522015-05-26 16:11:58 -06002651#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002652
2653// This is a positive test. No errors should be generated.
2654TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
2655
2656 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2657 "submitted on separate queues followed by a QueueWaitIdle.");
2658
Dustin Graves48458142016-04-29 16:11:55 -06002659 if ((m_device->queue_props.empty()) ||
2660 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002661 return;
2662
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002663 m_errorMonitor->ExpectSuccess();
2664
2665 VkSemaphore semaphore;
2666 VkSemaphoreCreateInfo semaphore_create_info{};
2667 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2668 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2669 &semaphore);
2670
2671 VkCommandPool command_pool;
2672 VkCommandPoolCreateInfo pool_create_info{};
2673 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2674 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2675 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2676 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2677 &command_pool);
2678
2679 VkCommandBuffer command_buffer[2];
2680 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2681 command_buffer_allocate_info.sType =
2682 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2683 command_buffer_allocate_info.commandPool = command_pool;
2684 command_buffer_allocate_info.commandBufferCount = 2;
2685 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2686 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2687 command_buffer);
2688
2689 VkQueue queue = VK_NULL_HANDLE;
2690 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2691 1, &queue);
2692
2693 {
2694 VkCommandBufferBeginInfo begin_info{};
2695 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2696 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2697
2698 vkCmdPipelineBarrier(command_buffer[0],
2699 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2700 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2701 0, nullptr, 0, nullptr);
2702
2703 VkViewport viewport{};
2704 viewport.maxDepth = 1.0f;
2705 viewport.minDepth = 0.0f;
2706 viewport.width = 512;
2707 viewport.height = 512;
2708 viewport.x = 0;
2709 viewport.y = 0;
2710 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2711 vkEndCommandBuffer(command_buffer[0]);
2712 }
2713 {
2714 VkCommandBufferBeginInfo begin_info{};
2715 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2716 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2717
2718 VkViewport viewport{};
2719 viewport.maxDepth = 1.0f;
2720 viewport.minDepth = 0.0f;
2721 viewport.width = 512;
2722 viewport.height = 512;
2723 viewport.x = 0;
2724 viewport.y = 0;
2725 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2726 vkEndCommandBuffer(command_buffer[1]);
2727 }
2728 {
2729 VkSubmitInfo submit_info{};
2730 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2731 submit_info.commandBufferCount = 1;
2732 submit_info.pCommandBuffers = &command_buffer[0];
2733 submit_info.signalSemaphoreCount = 1;
2734 submit_info.pSignalSemaphores = &semaphore;
2735 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2736 }
2737 {
2738 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2739 VkSubmitInfo submit_info{};
2740 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2741 submit_info.commandBufferCount = 1;
2742 submit_info.pCommandBuffers = &command_buffer[1];
2743 submit_info.waitSemaphoreCount = 1;
2744 submit_info.pWaitSemaphores = &semaphore;
2745 submit_info.pWaitDstStageMask = flags;
2746 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2747 }
2748
2749 vkQueueWaitIdle(m_device->m_queue);
2750
2751 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2752 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2753 &command_buffer[0]);
2754 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2755
2756 m_errorMonitor->VerifyNotFound();
2757}
2758
2759// This is a positive test. No errors should be generated.
2760TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
2761
2762 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2763 "submitted on separate queues, the second having a fence"
2764 "followed by a QueueWaitIdle.");
2765
Dustin Graves48458142016-04-29 16:11:55 -06002766 if ((m_device->queue_props.empty()) ||
2767 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002768 return;
2769
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002770 m_errorMonitor->ExpectSuccess();
2771
2772 VkFence fence;
2773 VkFenceCreateInfo fence_create_info{};
2774 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2775 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2776
2777 VkSemaphore semaphore;
2778 VkSemaphoreCreateInfo semaphore_create_info{};
2779 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2780 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2781 &semaphore);
2782
2783 VkCommandPool command_pool;
2784 VkCommandPoolCreateInfo pool_create_info{};
2785 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2786 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2787 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2788 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2789 &command_pool);
2790
2791 VkCommandBuffer command_buffer[2];
2792 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2793 command_buffer_allocate_info.sType =
2794 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2795 command_buffer_allocate_info.commandPool = command_pool;
2796 command_buffer_allocate_info.commandBufferCount = 2;
2797 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2798 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2799 command_buffer);
2800
2801 VkQueue queue = VK_NULL_HANDLE;
2802 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2803 1, &queue);
2804
2805 {
2806 VkCommandBufferBeginInfo begin_info{};
2807 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2808 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2809
2810 vkCmdPipelineBarrier(command_buffer[0],
2811 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2812 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2813 0, nullptr, 0, nullptr);
2814
2815 VkViewport viewport{};
2816 viewport.maxDepth = 1.0f;
2817 viewport.minDepth = 0.0f;
2818 viewport.width = 512;
2819 viewport.height = 512;
2820 viewport.x = 0;
2821 viewport.y = 0;
2822 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2823 vkEndCommandBuffer(command_buffer[0]);
2824 }
2825 {
2826 VkCommandBufferBeginInfo begin_info{};
2827 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2828 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2829
2830 VkViewport viewport{};
2831 viewport.maxDepth = 1.0f;
2832 viewport.minDepth = 0.0f;
2833 viewport.width = 512;
2834 viewport.height = 512;
2835 viewport.x = 0;
2836 viewport.y = 0;
2837 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2838 vkEndCommandBuffer(command_buffer[1]);
2839 }
2840 {
2841 VkSubmitInfo submit_info{};
2842 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2843 submit_info.commandBufferCount = 1;
2844 submit_info.pCommandBuffers = &command_buffer[0];
2845 submit_info.signalSemaphoreCount = 1;
2846 submit_info.pSignalSemaphores = &semaphore;
2847 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2848 }
2849 {
2850 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2851 VkSubmitInfo submit_info{};
2852 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2853 submit_info.commandBufferCount = 1;
2854 submit_info.pCommandBuffers = &command_buffer[1];
2855 submit_info.waitSemaphoreCount = 1;
2856 submit_info.pWaitSemaphores = &semaphore;
2857 submit_info.pWaitDstStageMask = flags;
2858 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2859 }
2860
2861 vkQueueWaitIdle(m_device->m_queue);
2862
2863 vkDestroyFence(m_device->device(), fence, nullptr);
2864 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2865 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2866 &command_buffer[0]);
2867 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2868
2869 m_errorMonitor->VerifyNotFound();
2870}
2871
2872// This is a positive test. No errors should be generated.
2873TEST_F(VkLayerTest,
2874 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
2875
2876 TEST_DESCRIPTION(
2877 "Two command buffers, each in a separate QueueSubmit call "
2878 "submitted on separate queues, the second having a fence"
2879 "followed by two consecutive WaitForFences calls on the same fence.");
2880
Dustin Graves48458142016-04-29 16:11:55 -06002881 if ((m_device->queue_props.empty()) ||
2882 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002883 return;
2884
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002885 m_errorMonitor->ExpectSuccess();
2886
2887 VkFence fence;
2888 VkFenceCreateInfo fence_create_info{};
2889 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2890 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2891
2892 VkSemaphore semaphore;
2893 VkSemaphoreCreateInfo semaphore_create_info{};
2894 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2895 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2896 &semaphore);
2897
2898 VkCommandPool command_pool;
2899 VkCommandPoolCreateInfo pool_create_info{};
2900 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2901 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2902 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2903 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2904 &command_pool);
2905
2906 VkCommandBuffer command_buffer[2];
2907 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2908 command_buffer_allocate_info.sType =
2909 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2910 command_buffer_allocate_info.commandPool = command_pool;
2911 command_buffer_allocate_info.commandBufferCount = 2;
2912 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2913 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2914 command_buffer);
2915
2916 VkQueue queue = VK_NULL_HANDLE;
2917 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2918 1, &queue);
2919
2920 {
2921 VkCommandBufferBeginInfo begin_info{};
2922 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2923 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2924
2925 vkCmdPipelineBarrier(command_buffer[0],
2926 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2927 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2928 0, nullptr, 0, nullptr);
2929
2930 VkViewport viewport{};
2931 viewport.maxDepth = 1.0f;
2932 viewport.minDepth = 0.0f;
2933 viewport.width = 512;
2934 viewport.height = 512;
2935 viewport.x = 0;
2936 viewport.y = 0;
2937 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2938 vkEndCommandBuffer(command_buffer[0]);
2939 }
2940 {
2941 VkCommandBufferBeginInfo begin_info{};
2942 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2943 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2944
2945 VkViewport viewport{};
2946 viewport.maxDepth = 1.0f;
2947 viewport.minDepth = 0.0f;
2948 viewport.width = 512;
2949 viewport.height = 512;
2950 viewport.x = 0;
2951 viewport.y = 0;
2952 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2953 vkEndCommandBuffer(command_buffer[1]);
2954 }
2955 {
2956 VkSubmitInfo submit_info{};
2957 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2958 submit_info.commandBufferCount = 1;
2959 submit_info.pCommandBuffers = &command_buffer[0];
2960 submit_info.signalSemaphoreCount = 1;
2961 submit_info.pSignalSemaphores = &semaphore;
2962 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2963 }
2964 {
2965 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2966 VkSubmitInfo submit_info{};
2967 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2968 submit_info.commandBufferCount = 1;
2969 submit_info.pCommandBuffers = &command_buffer[1];
2970 submit_info.waitSemaphoreCount = 1;
2971 submit_info.pWaitSemaphores = &semaphore;
2972 submit_info.pWaitDstStageMask = flags;
2973 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2974 }
2975
2976 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2977 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2978
2979 vkDestroyFence(m_device->device(), fence, nullptr);
2980 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2981 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2982 &command_buffer[0]);
2983 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2984
2985 m_errorMonitor->VerifyNotFound();
2986}
2987
2988// This is a positive test. No errors should be generated.
2989TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
2990
2991 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2992 "submitted on separate queues, the second having a fence, "
2993 "followed by a WaitForFences call.");
2994
Dustin Graves48458142016-04-29 16:11:55 -06002995 if ((m_device->queue_props.empty()) ||
2996 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002997 return;
2998
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002999 m_errorMonitor->ExpectSuccess();
3000
3001 VkFence fence;
3002 VkFenceCreateInfo fence_create_info{};
3003 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3004 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
3005
3006 VkSemaphore semaphore;
3007 VkSemaphoreCreateInfo semaphore_create_info{};
3008 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
3009 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
3010 &semaphore);
3011
3012 VkCommandPool command_pool;
3013 VkCommandPoolCreateInfo pool_create_info{};
3014 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3015 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3016 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3017 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3018 &command_pool);
3019
3020 VkCommandBuffer command_buffer[2];
3021 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3022 command_buffer_allocate_info.sType =
3023 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3024 command_buffer_allocate_info.commandPool = command_pool;
3025 command_buffer_allocate_info.commandBufferCount = 2;
3026 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3027 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3028 command_buffer);
3029
3030 VkQueue queue = VK_NULL_HANDLE;
3031 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
3032 1, &queue);
3033
3034
3035 {
3036 VkCommandBufferBeginInfo begin_info{};
3037 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3038 vkBeginCommandBuffer(command_buffer[0], &begin_info);
3039
3040 vkCmdPipelineBarrier(command_buffer[0],
3041 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3042 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
3043 0, nullptr, 0, nullptr);
3044
3045 VkViewport viewport{};
3046 viewport.maxDepth = 1.0f;
3047 viewport.minDepth = 0.0f;
3048 viewport.width = 512;
3049 viewport.height = 512;
3050 viewport.x = 0;
3051 viewport.y = 0;
3052 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
3053 vkEndCommandBuffer(command_buffer[0]);
3054 }
3055 {
3056 VkCommandBufferBeginInfo begin_info{};
3057 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3058 vkBeginCommandBuffer(command_buffer[1], &begin_info);
3059
3060 VkViewport viewport{};
3061 viewport.maxDepth = 1.0f;
3062 viewport.minDepth = 0.0f;
3063 viewport.width = 512;
3064 viewport.height = 512;
3065 viewport.x = 0;
3066 viewport.y = 0;
3067 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
3068 vkEndCommandBuffer(command_buffer[1]);
3069 }
3070 {
3071 VkSubmitInfo submit_info{};
3072 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3073 submit_info.commandBufferCount = 1;
3074 submit_info.pCommandBuffers = &command_buffer[0];
3075 submit_info.signalSemaphoreCount = 1;
3076 submit_info.pSignalSemaphores = &semaphore;
3077 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
3078 }
3079 {
3080 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
3081 VkSubmitInfo submit_info{};
3082 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3083 submit_info.commandBufferCount = 1;
3084 submit_info.pCommandBuffers = &command_buffer[1];
3085 submit_info.waitSemaphoreCount = 1;
3086 submit_info.pWaitSemaphores = &semaphore;
3087 submit_info.pWaitDstStageMask = flags;
3088 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
3089 }
3090
3091 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3092
3093 vkDestroyFence(m_device->device(), fence, nullptr);
3094 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
3095 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
3096 &command_buffer[0]);
3097 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3098
3099 m_errorMonitor->VerifyNotFound();
3100}
3101
3102// This is a positive test. No errors should be generated.
3103TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
3104
3105 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
3106 "on the same queue, sharing a signal/wait semaphore, the "
3107 "second having a fence, "
3108 "followed by a WaitForFences call.");
3109
3110 m_errorMonitor->ExpectSuccess();
3111
3112 VkFence fence;
3113 VkFenceCreateInfo fence_create_info{};
3114 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3115 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
3116
3117 VkSemaphore semaphore;
3118 VkSemaphoreCreateInfo semaphore_create_info{};
3119 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
3120 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
3121 &semaphore);
3122
3123 VkCommandPool command_pool;
3124 VkCommandPoolCreateInfo pool_create_info{};
3125 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3126 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3127 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3128 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3129 &command_pool);
3130
3131 VkCommandBuffer command_buffer[2];
3132 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3133 command_buffer_allocate_info.sType =
3134 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3135 command_buffer_allocate_info.commandPool = command_pool;
3136 command_buffer_allocate_info.commandBufferCount = 2;
3137 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3138 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3139 command_buffer);
3140
3141 {
3142 VkCommandBufferBeginInfo begin_info{};
3143 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3144 vkBeginCommandBuffer(command_buffer[0], &begin_info);
3145
3146 vkCmdPipelineBarrier(command_buffer[0],
3147 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3148 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
3149 0, nullptr, 0, nullptr);
3150
3151 VkViewport viewport{};
3152 viewport.maxDepth = 1.0f;
3153 viewport.minDepth = 0.0f;
3154 viewport.width = 512;
3155 viewport.height = 512;
3156 viewport.x = 0;
3157 viewport.y = 0;
3158 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
3159 vkEndCommandBuffer(command_buffer[0]);
3160 }
3161 {
3162 VkCommandBufferBeginInfo begin_info{};
3163 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3164 vkBeginCommandBuffer(command_buffer[1], &begin_info);
3165
3166 VkViewport viewport{};
3167 viewport.maxDepth = 1.0f;
3168 viewport.minDepth = 0.0f;
3169 viewport.width = 512;
3170 viewport.height = 512;
3171 viewport.x = 0;
3172 viewport.y = 0;
3173 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
3174 vkEndCommandBuffer(command_buffer[1]);
3175 }
3176 {
3177 VkSubmitInfo submit_info{};
3178 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3179 submit_info.commandBufferCount = 1;
3180 submit_info.pCommandBuffers = &command_buffer[0];
3181 submit_info.signalSemaphoreCount = 1;
3182 submit_info.pSignalSemaphores = &semaphore;
3183 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
3184 }
3185 {
3186 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
3187 VkSubmitInfo submit_info{};
3188 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3189 submit_info.commandBufferCount = 1;
3190 submit_info.pCommandBuffers = &command_buffer[1];
3191 submit_info.waitSemaphoreCount = 1;
3192 submit_info.pWaitSemaphores = &semaphore;
3193 submit_info.pWaitDstStageMask = flags;
3194 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
3195 }
3196
3197 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3198
3199 vkDestroyFence(m_device->device(), fence, nullptr);
3200 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
3201 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
3202 &command_buffer[0]);
3203 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3204
3205 m_errorMonitor->VerifyNotFound();
3206}
3207
3208// This is a positive test. No errors should be generated.
3209TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
3210
3211 TEST_DESCRIPTION(
3212 "Two command buffers, each in a separate QueueSubmit call "
3213 "on the same queue, no fences, followed by a third QueueSubmit with NO "
3214 "SubmitInfos but with a fence, followed by a WaitForFences call.");
3215
3216 m_errorMonitor->ExpectSuccess();
3217
3218 VkFence fence;
3219 VkFenceCreateInfo fence_create_info{};
3220 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3221 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
3222
3223 VkCommandPool command_pool;
3224 VkCommandPoolCreateInfo pool_create_info{};
3225 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3226 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3227 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3228 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3229 &command_pool);
3230
3231 VkCommandBuffer command_buffer[2];
3232 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3233 command_buffer_allocate_info.sType =
3234 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3235 command_buffer_allocate_info.commandPool = command_pool;
3236 command_buffer_allocate_info.commandBufferCount = 2;
3237 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3238 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3239 command_buffer);
3240
3241 {
3242 VkCommandBufferBeginInfo begin_info{};
3243 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3244 vkBeginCommandBuffer(command_buffer[0], &begin_info);
3245
3246 vkCmdPipelineBarrier(command_buffer[0],
3247 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3248 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
3249 0, nullptr, 0, nullptr);
3250
3251 VkViewport viewport{};
3252 viewport.maxDepth = 1.0f;
3253 viewport.minDepth = 0.0f;
3254 viewport.width = 512;
3255 viewport.height = 512;
3256 viewport.x = 0;
3257 viewport.y = 0;
3258 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
3259 vkEndCommandBuffer(command_buffer[0]);
3260 }
3261 {
3262 VkCommandBufferBeginInfo begin_info{};
3263 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3264 vkBeginCommandBuffer(command_buffer[1], &begin_info);
3265
3266 VkViewport viewport{};
3267 viewport.maxDepth = 1.0f;
3268 viewport.minDepth = 0.0f;
3269 viewport.width = 512;
3270 viewport.height = 512;
3271 viewport.x = 0;
3272 viewport.y = 0;
3273 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
3274 vkEndCommandBuffer(command_buffer[1]);
3275 }
3276 {
3277 VkSubmitInfo submit_info{};
3278 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3279 submit_info.commandBufferCount = 1;
3280 submit_info.pCommandBuffers = &command_buffer[0];
3281 submit_info.signalSemaphoreCount = 0;
3282 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
3283 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
3284 }
3285 {
3286 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
3287 VkSubmitInfo submit_info{};
3288 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3289 submit_info.commandBufferCount = 1;
3290 submit_info.pCommandBuffers = &command_buffer[1];
3291 submit_info.waitSemaphoreCount = 0;
3292 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
3293 submit_info.pWaitDstStageMask = flags;
3294 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
3295 }
3296
3297 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
3298
3299 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3300
3301 vkDestroyFence(m_device->device(), fence, nullptr);
3302 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
3303 &command_buffer[0]);
3304 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3305
3306 m_errorMonitor->VerifyNotFound();
3307}
3308
3309// This is a positive test. No errors should be generated.
3310TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
3311
3312 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
3313 "on the same queue, the second having a fence, followed "
3314 "by a WaitForFences call.");
3315
3316 m_errorMonitor->ExpectSuccess();
3317
3318 VkFence fence;
3319 VkFenceCreateInfo fence_create_info{};
3320 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3321 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
3322
3323 VkCommandPool command_pool;
3324 VkCommandPoolCreateInfo pool_create_info{};
3325 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3326 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3327 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3328 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3329 &command_pool);
3330
3331 VkCommandBuffer command_buffer[2];
3332 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3333 command_buffer_allocate_info.sType =
3334 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3335 command_buffer_allocate_info.commandPool = command_pool;
3336 command_buffer_allocate_info.commandBufferCount = 2;
3337 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3338 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3339 command_buffer);
3340
3341 {
3342 VkCommandBufferBeginInfo begin_info{};
3343 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3344 vkBeginCommandBuffer(command_buffer[0], &begin_info);
3345
3346 vkCmdPipelineBarrier(command_buffer[0],
3347 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3348 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
3349 0, nullptr, 0, nullptr);
3350
3351 VkViewport viewport{};
3352 viewport.maxDepth = 1.0f;
3353 viewport.minDepth = 0.0f;
3354 viewport.width = 512;
3355 viewport.height = 512;
3356 viewport.x = 0;
3357 viewport.y = 0;
3358 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
3359 vkEndCommandBuffer(command_buffer[0]);
3360 }
3361 {
3362 VkCommandBufferBeginInfo begin_info{};
3363 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3364 vkBeginCommandBuffer(command_buffer[1], &begin_info);
3365
3366 VkViewport viewport{};
3367 viewport.maxDepth = 1.0f;
3368 viewport.minDepth = 0.0f;
3369 viewport.width = 512;
3370 viewport.height = 512;
3371 viewport.x = 0;
3372 viewport.y = 0;
3373 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
3374 vkEndCommandBuffer(command_buffer[1]);
3375 }
3376 {
3377 VkSubmitInfo submit_info{};
3378 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3379 submit_info.commandBufferCount = 1;
3380 submit_info.pCommandBuffers = &command_buffer[0];
3381 submit_info.signalSemaphoreCount = 0;
3382 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
3383 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
3384 }
3385 {
3386 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
3387 VkSubmitInfo submit_info{};
3388 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3389 submit_info.commandBufferCount = 1;
3390 submit_info.pCommandBuffers = &command_buffer[1];
3391 submit_info.waitSemaphoreCount = 0;
3392 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
3393 submit_info.pWaitDstStageMask = flags;
3394 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
3395 }
3396
3397 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3398
3399 vkDestroyFence(m_device->device(), fence, nullptr);
3400 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
3401 &command_buffer[0]);
3402 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3403
3404 m_errorMonitor->VerifyNotFound();
3405}
3406
3407// This is a positive test. No errors should be generated.
3408TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
3409
3410 TEST_DESCRIPTION(
3411 "Two command buffers each in a separate SubmitInfo sent in a single "
3412 "QueueSubmit call followed by a WaitForFences call.");
3413
3414 m_errorMonitor->ExpectSuccess();
3415
3416 VkFence fence;
3417 VkFenceCreateInfo fence_create_info{};
3418 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3419 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
3420
3421 VkSemaphore semaphore;
3422 VkSemaphoreCreateInfo semaphore_create_info{};
3423 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
3424 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
3425 &semaphore);
3426
3427 VkCommandPool command_pool;
3428 VkCommandPoolCreateInfo pool_create_info{};
3429 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3430 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3431 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3432 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3433 &command_pool);
3434
3435 VkCommandBuffer command_buffer[2];
3436 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3437 command_buffer_allocate_info.sType =
3438 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3439 command_buffer_allocate_info.commandPool = command_pool;
3440 command_buffer_allocate_info.commandBufferCount = 2;
3441 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3442 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3443 command_buffer);
3444
3445 {
3446 VkCommandBufferBeginInfo begin_info{};
3447 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3448 vkBeginCommandBuffer(command_buffer[0], &begin_info);
3449
3450 vkCmdPipelineBarrier(command_buffer[0],
3451 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3452 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
3453 0, nullptr, 0, nullptr);
3454
3455 VkViewport viewport{};
3456 viewport.maxDepth = 1.0f;
3457 viewport.minDepth = 0.0f;
3458 viewport.width = 512;
3459 viewport.height = 512;
3460 viewport.x = 0;
3461 viewport.y = 0;
3462 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
3463 vkEndCommandBuffer(command_buffer[0]);
3464 }
3465 {
3466 VkCommandBufferBeginInfo begin_info{};
3467 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3468 vkBeginCommandBuffer(command_buffer[1], &begin_info);
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[1], 0, 1, &viewport);
3478 vkEndCommandBuffer(command_buffer[1]);
3479 }
3480 {
3481 VkSubmitInfo submit_info[2];
3482 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
3483
3484 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3485 submit_info[0].pNext = NULL;
3486 submit_info[0].commandBufferCount = 1;
3487 submit_info[0].pCommandBuffers = &command_buffer[0];
3488 submit_info[0].signalSemaphoreCount = 1;
3489 submit_info[0].pSignalSemaphores = &semaphore;
3490 submit_info[0].waitSemaphoreCount = 0;
3491 submit_info[0].pWaitSemaphores = NULL;
3492 submit_info[0].pWaitDstStageMask = 0;
3493
3494 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3495 submit_info[1].pNext = NULL;
3496 submit_info[1].commandBufferCount = 1;
3497 submit_info[1].pCommandBuffers = &command_buffer[1];
3498 submit_info[1].waitSemaphoreCount = 1;
3499 submit_info[1].pWaitSemaphores = &semaphore;
3500 submit_info[1].pWaitDstStageMask = flags;
3501 submit_info[1].signalSemaphoreCount = 0;
3502 submit_info[1].pSignalSemaphores = NULL;
3503 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
3504 }
3505
3506 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3507
3508 vkDestroyFence(m_device->device(), fence, nullptr);
3509 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
3510 &command_buffer[0]);
3511 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3512
3513 m_errorMonitor->VerifyNotFound();
3514}
3515
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003516TEST_F(VkLayerTest, DynamicStatesNotBound) {
3517 TEST_DESCRIPTION(
3518 "Run a series of simple draw calls to validate all the different "
3519 "failure cases that can occur when dynamic state is required but not "
3520 "correctly bound."
3521 "Here are the different dynamic state cases verified by this test:\n"
3522 "-Line Width\n-Depth Bias\n-Viewport State\n-Scissor State\n-Blend "
3523 "State\n-Depth Bounds\n-Stencil Read Mask\n-Stencil Write "
3524 "Mask\n-Stencil Reference");
3525
3526 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07003527 m_errorMonitor->SetDesiredFailureMsg(
3528 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003529 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003530 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3531 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003532 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003533 // Dynamic depth bias
Karl Schultz6addd812016-02-02 17:17:23 -07003534 m_errorMonitor->SetDesiredFailureMsg(
3535 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003536 "Dynamic depth bias state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003537 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3538 BsoFailDepthBias);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003539 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003540 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07003541 m_errorMonitor->SetDesiredFailureMsg(
3542 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003543 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003544 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3545 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003546 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003547 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07003548 m_errorMonitor->SetDesiredFailureMsg(
3549 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003550 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003551 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3552 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003553 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003554 // Dynamic blend state
Karl Schultz6addd812016-02-02 17:17:23 -07003555 m_errorMonitor->SetDesiredFailureMsg(
3556 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003557 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003558 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3559 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003560 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003561 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07003562 m_errorMonitor->SetDesiredFailureMsg(
3563 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003564 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003565 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3566 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003567 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003568 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07003569 m_errorMonitor->SetDesiredFailureMsg(
3570 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003571 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003572 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3573 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003574 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003575 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07003576 m_errorMonitor->SetDesiredFailureMsg(
3577 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003578 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003579 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3580 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003581 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06003582}
3583
Karl Schultz6addd812016-02-02 17:17:23 -07003584TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003585 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003586
Karl Schultz6addd812016-02-02 17:17:23 -07003587 m_errorMonitor->SetDesiredFailureMsg(
3588 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3589 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
3590 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003591
3592 VkFenceCreateInfo fenceInfo = {};
3593 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3594 fenceInfo.pNext = NULL;
3595 fenceInfo.flags = 0;
3596
3597 ASSERT_NO_FATAL_FAILURE(InitState());
3598 ASSERT_NO_FATAL_FAILURE(InitViewport());
3599 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3600
Karl Schultz6addd812016-02-02 17:17:23 -07003601 // We luck out b/c by default the framework creates CB w/ the
3602 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003603 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003604 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
3605 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003606 EndCommandBuffer();
3607
3608 testFence.init(*m_device, fenceInfo);
3609
3610 // Bypass framework since it does the waits automatically
3611 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003612 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08003613 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3614 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003615 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003616 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07003617 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003618 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003619 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08003620 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003621 submit_info.pSignalSemaphores = NULL;
3622
Karl Schultz6addd812016-02-02 17:17:23 -07003623 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
3624 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003625
Karl Schultz6addd812016-02-02 17:17:23 -07003626 // Cause validation error by re-submitting cmd buffer that should only be
3627 // submitted once
3628 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003629
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003630 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003631}
3632
Karl Schultz6addd812016-02-02 17:17:23 -07003633TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003634 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07003635 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003636
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003637 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003638 "Unable to allocate 1 descriptors of "
3639 "type "
3640 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003641
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003642 ASSERT_NO_FATAL_FAILURE(InitState());
3643 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003644
Karl Schultz6addd812016-02-02 17:17:23 -07003645 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
3646 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003647 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003648 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3649 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003650
3651 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003652 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3653 ds_pool_ci.pNext = NULL;
3654 ds_pool_ci.flags = 0;
3655 ds_pool_ci.maxSets = 1;
3656 ds_pool_ci.poolSizeCount = 1;
3657 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003658
3659 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003660 err =
3661 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003662 ASSERT_VK_SUCCESS(err);
3663
3664 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003665 dsl_binding.binding = 0;
3666 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3667 dsl_binding.descriptorCount = 1;
3668 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3669 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003670
3671 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003672 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3673 ds_layout_ci.pNext = NULL;
3674 ds_layout_ci.bindingCount = 1;
3675 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003676
3677 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003678 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3679 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003680 ASSERT_VK_SUCCESS(err);
3681
3682 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003683 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003684 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003685 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003686 alloc_info.descriptorPool = ds_pool;
3687 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003688 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3689 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003690
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003691 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003692
Chia-I Wuf7458c52015-10-26 21:10:41 +08003693 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3694 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003695}
3696
Karl Schultz6addd812016-02-02 17:17:23 -07003697TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
3698 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06003699
Karl Schultz6addd812016-02-02 17:17:23 -07003700 m_errorMonitor->SetDesiredFailureMsg(
3701 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3702 "It is invalid to call vkFreeDescriptorSets() with a pool created "
3703 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003704
Tobin Ehlise735c692015-10-08 13:13:50 -06003705 ASSERT_NO_FATAL_FAILURE(InitState());
3706 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06003707
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003708 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003709 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3710 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06003711
3712 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003713 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3714 ds_pool_ci.pNext = NULL;
3715 ds_pool_ci.maxSets = 1;
3716 ds_pool_ci.poolSizeCount = 1;
3717 ds_pool_ci.flags = 0;
3718 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
3719 // app can only call vkResetDescriptorPool on this pool.;
3720 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06003721
3722 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003723 err =
3724 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06003725 ASSERT_VK_SUCCESS(err);
3726
3727 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003728 dsl_binding.binding = 0;
3729 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3730 dsl_binding.descriptorCount = 1;
3731 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3732 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06003733
3734 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003735 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3736 ds_layout_ci.pNext = NULL;
3737 ds_layout_ci.bindingCount = 1;
3738 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06003739
3740 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003741 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3742 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06003743 ASSERT_VK_SUCCESS(err);
3744
3745 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003746 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003747 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003748 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003749 alloc_info.descriptorPool = ds_pool;
3750 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003751 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3752 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06003753 ASSERT_VK_SUCCESS(err);
3754
3755 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003756 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06003757
Chia-I Wuf7458c52015-10-26 21:10:41 +08003758 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3759 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06003760}
3761
Karl Schultz6addd812016-02-02 17:17:23 -07003762TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003763 // Attempt to clear Descriptor Pool with bad object.
3764 // ObjectTracker should catch this.
3765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3766 "Invalid VkDescriptorPool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003767 uint64_t fake_pool_handle = 0xbaad6001;
3768 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
3769 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06003770 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003771}
3772
Karl Schultz6addd812016-02-02 17:17:23 -07003773TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003774 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
3775 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003776 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06003777 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003778
3779 uint64_t fake_set_handle = 0xbaad6001;
3780 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003781 VkResult err;
3782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3783 "Invalid VkDescriptorSet Object 0xbaad6001");
3784
3785 ASSERT_NO_FATAL_FAILURE(InitState());
3786
3787 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
3788 layout_bindings[0].binding = 0;
3789 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3790 layout_bindings[0].descriptorCount = 1;
3791 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3792 layout_bindings[0].pImmutableSamplers = NULL;
3793
3794 VkDescriptorSetLayout descriptor_set_layout;
3795 VkDescriptorSetLayoutCreateInfo dslci = {};
3796 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3797 dslci.pNext = NULL;
3798 dslci.bindingCount = 1;
3799 dslci.pBindings = layout_bindings;
3800 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003801 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003802
3803 VkPipelineLayout pipeline_layout;
3804 VkPipelineLayoutCreateInfo plci = {};
3805 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3806 plci.pNext = NULL;
3807 plci.setLayoutCount = 1;
3808 plci.pSetLayouts = &descriptor_set_layout;
3809 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003810 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003811
3812 BeginCommandBuffer();
3813 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003814 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06003815 m_errorMonitor->VerifyFound();
3816 EndCommandBuffer();
3817 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
3818 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003819}
3820
Karl Schultz6addd812016-02-02 17:17:23 -07003821TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003822 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
3823 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003824 uint64_t fake_layout_handle = 0xbaad6001;
3825 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3827 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
3828
3829 VkPipelineLayout pipeline_layout;
3830 VkPipelineLayoutCreateInfo plci = {};
3831 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3832 plci.pNext = NULL;
3833 plci.setLayoutCount = 1;
3834 plci.pSetLayouts = &bad_layout;
3835 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
3836
3837 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003838}
3839
Karl Schultz6addd812016-02-02 17:17:23 -07003840TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003841 // Attempt to bind an invalid Pipeline to a valid Command Buffer
3842 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003843 // Create a valid cmd buffer
3844 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003845 uint64_t fake_pipeline_handle = 0xbaad6001;
3846 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3848 "Invalid VkPipeline Object 0xbaad6001");
3849 ASSERT_NO_FATAL_FAILURE(InitState());
3850 BeginCommandBuffer();
3851 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3852 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
3853 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06003854
3855 // Now issue a draw call with no pipeline bound
3856 m_errorMonitor->SetDesiredFailureMsg(
3857 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3858 "At Draw/Dispatch time no valid VkPipeline is bound!");
3859 ASSERT_NO_FATAL_FAILURE(InitState());
3860 BeginCommandBuffer();
3861 Draw(1, 0, 0, 0);
3862 m_errorMonitor->VerifyFound();
3863 // Finally same check once more but with Dispatch/Compute
3864 m_errorMonitor->SetDesiredFailureMsg(
3865 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3866 "At Draw/Dispatch time no valid VkPipeline is bound!");
3867 ASSERT_NO_FATAL_FAILURE(InitState());
3868 BeginCommandBuffer();
3869 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
3870 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003871}
3872
Karl Schultz6addd812016-02-02 17:17:23 -07003873TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
3874 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
3875 // CommandBuffer
3876 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003877
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003879 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003880
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003881 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06003882 ASSERT_NO_FATAL_FAILURE(InitViewport());
3883 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003884 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003885 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3886 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003887
3888 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003889 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3890 ds_pool_ci.pNext = NULL;
3891 ds_pool_ci.maxSets = 1;
3892 ds_pool_ci.poolSizeCount = 1;
3893 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06003894
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003895 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003896 err =
3897 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003898 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003899
Tony Barboureb254902015-07-15 12:50:33 -06003900 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003901 dsl_binding.binding = 0;
3902 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3903 dsl_binding.descriptorCount = 1;
3904 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3905 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003906
Tony Barboureb254902015-07-15 12:50:33 -06003907 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003908 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3909 ds_layout_ci.pNext = NULL;
3910 ds_layout_ci.bindingCount = 1;
3911 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003912 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003913 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3914 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003915 ASSERT_VK_SUCCESS(err);
3916
3917 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003918 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003919 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003920 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003921 alloc_info.descriptorPool = ds_pool;
3922 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003923 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3924 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003925 ASSERT_VK_SUCCESS(err);
3926
Tony Barboureb254902015-07-15 12:50:33 -06003927 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003928 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3929 pipeline_layout_ci.pNext = NULL;
3930 pipeline_layout_ci.setLayoutCount = 1;
3931 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003932
3933 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003934 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3935 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003936 ASSERT_VK_SUCCESS(err);
3937
Karl Schultz6addd812016-02-02 17:17:23 -07003938 VkShaderObj vs(m_device, bindStateVertShaderText,
3939 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06003940 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07003941 // on more devices
3942 VkShaderObj fs(m_device, bindStateFragShaderText,
3943 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003944
Tony Barbourc95e4ac2015-08-04 17:05:26 -06003945 VkPipelineObj pipe(m_device);
3946 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06003947 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06003948 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06003949 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06003950
3951 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003952 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3953 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3954 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3955 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3956 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003957
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003958 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003959
Chia-I Wuf7458c52015-10-26 21:10:41 +08003960 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3961 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3962 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003963}
3964
Karl Schultz6addd812016-02-02 17:17:23 -07003965TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003966 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07003967 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003968
Karl Schultz6addd812016-02-02 17:17:23 -07003969 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003970 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
3971 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003972
3973 ASSERT_NO_FATAL_FAILURE(InitState());
3974 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003975 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3976 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003977
3978 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003979 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3980 ds_pool_ci.pNext = NULL;
3981 ds_pool_ci.maxSets = 1;
3982 ds_pool_ci.poolSizeCount = 1;
3983 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003984
3985 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003986 err =
3987 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003988 ASSERT_VK_SUCCESS(err);
3989
3990 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003991 dsl_binding.binding = 0;
3992 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3993 dsl_binding.descriptorCount = 1;
3994 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3995 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003996
3997 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003998 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3999 ds_layout_ci.pNext = NULL;
4000 ds_layout_ci.bindingCount = 1;
4001 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004002 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004003 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4004 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004005 ASSERT_VK_SUCCESS(err);
4006
4007 VkDescriptorSet descriptorSet;
4008 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004009 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004010 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004011 alloc_info.descriptorPool = ds_pool;
4012 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004013 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4014 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004015 ASSERT_VK_SUCCESS(err);
4016
Karl Schultz6addd812016-02-02 17:17:23 -07004017 VkBufferView view =
4018 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004019 VkWriteDescriptorSet descriptor_write;
4020 memset(&descriptor_write, 0, sizeof(descriptor_write));
4021 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4022 descriptor_write.dstSet = descriptorSet;
4023 descriptor_write.dstBinding = 0;
4024 descriptor_write.descriptorCount = 1;
4025 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
4026 descriptor_write.pTexelBufferView = &view;
4027
4028 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4029
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004030 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004031
4032 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4033 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4034}
4035
Karl Schultz6addd812016-02-02 17:17:23 -07004036TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
4037 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
4038 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07004039 // 1. No dynamicOffset supplied
4040 // 2. Too many dynamicOffsets supplied
4041 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07004042 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004043 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004044 " requires 1 dynamicOffsets, but only "
4045 "0 dynamicOffsets are left in "
4046 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004047
4048 ASSERT_NO_FATAL_FAILURE(InitState());
4049 ASSERT_NO_FATAL_FAILURE(InitViewport());
4050 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4051
4052 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004053 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
4054 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004055
4056 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004057 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4058 ds_pool_ci.pNext = NULL;
4059 ds_pool_ci.maxSets = 1;
4060 ds_pool_ci.poolSizeCount = 1;
4061 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004062
4063 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004064 err =
4065 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004066 ASSERT_VK_SUCCESS(err);
4067
4068 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004069 dsl_binding.binding = 0;
4070 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
4071 dsl_binding.descriptorCount = 1;
4072 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4073 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004074
4075 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004076 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4077 ds_layout_ci.pNext = NULL;
4078 ds_layout_ci.bindingCount = 1;
4079 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004080 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004081 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4082 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004083 ASSERT_VK_SUCCESS(err);
4084
4085 VkDescriptorSet descriptorSet;
4086 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004087 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004088 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004089 alloc_info.descriptorPool = ds_pool;
4090 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004091 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4092 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004093 ASSERT_VK_SUCCESS(err);
4094
4095 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004096 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4097 pipeline_layout_ci.pNext = NULL;
4098 pipeline_layout_ci.setLayoutCount = 1;
4099 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004100
4101 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004102 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4103 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004104 ASSERT_VK_SUCCESS(err);
4105
4106 // Create a buffer to update the descriptor with
4107 uint32_t qfi = 0;
4108 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004109 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4110 buffCI.size = 1024;
4111 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4112 buffCI.queueFamilyIndexCount = 1;
4113 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004114
4115 VkBuffer dyub;
4116 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4117 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06004118 // Allocate memory and bind to buffer so we can make it to the appropriate
4119 // error
4120 VkMemoryAllocateInfo mem_alloc = {};
4121 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4122 mem_alloc.pNext = NULL;
4123 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12004124 mem_alloc.memoryTypeIndex = 0;
4125
4126 VkMemoryRequirements memReqs;
4127 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
4128 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
4129 0);
4130 if (!pass) {
4131 vkDestroyBuffer(m_device->device(), dyub, NULL);
4132 return;
4133 }
4134
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06004135 VkDeviceMemory mem;
4136 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
4137 ASSERT_VK_SUCCESS(err);
4138 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4139 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004140 // Correctly update descriptor to avoid "NOT_UPDATED" error
4141 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004142 buffInfo.buffer = dyub;
4143 buffInfo.offset = 0;
4144 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004145
4146 VkWriteDescriptorSet descriptor_write;
4147 memset(&descriptor_write, 0, sizeof(descriptor_write));
4148 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4149 descriptor_write.dstSet = descriptorSet;
4150 descriptor_write.dstBinding = 0;
4151 descriptor_write.descriptorCount = 1;
4152 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
4153 descriptor_write.pBufferInfo = &buffInfo;
4154
4155 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4156
4157 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004158 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4159 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4160 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004161 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07004162 uint32_t pDynOff[2] = {512, 756};
4163 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07004164 m_errorMonitor->SetDesiredFailureMsg(
4165 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07004166 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07004167 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4168 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4169 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12004170 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07004171 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06004172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4173 " dynamic offset 512 combined with "
4174 "offset 0 and range 1024 that "
4175 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07004176 // Create PSO to be used for draw-time errors below
4177 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12004178 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07004179 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07004180 "out gl_PerVertex { \n"
4181 " vec4 gl_Position;\n"
4182 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07004183 "void main(){\n"
4184 " gl_Position = vec4(1);\n"
4185 "}\n";
4186 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12004187 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07004188 "\n"
4189 "layout(location=0) out vec4 x;\n"
4190 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
4191 "void main(){\n"
4192 " x = vec4(bar.y);\n"
4193 "}\n";
4194 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4195 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4196 VkPipelineObj pipe(m_device);
4197 pipe.AddShader(&vs);
4198 pipe.AddShader(&fs);
4199 pipe.AddColorAttachment();
4200 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4201
Karl Schultz6addd812016-02-02 17:17:23 -07004202 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4203 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4204 // This update should succeed, but offset size of 512 will overstep buffer
4205 // /w range 1024 & size 1024
4206 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4207 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4208 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07004209 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004210 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004211
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06004212 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06004213 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06004214
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004215 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4216 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4217}
4218
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004219TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004220 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004221 ASSERT_NO_FATAL_FAILURE(InitState());
4222 ASSERT_NO_FATAL_FAILURE(InitViewport());
4223 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4224
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004225 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004226 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004227 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4228 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4229 pipeline_layout_ci.pushConstantRangeCount = 1;
4230 pipeline_layout_ci.pPushConstantRanges = &pc_range;
4231
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004232 //
4233 // Check for invalid push constant ranges in pipeline layouts.
4234 //
4235 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06004236 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004237 char const *msg;
4238 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004239
Karl Schultzc81037d2016-05-12 08:11:23 -06004240 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
4241 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
4242 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
4243 "vkCreatePipelineLayout() call has push constants index 0 with "
4244 "size 0."},
4245 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
4246 "vkCreatePipelineLayout() call has push constants index 0 with "
4247 "size 1."},
4248 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
4249 "vkCreatePipelineLayout() call has push constants index 0 with "
4250 "size 1."},
4251 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
4252 "vkCreatePipelineLayout() call has push constants index 0 with "
4253 "size 0."},
4254 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
4255 "vkCreatePipelineLayout() call has push constants index 0 with "
4256 "offset 1. Offset must"},
4257 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
4258 "vkCreatePipelineLayout() call has push constants index 0 "
4259 "with offset "},
4260 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
4261 "vkCreatePipelineLayout() call has push constants "
4262 "index 0 with offset "},
4263 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
4264 "vkCreatePipelineLayout() call has push constants index 0 "
4265 "with offset "},
4266 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
4267 "vkCreatePipelineLayout() call has push "
4268 "constants index 0 with offset "},
4269 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
4270 "vkCreatePipelineLayout() call has push "
4271 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004272 }};
4273
4274 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06004275 for (const auto &iter : range_tests) {
4276 pc_range = iter.range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004277 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4278 iter.msg);
4279 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
4280 NULL, &pipeline_layout);
4281 m_errorMonitor->VerifyFound();
4282 if (VK_SUCCESS == err) {
4283 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4284 }
4285 }
4286
4287 // Check for invalid stage flag
4288 pc_range.offset = 0;
4289 pc_range.size = 16;
4290 pc_range.stageFlags = 0;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004291 m_errorMonitor->SetDesiredFailureMsg(
4292 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004293 "vkCreatePipelineLayout() call has no stageFlags set.");
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004294 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4295 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004296 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004297 if (VK_SUCCESS == err) {
4298 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4299 }
4300
4301 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06004302 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004303 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06004304 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004305 char const *msg;
4306 };
4307
Karl Schultzc81037d2016-05-12 08:11:23 -06004308 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004309 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4310 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4311 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4312 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4313 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
4314 "vkCreatePipelineLayout() call has push constants with overlapping "
4315 "ranges: 0:[0, 4), 1:[0, 4)"},
4316 {
4317 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4318 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
4319 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
4320 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
4321 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
4322 "vkCreatePipelineLayout() call has push constants with "
4323 "overlapping "
4324 "ranges: 3:[12, 20), 4:[16, 20)",
4325 },
4326 {
4327 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
4328 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
4329 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
4330 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
4331 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
4332 "vkCreatePipelineLayout() call has push constants with "
4333 "overlapping "
4334 "ranges: 0:[16, 20), 1:[12, 20)",
4335 },
4336 {
4337 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
4338 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
4339 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
4340 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
4341 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
4342 "vkCreatePipelineLayout() call has push constants with "
4343 "overlapping "
4344 "ranges: 0:[16, 20), 3:[12, 20)",
4345 },
4346 {
4347 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
4348 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
4349 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
4350 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
4351 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
4352 "vkCreatePipelineLayout() call has push constants with "
4353 "overlapping "
4354 "ranges: 0:[16, 20), 2:[4, 100)",
4355 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004356
Karl Schultzc81037d2016-05-12 08:11:23 -06004357 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004358 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06004359 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
4360 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004361 iter.msg);
4362 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
4363 NULL, &pipeline_layout);
4364 m_errorMonitor->VerifyFound();
4365 if (VK_SUCCESS == err) {
4366 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4367 }
4368 }
4369
4370 // Run some positive tests to make sure overlap checking in the layer is OK
Karl Schultzc81037d2016-05-12 08:11:23 -06004371 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos =
4372 {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4373 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
4374 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
4375 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
4376 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
4377 ""},
4378 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
4379 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
4380 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
4381 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
4382 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
4383 ""}}};
4384 for (const auto &iter : overlapping_range_tests_pos) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004385 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
4386 m_errorMonitor->ExpectSuccess();
4387 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
4388 NULL, &pipeline_layout);
4389 m_errorMonitor->VerifyNotFound();
4390 if (VK_SUCCESS == err) {
4391 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4392 }
4393 }
4394
4395 //
4396 // CmdPushConstants tests
4397 //
Karl Schultzc81037d2016-05-12 08:11:23 -06004398 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004399
4400 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzc81037d2016-05-12 08:11:23 -06004401 const std::array<PipelineLayoutTestCase, 16> cmd_range_tests = {{
4402 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
4403 "vkCmdPushConstants() call has push constants with size 0. Size "
4404 "must be greater than zero and a multiple of 4."},
4405 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
4406 "vkCmdPushConstants() call has push constants with size 1. Size "
4407 "must be greater than zero and a multiple of 4."},
4408 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
4409 "vkCmdPushConstants() call has push constants with size 1. Size "
4410 "must be greater than zero and a multiple of 4."},
4411 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
4412 "vkCmdPushConstants() call has push constants with offset 1. "
4413 "Offset must be a multiple of 4."},
4414 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
4415 "vkCmdPushConstants() call has push constants with offset 1. "
4416 "Offset must be a multiple of 4."},
4417 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
4418 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
4419 "0x1 not within flag-matching ranges in pipeline layout"},
4420 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
4421 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
4422 "0x1 not within flag-matching ranges in pipeline layout"},
4423 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
4424 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
4425 "0x1 not within flag-matching ranges in pipeline layout"},
4426 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
4427 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
4428 "0x1 not within flag-matching ranges in pipeline layout"},
4429 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
4430 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
4431 "any of the ranges in pipeline layout"},
4432 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
4433 0, 16},
4434 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
4435 "any of the ranges in pipeline layout"},
4436 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004437 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06004438 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004439 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06004440 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004441 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06004442 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004443 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06004444 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004445 "vkCmdPushConstants() call has push constants with offset "},
4446 }};
4447
4448 // Two ranges for testing robustness
Karl Schultzc81037d2016-05-12 08:11:23 -06004449 const VkPushConstantRange pc_range2[] = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004450 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06004451 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004452 };
Karl Schultzc81037d2016-05-12 08:11:23 -06004453 pipeline_layout_ci.pushConstantRangeCount =
4454 sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004455 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004456 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4457 &pipeline_layout);
4458 ASSERT_VK_SUCCESS(err);
4459 BeginCommandBuffer();
Karl Schultzc81037d2016-05-12 08:11:23 -06004460 for (const auto &iter : cmd_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4462 iter.msg);
4463 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
Karl Schultzc81037d2016-05-12 08:11:23 -06004464 iter.range.stageFlags, iter.range.offset,
4465 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004466 m_errorMonitor->VerifyFound();
4467 }
4468
4469 // Check for invalid stage flag
4470 m_errorMonitor->SetDesiredFailureMsg(
4471 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4472 "vkCmdPushConstants() call has no stageFlags set.");
4473 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0,
Karl Schultzc81037d2016-05-12 08:11:23 -06004474 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004475 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06004476 EndCommandBuffer();
4477 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
4478 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004479
Karl Schultzc81037d2016-05-12 08:11:23 -06004480 // overlapping range tests with cmd
4481 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
4482 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
4483 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
4484 "0x1 not within flag-matching ranges in pipeline layout"},
4485 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
4486 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
4487 "0x1 not within flag-matching ranges in pipeline layout"},
4488 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
4489 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
4490 "0x1 not within flag-matching ranges in pipeline layout"},
4491 }};
4492 const VkPushConstantRange pc_range3[] = {
4493 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
4494 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
4495 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4496 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
4497 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
4498 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
4499 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
4500 };
4501 pipeline_layout_ci.pushConstantRangeCount =
4502 sizeof(pc_range3) / sizeof(VkPushConstantRange);
4503 pipeline_layout_ci.pPushConstantRanges = pc_range3;
4504 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4505 &pipeline_layout);
4506 ASSERT_VK_SUCCESS(err);
4507 BeginCommandBuffer();
4508 for (const auto &iter : cmd_overlap_tests) {
4509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4510 iter.msg);
4511 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
4512 iter.range.stageFlags, iter.range.offset,
4513 iter.range.size, dummy_values);
4514 m_errorMonitor->VerifyFound();
4515 }
4516 EndCommandBuffer();
4517 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
4518 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4519
4520 // positive overlapping range tests with cmd
4521 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
4522 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
4523 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
4524 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
4525 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
4526 }};
4527 const VkPushConstantRange pc_range4[] = {
4528 {VK_SHADER_STAGE_VERTEX_BIT, 0, 64},
4529 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
4530 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
4531 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4532 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
4533 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
4534 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
4535 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
4536 };
4537 pipeline_layout_ci.pushConstantRangeCount =
4538 sizeof(pc_range4) / sizeof(VkPushConstantRange);
4539 pipeline_layout_ci.pPushConstantRanges = pc_range4;
4540 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4541 &pipeline_layout);
4542 ASSERT_VK_SUCCESS(err);
4543 BeginCommandBuffer();
4544 for (const auto &iter : cmd_overlap_tests_pos) {
4545 m_errorMonitor->ExpectSuccess();
4546 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
4547 iter.range.stageFlags, iter.range.offset,
4548 iter.range.size, dummy_values);
4549 m_errorMonitor->VerifyNotFound();
4550 }
4551 EndCommandBuffer();
4552 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004553 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4554}
4555
Karl Schultz6addd812016-02-02 17:17:23 -07004556TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07004557 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07004558 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004559
4560 ASSERT_NO_FATAL_FAILURE(InitState());
4561 ASSERT_NO_FATAL_FAILURE(InitViewport());
4562 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4563
4564 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
4565 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004566 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4567 ds_type_count[0].descriptorCount = 10;
4568 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
4569 ds_type_count[1].descriptorCount = 2;
4570 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
4571 ds_type_count[2].descriptorCount = 2;
4572 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
4573 ds_type_count[3].descriptorCount = 5;
4574 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
4575 // type
4576 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4577 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4578 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004579
4580 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004581 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4582 ds_pool_ci.pNext = NULL;
4583 ds_pool_ci.maxSets = 5;
4584 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
4585 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004586
4587 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004588 err =
4589 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004590 ASSERT_VK_SUCCESS(err);
4591
4592 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
4593 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004594 dsl_binding[0].binding = 0;
4595 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4596 dsl_binding[0].descriptorCount = 5;
4597 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4598 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004599
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004600 // Create layout identical to set0 layout but w/ different stageFlags
4601 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004602 dsl_fs_stage_only.binding = 0;
4603 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4604 dsl_fs_stage_only.descriptorCount = 5;
4605 dsl_fs_stage_only.stageFlags =
4606 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
4607 // bind time
4608 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004609 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004610 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4611 ds_layout_ci.pNext = NULL;
4612 ds_layout_ci.bindingCount = 1;
4613 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004614 static const uint32_t NUM_LAYOUTS = 4;
4615 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004616 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004617 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
4618 // layout for error case
4619 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4620 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004621 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004622 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07004623 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4624 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004625 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004626 dsl_binding[0].binding = 0;
4627 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004628 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07004629 dsl_binding[1].binding = 1;
4630 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
4631 dsl_binding[1].descriptorCount = 2;
4632 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
4633 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004634 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004635 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07004636 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4637 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004638 ASSERT_VK_SUCCESS(err);
4639 dsl_binding[0].binding = 0;
4640 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004641 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004642 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07004643 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4644 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004645 ASSERT_VK_SUCCESS(err);
4646 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004647 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07004648 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4649 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004650 ASSERT_VK_SUCCESS(err);
4651
4652 static const uint32_t NUM_SETS = 4;
4653 VkDescriptorSet descriptorSet[NUM_SETS] = {};
4654 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004655 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004656 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004657 alloc_info.descriptorPool = ds_pool;
4658 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004659 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4660 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004661 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004662 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07004663 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004664 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07004665 err =
4666 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004667 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004668
4669 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004670 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4671 pipeline_layout_ci.pNext = NULL;
4672 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
4673 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004674
4675 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004676 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4677 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004678 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004679 // Create pipelineLayout with only one setLayout
4680 pipeline_layout_ci.setLayoutCount = 1;
4681 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004682 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4683 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004684 ASSERT_VK_SUCCESS(err);
4685 // Create pipelineLayout with 2 descriptor setLayout at index 0
4686 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
4687 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07004688 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4689 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004690 ASSERT_VK_SUCCESS(err);
4691 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
4692 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
4693 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07004694 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4695 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004696 ASSERT_VK_SUCCESS(err);
4697 // Create pipelineLayout with UB type, but stageFlags for FS only
4698 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
4699 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07004700 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4701 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004702 ASSERT_VK_SUCCESS(err);
4703 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
4704 VkDescriptorSetLayout pl_bad_s0[2] = {};
4705 pl_bad_s0[0] = ds_layout_fs_only;
4706 pl_bad_s0[1] = ds_layout[1];
4707 pipeline_layout_ci.setLayoutCount = 2;
4708 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
4709 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07004710 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4711 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004712 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004713
4714 // Create a buffer to update the descriptor with
4715 uint32_t qfi = 0;
4716 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004717 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4718 buffCI.size = 1024;
4719 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4720 buffCI.queueFamilyIndexCount = 1;
4721 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004722
4723 VkBuffer dyub;
4724 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4725 ASSERT_VK_SUCCESS(err);
4726 // Correctly update descriptor to avoid "NOT_UPDATED" error
4727 static const uint32_t NUM_BUFFS = 5;
4728 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004729 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07004730 buffInfo[i].buffer = dyub;
4731 buffInfo[i].offset = 0;
4732 buffInfo[i].range = 1024;
4733 }
Karl Schultz6addd812016-02-02 17:17:23 -07004734 VkImage image;
4735 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4736 const int32_t tex_width = 32;
4737 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004738 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004739 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4740 image_create_info.pNext = NULL;
4741 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4742 image_create_info.format = tex_format;
4743 image_create_info.extent.width = tex_width;
4744 image_create_info.extent.height = tex_height;
4745 image_create_info.extent.depth = 1;
4746 image_create_info.mipLevels = 1;
4747 image_create_info.arrayLayers = 1;
4748 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4749 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4750 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4751 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004752 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
4753 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004754
Karl Schultz6addd812016-02-02 17:17:23 -07004755 VkMemoryRequirements memReqs;
4756 VkDeviceMemory imageMem;
4757 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07004758 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004759 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4760 memAlloc.pNext = NULL;
4761 memAlloc.allocationSize = 0;
4762 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07004763 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
4764 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07004765 pass =
4766 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07004767 ASSERT_TRUE(pass);
4768 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
4769 ASSERT_VK_SUCCESS(err);
4770 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
4771 ASSERT_VK_SUCCESS(err);
4772
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004773 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004774 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4775 image_view_create_info.image = image;
4776 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
4777 image_view_create_info.format = tex_format;
4778 image_view_create_info.subresourceRange.layerCount = 1;
4779 image_view_create_info.subresourceRange.baseMipLevel = 0;
4780 image_view_create_info.subresourceRange.levelCount = 1;
4781 image_view_create_info.subresourceRange.aspectMask =
4782 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004783
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004784 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07004785 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
4786 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004787 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004788 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004789 imageInfo[0].imageView = view;
4790 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4791 imageInfo[1].imageView = view;
4792 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004793 imageInfo[2].imageView = view;
4794 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4795 imageInfo[3].imageView = view;
4796 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004797
4798 static const uint32_t NUM_SET_UPDATES = 3;
4799 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
4800 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4801 descriptor_write[0].dstSet = descriptorSet[0];
4802 descriptor_write[0].dstBinding = 0;
4803 descriptor_write[0].descriptorCount = 5;
4804 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4805 descriptor_write[0].pBufferInfo = buffInfo;
4806 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4807 descriptor_write[1].dstSet = descriptorSet[1];
4808 descriptor_write[1].dstBinding = 0;
4809 descriptor_write[1].descriptorCount = 2;
4810 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
4811 descriptor_write[1].pImageInfo = imageInfo;
4812 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4813 descriptor_write[2].dstSet = descriptorSet[1];
4814 descriptor_write[2].dstBinding = 1;
4815 descriptor_write[2].descriptorCount = 2;
4816 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004817 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004818
4819 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004820
Tobin Ehlis88452832015-12-03 09:40:56 -07004821 // Create PSO to be used for draw-time errors below
4822 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12004823 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07004824 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07004825 "out gl_PerVertex {\n"
4826 " vec4 gl_Position;\n"
4827 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07004828 "void main(){\n"
4829 " gl_Position = vec4(1);\n"
4830 "}\n";
4831 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12004832 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07004833 "\n"
4834 "layout(location=0) out vec4 x;\n"
4835 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
4836 "void main(){\n"
4837 " x = vec4(bar.y);\n"
4838 "}\n";
4839 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4840 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004841 VkPipelineObj pipe(m_device);
4842 pipe.AddShader(&vs);
4843 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07004844 pipe.AddColorAttachment();
4845 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07004846
4847 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07004848
Karl Schultz6addd812016-02-02 17:17:23 -07004849 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4850 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4851 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
4852 // of PSO
4853 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
4854 // cmd_pipeline.c
4855 // due to the fact that cmd_alloc_dset_data() has not been called in
4856 // cmd_bind_graphics_pipeline()
4857 // TODO : Want to cause various binding incompatibility issues here to test
4858 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07004859 // First cause various verify_layout_compatibility() fails
4860 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004861 // verify_set_layout_compatibility fail cases:
4862 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07004863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4864 " due to: invalid VkPipelineLayout ");
4865 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4866 VK_PIPELINE_BIND_POINT_GRAPHICS,
4867 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
4868 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004869 m_errorMonitor->VerifyFound();
4870
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004871 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07004872 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4873 " attempting to bind set to index 1");
4874 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4875 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
4876 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004877 m_errorMonitor->VerifyFound();
4878
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004879 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07004880 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
4881 // descriptors
4882 m_errorMonitor->SetDesiredFailureMsg(
4883 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06004884 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07004885 vkCmdBindDescriptorSets(
4886 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4887 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004888 m_errorMonitor->VerifyFound();
4889
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004890 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
4891 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07004892 m_errorMonitor->SetDesiredFailureMsg(
4893 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06004894 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07004895 vkCmdBindDescriptorSets(
4896 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4897 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004898 m_errorMonitor->VerifyFound();
4899
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004900 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
4901 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07004902 m_errorMonitor->SetDesiredFailureMsg(
4903 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06004904 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07004905 vkCmdBindDescriptorSets(
4906 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4907 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004908 m_errorMonitor->VerifyFound();
4909
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004910 // Cause INFO messages due to disturbing previously bound Sets
4911 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07004912 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4913 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4914 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004915 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07004916 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004917 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004918 " previously bound as set #0 was disturbed ");
4919 vkCmdBindDescriptorSets(
4920 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4921 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004922 m_errorMonitor->VerifyFound();
4923
Karl Schultz6addd812016-02-02 17:17:23 -07004924 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4925 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4926 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004927 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004929 " newly bound as set #0 so set #1 and "
4930 "any subsequent sets were disturbed ");
4931 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4932 VK_PIPELINE_BIND_POINT_GRAPHICS,
4933 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004934 m_errorMonitor->VerifyFound();
4935
Tobin Ehlis88452832015-12-03 09:40:56 -07004936 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07004937 // 1. Error due to not binding required set (we actually use same code as
4938 // above to disturb set0)
4939 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4940 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4941 2, &descriptorSet[0], 0, NULL);
4942 vkCmdBindDescriptorSets(
4943 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4944 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
4945 m_errorMonitor->SetDesiredFailureMsg(
4946 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4947 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07004948 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004949 m_errorMonitor->VerifyFound();
4950
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004951 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07004952 // 2. Error due to bound set not being compatible with PSO's
4953 // VkPipelineLayout (diff stageFlags in this case)
4954 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4955 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4956 2, &descriptorSet[0], 0, NULL);
4957 m_errorMonitor->SetDesiredFailureMsg(
4958 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4959 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07004960 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004961 m_errorMonitor->VerifyFound();
4962
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004963 // Remaining clean-up
4964 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07004965 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004966 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
4967 }
4968 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06004969 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
4970 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004971 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004972 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4973 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4974}
Tobin Ehlis559c6382015-11-05 09:52:49 -07004975
Karl Schultz6addd812016-02-02 17:17:23 -07004976TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004977
Karl Schultz6addd812016-02-02 17:17:23 -07004978 m_errorMonitor->SetDesiredFailureMsg(
4979 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004980 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004981
4982 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004983 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004984 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004985 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004986
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004987 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004988}
4989
Karl Schultz6addd812016-02-02 17:17:23 -07004990TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
4991 VkResult err;
4992 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004993
Karl Schultz6addd812016-02-02 17:17:23 -07004994 m_errorMonitor->SetDesiredFailureMsg(
4995 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07004996 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004997
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004998 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004999
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005000 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005001 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06005002 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005003 cmd.commandPool = m_commandPool;
5004 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005005 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06005006
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005007 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06005008 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06005009
5010 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005011 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07005012 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005013 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06005014 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07005015 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
5016 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005017 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06005018
5019 // The error should be caught by validation of the BeginCommandBuffer call
5020 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
5021
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005022 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005023 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06005024}
5025
Karl Schultz6addd812016-02-02 17:17:23 -07005026TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005027 // Cause error due to Begin while recording CB
5028 // Then cause 2 errors for attempting to reset CB w/o having
5029 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
5030 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005031 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005032 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005033
5034 ASSERT_NO_FATAL_FAILURE(InitState());
5035
5036 // Calls AllocateCommandBuffers
5037 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
5038
Karl Schultz6addd812016-02-02 17:17:23 -07005039 // Force the failure by setting the Renderpass and Framebuffer fields with
5040 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005041 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07005042 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005043 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5044 cmd_buf_info.pNext = NULL;
5045 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005046 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005047
5048 // Begin CB to transition to recording state
5049 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
5050 // Can't re-begin. This should trigger error
5051 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005052 m_errorMonitor->VerifyFound();
5053
Karl Schultz6addd812016-02-02 17:17:23 -07005054 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5055 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005056 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
5057 // Reset attempt will trigger error due to incorrect CommandPool state
5058 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005059 m_errorMonitor->VerifyFound();
5060
Karl Schultz6addd812016-02-02 17:17:23 -07005061 m_errorMonitor->SetDesiredFailureMsg(
5062 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5063 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005064 // Transition CB to RECORDED state
5065 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
5066 // Now attempting to Begin will implicitly reset, which triggers error
5067 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005068 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005069}
5070
Karl Schultz6addd812016-02-02 17:17:23 -07005071TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005072 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07005073 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005074
Karl Schultz6addd812016-02-02 17:17:23 -07005075 m_errorMonitor->SetDesiredFailureMsg(
5076 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005077 "Invalid Pipeline CreateInfo State: Vtx Shader required");
5078
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005079 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005080 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005081
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005082 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005083 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5084 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005085
5086 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005087 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5088 ds_pool_ci.pNext = NULL;
5089 ds_pool_ci.maxSets = 1;
5090 ds_pool_ci.poolSizeCount = 1;
5091 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005092
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005093 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005094 err =
5095 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005096 ASSERT_VK_SUCCESS(err);
5097
Tony Barboureb254902015-07-15 12:50:33 -06005098 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005099 dsl_binding.binding = 0;
5100 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5101 dsl_binding.descriptorCount = 1;
5102 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5103 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005104
Tony Barboureb254902015-07-15 12:50:33 -06005105 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005106 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5107 ds_layout_ci.pNext = NULL;
5108 ds_layout_ci.bindingCount = 1;
5109 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005110
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005111 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005112 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5113 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005114 ASSERT_VK_SUCCESS(err);
5115
5116 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005117 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005118 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005119 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005120 alloc_info.descriptorPool = ds_pool;
5121 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005122 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5123 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005124 ASSERT_VK_SUCCESS(err);
5125
Tony Barboureb254902015-07-15 12:50:33 -06005126 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005127 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5128 pipeline_layout_ci.setLayoutCount = 1;
5129 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005130
5131 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005132 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5133 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005134 ASSERT_VK_SUCCESS(err);
5135
Tobin Ehlise68360f2015-10-01 11:15:13 -06005136 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07005137 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06005138
5139 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005140 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5141 vp_state_ci.scissorCount = 1;
5142 vp_state_ci.pScissors = &sc;
5143 vp_state_ci.viewportCount = 1;
5144 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005145
Karl Schultzdfdb8d42016-03-08 10:30:21 -07005146 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
5147 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5148 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
5149 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
5150 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
5151 rs_state_ci.depthClampEnable = VK_FALSE;
5152 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
5153 rs_state_ci.depthBiasEnable = VK_FALSE;
5154
Tony Barboureb254902015-07-15 12:50:33 -06005155 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005156 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5157 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07005158 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07005159 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5160 gp_ci.layout = pipeline_layout;
5161 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06005162
5163 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005164 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5165 pc_ci.initialDataSize = 0;
5166 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005167
5168 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06005169 VkPipelineCache pipelineCache;
5170
Karl Schultz6addd812016-02-02 17:17:23 -07005171 err =
5172 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06005173 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005174 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5175 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005176
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005177 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005178
Chia-I Wuf7458c52015-10-26 21:10:41 +08005179 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5180 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5181 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5182 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005183}
Tobin Ehlis912df022015-09-17 08:46:18 -06005184/*// TODO : This test should be good, but needs Tess support in compiler to run
5185TEST_F(VkLayerTest, InvalidPatchControlPoints)
5186{
5187 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06005188 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005189
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005191 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
5192primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005193
Tobin Ehlis912df022015-09-17 08:46:18 -06005194 ASSERT_NO_FATAL_FAILURE(InitState());
5195 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06005196
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005197 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06005198 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005199 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06005200
5201 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5202 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5203 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005204 ds_pool_ci.poolSizeCount = 1;
5205 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06005206
5207 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005208 err = vkCreateDescriptorPool(m_device->device(),
5209VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06005210 ASSERT_VK_SUCCESS(err);
5211
5212 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08005213 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06005214 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08005215 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06005216 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5217 dsl_binding.pImmutableSamplers = NULL;
5218
5219 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005220 ds_layout_ci.sType =
5221VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06005222 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005223 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07005224 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06005225
5226 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005227 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5228&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06005229 ASSERT_VK_SUCCESS(err);
5230
5231 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005232 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
5233VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06005234 ASSERT_VK_SUCCESS(err);
5235
5236 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005237 pipeline_layout_ci.sType =
5238VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06005239 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005240 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06005241 pipeline_layout_ci.pSetLayouts = &ds_layout;
5242
5243 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005244 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5245&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06005246 ASSERT_VK_SUCCESS(err);
5247
5248 VkPipelineShaderStageCreateInfo shaderStages[3];
5249 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
5250
Karl Schultz6addd812016-02-02 17:17:23 -07005251 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
5252this);
Tobin Ehlis912df022015-09-17 08:46:18 -06005253 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07005254 VkShaderObj
5255tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
5256this);
5257 VkShaderObj
5258te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
5259this);
Tobin Ehlis912df022015-09-17 08:46:18 -06005260
Karl Schultz6addd812016-02-02 17:17:23 -07005261 shaderStages[0].sType =
5262VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005263 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06005264 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07005265 shaderStages[1].sType =
5266VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005267 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06005268 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07005269 shaderStages[2].sType =
5270VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005271 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06005272 shaderStages[2].shader = te.handle();
5273
5274 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005275 iaCI.sType =
5276VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08005277 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06005278
5279 VkPipelineTessellationStateCreateInfo tsCI = {};
5280 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
5281 tsCI.patchControlPoints = 0; // This will cause an error
5282
5283 VkGraphicsPipelineCreateInfo gp_ci = {};
5284 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5285 gp_ci.pNext = NULL;
5286 gp_ci.stageCount = 3;
5287 gp_ci.pStages = shaderStages;
5288 gp_ci.pVertexInputState = NULL;
5289 gp_ci.pInputAssemblyState = &iaCI;
5290 gp_ci.pTessellationState = &tsCI;
5291 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005292 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06005293 gp_ci.pMultisampleState = NULL;
5294 gp_ci.pDepthStencilState = NULL;
5295 gp_ci.pColorBlendState = NULL;
5296 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5297 gp_ci.layout = pipeline_layout;
5298 gp_ci.renderPass = renderPass();
5299
5300 VkPipelineCacheCreateInfo pc_ci = {};
5301 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5302 pc_ci.pNext = NULL;
5303 pc_ci.initialSize = 0;
5304 pc_ci.initialData = 0;
5305 pc_ci.maxSize = 0;
5306
5307 VkPipeline pipeline;
5308 VkPipelineCache pipelineCache;
5309
Karl Schultz6addd812016-02-02 17:17:23 -07005310 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
5311&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06005312 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005313 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5314&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06005315
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005316 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005317
Chia-I Wuf7458c52015-10-26 21:10:41 +08005318 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5319 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5320 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5321 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06005322}
5323*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06005324// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07005325TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07005326 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005327
Karl Schultz6addd812016-02-02 17:17:23 -07005328 m_errorMonitor->SetDesiredFailureMsg(
5329 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005330 "Gfx Pipeline viewport count (1) must match scissor count (0).");
5331
Tobin Ehlise68360f2015-10-01 11:15:13 -06005332 ASSERT_NO_FATAL_FAILURE(InitState());
5333 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06005334
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005335 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005336 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5337 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005338
5339 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005340 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5341 ds_pool_ci.maxSets = 1;
5342 ds_pool_ci.poolSizeCount = 1;
5343 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005344
5345 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005346 err =
5347 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005348 ASSERT_VK_SUCCESS(err);
5349
5350 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005351 dsl_binding.binding = 0;
5352 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5353 dsl_binding.descriptorCount = 1;
5354 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005355
5356 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005357 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5358 ds_layout_ci.bindingCount = 1;
5359 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005360
5361 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005362 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5363 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005364 ASSERT_VK_SUCCESS(err);
5365
5366 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005367 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005368 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005369 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005370 alloc_info.descriptorPool = ds_pool;
5371 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005372 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5373 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005374 ASSERT_VK_SUCCESS(err);
5375
5376 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005377 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5378 pipeline_layout_ci.setLayoutCount = 1;
5379 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005380
5381 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005382 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5383 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005384 ASSERT_VK_SUCCESS(err);
5385
5386 VkViewport vp = {}; // Just need dummy vp to point to
5387
5388 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005389 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5390 vp_state_ci.scissorCount = 0;
5391 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
5392 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005393
Karl Schultzdfdb8d42016-03-08 10:30:21 -07005394 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
5395 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5396 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
5397 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
5398 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
5399 rs_state_ci.depthClampEnable = VK_FALSE;
5400 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
5401 rs_state_ci.depthBiasEnable = VK_FALSE;
5402
Cody Northropeb3a6c12015-10-05 14:44:45 -06005403 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07005404 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06005405
Karl Schultz6addd812016-02-02 17:17:23 -07005406 VkShaderObj vs(m_device, bindStateVertShaderText,
5407 VK_SHADER_STAGE_VERTEX_BIT, this);
5408 VkShaderObj fs(m_device, bindStateFragShaderText,
5409 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005410 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005411 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08005412 shaderStages[0] = vs.GetStageCreateInfo();
5413 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005414
5415 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005416 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5417 gp_ci.stageCount = 2;
5418 gp_ci.pStages = shaderStages;
5419 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07005420 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07005421 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5422 gp_ci.layout = pipeline_layout;
5423 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005424
5425 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005426 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005427
5428 VkPipeline pipeline;
5429 VkPipelineCache pipelineCache;
5430
Karl Schultz6addd812016-02-02 17:17:23 -07005431 err =
5432 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005433 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005434 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5435 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005436
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005437 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005438
Chia-I Wuf7458c52015-10-26 21:10:41 +08005439 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5440 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5441 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5442 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005443}
Karl Schultz6addd812016-02-02 17:17:23 -07005444// Don't set viewport state in PSO. This is an error b/c we always need this
5445// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06005446// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07005447TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06005448 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07005449 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005450
Karl Schultz6addd812016-02-02 17:17:23 -07005451 m_errorMonitor->SetDesiredFailureMsg(
5452 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005453 "Gfx Pipeline pViewportState is null. Even if ");
5454
Tobin Ehlise68360f2015-10-01 11:15:13 -06005455 ASSERT_NO_FATAL_FAILURE(InitState());
5456 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06005457
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005458 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005459 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5460 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005461
5462 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005463 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5464 ds_pool_ci.maxSets = 1;
5465 ds_pool_ci.poolSizeCount = 1;
5466 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005467
5468 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005469 err =
5470 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005471 ASSERT_VK_SUCCESS(err);
5472
5473 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005474 dsl_binding.binding = 0;
5475 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5476 dsl_binding.descriptorCount = 1;
5477 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005478
5479 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005480 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5481 ds_layout_ci.bindingCount = 1;
5482 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005483
5484 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005485 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5486 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005487 ASSERT_VK_SUCCESS(err);
5488
5489 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005490 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005491 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005492 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005493 alloc_info.descriptorPool = ds_pool;
5494 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005495 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5496 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005497 ASSERT_VK_SUCCESS(err);
5498
5499 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005500 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5501 pipeline_layout_ci.setLayoutCount = 1;
5502 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005503
5504 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005505 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5506 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005507 ASSERT_VK_SUCCESS(err);
5508
5509 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
5510 // Set scissor as dynamic to avoid second error
5511 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005512 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5513 dyn_state_ci.dynamicStateCount = 1;
5514 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005515
Cody Northropeb3a6c12015-10-05 14:44:45 -06005516 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07005517 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06005518
Karl Schultz6addd812016-02-02 17:17:23 -07005519 VkShaderObj vs(m_device, bindStateVertShaderText,
5520 VK_SHADER_STAGE_VERTEX_BIT, this);
5521 VkShaderObj fs(m_device, bindStateFragShaderText,
5522 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005523 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005524 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08005525 shaderStages[0] = vs.GetStageCreateInfo();
5526 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005527
Karl Schultzdfdb8d42016-03-08 10:30:21 -07005528
5529 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
5530 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5531 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
5532 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
5533 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
5534 rs_state_ci.depthClampEnable = VK_FALSE;
5535 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
5536 rs_state_ci.depthBiasEnable = VK_FALSE;
5537
Tobin Ehlise68360f2015-10-01 11:15:13 -06005538 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005539 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5540 gp_ci.stageCount = 2;
5541 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07005542 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07005543 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
5544 // should cause validation error
5545 gp_ci.pDynamicState = &dyn_state_ci;
5546 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5547 gp_ci.layout = pipeline_layout;
5548 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005549
5550 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005551 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005552
5553 VkPipeline pipeline;
5554 VkPipelineCache pipelineCache;
5555
Karl Schultz6addd812016-02-02 17:17:23 -07005556 err =
5557 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005558 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005559 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5560 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005561
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005562 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005563
Chia-I Wuf7458c52015-10-26 21:10:41 +08005564 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5565 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5566 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5567 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005568}
5569// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07005570// Then run second test where dynamic scissor count doesn't match PSO scissor
5571// count
5572TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
5573 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005574
Karl Schultz6addd812016-02-02 17:17:23 -07005575 m_errorMonitor->SetDesiredFailureMsg(
5576 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005577 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
5578
Tobin Ehlise68360f2015-10-01 11:15:13 -06005579 ASSERT_NO_FATAL_FAILURE(InitState());
5580 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06005581
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005582 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005583 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5584 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005585
5586 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005587 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5588 ds_pool_ci.maxSets = 1;
5589 ds_pool_ci.poolSizeCount = 1;
5590 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005591
5592 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005593 err =
5594 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005595 ASSERT_VK_SUCCESS(err);
5596
5597 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005598 dsl_binding.binding = 0;
5599 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5600 dsl_binding.descriptorCount = 1;
5601 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005602
5603 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005604 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5605 ds_layout_ci.bindingCount = 1;
5606 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005607
5608 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005609 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5610 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005611 ASSERT_VK_SUCCESS(err);
5612
5613 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005614 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005615 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005616 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005617 alloc_info.descriptorPool = ds_pool;
5618 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005619 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5620 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005621 ASSERT_VK_SUCCESS(err);
5622
5623 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005624 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5625 pipeline_layout_ci.setLayoutCount = 1;
5626 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005627
5628 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005629 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5630 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005631 ASSERT_VK_SUCCESS(err);
5632
5633 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005634 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5635 vp_state_ci.viewportCount = 1;
5636 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
5637 vp_state_ci.scissorCount = 1;
5638 vp_state_ci.pScissors =
5639 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06005640
5641 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
5642 // Set scissor as dynamic to avoid that error
5643 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005644 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5645 dyn_state_ci.dynamicStateCount = 1;
5646 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005647
Cody Northropeb3a6c12015-10-05 14:44:45 -06005648 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07005649 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06005650
Karl Schultz6addd812016-02-02 17:17:23 -07005651 VkShaderObj vs(m_device, bindStateVertShaderText,
5652 VK_SHADER_STAGE_VERTEX_BIT, this);
5653 VkShaderObj fs(m_device, bindStateFragShaderText,
5654 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005655 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005656 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08005657 shaderStages[0] = vs.GetStageCreateInfo();
5658 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005659
Cody Northropf6622dc2015-10-06 10:33:21 -06005660 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5661 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5662 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005663 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06005664 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005665 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06005666 vi_ci.pVertexAttributeDescriptions = nullptr;
5667
5668 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5669 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5670 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5671
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005672 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005673 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06005674 rs_ci.pNext = nullptr;
5675
Mark Youngc89c6312016-03-31 16:03:20 -06005676 VkPipelineColorBlendAttachmentState att = {};
5677 att.blendEnable = VK_FALSE;
5678 att.colorWriteMask = 0xf;
5679
Cody Northropf6622dc2015-10-06 10:33:21 -06005680 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5681 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5682 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06005683 cb_ci.attachmentCount = 1;
5684 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06005685
Tobin Ehlise68360f2015-10-01 11:15:13 -06005686 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005687 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5688 gp_ci.stageCount = 2;
5689 gp_ci.pStages = shaderStages;
5690 gp_ci.pVertexInputState = &vi_ci;
5691 gp_ci.pInputAssemblyState = &ia_ci;
5692 gp_ci.pViewportState = &vp_state_ci;
5693 gp_ci.pRasterizationState = &rs_ci;
5694 gp_ci.pColorBlendState = &cb_ci;
5695 gp_ci.pDynamicState = &dyn_state_ci;
5696 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5697 gp_ci.layout = pipeline_layout;
5698 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005699
5700 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005701 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005702
5703 VkPipeline pipeline;
5704 VkPipelineCache pipelineCache;
5705
Karl Schultz6addd812016-02-02 17:17:23 -07005706 err =
5707 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005708 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005709 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5710 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005711
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005712 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005713
Tobin Ehlisd332f282015-10-02 11:00:56 -06005714 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07005715 // First need to successfully create the PSO from above by setting
5716 // pViewports
5717 m_errorMonitor->SetDesiredFailureMsg(
5718 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5719 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
5720 "scissorCount is 1. These counts must match.");
5721
5722 VkViewport vp = {}; // Just need dummy vp to point to
5723 vp_state_ci.pViewports = &vp;
5724 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5725 &gp_ci, NULL, &pipeline);
5726 ASSERT_VK_SUCCESS(err);
5727 BeginCommandBuffer();
5728 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5729 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5730 VkRect2D scissors[2] = {}; // don't care about data
5731 // Count of 2 doesn't match PSO count of 1
5732 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
5733 Draw(1, 0, 0, 0);
5734
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005735 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07005736
5737 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5738 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5739 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5740 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5741}
5742// Create PSO w/o non-zero scissorCount but no scissor data
5743// Then run second test where dynamic viewportCount doesn't match PSO
5744// viewportCount
5745TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
5746 VkResult err;
5747
5748 m_errorMonitor->SetDesiredFailureMsg(
5749 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5750 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
5751
5752 ASSERT_NO_FATAL_FAILURE(InitState());
5753 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5754
5755 VkDescriptorPoolSize ds_type_count = {};
5756 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5757 ds_type_count.descriptorCount = 1;
5758
5759 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5760 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5761 ds_pool_ci.maxSets = 1;
5762 ds_pool_ci.poolSizeCount = 1;
5763 ds_pool_ci.pPoolSizes = &ds_type_count;
5764
5765 VkDescriptorPool ds_pool;
5766 err =
5767 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5768 ASSERT_VK_SUCCESS(err);
5769
5770 VkDescriptorSetLayoutBinding dsl_binding = {};
5771 dsl_binding.binding = 0;
5772 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5773 dsl_binding.descriptorCount = 1;
5774 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5775
5776 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5777 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5778 ds_layout_ci.bindingCount = 1;
5779 ds_layout_ci.pBindings = &dsl_binding;
5780
5781 VkDescriptorSetLayout ds_layout;
5782 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5783 &ds_layout);
5784 ASSERT_VK_SUCCESS(err);
5785
5786 VkDescriptorSet descriptorSet;
5787 VkDescriptorSetAllocateInfo alloc_info = {};
5788 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5789 alloc_info.descriptorSetCount = 1;
5790 alloc_info.descriptorPool = ds_pool;
5791 alloc_info.pSetLayouts = &ds_layout;
5792 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5793 &descriptorSet);
5794 ASSERT_VK_SUCCESS(err);
5795
5796 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5797 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5798 pipeline_layout_ci.setLayoutCount = 1;
5799 pipeline_layout_ci.pSetLayouts = &ds_layout;
5800
5801 VkPipelineLayout pipeline_layout;
5802 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5803 &pipeline_layout);
5804 ASSERT_VK_SUCCESS(err);
5805
5806 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5807 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5808 vp_state_ci.scissorCount = 1;
5809 vp_state_ci.pScissors =
5810 NULL; // Null scissor w/ count of 1 should cause error
5811 vp_state_ci.viewportCount = 1;
5812 vp_state_ci.pViewports =
5813 NULL; // vp is dynamic (below) so this won't cause error
5814
5815 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
5816 // Set scissor as dynamic to avoid that error
5817 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5818 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5819 dyn_state_ci.dynamicStateCount = 1;
5820 dyn_state_ci.pDynamicStates = &vp_state;
5821
5822 VkPipelineShaderStageCreateInfo shaderStages[2];
5823 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5824
5825 VkShaderObj vs(m_device, bindStateVertShaderText,
5826 VK_SHADER_STAGE_VERTEX_BIT, this);
5827 VkShaderObj fs(m_device, bindStateFragShaderText,
5828 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005829 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005830 // but add it to be able to run on more devices
5831 shaderStages[0] = vs.GetStageCreateInfo();
5832 shaderStages[1] = fs.GetStageCreateInfo();
5833
5834 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5835 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5836 vi_ci.pNext = nullptr;
5837 vi_ci.vertexBindingDescriptionCount = 0;
5838 vi_ci.pVertexBindingDescriptions = nullptr;
5839 vi_ci.vertexAttributeDescriptionCount = 0;
5840 vi_ci.pVertexAttributeDescriptions = nullptr;
5841
5842 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5843 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5844 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5845
5846 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5847 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5848 rs_ci.pNext = nullptr;
5849
Mark Youngc89c6312016-03-31 16:03:20 -06005850 VkPipelineColorBlendAttachmentState att = {};
5851 att.blendEnable = VK_FALSE;
5852 att.colorWriteMask = 0xf;
5853
Karl Schultz6addd812016-02-02 17:17:23 -07005854 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5855 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5856 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06005857 cb_ci.attachmentCount = 1;
5858 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07005859
5860 VkGraphicsPipelineCreateInfo gp_ci = {};
5861 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5862 gp_ci.stageCount = 2;
5863 gp_ci.pStages = shaderStages;
5864 gp_ci.pVertexInputState = &vi_ci;
5865 gp_ci.pInputAssemblyState = &ia_ci;
5866 gp_ci.pViewportState = &vp_state_ci;
5867 gp_ci.pRasterizationState = &rs_ci;
5868 gp_ci.pColorBlendState = &cb_ci;
5869 gp_ci.pDynamicState = &dyn_state_ci;
5870 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5871 gp_ci.layout = pipeline_layout;
5872 gp_ci.renderPass = renderPass();
5873
5874 VkPipelineCacheCreateInfo pc_ci = {};
5875 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5876
5877 VkPipeline pipeline;
5878 VkPipelineCache pipelineCache;
5879
5880 err =
5881 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5882 ASSERT_VK_SUCCESS(err);
5883 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5884 &gp_ci, NULL, &pipeline);
5885
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005886 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07005887
5888 // Now hit second fail case where we set scissor w/ different count than PSO
5889 // First need to successfully create the PSO from above by setting
5890 // pViewports
5891 m_errorMonitor->SetDesiredFailureMsg(
5892 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5893 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
5894 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005895
Tobin Ehlisd332f282015-10-02 11:00:56 -06005896 VkRect2D sc = {}; // Just need dummy vp to point to
5897 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07005898 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5899 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06005900 ASSERT_VK_SUCCESS(err);
5901 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005902 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5903 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06005904 VkViewport viewports[2] = {}; // don't care about data
5905 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07005906 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06005907 Draw(1, 0, 0, 0);
5908
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005909 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005910
Chia-I Wuf7458c52015-10-26 21:10:41 +08005911 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5912 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5913 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5914 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005915}
5916
Mark Young7394fdd2016-03-31 14:56:43 -06005917TEST_F(VkLayerTest, PSOLineWidthInvalid) {
5918 VkResult err;
5919
5920 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06005921 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06005922
5923 ASSERT_NO_FATAL_FAILURE(InitState());
5924 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5925
5926 VkDescriptorPoolSize ds_type_count = {};
5927 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5928 ds_type_count.descriptorCount = 1;
5929
5930 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5931 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5932 ds_pool_ci.maxSets = 1;
5933 ds_pool_ci.poolSizeCount = 1;
5934 ds_pool_ci.pPoolSizes = &ds_type_count;
5935
5936 VkDescriptorPool ds_pool;
5937 err =
5938 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5939 ASSERT_VK_SUCCESS(err);
5940
5941 VkDescriptorSetLayoutBinding dsl_binding = {};
5942 dsl_binding.binding = 0;
5943 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5944 dsl_binding.descriptorCount = 1;
5945 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5946
5947 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5948 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5949 ds_layout_ci.bindingCount = 1;
5950 ds_layout_ci.pBindings = &dsl_binding;
5951
5952 VkDescriptorSetLayout ds_layout;
5953 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5954 &ds_layout);
5955 ASSERT_VK_SUCCESS(err);
5956
5957 VkDescriptorSet descriptorSet;
5958 VkDescriptorSetAllocateInfo alloc_info = {};
5959 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5960 alloc_info.descriptorSetCount = 1;
5961 alloc_info.descriptorPool = ds_pool;
5962 alloc_info.pSetLayouts = &ds_layout;
5963 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5964 &descriptorSet);
5965 ASSERT_VK_SUCCESS(err);
5966
5967 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5968 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5969 pipeline_layout_ci.setLayoutCount = 1;
5970 pipeline_layout_ci.pSetLayouts = &ds_layout;
5971
5972 VkPipelineLayout pipeline_layout;
5973 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5974 &pipeline_layout);
5975 ASSERT_VK_SUCCESS(err);
5976
5977 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5978 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5979 vp_state_ci.scissorCount = 1;
5980 vp_state_ci.pScissors = NULL;
5981 vp_state_ci.viewportCount = 1;
5982 vp_state_ci.pViewports = NULL;
5983
5984 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
5985 VK_DYNAMIC_STATE_SCISSOR,
5986 VK_DYNAMIC_STATE_LINE_WIDTH};
5987 // Set scissor as dynamic to avoid that error
5988 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5989 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5990 dyn_state_ci.dynamicStateCount = 2;
5991 dyn_state_ci.pDynamicStates = dynamic_states;
5992
5993 VkPipelineShaderStageCreateInfo shaderStages[2];
5994 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5995
5996 VkShaderObj vs(m_device, bindStateVertShaderText,
5997 VK_SHADER_STAGE_VERTEX_BIT, this);
5998 VkShaderObj fs(m_device, bindStateFragShaderText,
5999 VK_SHADER_STAGE_FRAGMENT_BIT,
6000 this); // TODO - We shouldn't need a fragment shader
6001 // but add it to be able to run on more devices
6002 shaderStages[0] = vs.GetStageCreateInfo();
6003 shaderStages[1] = fs.GetStageCreateInfo();
6004
6005 VkPipelineVertexInputStateCreateInfo vi_ci = {};
6006 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
6007 vi_ci.pNext = nullptr;
6008 vi_ci.vertexBindingDescriptionCount = 0;
6009 vi_ci.pVertexBindingDescriptions = nullptr;
6010 vi_ci.vertexAttributeDescriptionCount = 0;
6011 vi_ci.pVertexAttributeDescriptions = nullptr;
6012
6013 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
6014 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
6015 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
6016
6017 VkPipelineRasterizationStateCreateInfo rs_ci = {};
6018 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
6019 rs_ci.pNext = nullptr;
6020
Mark Young47107952016-05-02 15:59:55 -06006021 // Check too low (line width of -1.0f).
6022 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06006023
6024 VkPipelineColorBlendAttachmentState att = {};
6025 att.blendEnable = VK_FALSE;
6026 att.colorWriteMask = 0xf;
6027
6028 VkPipelineColorBlendStateCreateInfo cb_ci = {};
6029 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
6030 cb_ci.pNext = nullptr;
6031 cb_ci.attachmentCount = 1;
6032 cb_ci.pAttachments = &att;
6033
6034 VkGraphicsPipelineCreateInfo gp_ci = {};
6035 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
6036 gp_ci.stageCount = 2;
6037 gp_ci.pStages = shaderStages;
6038 gp_ci.pVertexInputState = &vi_ci;
6039 gp_ci.pInputAssemblyState = &ia_ci;
6040 gp_ci.pViewportState = &vp_state_ci;
6041 gp_ci.pRasterizationState = &rs_ci;
6042 gp_ci.pColorBlendState = &cb_ci;
6043 gp_ci.pDynamicState = &dyn_state_ci;
6044 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
6045 gp_ci.layout = pipeline_layout;
6046 gp_ci.renderPass = renderPass();
6047
6048 VkPipelineCacheCreateInfo pc_ci = {};
6049 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
6050
6051 VkPipeline pipeline;
6052 VkPipelineCache pipelineCache;
6053
6054 err =
6055 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
6056 ASSERT_VK_SUCCESS(err);
6057 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
6058 &gp_ci, NULL, &pipeline);
6059
6060 m_errorMonitor->VerifyFound();
6061
6062 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6063 "Attempt to set lineWidth to 65536");
6064
6065 // Check too high (line width of 65536.0f).
6066 rs_ci.lineWidth = 65536.0f;
6067
6068 err =
6069 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
6070 ASSERT_VK_SUCCESS(err);
6071 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
6072 &gp_ci, NULL, &pipeline);
6073
6074 m_errorMonitor->VerifyFound();
6075
6076 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06006077 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06006078
6079 dyn_state_ci.dynamicStateCount = 3;
6080
6081 rs_ci.lineWidth = 1.0f;
6082
6083 err =
6084 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
6085 ASSERT_VK_SUCCESS(err);
6086 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
6087 &gp_ci, NULL, &pipeline);
6088 BeginCommandBuffer();
6089 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6090 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
6091
6092 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06006093 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06006094 m_errorMonitor->VerifyFound();
6095
6096 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6097 "Attempt to set lineWidth to 65536");
6098
6099 // Check too high with dynamic setting.
6100 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
6101 m_errorMonitor->VerifyFound();
6102 EndCommandBuffer();
6103
6104 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
6105 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6106 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6107 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6108}
6109
Karl Schultz6addd812016-02-02 17:17:23 -07006110TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06006111 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07006112 m_errorMonitor->SetDesiredFailureMsg(
6113 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006114 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06006115
6116 ASSERT_NO_FATAL_FAILURE(InitState());
6117 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06006118
Tony Barbourfe3351b2015-07-28 10:17:20 -06006119 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006120 // Don't care about RenderPass handle b/c error should be flagged before
6121 // that
6122 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
6123 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06006124
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006125 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06006126}
6127
Karl Schultz6addd812016-02-02 17:17:23 -07006128TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006129 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07006130 m_errorMonitor->SetDesiredFailureMsg(
6131 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006132 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006133
6134 ASSERT_NO_FATAL_FAILURE(InitState());
6135 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006136
Tony Barbourfe3351b2015-07-28 10:17:20 -06006137 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006138 // Just create a dummy Renderpass that's non-NULL so we can get to the
6139 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06006140 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006141 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
6142 rp_begin.pNext = NULL;
6143 rp_begin.renderPass = renderPass();
6144 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006145
Karl Schultz6addd812016-02-02 17:17:23 -07006146 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
6147 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006148
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006149 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006150}
6151
Cody Northrop3bb4d962016-05-09 16:15:57 -06006152TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
6153
6154 TEST_DESCRIPTION("End a command buffer with an active render pass");
6155
6156 m_errorMonitor->SetDesiredFailureMsg(
6157 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6158 "It is invalid to issue this call inside an active render pass");
6159
6160 ASSERT_NO_FATAL_FAILURE(InitState());
6161 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6162
6163 // The framework's BeginCommandBuffer calls CreateRenderPass
6164 BeginCommandBuffer();
6165
6166 // Call directly into vkEndCommandBuffer instead of the
6167 // the framework's EndCommandBuffer, which inserts a
6168 // vkEndRenderPass
6169 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
6170
6171 m_errorMonitor->VerifyFound();
6172
6173 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
6174 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
6175}
6176
Karl Schultz6addd812016-02-02 17:17:23 -07006177TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006178 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07006179 m_errorMonitor->SetDesiredFailureMsg(
6180 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006181 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006182
6183 ASSERT_NO_FATAL_FAILURE(InitState());
6184 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006185
6186 // Renderpass is started here
6187 BeginCommandBuffer();
6188
6189 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006190 vk_testing::Buffer dstBuffer;
6191 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006192
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006193 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006194
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006195 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006196}
6197
Karl Schultz6addd812016-02-02 17:17:23 -07006198TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006199 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07006200 m_errorMonitor->SetDesiredFailureMsg(
6201 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006202 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006203
6204 ASSERT_NO_FATAL_FAILURE(InitState());
6205 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006206
6207 // Renderpass is started here
6208 BeginCommandBuffer();
6209
6210 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006211 vk_testing::Buffer dstBuffer;
6212 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006213
Karl Schultz6addd812016-02-02 17:17:23 -07006214 VkDeviceSize dstOffset = 0;
6215 VkDeviceSize dataSize = 1024;
6216 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006217
Karl Schultz6addd812016-02-02 17:17:23 -07006218 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
6219 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006220
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006221 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006222}
6223
Karl Schultz6addd812016-02-02 17:17:23 -07006224TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006225 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07006226 m_errorMonitor->SetDesiredFailureMsg(
6227 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006228 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006229
6230 ASSERT_NO_FATAL_FAILURE(InitState());
6231 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006232
6233 // Renderpass is started here
6234 BeginCommandBuffer();
6235
Michael Lentine0a369f62016-02-03 16:51:46 -06006236 VkClearColorValue clear_color;
6237 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07006238 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
6239 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6240 const int32_t tex_width = 32;
6241 const int32_t tex_height = 32;
6242 VkImageCreateInfo image_create_info = {};
6243 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6244 image_create_info.pNext = NULL;
6245 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6246 image_create_info.format = tex_format;
6247 image_create_info.extent.width = tex_width;
6248 image_create_info.extent.height = tex_height;
6249 image_create_info.extent.depth = 1;
6250 image_create_info.mipLevels = 1;
6251 image_create_info.arrayLayers = 1;
6252 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6253 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6254 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006255
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006256 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07006257 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
6258 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006259
Karl Schultz6addd812016-02-02 17:17:23 -07006260 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
6261 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006262
Karl Schultz6addd812016-02-02 17:17:23 -07006263 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
6264 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006265
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006266 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006267}
6268
Karl Schultz6addd812016-02-02 17:17:23 -07006269TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006270 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07006271 m_errorMonitor->SetDesiredFailureMsg(
6272 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006273 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006274
6275 ASSERT_NO_FATAL_FAILURE(InitState());
6276 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006277
6278 // Renderpass is started here
6279 BeginCommandBuffer();
6280
6281 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07006282 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006283 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
6284 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6285 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
6286 image_create_info.extent.width = 64;
6287 image_create_info.extent.height = 64;
6288 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6289 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006290
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006291 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07006292 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
6293 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006294
Karl Schultz6addd812016-02-02 17:17:23 -07006295 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
6296 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006297
Karl Schultz6addd812016-02-02 17:17:23 -07006298 vkCmdClearDepthStencilImage(
6299 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
6300 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
6301 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006302
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006303 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006304}
6305
Karl Schultz6addd812016-02-02 17:17:23 -07006306TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06006307 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07006308 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006309
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006311 "vkCmdClearAttachments: This call "
6312 "must be issued inside an active "
6313 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006314
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006315 ASSERT_NO_FATAL_FAILURE(InitState());
6316 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006317
6318 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006319 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006320 ASSERT_VK_SUCCESS(err);
6321
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06006322 VkClearAttachment color_attachment;
6323 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6324 color_attachment.clearValue.color.float32[0] = 0;
6325 color_attachment.clearValue.color.float32[1] = 0;
6326 color_attachment.clearValue.color.float32[2] = 0;
6327 color_attachment.clearValue.color.float32[3] = 0;
6328 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006329 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
6330 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
6331 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006332
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006333 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006334}
6335
Karl Schultz9e66a292016-04-21 15:57:51 -06006336TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
6337 // Try to add a buffer memory barrier with no buffer.
6338 m_errorMonitor->SetDesiredFailureMsg(
6339 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6340 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
6341
6342 ASSERT_NO_FATAL_FAILURE(InitState());
6343 BeginCommandBuffer();
6344
6345 VkBufferMemoryBarrier buf_barrier = {};
6346 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
6347 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
6348 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
6349 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
6350 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
6351 buf_barrier.buffer = VK_NULL_HANDLE;
6352 buf_barrier.offset = 0;
6353 buf_barrier.size = VK_WHOLE_SIZE;
6354 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6355 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
6356 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
6357
6358 m_errorMonitor->VerifyFound();
6359}
6360
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06006361TEST_F(VkLayerTest, InvalidBarriers) {
6362 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
6363
6364 m_errorMonitor->SetDesiredFailureMsg(
6365 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
6366
6367 ASSERT_NO_FATAL_FAILURE(InitState());
6368 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6369
6370 VkMemoryBarrier mem_barrier = {};
6371 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
6372 mem_barrier.pNext = NULL;
6373 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
6374 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
6375 BeginCommandBuffer();
6376 // BeginCommandBuffer() starts a render pass
6377 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6378 VK_PIPELINE_STAGE_HOST_BIT,
6379 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
6380 &mem_barrier, 0, nullptr, 0, nullptr);
6381 m_errorMonitor->VerifyFound();
6382
6383 m_errorMonitor->SetDesiredFailureMsg(
6384 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6385 "Image Layout cannot be transitioned to UNDEFINED");
6386 VkImageObj image(m_device);
6387 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
6388 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
6389 ASSERT_TRUE(image.initialized());
6390 VkImageMemoryBarrier img_barrier = {};
6391 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
6392 img_barrier.pNext = NULL;
6393 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
6394 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
6395 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
6396 // New layout can't be UNDEFINED
6397 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
6398 img_barrier.image = image.handle();
6399 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
6400 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
6401 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6402 img_barrier.subresourceRange.baseArrayLayer = 0;
6403 img_barrier.subresourceRange.baseMipLevel = 0;
6404 img_barrier.subresourceRange.layerCount = 1;
6405 img_barrier.subresourceRange.levelCount = 1;
6406 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6407 VK_PIPELINE_STAGE_HOST_BIT,
6408 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
6409 nullptr, 1, &img_barrier);
6410 m_errorMonitor->VerifyFound();
6411 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
6412
6413 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6414 "Subresource must have the sum of the "
6415 "baseArrayLayer");
6416 // baseArrayLayer + layerCount must be <= image's arrayLayers
6417 img_barrier.subresourceRange.baseArrayLayer = 1;
6418 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6419 VK_PIPELINE_STAGE_HOST_BIT,
6420 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
6421 nullptr, 1, &img_barrier);
6422 m_errorMonitor->VerifyFound();
6423 img_barrier.subresourceRange.baseArrayLayer = 0;
6424
6425 m_errorMonitor->SetDesiredFailureMsg(
6426 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6427 "Subresource must have the sum of the baseMipLevel");
6428 // baseMipLevel + levelCount must be <= image's mipLevels
6429 img_barrier.subresourceRange.baseMipLevel = 1;
6430 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6431 VK_PIPELINE_STAGE_HOST_BIT,
6432 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
6433 nullptr, 1, &img_barrier);
6434 m_errorMonitor->VerifyFound();
6435 img_barrier.subresourceRange.baseMipLevel = 0;
6436
6437 m_errorMonitor->SetDesiredFailureMsg(
6438 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6439 "Buffer Barriers cannot be used during a render pass");
6440 vk_testing::Buffer buffer;
6441 buffer.init(*m_device, 256);
6442 VkBufferMemoryBarrier buf_barrier = {};
6443 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
6444 buf_barrier.pNext = NULL;
6445 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
6446 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
6447 buf_barrier.buffer = buffer.handle();
6448 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
6449 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
6450 buf_barrier.offset = 0;
6451 buf_barrier.size = VK_WHOLE_SIZE;
6452 // Can't send buffer barrier during a render pass
6453 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6454 VK_PIPELINE_STAGE_HOST_BIT,
6455 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
6456 &buf_barrier, 0, nullptr);
6457 m_errorMonitor->VerifyFound();
6458 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
6459
6460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6461 "which is not less than total size");
6462 buf_barrier.offset = 257;
6463 // Offset greater than total size
6464 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6465 VK_PIPELINE_STAGE_HOST_BIT,
6466 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
6467 &buf_barrier, 0, nullptr);
6468 m_errorMonitor->VerifyFound();
6469 buf_barrier.offset = 0;
6470
6471 m_errorMonitor->SetDesiredFailureMsg(
6472 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
6473 buf_barrier.size = 257;
6474 // Size greater than total size
6475 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6476 VK_PIPELINE_STAGE_HOST_BIT,
6477 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
6478 &buf_barrier, 0, nullptr);
6479 m_errorMonitor->VerifyFound();
6480 buf_barrier.size = VK_WHOLE_SIZE;
6481
6482 m_errorMonitor->SetDesiredFailureMsg(
6483 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6484 "Image is a depth and stencil format and thus must "
6485 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
6486 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
6487 VkDepthStencilObj ds_image(m_device);
6488 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
6489 ASSERT_TRUE(ds_image.initialized());
6490 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
6491 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
6492 img_barrier.image = ds_image.handle();
6493 // Leave aspectMask at COLOR on purpose
6494 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6495 VK_PIPELINE_STAGE_HOST_BIT,
6496 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
6497 nullptr, 1, &img_barrier);
6498 m_errorMonitor->VerifyFound();
6499}
6500
Karl Schultz6addd812016-02-02 17:17:23 -07006501TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006502 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07006503 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006504
Karl Schultz6addd812016-02-02 17:17:23 -07006505 m_errorMonitor->SetDesiredFailureMsg(
6506 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006507 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
6508
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006509 ASSERT_NO_FATAL_FAILURE(InitState());
6510 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006511 uint32_t qfi = 0;
6512 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006513 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6514 buffCI.size = 1024;
6515 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
6516 buffCI.queueFamilyIndexCount = 1;
6517 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006518
6519 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006520 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006521 ASSERT_VK_SUCCESS(err);
6522
6523 BeginCommandBuffer();
6524 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07006525 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6526 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006527 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07006528 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
6529 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006530
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006531 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006532
Chia-I Wuf7458c52015-10-26 21:10:41 +08006533 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006534}
6535
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07006536TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
6537 // Create an out-of-range queueFamilyIndex
6538 m_errorMonitor->SetDesiredFailureMsg(
6539 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -06006540 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
6541 "of the indices specified when the device was created, via the "
6542 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07006543
6544 ASSERT_NO_FATAL_FAILURE(InitState());
6545 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6546 VkBufferCreateInfo buffCI = {};
6547 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6548 buffCI.size = 1024;
6549 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
6550 buffCI.queueFamilyIndexCount = 1;
6551 // Introduce failure by specifying invalid queue_family_index
6552 uint32_t qfi = 777;
6553 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06006554 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07006555
6556 VkBuffer ib;
6557 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
6558
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006559 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07006560}
6561
Karl Schultz6addd812016-02-02 17:17:23 -07006562TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
6563 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
6564 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006565
Karl Schultz6addd812016-02-02 17:17:23 -07006566 m_errorMonitor->SetDesiredFailureMsg(
6567 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006568 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06006569
6570 ASSERT_NO_FATAL_FAILURE(InitState());
6571 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06006572
6573 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006574 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006575 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
6576 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06006577
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006578 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06006579}
6580
Karl Schultz6addd812016-02-02 17:17:23 -07006581TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006582 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07006583 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006584
Karl Schultz6addd812016-02-02 17:17:23 -07006585 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006586 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6587 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
6588 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006589
Tobin Ehlis3b780662015-05-28 12:11:26 -06006590 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006591 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006592 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006593 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6594 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006595
6596 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006597 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6598 ds_pool_ci.pNext = NULL;
6599 ds_pool_ci.maxSets = 1;
6600 ds_pool_ci.poolSizeCount = 1;
6601 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006602
Tobin Ehlis3b780662015-05-28 12:11:26 -06006603 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006604 err =
6605 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006606 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06006607 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006608 dsl_binding.binding = 0;
6609 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6610 dsl_binding.descriptorCount = 1;
6611 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6612 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006613
Tony Barboureb254902015-07-15 12:50:33 -06006614 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006615 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6616 ds_layout_ci.pNext = NULL;
6617 ds_layout_ci.bindingCount = 1;
6618 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006619
Tobin Ehlis3b780662015-05-28 12:11:26 -06006620 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006621 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6622 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006623 ASSERT_VK_SUCCESS(err);
6624
6625 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006626 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006627 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006628 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006629 alloc_info.descriptorPool = ds_pool;
6630 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006631 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6632 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006633 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006634
Tobin Ehlis30db8f82016-05-05 08:19:48 -06006635 VkSamplerCreateInfo sampler_ci = {};
6636 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6637 sampler_ci.pNext = NULL;
6638 sampler_ci.magFilter = VK_FILTER_NEAREST;
6639 sampler_ci.minFilter = VK_FILTER_NEAREST;
6640 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6641 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6642 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6643 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6644 sampler_ci.mipLodBias = 1.0;
6645 sampler_ci.anisotropyEnable = VK_FALSE;
6646 sampler_ci.maxAnisotropy = 1;
6647 sampler_ci.compareEnable = VK_FALSE;
6648 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6649 sampler_ci.minLod = 1.0;
6650 sampler_ci.maxLod = 1.0;
6651 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6652 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6653 VkSampler sampler;
6654 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6655 ASSERT_VK_SUCCESS(err);
6656
6657 VkDescriptorImageInfo info = {};
6658 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006659
6660 VkWriteDescriptorSet descriptor_write;
6661 memset(&descriptor_write, 0, sizeof(descriptor_write));
6662 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006663 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006664 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006665 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006666 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006667 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006668
6669 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6670
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006671 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006672
Chia-I Wuf7458c52015-10-26 21:10:41 +08006673 vkDestroySampler(m_device->device(), sampler, NULL);
6674 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6675 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006676}
6677
Karl Schultz6addd812016-02-02 17:17:23 -07006678TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006679 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07006680 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006681
Karl Schultz6addd812016-02-02 17:17:23 -07006682 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006683 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6684 " binding #0 with 1 total descriptors but update of 1 descriptors "
6685 "starting at binding offset of 0 combined with update array element "
6686 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006687
Tobin Ehlis3b780662015-05-28 12:11:26 -06006688 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006689 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006690 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006691 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6692 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006693
6694 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006695 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6696 ds_pool_ci.pNext = NULL;
6697 ds_pool_ci.maxSets = 1;
6698 ds_pool_ci.poolSizeCount = 1;
6699 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006700
Tobin Ehlis3b780662015-05-28 12:11:26 -06006701 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006702 err =
6703 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006704 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006705
Tony Barboureb254902015-07-15 12:50:33 -06006706 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006707 dsl_binding.binding = 0;
6708 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6709 dsl_binding.descriptorCount = 1;
6710 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6711 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06006712
6713 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006714 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6715 ds_layout_ci.pNext = NULL;
6716 ds_layout_ci.bindingCount = 1;
6717 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006718
Tobin Ehlis3b780662015-05-28 12:11:26 -06006719 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006720 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6721 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006722 ASSERT_VK_SUCCESS(err);
6723
6724 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006725 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006726 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006727 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006728 alloc_info.descriptorPool = ds_pool;
6729 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006730 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6731 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006732 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006733
Tobin Ehlis30db8f82016-05-05 08:19:48 -06006734 // Correctly update descriptor to avoid "NOT_UPDATED" error
6735 VkDescriptorBufferInfo buff_info = {};
6736 buff_info.buffer =
6737 VkBuffer(0); // Don't care about buffer handle for this test
6738 buff_info.offset = 0;
6739 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006740
6741 VkWriteDescriptorSet descriptor_write;
6742 memset(&descriptor_write, 0, sizeof(descriptor_write));
6743 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006744 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006745 descriptor_write.dstArrayElement =
6746 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08006747 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006748 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6749 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006750
6751 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6752
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006753 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006754
Chia-I Wuf7458c52015-10-26 21:10:41 +08006755 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6756 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006757}
6758
Karl Schultz6addd812016-02-02 17:17:23 -07006759TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
6760 // Create layout w/ count of 1 and attempt update to that layout w/ binding
6761 // index 2
6762 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006763
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6765 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006766
Tobin Ehlis3b780662015-05-28 12:11:26 -06006767 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006768 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006769 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006770 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6771 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006772
6773 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006774 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6775 ds_pool_ci.pNext = NULL;
6776 ds_pool_ci.maxSets = 1;
6777 ds_pool_ci.poolSizeCount = 1;
6778 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006779
Tobin Ehlis3b780662015-05-28 12:11:26 -06006780 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006781 err =
6782 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006783 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006784
Tony Barboureb254902015-07-15 12:50:33 -06006785 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006786 dsl_binding.binding = 0;
6787 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6788 dsl_binding.descriptorCount = 1;
6789 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6790 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06006791
6792 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006793 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6794 ds_layout_ci.pNext = NULL;
6795 ds_layout_ci.bindingCount = 1;
6796 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006797 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006798 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6799 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006800 ASSERT_VK_SUCCESS(err);
6801
6802 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006803 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006804 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006805 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006806 alloc_info.descriptorPool = ds_pool;
6807 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006808 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6809 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006810 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006811
Tony Barboureb254902015-07-15 12:50:33 -06006812 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006813 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6814 sampler_ci.pNext = NULL;
6815 sampler_ci.magFilter = VK_FILTER_NEAREST;
6816 sampler_ci.minFilter = VK_FILTER_NEAREST;
6817 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6818 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6819 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6820 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6821 sampler_ci.mipLodBias = 1.0;
6822 sampler_ci.anisotropyEnable = VK_FALSE;
6823 sampler_ci.maxAnisotropy = 1;
6824 sampler_ci.compareEnable = VK_FALSE;
6825 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6826 sampler_ci.minLod = 1.0;
6827 sampler_ci.maxLod = 1.0;
6828 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6829 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06006830
Tobin Ehlis3b780662015-05-28 12:11:26 -06006831 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006832 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006833 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006834
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006835 VkDescriptorImageInfo info = {};
6836 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006837
6838 VkWriteDescriptorSet descriptor_write;
6839 memset(&descriptor_write, 0, sizeof(descriptor_write));
6840 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006841 descriptor_write.dstSet = descriptorSet;
6842 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006843 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006844 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006845 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006846 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006847
6848 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6849
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006850 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006851
Chia-I Wuf7458c52015-10-26 21:10:41 +08006852 vkDestroySampler(m_device->device(), sampler, NULL);
6853 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6854 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006855}
6856
Karl Schultz6addd812016-02-02 17:17:23 -07006857TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
6858 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
6859 // types
6860 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006861
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006862 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006863 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006864
Tobin Ehlis3b780662015-05-28 12:11:26 -06006865 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006866
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006867 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006868 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6869 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006870
6871 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006872 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6873 ds_pool_ci.pNext = NULL;
6874 ds_pool_ci.maxSets = 1;
6875 ds_pool_ci.poolSizeCount = 1;
6876 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006877
Tobin Ehlis3b780662015-05-28 12:11:26 -06006878 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006879 err =
6880 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006881 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06006882 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006883 dsl_binding.binding = 0;
6884 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6885 dsl_binding.descriptorCount = 1;
6886 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6887 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006888
Tony Barboureb254902015-07-15 12:50:33 -06006889 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006890 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6891 ds_layout_ci.pNext = NULL;
6892 ds_layout_ci.bindingCount = 1;
6893 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006894
Tobin Ehlis3b780662015-05-28 12:11:26 -06006895 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006896 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6897 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006898 ASSERT_VK_SUCCESS(err);
6899
6900 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006901 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006902 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006903 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006904 alloc_info.descriptorPool = ds_pool;
6905 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006906 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6907 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006908 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006909
Tony Barboureb254902015-07-15 12:50:33 -06006910 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006911 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6912 sampler_ci.pNext = NULL;
6913 sampler_ci.magFilter = VK_FILTER_NEAREST;
6914 sampler_ci.minFilter = VK_FILTER_NEAREST;
6915 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6916 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6917 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6918 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6919 sampler_ci.mipLodBias = 1.0;
6920 sampler_ci.anisotropyEnable = VK_FALSE;
6921 sampler_ci.maxAnisotropy = 1;
6922 sampler_ci.compareEnable = VK_FALSE;
6923 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6924 sampler_ci.minLod = 1.0;
6925 sampler_ci.maxLod = 1.0;
6926 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6927 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006928 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006929 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006930 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006931
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006932 VkDescriptorImageInfo info = {};
6933 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006934
6935 VkWriteDescriptorSet descriptor_write;
6936 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07006937 descriptor_write.sType =
6938 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006939 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006940 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006941 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006942 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006943 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006944
6945 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6946
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006947 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006948
Chia-I Wuf7458c52015-10-26 21:10:41 +08006949 vkDestroySampler(m_device->device(), sampler, NULL);
6950 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6951 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006952}
6953
Karl Schultz6addd812016-02-02 17:17:23 -07006954TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006955 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07006956 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006957
Karl Schultz6addd812016-02-02 17:17:23 -07006958 m_errorMonitor->SetDesiredFailureMsg(
6959 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006960 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006961
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006962 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006963 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
6964 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006965 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006966 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6967 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006968
6969 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006970 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6971 ds_pool_ci.pNext = NULL;
6972 ds_pool_ci.maxSets = 1;
6973 ds_pool_ci.poolSizeCount = 1;
6974 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006975
6976 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006977 err =
6978 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006979 ASSERT_VK_SUCCESS(err);
6980
6981 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006982 dsl_binding.binding = 0;
6983 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6984 dsl_binding.descriptorCount = 1;
6985 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6986 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006987
6988 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006989 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6990 ds_layout_ci.pNext = NULL;
6991 ds_layout_ci.bindingCount = 1;
6992 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006993 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006994 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6995 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006996 ASSERT_VK_SUCCESS(err);
6997
6998 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006999 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007000 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007001 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007002 alloc_info.descriptorPool = ds_pool;
7003 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007004 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7005 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007006 ASSERT_VK_SUCCESS(err);
7007
Karl Schultz6addd812016-02-02 17:17:23 -07007008 VkSampler sampler =
7009 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007010
7011 VkDescriptorImageInfo descriptor_info;
7012 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
7013 descriptor_info.sampler = sampler;
7014
7015 VkWriteDescriptorSet descriptor_write;
7016 memset(&descriptor_write, 0, sizeof(descriptor_write));
7017 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007018 descriptor_write.dstSet = descriptorSet;
7019 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007020 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007021 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
7022 descriptor_write.pImageInfo = &descriptor_info;
7023
7024 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7025
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007026 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007027
Chia-I Wuf7458c52015-10-26 21:10:41 +08007028 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7029 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007030}
7031
Karl Schultz6addd812016-02-02 17:17:23 -07007032TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
7033 // Create a single combined Image/Sampler descriptor and send it an invalid
7034 // imageView
7035 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007036
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007037 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7038 "Attempted write update to combined "
7039 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -06007040 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007041
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007042 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007043 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007044 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
7045 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007046
7047 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007048 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7049 ds_pool_ci.pNext = NULL;
7050 ds_pool_ci.maxSets = 1;
7051 ds_pool_ci.poolSizeCount = 1;
7052 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007053
7054 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007055 err =
7056 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007057 ASSERT_VK_SUCCESS(err);
7058
7059 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007060 dsl_binding.binding = 0;
7061 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
7062 dsl_binding.descriptorCount = 1;
7063 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7064 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007065
7066 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007067 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7068 ds_layout_ci.pNext = NULL;
7069 ds_layout_ci.bindingCount = 1;
7070 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007071 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007072 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7073 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007074 ASSERT_VK_SUCCESS(err);
7075
7076 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007077 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007078 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007079 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007080 alloc_info.descriptorPool = ds_pool;
7081 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007082 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7083 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007084 ASSERT_VK_SUCCESS(err);
7085
7086 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007087 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
7088 sampler_ci.pNext = NULL;
7089 sampler_ci.magFilter = VK_FILTER_NEAREST;
7090 sampler_ci.minFilter = VK_FILTER_NEAREST;
7091 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
7092 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7093 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7094 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7095 sampler_ci.mipLodBias = 1.0;
7096 sampler_ci.anisotropyEnable = VK_FALSE;
7097 sampler_ci.maxAnisotropy = 1;
7098 sampler_ci.compareEnable = VK_FALSE;
7099 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
7100 sampler_ci.minLod = 1.0;
7101 sampler_ci.maxLod = 1.0;
7102 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
7103 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007104
7105 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007106 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007107 ASSERT_VK_SUCCESS(err);
7108
Karl Schultz6addd812016-02-02 17:17:23 -07007109 VkImageView view =
7110 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007111
7112 VkDescriptorImageInfo descriptor_info;
7113 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
7114 descriptor_info.sampler = sampler;
7115 descriptor_info.imageView = view;
7116
7117 VkWriteDescriptorSet descriptor_write;
7118 memset(&descriptor_write, 0, sizeof(descriptor_write));
7119 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007120 descriptor_write.dstSet = descriptorSet;
7121 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007122 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007123 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
7124 descriptor_write.pImageInfo = &descriptor_info;
7125
7126 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7127
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007128 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007129
Chia-I Wuf7458c52015-10-26 21:10:41 +08007130 vkDestroySampler(m_device->device(), sampler, NULL);
7131 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7132 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007133}
7134
Karl Schultz6addd812016-02-02 17:17:23 -07007135TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
7136 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
7137 // into the other
7138 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007139
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007140 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7141 " binding #1 with type "
7142 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
7143 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007144
Tobin Ehlis04356f92015-10-27 16:35:27 -06007145 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07007146 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007147 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007148 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7149 ds_type_count[0].descriptorCount = 1;
7150 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7151 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007152
7153 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007154 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7155 ds_pool_ci.pNext = NULL;
7156 ds_pool_ci.maxSets = 1;
7157 ds_pool_ci.poolSizeCount = 2;
7158 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007159
7160 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007161 err =
7162 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06007163 ASSERT_VK_SUCCESS(err);
7164 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007165 dsl_binding[0].binding = 0;
7166 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7167 dsl_binding[0].descriptorCount = 1;
7168 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7169 dsl_binding[0].pImmutableSamplers = NULL;
7170 dsl_binding[1].binding = 1;
7171 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
7172 dsl_binding[1].descriptorCount = 1;
7173 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7174 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007175
7176 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007177 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7178 ds_layout_ci.pNext = NULL;
7179 ds_layout_ci.bindingCount = 2;
7180 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007181
7182 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007183 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7184 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06007185 ASSERT_VK_SUCCESS(err);
7186
7187 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007188 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007189 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007190 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007191 alloc_info.descriptorPool = ds_pool;
7192 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007193 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7194 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06007195 ASSERT_VK_SUCCESS(err);
7196
7197 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007198 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
7199 sampler_ci.pNext = NULL;
7200 sampler_ci.magFilter = VK_FILTER_NEAREST;
7201 sampler_ci.minFilter = VK_FILTER_NEAREST;
7202 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
7203 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7204 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7205 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7206 sampler_ci.mipLodBias = 1.0;
7207 sampler_ci.anisotropyEnable = VK_FALSE;
7208 sampler_ci.maxAnisotropy = 1;
7209 sampler_ci.compareEnable = VK_FALSE;
7210 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
7211 sampler_ci.minLod = 1.0;
7212 sampler_ci.maxLod = 1.0;
7213 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
7214 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007215
7216 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007217 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06007218 ASSERT_VK_SUCCESS(err);
7219
7220 VkDescriptorImageInfo info = {};
7221 info.sampler = sampler;
7222
7223 VkWriteDescriptorSet descriptor_write;
7224 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
7225 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007226 descriptor_write.dstSet = descriptorSet;
7227 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08007228 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007229 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
7230 descriptor_write.pImageInfo = &info;
7231 // This write update should succeed
7232 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7233 // Now perform a copy update that fails due to type mismatch
7234 VkCopyDescriptorSet copy_ds_update;
7235 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
7236 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
7237 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -06007238 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007239 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007240 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08007241 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06007242 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
7243
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007244 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06007245 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07007246 m_errorMonitor->SetDesiredFailureMsg(
7247 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007248 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -06007249 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
7250 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
7251 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007252 copy_ds_update.srcBinding =
7253 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007254 copy_ds_update.dstSet = descriptorSet;
7255 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -06007256 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06007257 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
7258
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007259 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007260
Tobin Ehlis04356f92015-10-27 16:35:27 -06007261 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07007262 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007263 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
7264 "update array offset of 0 and update of "
7265 "5 descriptors oversteps total number "
7266 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007267
Tobin Ehlis04356f92015-10-27 16:35:27 -06007268 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
7269 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
7270 copy_ds_update.srcSet = descriptorSet;
7271 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007272 copy_ds_update.dstSet = descriptorSet;
7273 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07007274 copy_ds_update.descriptorCount =
7275 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06007276 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
7277
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007278 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06007279
Chia-I Wuf7458c52015-10-26 21:10:41 +08007280 vkDestroySampler(m_device->device(), sampler, NULL);
7281 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7282 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06007283}
7284
Karl Schultz6addd812016-02-02 17:17:23 -07007285TEST_F(VkLayerTest, NumSamplesMismatch) {
7286 // Create CommandBuffer where MSAA samples doesn't match RenderPass
7287 // sampleCount
7288 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06007289
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007290 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007291 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007292
Tobin Ehlis3b780662015-05-28 12:11:26 -06007293 ASSERT_NO_FATAL_FAILURE(InitState());
7294 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007295 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06007296 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007297 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007298
7299 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007300 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7301 ds_pool_ci.pNext = NULL;
7302 ds_pool_ci.maxSets = 1;
7303 ds_pool_ci.poolSizeCount = 1;
7304 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06007305
Tobin Ehlis3b780662015-05-28 12:11:26 -06007306 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007307 err =
7308 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007309 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007310
Tony Barboureb254902015-07-15 12:50:33 -06007311 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007312 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06007313 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007314 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007315 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7316 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06007317
Tony Barboureb254902015-07-15 12:50:33 -06007318 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7319 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7320 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007321 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007322 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007323
Tobin Ehlis3b780662015-05-28 12:11:26 -06007324 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007325 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7326 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007327 ASSERT_VK_SUCCESS(err);
7328
7329 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007330 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007331 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007332 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007333 alloc_info.descriptorPool = ds_pool;
7334 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007335 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7336 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007337 ASSERT_VK_SUCCESS(err);
7338
Tony Barboureb254902015-07-15 12:50:33 -06007339 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007340 pipe_ms_state_ci.sType =
7341 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7342 pipe_ms_state_ci.pNext = NULL;
7343 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7344 pipe_ms_state_ci.sampleShadingEnable = 0;
7345 pipe_ms_state_ci.minSampleShading = 1.0;
7346 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06007347
Tony Barboureb254902015-07-15 12:50:33 -06007348 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007349 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7350 pipeline_layout_ci.pNext = NULL;
7351 pipeline_layout_ci.setLayoutCount = 1;
7352 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06007353
7354 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007355 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7356 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007357 ASSERT_VK_SUCCESS(err);
7358
Karl Schultz6addd812016-02-02 17:17:23 -07007359 VkShaderObj vs(m_device, bindStateVertShaderText,
7360 VK_SHADER_STAGE_VERTEX_BIT, this);
7361 VkShaderObj fs(m_device, bindStateFragShaderText,
7362 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06007363 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07007364 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007365 VkPipelineObj pipe(m_device);
7366 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007367 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06007368 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007369 pipe.SetMSAA(&pipe_ms_state_ci);
7370 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06007371
Tony Barbourfe3351b2015-07-28 10:17:20 -06007372 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007373 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7374 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06007375
Mark Young29927482016-05-04 14:38:51 -06007376 // Render triangle (the error should trigger on the attempt to draw).
7377 Draw(3, 1, 0, 0);
7378
7379 // Finalize recording of the command buffer
7380 EndCommandBuffer();
7381
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007382 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007383
Chia-I Wuf7458c52015-10-26 21:10:41 +08007384 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7385 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7386 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007387}
Mark Young29927482016-05-04 14:38:51 -06007388
Mark Youngc89c6312016-03-31 16:03:20 -06007389TEST_F(VkLayerTest, NumBlendAttachMismatch) {
7390 // Create Pipeline where the number of blend attachments doesn't match the
7391 // number of color attachments. In this case, we don't add any color
7392 // blend attachments even though we have a color attachment.
7393 VkResult err;
7394
7395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -06007396 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -06007397
7398 ASSERT_NO_FATAL_FAILURE(InitState());
7399 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7400 VkDescriptorPoolSize ds_type_count = {};
7401 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7402 ds_type_count.descriptorCount = 1;
7403
7404 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7405 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7406 ds_pool_ci.pNext = NULL;
7407 ds_pool_ci.maxSets = 1;
7408 ds_pool_ci.poolSizeCount = 1;
7409 ds_pool_ci.pPoolSizes = &ds_type_count;
7410
7411 VkDescriptorPool ds_pool;
7412 err =
7413 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
7414 ASSERT_VK_SUCCESS(err);
7415
7416 VkDescriptorSetLayoutBinding dsl_binding = {};
7417 dsl_binding.binding = 0;
7418 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7419 dsl_binding.descriptorCount = 1;
7420 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7421 dsl_binding.pImmutableSamplers = NULL;
7422
7423 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7424 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7425 ds_layout_ci.pNext = NULL;
7426 ds_layout_ci.bindingCount = 1;
7427 ds_layout_ci.pBindings = &dsl_binding;
7428
7429 VkDescriptorSetLayout ds_layout;
7430 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7431 &ds_layout);
7432 ASSERT_VK_SUCCESS(err);
7433
7434 VkDescriptorSet descriptorSet;
7435 VkDescriptorSetAllocateInfo alloc_info = {};
7436 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7437 alloc_info.descriptorSetCount = 1;
7438 alloc_info.descriptorPool = ds_pool;
7439 alloc_info.pSetLayouts = &ds_layout;
7440 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7441 &descriptorSet);
7442 ASSERT_VK_SUCCESS(err);
7443
7444 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7445 pipe_ms_state_ci.sType =
7446 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7447 pipe_ms_state_ci.pNext = NULL;
7448 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7449 pipe_ms_state_ci.sampleShadingEnable = 0;
7450 pipe_ms_state_ci.minSampleShading = 1.0;
7451 pipe_ms_state_ci.pSampleMask = NULL;
7452
7453 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7454 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7455 pipeline_layout_ci.pNext = NULL;
7456 pipeline_layout_ci.setLayoutCount = 1;
7457 pipeline_layout_ci.pSetLayouts = &ds_layout;
7458
7459 VkPipelineLayout pipeline_layout;
7460 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7461 &pipeline_layout);
7462 ASSERT_VK_SUCCESS(err);
7463
7464 VkShaderObj vs(m_device, bindStateVertShaderText,
7465 VK_SHADER_STAGE_VERTEX_BIT, this);
7466 VkShaderObj fs(m_device, bindStateFragShaderText,
7467 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06007468 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06007469 // but add it to be able to run on more devices
7470 VkPipelineObj pipe(m_device);
7471 pipe.AddShader(&vs);
7472 pipe.AddShader(&fs);
7473 pipe.SetMSAA(&pipe_ms_state_ci);
7474 pipe.CreateVKPipeline(pipeline_layout, renderPass());
7475
7476 BeginCommandBuffer();
7477 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7478 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7479
Mark Young29927482016-05-04 14:38:51 -06007480 // Render triangle (the error should trigger on the attempt to draw).
7481 Draw(3, 1, 0, 0);
7482
7483 // Finalize recording of the command buffer
7484 EndCommandBuffer();
7485
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007486 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06007487
7488 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7489 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7490 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7491}
Mark Young29927482016-05-04 14:38:51 -06007492
Karl Schultz6addd812016-02-02 17:17:23 -07007493TEST_F(VkLayerTest, ClearCmdNoDraw) {
7494 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
7495 // to issuing a Draw
7496 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007497
Karl Schultz6addd812016-02-02 17:17:23 -07007498 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07007499 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007500 "vkCmdClearAttachments() issued on CB object ");
7501
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007502 ASSERT_NO_FATAL_FAILURE(InitState());
7503 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06007504
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007505 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007506 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7507 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007508
7509 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007510 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7511 ds_pool_ci.pNext = NULL;
7512 ds_pool_ci.maxSets = 1;
7513 ds_pool_ci.poolSizeCount = 1;
7514 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06007515
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007516 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007517 err =
7518 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007519 ASSERT_VK_SUCCESS(err);
7520
Tony Barboureb254902015-07-15 12:50:33 -06007521 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007522 dsl_binding.binding = 0;
7523 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7524 dsl_binding.descriptorCount = 1;
7525 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7526 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007527
Tony Barboureb254902015-07-15 12:50:33 -06007528 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007529 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7530 ds_layout_ci.pNext = NULL;
7531 ds_layout_ci.bindingCount = 1;
7532 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007533
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007534 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007535 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7536 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007537 ASSERT_VK_SUCCESS(err);
7538
7539 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007540 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007541 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007542 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007543 alloc_info.descriptorPool = ds_pool;
7544 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007545 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7546 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007547 ASSERT_VK_SUCCESS(err);
7548
Tony Barboureb254902015-07-15 12:50:33 -06007549 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007550 pipe_ms_state_ci.sType =
7551 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7552 pipe_ms_state_ci.pNext = NULL;
7553 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7554 pipe_ms_state_ci.sampleShadingEnable = 0;
7555 pipe_ms_state_ci.minSampleShading = 1.0;
7556 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007557
Tony Barboureb254902015-07-15 12:50:33 -06007558 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007559 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7560 pipeline_layout_ci.pNext = NULL;
7561 pipeline_layout_ci.setLayoutCount = 1;
7562 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007563
7564 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007565 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7566 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007567 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007568
Karl Schultz6addd812016-02-02 17:17:23 -07007569 VkShaderObj vs(m_device, bindStateVertShaderText,
7570 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06007571 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07007572 // on more devices
7573 VkShaderObj fs(m_device, bindStateFragShaderText,
7574 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007575
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007576 VkPipelineObj pipe(m_device);
7577 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007578 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007579 pipe.SetMSAA(&pipe_ms_state_ci);
7580 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06007581
7582 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007583
Karl Schultz6addd812016-02-02 17:17:23 -07007584 // Main thing we care about for this test is that the VkImage obj we're
7585 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007586 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06007587 VkClearAttachment color_attachment;
7588 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7589 color_attachment.clearValue.color.float32[0] = 1.0;
7590 color_attachment.clearValue.color.float32[1] = 1.0;
7591 color_attachment.clearValue.color.float32[2] = 1.0;
7592 color_attachment.clearValue.color.float32[3] = 1.0;
7593 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07007594 VkClearRect clear_rect = {
7595 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007596
Karl Schultz6addd812016-02-02 17:17:23 -07007597 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
7598 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007599
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007600 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007601
Chia-I Wuf7458c52015-10-26 21:10:41 +08007602 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7603 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7604 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007605}
7606
Karl Schultz6addd812016-02-02 17:17:23 -07007607TEST_F(VkLayerTest, VtxBufferBadIndex) {
7608 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06007609
Karl Schultz6addd812016-02-02 17:17:23 -07007610 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007611 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07007612 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007613
Tobin Ehlis502480b2015-06-24 15:53:07 -06007614 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06007615 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06007616 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06007617
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007618 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007619 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7620 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007621
7622 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007623 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7624 ds_pool_ci.pNext = NULL;
7625 ds_pool_ci.maxSets = 1;
7626 ds_pool_ci.poolSizeCount = 1;
7627 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06007628
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06007629 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007630 err =
7631 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007632 ASSERT_VK_SUCCESS(err);
7633
Tony Barboureb254902015-07-15 12:50:33 -06007634 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007635 dsl_binding.binding = 0;
7636 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7637 dsl_binding.descriptorCount = 1;
7638 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7639 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06007640
Tony Barboureb254902015-07-15 12:50:33 -06007641 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007642 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7643 ds_layout_ci.pNext = NULL;
7644 ds_layout_ci.bindingCount = 1;
7645 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007646
Tobin Ehlis502480b2015-06-24 15:53:07 -06007647 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007648 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7649 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007650 ASSERT_VK_SUCCESS(err);
7651
7652 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007653 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007654 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007655 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007656 alloc_info.descriptorPool = ds_pool;
7657 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007658 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7659 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007660 ASSERT_VK_SUCCESS(err);
7661
Tony Barboureb254902015-07-15 12:50:33 -06007662 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007663 pipe_ms_state_ci.sType =
7664 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7665 pipe_ms_state_ci.pNext = NULL;
7666 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7667 pipe_ms_state_ci.sampleShadingEnable = 0;
7668 pipe_ms_state_ci.minSampleShading = 1.0;
7669 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06007670
Tony Barboureb254902015-07-15 12:50:33 -06007671 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007672 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7673 pipeline_layout_ci.pNext = NULL;
7674 pipeline_layout_ci.setLayoutCount = 1;
7675 pipeline_layout_ci.pSetLayouts = &ds_layout;
7676 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06007677
Karl Schultz6addd812016-02-02 17:17:23 -07007678 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7679 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007680 ASSERT_VK_SUCCESS(err);
7681
Karl Schultz6addd812016-02-02 17:17:23 -07007682 VkShaderObj vs(m_device, bindStateVertShaderText,
7683 VK_SHADER_STAGE_VERTEX_BIT, this);
7684 VkShaderObj fs(m_device, bindStateFragShaderText,
7685 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06007686 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07007687 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007688 VkPipelineObj pipe(m_device);
7689 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007690 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06007691 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007692 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007693 pipe.SetViewport(m_viewports);
7694 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007695 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06007696
7697 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007698 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7699 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06007700 // Don't care about actual data, just need to get to draw to flag error
7701 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07007702 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
7703 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06007704 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06007705 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007706
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007707 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007708
Chia-I Wuf7458c52015-10-26 21:10:41 +08007709 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7710 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7711 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007712}
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06007713// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
7714TEST_F(VkLayerTest, InvalidImageLayout) {
7715 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
7716 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
7717 "images in the wrong layout when they're copied or transitioned.");
7718 // 3 in ValidateCmdBufImageLayouts
7719 // * -1 Attempt to submit cmd buf w/ deleted image
7720 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
7721 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
7722 m_errorMonitor->SetDesiredFailureMsg(
7723 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7724 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
7725
7726 ASSERT_NO_FATAL_FAILURE(InitState());
7727 // Create src & dst images to use for copy operations
7728 VkImage src_image;
7729 VkImage dst_image;
7730
7731 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7732 const int32_t tex_width = 32;
7733 const int32_t tex_height = 32;
7734
7735 VkImageCreateInfo image_create_info = {};
7736 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7737 image_create_info.pNext = NULL;
7738 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7739 image_create_info.format = tex_format;
7740 image_create_info.extent.width = tex_width;
7741 image_create_info.extent.height = tex_height;
7742 image_create_info.extent.depth = 1;
7743 image_create_info.mipLevels = 1;
7744 image_create_info.arrayLayers = 4;
7745 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7746 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7747 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7748 image_create_info.flags = 0;
7749
7750 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
7751 ASSERT_VK_SUCCESS(err);
7752 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
7753 ASSERT_VK_SUCCESS(err);
7754
7755 BeginCommandBuffer();
7756 VkImageCopy copyRegion;
7757 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7758 copyRegion.srcSubresource.mipLevel = 0;
7759 copyRegion.srcSubresource.baseArrayLayer = 0;
7760 copyRegion.srcSubresource.layerCount = 1;
7761 copyRegion.srcOffset.x = 0;
7762 copyRegion.srcOffset.y = 0;
7763 copyRegion.srcOffset.z = 0;
7764 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7765 copyRegion.dstSubresource.mipLevel = 0;
7766 copyRegion.dstSubresource.baseArrayLayer = 0;
7767 copyRegion.dstSubresource.layerCount = 1;
7768 copyRegion.dstOffset.x = 0;
7769 copyRegion.dstOffset.y = 0;
7770 copyRegion.dstOffset.z = 0;
7771 copyRegion.extent.width = 1;
7772 copyRegion.extent.height = 1;
7773 copyRegion.extent.depth = 1;
7774 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7775 m_errorMonitor->VerifyFound();
7776 // Now cause error due to src image layout changing
7777 m_errorMonitor->SetDesiredFailureMsg(
7778 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7779 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
7780 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7781 m_errorMonitor->VerifyFound();
7782 // Final src error is due to bad layout type
7783 m_errorMonitor->SetDesiredFailureMsg(
7784 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7785 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
7786 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7787 m_errorMonitor->VerifyFound();
7788 // Now verify same checks for dst
7789 m_errorMonitor->SetDesiredFailureMsg(
7790 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7791 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
7792 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7793 m_errorMonitor->VerifyFound();
7794 // Now cause error due to src image layout changing
7795 m_errorMonitor->SetDesiredFailureMsg(
7796 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7797 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
7798 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
7799 m_errorMonitor->VerifyFound();
7800 m_errorMonitor->SetDesiredFailureMsg(
7801 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7802 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
7803 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
7804 m_errorMonitor->VerifyFound();
7805 // Now cause error due to bad image layout transition in PipelineBarrier
7806 VkImageMemoryBarrier image_barrier[1] = {};
7807 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
7808 image_barrier[0].image = src_image;
7809 image_barrier[0].subresourceRange.layerCount = 2;
7810 image_barrier[0].subresourceRange.levelCount = 2;
7811 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7812 m_errorMonitor->SetDesiredFailureMsg(
7813 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7814 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
7815 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
7816 m_errorMonitor->VerifyFound();
7817
7818 // Finally some layout errors at RenderPass create time
7819 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
7820 VkAttachmentReference attach = {};
7821 // perf warning for GENERAL layout w/ non-DS input attachment
7822 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7823 VkSubpassDescription subpass = {};
7824 subpass.inputAttachmentCount = 1;
7825 subpass.pInputAttachments = &attach;
7826 VkRenderPassCreateInfo rpci = {};
7827 rpci.subpassCount = 1;
7828 rpci.pSubpasses = &subpass;
7829 rpci.attachmentCount = 1;
7830 VkAttachmentDescription attach_desc = {};
7831 attach_desc.format = VK_FORMAT_UNDEFINED;
7832 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -06007833 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06007834 VkRenderPass rp;
7835 m_errorMonitor->SetDesiredFailureMsg(
7836 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7837 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
7838 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7839 m_errorMonitor->VerifyFound();
7840 // error w/ non-general layout
7841 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7842
7843 m_errorMonitor->SetDesiredFailureMsg(
7844 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7845 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
7846 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7847 m_errorMonitor->VerifyFound();
7848 subpass.inputAttachmentCount = 0;
7849 subpass.colorAttachmentCount = 1;
7850 subpass.pColorAttachments = &attach;
7851 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7852 // perf warning for GENERAL layout on color attachment
7853 m_errorMonitor->SetDesiredFailureMsg(
7854 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7855 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
7856 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7857 m_errorMonitor->VerifyFound();
7858 // error w/ non-color opt or GENERAL layout for color attachment
7859 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7860 m_errorMonitor->SetDesiredFailureMsg(
7861 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7862 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
7863 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7864 m_errorMonitor->VerifyFound();
7865 subpass.colorAttachmentCount = 0;
7866 subpass.pDepthStencilAttachment = &attach;
7867 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7868 // perf warning for GENERAL layout on DS attachment
7869 m_errorMonitor->SetDesiredFailureMsg(
7870 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7871 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
7872 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7873 m_errorMonitor->VerifyFound();
7874 // error w/ non-ds opt or GENERAL layout for color attachment
7875 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7876 m_errorMonitor->SetDesiredFailureMsg(
7877 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7878 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
7879 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7880 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -06007881 // For this error we need a valid renderpass so create default one
7882 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
7883 attach.attachment = 0;
7884 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
7885 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
7886 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
7887 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
7888 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
7889 // Can't do a CLEAR load on READ_ONLY initialLayout
7890 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
7891 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
7892 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
7893 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7894 " with invalid first layout "
7895 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
7896 "ONLY_OPTIMAL");
7897 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7898 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06007899
7900 vkDestroyImage(m_device->device(), src_image, NULL);
7901 vkDestroyImage(m_device->device(), dst_image, NULL);
7902}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007903#endif // DRAW_STATE_TESTS
7904
Tobin Ehlis0788f522015-05-26 16:11:58 -06007905#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06007906#if GTEST_IS_THREADSAFE
7907struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007908 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007909 VkEvent event;
7910 bool bailout;
7911};
7912
Karl Schultz6addd812016-02-02 17:17:23 -07007913extern "C" void *AddToCommandBuffer(void *arg) {
7914 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007915
Karl Schultz6addd812016-02-02 17:17:23 -07007916 for (int i = 0; i < 10000; i++) {
7917 vkCmdSetEvent(data->commandBuffer, data->event,
7918 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007919 if (data->bailout) {
7920 break;
7921 }
7922 }
7923 return NULL;
7924}
7925
Karl Schultz6addd812016-02-02 17:17:23 -07007926TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06007927 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007928
Karl Schultz6addd812016-02-02 17:17:23 -07007929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7930 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007931
Mike Stroyanaccf7692015-05-12 16:00:45 -06007932 ASSERT_NO_FATAL_FAILURE(InitState());
7933 ASSERT_NO_FATAL_FAILURE(InitViewport());
7934 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7935
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007936 // Calls AllocateCommandBuffers
7937 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06007938
7939 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007940 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007941
7942 VkEventCreateInfo event_info;
7943 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007944 VkResult err;
7945
7946 memset(&event_info, 0, sizeof(event_info));
7947 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
7948
Chia-I Wuf7458c52015-10-26 21:10:41 +08007949 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007950 ASSERT_VK_SUCCESS(err);
7951
Mike Stroyanaccf7692015-05-12 16:00:45 -06007952 err = vkResetEvent(device(), event);
7953 ASSERT_VK_SUCCESS(err);
7954
7955 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007956 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007957 data.event = event;
7958 data.bailout = false;
7959 m_errorMonitor->SetBailout(&data.bailout);
7960 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06007961 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007962 // Add many entries to command buffer from this thread at the same time.
7963 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06007964
Mike Stroyan4268d1f2015-07-13 14:45:35 -06007965 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007966 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007967
Mike Stroyan10b8cb72016-01-22 15:22:03 -07007968 m_errorMonitor->SetBailout(NULL);
7969
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007970 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007971
Chia-I Wuf7458c52015-10-26 21:10:41 +08007972 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007973}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007974#endif // GTEST_IS_THREADSAFE
7975#endif // THREADING_TESTS
7976
Chris Forbes9f7ff632015-05-25 11:13:08 +12007977#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07007978TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007979 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007980 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007981
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007982 ASSERT_NO_FATAL_FAILURE(InitState());
7983 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7984
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007985 VkShaderModule module;
7986 VkShaderModuleCreateInfo moduleCreateInfo;
7987 struct icd_spv_header spv;
7988
7989 spv.magic = ICD_SPV_MAGIC;
7990 spv.version = ICD_SPV_VERSION;
7991 spv.gen_magic = 0;
7992
7993 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
7994 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007995 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007996 moduleCreateInfo.codeSize = 4;
7997 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007998 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007999
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008000 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008001}
8002
Karl Schultz6addd812016-02-02 17:17:23 -07008003TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008004 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12008005 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008006
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008007 ASSERT_NO_FATAL_FAILURE(InitState());
8008 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8009
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008010 VkShaderModule module;
8011 VkShaderModuleCreateInfo moduleCreateInfo;
8012 struct icd_spv_header spv;
8013
8014 spv.magic = ~ICD_SPV_MAGIC;
8015 spv.version = ICD_SPV_VERSION;
8016 spv.gen_magic = 0;
8017
8018 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
8019 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008020 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008021 moduleCreateInfo.codeSize = sizeof(spv) + 10;
8022 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008023 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008024
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008025 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008026}
8027
Chris Forbesb4afd0f2016-04-04 10:48:35 +12008028#if 0
8029// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07008030TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008031 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12008032 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008033
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008034 ASSERT_NO_FATAL_FAILURE(InitState());
8035 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8036
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008037 VkShaderModule module;
8038 VkShaderModuleCreateInfo moduleCreateInfo;
8039 struct icd_spv_header spv;
8040
8041 spv.magic = ICD_SPV_MAGIC;
8042 spv.version = ~ICD_SPV_VERSION;
8043 spv.gen_magic = 0;
8044
8045 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
8046 moduleCreateInfo.pNext = NULL;
8047
Karl Schultz6addd812016-02-02 17:17:23 -07008048 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008049 moduleCreateInfo.codeSize = sizeof(spv) + 10;
8050 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008051 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008052
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008053 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008054}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12008055#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008056
Karl Schultz6addd812016-02-02 17:17:23 -07008057TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008058 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008059 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008060
Chris Forbes9f7ff632015-05-25 11:13:08 +12008061 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008062 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12008063
8064 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008065 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12008066 "\n"
8067 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07008068 "out gl_PerVertex {\n"
8069 " vec4 gl_Position;\n"
8070 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12008071 "void main(){\n"
8072 " gl_Position = vec4(1);\n"
8073 " x = 0;\n"
8074 "}\n";
8075 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008076 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12008077 "\n"
8078 "layout(location=0) out vec4 color;\n"
8079 "void main(){\n"
8080 " color = vec4(1);\n"
8081 "}\n";
8082
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008083 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8084 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12008085
8086 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008087 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12008088 pipe.AddShader(&vs);
8089 pipe.AddShader(&fs);
8090
Chris Forbes9f7ff632015-05-25 11:13:08 +12008091 VkDescriptorSetObj descriptorSet(m_device);
8092 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008093 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12008094
Tony Barbour5781e8f2015-08-04 16:23:11 -06008095 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12008096
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008097 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12008098}
Chris Forbes9f7ff632015-05-25 11:13:08 +12008099
Karl Schultz6addd812016-02-02 17:17:23 -07008100TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008102 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008103
Chris Forbes59cb88d2015-05-25 11:13:13 +12008104 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008105 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12008106
8107 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008108 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12008109 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008110 "out gl_PerVertex {\n"
8111 " vec4 gl_Position;\n"
8112 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12008113 "void main(){\n"
8114 " gl_Position = vec4(1);\n"
8115 "}\n";
8116 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008117 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12008118 "\n"
8119 "layout(location=0) in float x;\n"
8120 "layout(location=0) out vec4 color;\n"
8121 "void main(){\n"
8122 " color = vec4(x);\n"
8123 "}\n";
8124
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008125 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8126 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12008127
8128 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008129 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12008130 pipe.AddShader(&vs);
8131 pipe.AddShader(&fs);
8132
Chris Forbes59cb88d2015-05-25 11:13:13 +12008133 VkDescriptorSetObj descriptorSet(m_device);
8134 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008135 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12008136
Tony Barbour5781e8f2015-08-04 16:23:11 -06008137 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12008138
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008139 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12008140}
8141
Karl Schultz6addd812016-02-02 17:17:23 -07008142TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13008143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008144 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13008145
8146 ASSERT_NO_FATAL_FAILURE(InitState());
8147 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8148
8149 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008150 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13008151 "\n"
8152 "out gl_PerVertex {\n"
8153 " vec4 gl_Position;\n"
8154 "};\n"
8155 "void main(){\n"
8156 " gl_Position = vec4(1);\n"
8157 "}\n";
8158 char const *fsSource =
8159 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13008160 "\n"
8161 "in block { layout(location=0) float x; } ins;\n"
8162 "layout(location=0) out vec4 color;\n"
8163 "void main(){\n"
8164 " color = vec4(ins.x);\n"
8165 "}\n";
8166
8167 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8168 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8169
8170 VkPipelineObj pipe(m_device);
8171 pipe.AddColorAttachment();
8172 pipe.AddShader(&vs);
8173 pipe.AddShader(&fs);
8174
8175 VkDescriptorSetObj descriptorSet(m_device);
8176 descriptorSet.AppendDummy();
8177 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8178
8179 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8180
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008181 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13008182}
8183
Karl Schultz6addd812016-02-02 17:17:23 -07008184TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13008185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13008186 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07008187 "output arr[2] of float32' vs 'ptr to "
8188 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13008189
8190 ASSERT_NO_FATAL_FAILURE(InitState());
8191 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8192
8193 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008194 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13008195 "\n"
8196 "layout(location=0) out float x[2];\n"
8197 "out gl_PerVertex {\n"
8198 " vec4 gl_Position;\n"
8199 "};\n"
8200 "void main(){\n"
8201 " x[0] = 0; x[1] = 0;\n"
8202 " gl_Position = vec4(1);\n"
8203 "}\n";
8204 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008205 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13008206 "\n"
8207 "layout(location=0) in float x[3];\n"
8208 "layout(location=0) out vec4 color;\n"
8209 "void main(){\n"
8210 " color = vec4(x[0] + x[1] + x[2]);\n"
8211 "}\n";
8212
8213 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8214 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8215
8216 VkPipelineObj pipe(m_device);
8217 pipe.AddColorAttachment();
8218 pipe.AddShader(&vs);
8219 pipe.AddShader(&fs);
8220
8221 VkDescriptorSetObj descriptorSet(m_device);
8222 descriptorSet.AppendDummy();
8223 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8224
8225 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8226
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008227 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13008228}
8229
Karl Schultz6addd812016-02-02 17:17:23 -07008230TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008232 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008233
Chris Forbesb56af562015-05-25 11:13:17 +12008234 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008235 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12008236
8237 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008238 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12008239 "\n"
8240 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07008241 "out gl_PerVertex {\n"
8242 " vec4 gl_Position;\n"
8243 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12008244 "void main(){\n"
8245 " x = 0;\n"
8246 " gl_Position = vec4(1);\n"
8247 "}\n";
8248 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008249 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12008250 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008251 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12008252 "layout(location=0) out vec4 color;\n"
8253 "void main(){\n"
8254 " color = vec4(x);\n"
8255 "}\n";
8256
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008257 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8258 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12008259
8260 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008261 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12008262 pipe.AddShader(&vs);
8263 pipe.AddShader(&fs);
8264
Chris Forbesb56af562015-05-25 11:13:17 +12008265 VkDescriptorSetObj descriptorSet(m_device);
8266 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008267 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12008268
Tony Barbour5781e8f2015-08-04 16:23:11 -06008269 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12008270
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008271 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12008272}
8273
Karl Schultz6addd812016-02-02 17:17:23 -07008274TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13008275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008276 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13008277
8278 ASSERT_NO_FATAL_FAILURE(InitState());
8279 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8280
8281 char const *vsSource =
8282 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13008283 "\n"
8284 "out block { layout(location=0) int x; } outs;\n"
8285 "out gl_PerVertex {\n"
8286 " vec4 gl_Position;\n"
8287 "};\n"
8288 "void main(){\n"
8289 " outs.x = 0;\n"
8290 " gl_Position = vec4(1);\n"
8291 "}\n";
8292 char const *fsSource =
8293 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13008294 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008295 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13008296 "layout(location=0) out vec4 color;\n"
8297 "void main(){\n"
8298 " color = vec4(ins.x);\n"
8299 "}\n";
8300
8301 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8302 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8303
8304 VkPipelineObj pipe(m_device);
8305 pipe.AddColorAttachment();
8306 pipe.AddShader(&vs);
8307 pipe.AddShader(&fs);
8308
8309 VkDescriptorSetObj descriptorSet(m_device);
8310 descriptorSet.AppendDummy();
8311 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8312
8313 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8314
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008315 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13008316}
8317
8318TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
8319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8320 "location 0.0 which is not written by vertex shader");
8321
8322 ASSERT_NO_FATAL_FAILURE(InitState());
8323 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8324
8325 char const *vsSource =
8326 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13008327 "\n"
8328 "out block { layout(location=1) float x; } outs;\n"
8329 "out gl_PerVertex {\n"
8330 " vec4 gl_Position;\n"
8331 "};\n"
8332 "void main(){\n"
8333 " outs.x = 0;\n"
8334 " gl_Position = vec4(1);\n"
8335 "}\n";
8336 char const *fsSource =
8337 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13008338 "\n"
8339 "in block { layout(location=0) float x; } ins;\n"
8340 "layout(location=0) out vec4 color;\n"
8341 "void main(){\n"
8342 " color = vec4(ins.x);\n"
8343 "}\n";
8344
8345 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8346 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8347
8348 VkPipelineObj pipe(m_device);
8349 pipe.AddColorAttachment();
8350 pipe.AddShader(&vs);
8351 pipe.AddShader(&fs);
8352
8353 VkDescriptorSetObj descriptorSet(m_device);
8354 descriptorSet.AppendDummy();
8355 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8356
8357 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8358
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008359 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13008360}
8361
8362TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
8363 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8364 "location 0.1 which is not written by vertex shader");
8365
8366 ASSERT_NO_FATAL_FAILURE(InitState());
8367 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8368
8369 char const *vsSource =
8370 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13008371 "\n"
8372 "out block { layout(location=0, component=0) float x; } outs;\n"
8373 "out gl_PerVertex {\n"
8374 " vec4 gl_Position;\n"
8375 "};\n"
8376 "void main(){\n"
8377 " outs.x = 0;\n"
8378 " gl_Position = vec4(1);\n"
8379 "}\n";
8380 char const *fsSource =
8381 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13008382 "\n"
8383 "in block { layout(location=0, component=1) float x; } ins;\n"
8384 "layout(location=0) out vec4 color;\n"
8385 "void main(){\n"
8386 " color = vec4(ins.x);\n"
8387 "}\n";
8388
8389 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8390 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8391
8392 VkPipelineObj pipe(m_device);
8393 pipe.AddColorAttachment();
8394 pipe.AddShader(&vs);
8395 pipe.AddShader(&fs);
8396
8397 VkDescriptorSetObj descriptorSet(m_device);
8398 descriptorSet.AppendDummy();
8399 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8400
8401 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8402
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008403 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13008404}
8405
Karl Schultz6addd812016-02-02 17:17:23 -07008406TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008407 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008408 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008409
Chris Forbesde136e02015-05-25 11:13:28 +12008410 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008411 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12008412
8413 VkVertexInputBindingDescription input_binding;
8414 memset(&input_binding, 0, sizeof(input_binding));
8415
8416 VkVertexInputAttributeDescription input_attrib;
8417 memset(&input_attrib, 0, sizeof(input_attrib));
8418 input_attrib.format = VK_FORMAT_R32_SFLOAT;
8419
8420 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008421 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12008422 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008423 "out gl_PerVertex {\n"
8424 " vec4 gl_Position;\n"
8425 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12008426 "void main(){\n"
8427 " gl_Position = vec4(1);\n"
8428 "}\n";
8429 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008430 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12008431 "\n"
8432 "layout(location=0) out vec4 color;\n"
8433 "void main(){\n"
8434 " color = vec4(1);\n"
8435 "}\n";
8436
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008437 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8438 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12008439
8440 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008441 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12008442 pipe.AddShader(&vs);
8443 pipe.AddShader(&fs);
8444
8445 pipe.AddVertexInputBindings(&input_binding, 1);
8446 pipe.AddVertexInputAttribs(&input_attrib, 1);
8447
Chris Forbesde136e02015-05-25 11:13:28 +12008448 VkDescriptorSetObj descriptorSet(m_device);
8449 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008450 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12008451
Tony Barbour5781e8f2015-08-04 16:23:11 -06008452 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12008453
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008454 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12008455}
8456
Karl Schultz6addd812016-02-02 17:17:23 -07008457TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008458 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008459 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13008460
8461 ASSERT_NO_FATAL_FAILURE(InitState());
8462 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8463
8464 VkVertexInputBindingDescription input_binding;
8465 memset(&input_binding, 0, sizeof(input_binding));
8466
8467 VkVertexInputAttributeDescription input_attrib;
8468 memset(&input_attrib, 0, sizeof(input_attrib));
8469 input_attrib.format = VK_FORMAT_R32_SFLOAT;
8470
8471 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008472 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13008473 "\n"
8474 "layout(location=1) in float x;\n"
8475 "out gl_PerVertex {\n"
8476 " vec4 gl_Position;\n"
8477 "};\n"
8478 "void main(){\n"
8479 " gl_Position = vec4(x);\n"
8480 "}\n";
8481 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008482 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13008483 "\n"
8484 "layout(location=0) out vec4 color;\n"
8485 "void main(){\n"
8486 " color = vec4(1);\n"
8487 "}\n";
8488
8489 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8490 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8491
8492 VkPipelineObj pipe(m_device);
8493 pipe.AddColorAttachment();
8494 pipe.AddShader(&vs);
8495 pipe.AddShader(&fs);
8496
8497 pipe.AddVertexInputBindings(&input_binding, 1);
8498 pipe.AddVertexInputAttribs(&input_attrib, 1);
8499
8500 VkDescriptorSetObj descriptorSet(m_device);
8501 descriptorSet.AppendDummy();
8502 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8503
8504 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8505
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008506 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13008507}
8508
Karl Schultz6addd812016-02-02 17:17:23 -07008509TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
8510 m_errorMonitor->SetDesiredFailureMsg(
8511 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008512 "VS consumes input at location 0 but not provided");
8513
Chris Forbes62e8e502015-05-25 11:13:29 +12008514 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008515 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12008516
8517 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008518 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12008519 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008520 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07008521 "out gl_PerVertex {\n"
8522 " vec4 gl_Position;\n"
8523 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12008524 "void main(){\n"
8525 " gl_Position = x;\n"
8526 "}\n";
8527 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008528 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12008529 "\n"
8530 "layout(location=0) out vec4 color;\n"
8531 "void main(){\n"
8532 " color = vec4(1);\n"
8533 "}\n";
8534
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008535 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8536 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12008537
8538 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008539 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12008540 pipe.AddShader(&vs);
8541 pipe.AddShader(&fs);
8542
Chris Forbes62e8e502015-05-25 11:13:29 +12008543 VkDescriptorSetObj descriptorSet(m_device);
8544 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008545 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12008546
Tony Barbour5781e8f2015-08-04 16:23:11 -06008547 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12008548
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008549 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12008550}
8551
Karl Schultz6addd812016-02-02 17:17:23 -07008552TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
8553 m_errorMonitor->SetDesiredFailureMsg(
8554 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008555 "location 0 does not match VS input type");
8556
Chris Forbesc97d98e2015-05-25 11:13:31 +12008557 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008558 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12008559
8560 VkVertexInputBindingDescription input_binding;
8561 memset(&input_binding, 0, sizeof(input_binding));
8562
8563 VkVertexInputAttributeDescription input_attrib;
8564 memset(&input_attrib, 0, sizeof(input_attrib));
8565 input_attrib.format = VK_FORMAT_R32_SFLOAT;
8566
8567 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008568 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12008569 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008570 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07008571 "out gl_PerVertex {\n"
8572 " vec4 gl_Position;\n"
8573 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12008574 "void main(){\n"
8575 " gl_Position = vec4(x);\n"
8576 "}\n";
8577 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008578 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12008579 "\n"
8580 "layout(location=0) out vec4 color;\n"
8581 "void main(){\n"
8582 " color = vec4(1);\n"
8583 "}\n";
8584
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008585 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8586 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12008587
8588 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008589 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12008590 pipe.AddShader(&vs);
8591 pipe.AddShader(&fs);
8592
8593 pipe.AddVertexInputBindings(&input_binding, 1);
8594 pipe.AddVertexInputAttribs(&input_attrib, 1);
8595
Chris Forbesc97d98e2015-05-25 11:13:31 +12008596 VkDescriptorSetObj descriptorSet(m_device);
8597 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008598 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12008599
Tony Barbour5781e8f2015-08-04 16:23:11 -06008600 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12008601
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008602 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12008603}
8604
Chris Forbesc68b43c2016-04-06 11:18:47 +12008605TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
8606 m_errorMonitor->SetDesiredFailureMsg(
8607 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8608 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
8609
8610 ASSERT_NO_FATAL_FAILURE(InitState());
8611 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8612
8613 char const *vsSource =
8614 "#version 450\n"
8615 "\n"
8616 "out gl_PerVertex {\n"
8617 " vec4 gl_Position;\n"
8618 "};\n"
8619 "void main(){\n"
8620 " gl_Position = vec4(1);\n"
8621 "}\n";
8622 char const *fsSource =
8623 "#version 450\n"
8624 "\n"
8625 "layout(location=0) out vec4 color;\n"
8626 "void main(){\n"
8627 " color = vec4(1);\n"
8628 "}\n";
8629
8630 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8631 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8632
8633 VkPipelineObj pipe(m_device);
8634 pipe.AddColorAttachment();
8635 pipe.AddShader(&vs);
8636 pipe.AddShader(&vs);
8637 pipe.AddShader(&fs);
8638
8639 VkDescriptorSetObj descriptorSet(m_device);
8640 descriptorSet.AppendDummy();
8641 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8642
8643 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8644
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008645 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12008646}
8647
Karl Schultz6addd812016-02-02 17:17:23 -07008648TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008649 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13008650
8651 ASSERT_NO_FATAL_FAILURE(InitState());
8652 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8653
8654 VkVertexInputBindingDescription input_binding;
8655 memset(&input_binding, 0, sizeof(input_binding));
8656
8657 VkVertexInputAttributeDescription input_attribs[2];
8658 memset(input_attribs, 0, sizeof(input_attribs));
8659
8660 for (int i = 0; i < 2; i++) {
8661 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
8662 input_attribs[i].location = i;
8663 }
8664
8665 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008666 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008667 "\n"
8668 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07008669 "out gl_PerVertex {\n"
8670 " vec4 gl_Position;\n"
8671 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008672 "void main(){\n"
8673 " gl_Position = x[0] + x[1];\n"
8674 "}\n";
8675 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008676 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008677 "\n"
8678 "layout(location=0) out vec4 color;\n"
8679 "void main(){\n"
8680 " color = vec4(1);\n"
8681 "}\n";
8682
8683 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8684 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8685
8686 VkPipelineObj pipe(m_device);
8687 pipe.AddColorAttachment();
8688 pipe.AddShader(&vs);
8689 pipe.AddShader(&fs);
8690
8691 pipe.AddVertexInputBindings(&input_binding, 1);
8692 pipe.AddVertexInputAttribs(input_attribs, 2);
8693
8694 VkDescriptorSetObj descriptorSet(m_device);
8695 descriptorSet.AppendDummy();
8696 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8697
8698 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8699
8700 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008701 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13008702}
8703
Chris Forbes2682b242015-11-24 11:13:14 +13008704TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
8705{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008706 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13008707
8708 ASSERT_NO_FATAL_FAILURE(InitState());
8709 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8710
8711 VkVertexInputBindingDescription input_binding;
8712 memset(&input_binding, 0, sizeof(input_binding));
8713
8714 VkVertexInputAttributeDescription input_attribs[2];
8715 memset(input_attribs, 0, sizeof(input_attribs));
8716
8717 for (int i = 0; i < 2; i++) {
8718 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
8719 input_attribs[i].location = i;
8720 }
8721
8722 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008723 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008724 "\n"
8725 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07008726 "out gl_PerVertex {\n"
8727 " vec4 gl_Position;\n"
8728 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008729 "void main(){\n"
8730 " gl_Position = x[0] + x[1];\n"
8731 "}\n";
8732 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008733 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008734 "\n"
8735 "layout(location=0) out vec4 color;\n"
8736 "void main(){\n"
8737 " color = vec4(1);\n"
8738 "}\n";
8739
8740 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8741 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8742
8743 VkPipelineObj pipe(m_device);
8744 pipe.AddColorAttachment();
8745 pipe.AddShader(&vs);
8746 pipe.AddShader(&fs);
8747
8748 pipe.AddVertexInputBindings(&input_binding, 1);
8749 pipe.AddVertexInputAttribs(input_attribs, 2);
8750
8751 VkDescriptorSetObj descriptorSet(m_device);
8752 descriptorSet.AppendDummy();
8753 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8754
8755 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8756
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008757 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13008758}
Chris Forbes2682b242015-11-24 11:13:14 +13008759
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008760TEST_F(VkLayerTest, CreatePipelineSimplePositive)
8761{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008762 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008763
8764 ASSERT_NO_FATAL_FAILURE(InitState());
8765 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8766
8767 char const *vsSource =
8768 "#version 450\n"
8769 "out gl_PerVertex {\n"
8770 " vec4 gl_Position;\n"
8771 "};\n"
8772 "void main(){\n"
8773 " gl_Position = vec4(0);\n"
8774 "}\n";
8775 char const *fsSource =
8776 "#version 450\n"
8777 "\n"
8778 "layout(location=0) out vec4 color;\n"
8779 "void main(){\n"
8780 " color = vec4(1);\n"
8781 "}\n";
8782
8783 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8784 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8785
8786 VkPipelineObj pipe(m_device);
8787 pipe.AddColorAttachment();
8788 pipe.AddShader(&vs);
8789 pipe.AddShader(&fs);
8790
8791 VkDescriptorSetObj descriptorSet(m_device);
8792 descriptorSet.AppendDummy();
8793 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8794
8795 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8796
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008797 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008798}
8799
Chris Forbes912c9192016-04-05 17:50:35 +12008800TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
8801{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008802 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12008803
8804 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
8805
8806 ASSERT_NO_FATAL_FAILURE(InitState());
8807 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8808
8809 char const *vsSource =
8810 "#version 450\n"
8811 "out gl_PerVertex {\n"
8812 " vec4 gl_Position;\n"
8813 "};\n"
8814 "layout(location=0) out vec3 x;\n"
8815 "layout(location=1) out ivec3 y;\n"
8816 "layout(location=2) out vec3 z;\n"
8817 "void main(){\n"
8818 " gl_Position = vec4(0);\n"
8819 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
8820 "}\n";
8821 char const *fsSource =
8822 "#version 450\n"
8823 "\n"
8824 "layout(location=0) out vec4 color;\n"
8825 "layout(location=0) in float x;\n"
8826 "layout(location=1) flat in int y;\n"
8827 "layout(location=2) in vec2 z;\n"
8828 "void main(){\n"
8829 " color = vec4(1 + x + y + z.x);\n"
8830 "}\n";
8831
8832 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8833 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8834
8835 VkPipelineObj pipe(m_device);
8836 pipe.AddColorAttachment();
8837 pipe.AddShader(&vs);
8838 pipe.AddShader(&fs);
8839
8840 VkDescriptorSetObj descriptorSet(m_device);
8841 descriptorSet.AppendDummy();
8842 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8843
8844 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8845
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008846 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12008847}
8848
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008849TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
8850{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008851 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008852
8853 ASSERT_NO_FATAL_FAILURE(InitState());
8854 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8855
Chris Forbesc1e852d2016-04-04 19:26:42 +12008856 if (!m_device->phy().features().tessellationShader) {
8857 printf("Device does not support tessellation shaders; skipped.\n");
8858 return;
8859 }
8860
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008861 char const *vsSource =
8862 "#version 450\n"
8863 "void main(){}\n";
8864 char const *tcsSource =
8865 "#version 450\n"
8866 "layout(location=0) out int x[];\n"
8867 "layout(vertices=3) out;\n"
8868 "void main(){\n"
8869 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
8870 " gl_TessLevelInner[0] = 1;\n"
8871 " x[gl_InvocationID] = gl_InvocationID;\n"
8872 "}\n";
8873 char const *tesSource =
8874 "#version 450\n"
8875 "layout(triangles, equal_spacing, cw) in;\n"
8876 "layout(location=0) in int x[];\n"
8877 "out gl_PerVertex { vec4 gl_Position; };\n"
8878 "void main(){\n"
8879 " gl_Position.xyz = gl_TessCoord;\n"
8880 " gl_Position.w = x[0] + x[1] + x[2];\n"
8881 "}\n";
8882 char const *fsSource =
8883 "#version 450\n"
8884 "layout(location=0) out vec4 color;\n"
8885 "void main(){\n"
8886 " color = vec4(1);\n"
8887 "}\n";
8888
8889 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8890 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
8891 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
8892 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8893
8894 VkPipelineInputAssemblyStateCreateInfo iasci{
8895 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
8896 nullptr,
8897 0,
8898 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
8899 VK_FALSE};
8900
Chris Forbesb4cacb62016-04-04 19:15:00 +12008901 VkPipelineTessellationStateCreateInfo tsci{
8902 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
8903 nullptr,
8904 0,
8905 3};
8906
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008907 VkPipelineObj pipe(m_device);
8908 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12008909 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008910 pipe.AddColorAttachment();
8911 pipe.AddShader(&vs);
8912 pipe.AddShader(&tcs);
8913 pipe.AddShader(&tes);
8914 pipe.AddShader(&fs);
8915
8916 VkDescriptorSetObj descriptorSet(m_device);
8917 descriptorSet.AppendDummy();
8918 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8919
8920 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8921
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008922 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008923}
8924
Chris Forbesa0ab8152016-04-20 13:34:27 +12008925TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
8926{
8927 m_errorMonitor->ExpectSuccess();
8928
8929 ASSERT_NO_FATAL_FAILURE(InitState());
8930 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8931
8932 if (!m_device->phy().features().geometryShader) {
8933 printf("Device does not support geometry shaders; skipped.\n");
8934 return;
8935 }
8936
8937 char const *vsSource =
8938 "#version 450\n"
8939 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
8940 "void main(){\n"
8941 " vs_out.x = vec4(1);\n"
8942 "}\n";
8943 char const *gsSource =
8944 "#version 450\n"
8945 "layout(triangles) in;\n"
8946 "layout(triangle_strip, max_vertices=3) out;\n"
8947 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
8948 "out gl_PerVertex { vec4 gl_Position; };\n"
8949 "void main() {\n"
8950 " gl_Position = gs_in[0].x;\n"
8951 " EmitVertex();\n"
8952 "}\n";
8953 char const *fsSource =
8954 "#version 450\n"
8955 "layout(location=0) out vec4 color;\n"
8956 "void main(){\n"
8957 " color = vec4(1);\n"
8958 "}\n";
8959
8960 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8961 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
8962 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8963
8964 VkPipelineObj pipe(m_device);
8965 pipe.AddColorAttachment();
8966 pipe.AddShader(&vs);
8967 pipe.AddShader(&gs);
8968 pipe.AddShader(&fs);
8969
8970 VkDescriptorSetObj descriptorSet(m_device);
8971 descriptorSet.AppendDummy();
8972 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8973
8974 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8975
8976 m_errorMonitor->VerifyNotFound();
8977}
8978
Chris Forbesa0193bc2016-04-04 19:19:47 +12008979TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
8980{
8981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8982 "is per-vertex in tessellation control shader stage "
8983 "but per-patch in tessellation evaluation shader stage");
8984
8985 ASSERT_NO_FATAL_FAILURE(InitState());
8986 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8987
Chris Forbesc1e852d2016-04-04 19:26:42 +12008988 if (!m_device->phy().features().tessellationShader) {
8989 printf("Device does not support tessellation shaders; skipped.\n");
8990 return;
8991 }
8992
Chris Forbesa0193bc2016-04-04 19:19:47 +12008993 char const *vsSource =
8994 "#version 450\n"
8995 "void main(){}\n";
8996 char const *tcsSource =
8997 "#version 450\n"
8998 "layout(location=0) out int x[];\n"
8999 "layout(vertices=3) out;\n"
9000 "void main(){\n"
9001 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
9002 " gl_TessLevelInner[0] = 1;\n"
9003 " x[gl_InvocationID] = gl_InvocationID;\n"
9004 "}\n";
9005 char const *tesSource =
9006 "#version 450\n"
9007 "layout(triangles, equal_spacing, cw) in;\n"
9008 "layout(location=0) patch in int x;\n"
9009 "out gl_PerVertex { vec4 gl_Position; };\n"
9010 "void main(){\n"
9011 " gl_Position.xyz = gl_TessCoord;\n"
9012 " gl_Position.w = x;\n"
9013 "}\n";
9014 char const *fsSource =
9015 "#version 450\n"
9016 "layout(location=0) out vec4 color;\n"
9017 "void main(){\n"
9018 " color = vec4(1);\n"
9019 "}\n";
9020
9021 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9022 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
9023 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
9024 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9025
9026 VkPipelineInputAssemblyStateCreateInfo iasci{
9027 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
9028 nullptr,
9029 0,
9030 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
9031 VK_FALSE};
9032
9033 VkPipelineTessellationStateCreateInfo tsci{
9034 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
9035 nullptr,
9036 0,
9037 3};
9038
9039 VkPipelineObj pipe(m_device);
9040 pipe.SetInputAssembly(&iasci);
9041 pipe.SetTessellation(&tsci);
9042 pipe.AddColorAttachment();
9043 pipe.AddShader(&vs);
9044 pipe.AddShader(&tcs);
9045 pipe.AddShader(&tes);
9046 pipe.AddShader(&fs);
9047
9048 VkDescriptorSetObj descriptorSet(m_device);
9049 descriptorSet.AppendDummy();
9050 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
9051
9052 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
9053
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009054 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12009055}
9056
Karl Schultz6addd812016-02-02 17:17:23 -07009057TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
9058 m_errorMonitor->SetDesiredFailureMsg(
9059 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009060 "Duplicate vertex input binding descriptions for binding 0");
9061
Chris Forbes280ba2c2015-06-12 11:16:41 +12009062 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06009063 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12009064
9065 /* Two binding descriptions for binding 0 */
9066 VkVertexInputBindingDescription input_bindings[2];
9067 memset(input_bindings, 0, sizeof(input_bindings));
9068
9069 VkVertexInputAttributeDescription input_attrib;
9070 memset(&input_attrib, 0, sizeof(input_attrib));
9071 input_attrib.format = VK_FORMAT_R32_SFLOAT;
9072
9073 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009074 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12009075 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07009076 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07009077 "out gl_PerVertex {\n"
9078 " vec4 gl_Position;\n"
9079 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12009080 "void main(){\n"
9081 " gl_Position = vec4(x);\n"
9082 "}\n";
9083 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009084 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12009085 "\n"
9086 "layout(location=0) out vec4 color;\n"
9087 "void main(){\n"
9088 " color = vec4(1);\n"
9089 "}\n";
9090
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009091 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9092 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12009093
9094 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08009095 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12009096 pipe.AddShader(&vs);
9097 pipe.AddShader(&fs);
9098
9099 pipe.AddVertexInputBindings(input_bindings, 2);
9100 pipe.AddVertexInputAttribs(&input_attrib, 1);
9101
Chris Forbes280ba2c2015-06-12 11:16:41 +12009102 VkDescriptorSetObj descriptorSet(m_device);
9103 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009104 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12009105
Tony Barbour5781e8f2015-08-04 16:23:11 -06009106 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12009107
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009108 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12009109}
Chris Forbes8f68b562015-05-25 11:13:32 +12009110
Chris Forbes35efec72016-04-21 14:32:08 +12009111TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
9112 m_errorMonitor->ExpectSuccess();
9113
9114 ASSERT_NO_FATAL_FAILURE(InitState());
9115 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9116
9117 if (!m_device->phy().features().tessellationShader) {
9118 printf("Device does not support 64bit vertex attributes; skipped.\n");
9119 return;
9120 }
9121
9122 VkVertexInputBindingDescription input_bindings[1];
9123 memset(input_bindings, 0, sizeof(input_bindings));
9124
9125 VkVertexInputAttributeDescription input_attribs[4];
9126 memset(input_attribs, 0, sizeof(input_attribs));
9127 input_attribs[0].location = 0;
9128 input_attribs[0].offset = 0;
9129 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
9130 input_attribs[1].location = 2;
9131 input_attribs[1].offset = 32;
9132 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
9133 input_attribs[2].location = 4;
9134 input_attribs[2].offset = 64;
9135 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
9136 input_attribs[3].location = 6;
9137 input_attribs[3].offset = 96;
9138 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
9139
9140 char const *vsSource =
9141 "#version 450\n"
9142 "\n"
9143 "layout(location=0) in dmat4 x;\n"
9144 "out gl_PerVertex {\n"
9145 " vec4 gl_Position;\n"
9146 "};\n"
9147 "void main(){\n"
9148 " gl_Position = vec4(x[0][0]);\n"
9149 "}\n";
9150 char const *fsSource =
9151 "#version 450\n"
9152 "\n"
9153 "layout(location=0) out vec4 color;\n"
9154 "void main(){\n"
9155 " color = vec4(1);\n"
9156 "}\n";
9157
9158 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9159 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9160
9161 VkPipelineObj pipe(m_device);
9162 pipe.AddColorAttachment();
9163 pipe.AddShader(&vs);
9164 pipe.AddShader(&fs);
9165
9166 pipe.AddVertexInputBindings(input_bindings, 1);
9167 pipe.AddVertexInputAttribs(input_attribs, 4);
9168
9169 VkDescriptorSetObj descriptorSet(m_device);
9170 descriptorSet.AppendDummy();
9171 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
9172
9173 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
9174
9175 m_errorMonitor->VerifyNotFound();
9176}
9177
Karl Schultz6addd812016-02-02 17:17:23 -07009178TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009179 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009180 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009181
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009182 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009183
9184 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009185 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009186 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07009187 "out gl_PerVertex {\n"
9188 " vec4 gl_Position;\n"
9189 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009190 "void main(){\n"
9191 " gl_Position = vec4(1);\n"
9192 "}\n";
9193 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009194 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009195 "\n"
9196 "void main(){\n"
9197 "}\n";
9198
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009199 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9200 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009201
9202 VkPipelineObj pipe(m_device);
9203 pipe.AddShader(&vs);
9204 pipe.AddShader(&fs);
9205
Chia-I Wu08accc62015-07-07 11:50:03 +08009206 /* set up CB 0, not written */
9207 pipe.AddColorAttachment();
9208 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009209
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009210 VkDescriptorSetObj descriptorSet(m_device);
9211 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009212 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009213
Tony Barbour5781e8f2015-08-04 16:23:11 -06009214 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009215
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009216 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009217}
9218
Karl Schultz6addd812016-02-02 17:17:23 -07009219TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07009220 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07009221 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009222 "FS writes to output location 1 with no matching attachment");
9223
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009224 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009225
9226 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009227 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009228 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07009229 "out gl_PerVertex {\n"
9230 " vec4 gl_Position;\n"
9231 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009232 "void main(){\n"
9233 " gl_Position = vec4(1);\n"
9234 "}\n";
9235 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009236 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009237 "\n"
9238 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07009239 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009240 "void main(){\n"
9241 " x = vec4(1);\n"
9242 " y = vec4(1);\n"
9243 "}\n";
9244
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009245 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9246 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009247
9248 VkPipelineObj pipe(m_device);
9249 pipe.AddShader(&vs);
9250 pipe.AddShader(&fs);
9251
Chia-I Wu08accc62015-07-07 11:50:03 +08009252 /* set up CB 0, not written */
9253 pipe.AddColorAttachment();
9254 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009255 /* FS writes CB 1, but we don't configure it */
9256
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009257 VkDescriptorSetObj descriptorSet(m_device);
9258 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009259 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009260
Tony Barbour5781e8f2015-08-04 16:23:11 -06009261 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009262
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009263 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009264}
9265
Karl Schultz6addd812016-02-02 17:17:23 -07009266TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009267 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009268 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009269
Chris Forbesa36d69e2015-05-25 11:13:44 +12009270 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12009271
9272 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009273 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12009274 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07009275 "out gl_PerVertex {\n"
9276 " vec4 gl_Position;\n"
9277 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12009278 "void main(){\n"
9279 " gl_Position = vec4(1);\n"
9280 "}\n";
9281 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009282 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12009283 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07009284 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12009285 "void main(){\n"
9286 " x = ivec4(1);\n"
9287 "}\n";
9288
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009289 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9290 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12009291
9292 VkPipelineObj pipe(m_device);
9293 pipe.AddShader(&vs);
9294 pipe.AddShader(&fs);
9295
Chia-I Wu08accc62015-07-07 11:50:03 +08009296 /* set up CB 0; type is UNORM by default */
9297 pipe.AddColorAttachment();
9298 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12009299
Chris Forbesa36d69e2015-05-25 11:13:44 +12009300 VkDescriptorSetObj descriptorSet(m_device);
9301 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009302 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12009303
Tony Barbour5781e8f2015-08-04 16:23:11 -06009304 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12009305
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009306 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12009307}
Chris Forbes7b1b8932015-06-05 14:43:36 +12009308
Karl Schultz6addd812016-02-02 17:17:23 -07009309TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009311 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009312
Chris Forbes556c76c2015-08-14 12:04:59 +12009313 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12009314
9315 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009316 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12009317 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07009318 "out gl_PerVertex {\n"
9319 " vec4 gl_Position;\n"
9320 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12009321 "void main(){\n"
9322 " gl_Position = vec4(1);\n"
9323 "}\n";
9324 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009325 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12009326 "\n"
9327 "layout(location=0) out vec4 x;\n"
9328 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
9329 "void main(){\n"
9330 " x = vec4(bar.y);\n"
9331 "}\n";
9332
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009333 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9334 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12009335
Chris Forbes556c76c2015-08-14 12:04:59 +12009336 VkPipelineObj pipe(m_device);
9337 pipe.AddShader(&vs);
9338 pipe.AddShader(&fs);
9339
9340 /* set up CB 0; type is UNORM by default */
9341 pipe.AddColorAttachment();
9342 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9343
9344 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009345 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12009346
9347 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
9348
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009349 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12009350}
9351
Chris Forbes5c59e902016-02-26 16:56:09 +13009352TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
9353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9354 "not declared in layout");
9355
9356 ASSERT_NO_FATAL_FAILURE(InitState());
9357
9358 char const *vsSource =
9359 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13009360 "\n"
9361 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
9362 "out gl_PerVertex {\n"
9363 " vec4 gl_Position;\n"
9364 "};\n"
9365 "void main(){\n"
9366 " gl_Position = vec4(consts.x);\n"
9367 "}\n";
9368 char const *fsSource =
9369 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13009370 "\n"
9371 "layout(location=0) out vec4 x;\n"
9372 "void main(){\n"
9373 " x = vec4(1);\n"
9374 "}\n";
9375
9376 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9377 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9378
9379 VkPipelineObj pipe(m_device);
9380 pipe.AddShader(&vs);
9381 pipe.AddShader(&fs);
9382
9383 /* set up CB 0; type is UNORM by default */
9384 pipe.AddColorAttachment();
9385 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9386
9387 VkDescriptorSetObj descriptorSet(m_device);
9388 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
9389
9390 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
9391
9392 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009393 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13009394}
9395
Mark Lobodzinski209b5292015-09-17 09:44:05 -06009396#endif // SHADER_CHECKER_TESTS
9397
9398#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06009399TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07009400 m_errorMonitor->SetDesiredFailureMsg(
9401 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009402 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06009403
9404 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06009405
9406 // Create an image
9407 VkImage image;
9408
Karl Schultz6addd812016-02-02 17:17:23 -07009409 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9410 const int32_t tex_width = 32;
9411 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06009412
9413 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009414 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9415 image_create_info.pNext = NULL;
9416 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9417 image_create_info.format = tex_format;
9418 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06009419 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07009420 image_create_info.extent.depth = 1;
9421 image_create_info.mipLevels = 1;
9422 image_create_info.arrayLayers = 1;
9423 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9424 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9425 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9426 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06009427
9428 // Introduce error by sending down a bogus width extent
9429 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009430 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06009431
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009432 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06009433}
9434
Mark Youngc48c4c12016-04-11 14:26:49 -06009435TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
9436 m_errorMonitor->SetDesiredFailureMsg(
9437 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9438 "CreateImage extents is 0 for at least one required dimension");
9439
9440 ASSERT_NO_FATAL_FAILURE(InitState());
9441
9442 // Create an image
9443 VkImage image;
9444
9445 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9446 const int32_t tex_width = 32;
9447 const int32_t tex_height = 32;
9448
9449 VkImageCreateInfo image_create_info = {};
9450 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9451 image_create_info.pNext = NULL;
9452 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9453 image_create_info.format = tex_format;
9454 image_create_info.extent.width = tex_width;
9455 image_create_info.extent.height = tex_height;
9456 image_create_info.extent.depth = 1;
9457 image_create_info.mipLevels = 1;
9458 image_create_info.arrayLayers = 1;
9459 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9460 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9461 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9462 image_create_info.flags = 0;
9463
9464 // Introduce error by sending down a bogus width extent
9465 image_create_info.extent.width = 0;
9466 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
9467
9468 m_errorMonitor->VerifyFound();
9469}
9470
Karl Schultz6addd812016-02-02 17:17:23 -07009471TEST_F(VkLayerTest, UpdateBufferAlignment) {
9472 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06009473
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009475 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009476
Mike Stroyana3082432015-09-25 13:39:21 -06009477 ASSERT_NO_FATAL_FAILURE(InitState());
9478
9479 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9480 vk_testing::Buffer buffer;
9481 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
9482
9483 BeginCommandBuffer();
9484 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009485 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009486 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009487
Mike Stroyana3082432015-09-25 13:39:21 -06009488 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009489 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009490 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009491
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009492 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009493 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009494 EndCommandBuffer();
9495}
9496
Karl Schultz6addd812016-02-02 17:17:23 -07009497TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009498 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009499 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06009500
9501 ASSERT_NO_FATAL_FAILURE(InitState());
9502
9503 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9504 vk_testing::Buffer buffer;
9505 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
9506
9507 BeginCommandBuffer();
9508 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009509 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009510 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009511
Mike Stroyana3082432015-09-25 13:39:21 -06009512 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009514 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009515
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009516 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009517
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009518 m_errorMonitor->VerifyFound();
9519
Mike Stroyana3082432015-09-25 13:39:21 -06009520 EndCommandBuffer();
9521}
9522
Mark Lobodzinski209b5292015-09-17 09:44:05 -06009523#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12009524
Tobin Ehliscde08892015-09-22 10:11:37 -06009525#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07009526TEST_F(VkLayerTest, InvalidImageView) {
9527 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06009528
Karl Schultz6addd812016-02-02 17:17:23 -07009529 m_errorMonitor->SetDesiredFailureMsg(
9530 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009531 "vkCreateImageView called with baseMipLevel 10 ");
9532
Tobin Ehliscde08892015-09-22 10:11:37 -06009533 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06009534
Mike Stroyana3082432015-09-25 13:39:21 -06009535 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07009536 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06009537
Karl Schultz6addd812016-02-02 17:17:23 -07009538 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9539 const int32_t tex_width = 32;
9540 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06009541
9542 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009543 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9544 image_create_info.pNext = NULL;
9545 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9546 image_create_info.format = tex_format;
9547 image_create_info.extent.width = tex_width;
9548 image_create_info.extent.height = tex_height;
9549 image_create_info.extent.depth = 1;
9550 image_create_info.mipLevels = 1;
9551 image_create_info.arrayLayers = 1;
9552 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9553 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9554 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9555 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06009556
Chia-I Wuf7458c52015-10-26 21:10:41 +08009557 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06009558 ASSERT_VK_SUCCESS(err);
9559
9560 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009561 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9562 image_view_create_info.image = image;
9563 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
9564 image_view_create_info.format = tex_format;
9565 image_view_create_info.subresourceRange.layerCount = 1;
9566 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
9567 image_view_create_info.subresourceRange.levelCount = 1;
9568 image_view_create_info.subresourceRange.aspectMask =
9569 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06009570
9571 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07009572 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
9573 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06009574
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009575 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06009576}
Mike Stroyana3082432015-09-25 13:39:21 -06009577
Karl Schultz6addd812016-02-02 17:17:23 -07009578TEST_F(VkLayerTest, InvalidImageViewAspect) {
9579 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009580
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009582 "vkCreateImageView: Color image "
9583 "formats must have ONLY the "
9584 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009585
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009586 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009587
9588 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07009589 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009590
Karl Schultz6addd812016-02-02 17:17:23 -07009591 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9592 const int32_t tex_width = 32;
9593 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009594
9595 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009596 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9597 image_create_info.pNext = NULL;
9598 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9599 image_create_info.format = tex_format;
9600 image_create_info.extent.width = tex_width;
9601 image_create_info.extent.height = tex_height;
9602 image_create_info.extent.depth = 1;
9603 image_create_info.mipLevels = 1;
9604 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9605 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9606 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9607 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009608
Chia-I Wuf7458c52015-10-26 21:10:41 +08009609 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009610 ASSERT_VK_SUCCESS(err);
9611
9612 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009613 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9614 image_view_create_info.image = image;
9615 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
9616 image_view_create_info.format = tex_format;
9617 image_view_create_info.subresourceRange.baseMipLevel = 0;
9618 image_view_create_info.subresourceRange.levelCount = 1;
9619 // Cause an error by setting an invalid image aspect
9620 image_view_create_info.subresourceRange.aspectMask =
9621 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009622
9623 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07009624 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
9625 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009626
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009627 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009628}
9629
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009630TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07009631 VkResult err;
9632 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009633
Karl Schultz6addd812016-02-02 17:17:23 -07009634 m_errorMonitor->SetDesiredFailureMsg(
9635 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009636 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009637
Mike Stroyana3082432015-09-25 13:39:21 -06009638 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009639
9640 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009641 VkImage srcImage;
9642 VkImage dstImage;
9643 VkDeviceMemory srcMem;
9644 VkDeviceMemory destMem;
9645 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009646
9647 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009648 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9649 image_create_info.pNext = NULL;
9650 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9651 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9652 image_create_info.extent.width = 32;
9653 image_create_info.extent.height = 32;
9654 image_create_info.extent.depth = 1;
9655 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009656 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07009657 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9658 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9659 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9660 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009661
Karl Schultz6addd812016-02-02 17:17:23 -07009662 err =
9663 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009664 ASSERT_VK_SUCCESS(err);
9665
Karl Schultz6addd812016-02-02 17:17:23 -07009666 err =
9667 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009668 ASSERT_VK_SUCCESS(err);
9669
9670 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009671 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009672 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9673 memAlloc.pNext = NULL;
9674 memAlloc.allocationSize = 0;
9675 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009676
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009677 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009678 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009679 pass =
9680 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009681 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009682 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009683 ASSERT_VK_SUCCESS(err);
9684
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009685 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009686 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009687 pass =
9688 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009689 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009690 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009691 ASSERT_VK_SUCCESS(err);
9692
9693 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9694 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009695 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009696 ASSERT_VK_SUCCESS(err);
9697
9698 BeginCommandBuffer();
9699 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009700 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009701 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009702 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009703 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06009704 copyRegion.srcOffset.x = 0;
9705 copyRegion.srcOffset.y = 0;
9706 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009707 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009708 copyRegion.dstSubresource.mipLevel = 0;
9709 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009710 // Introduce failure by forcing the dst layerCount to differ from src
9711 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009712 copyRegion.dstOffset.x = 0;
9713 copyRegion.dstOffset.y = 0;
9714 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009715 copyRegion.extent.width = 1;
9716 copyRegion.extent.height = 1;
9717 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009718 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9719 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009720 EndCommandBuffer();
9721
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009722 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009723
Chia-I Wuf7458c52015-10-26 21:10:41 +08009724 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009725 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009726 vkFreeMemory(m_device->device(), srcMem, NULL);
9727 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009728}
9729
Tony Barbourd6673642016-05-05 14:46:39 -06009730TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
9731
9732 TEST_DESCRIPTION("Creating images with unsuported formats ");
9733
9734 ASSERT_NO_FATAL_FAILURE(InitState());
9735 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9736 VkImageObj image(m_device);
9737 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9738 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
9739 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
9740 VK_IMAGE_TILING_OPTIMAL, 0);
9741 ASSERT_TRUE(image.initialized());
9742
9743 VkFormat unsupported = VK_FORMAT_UNDEFINED;
9744 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9745 VkFormat format = static_cast<VkFormat>(f);
9746 VkFormatProperties fProps = m_device->format_properties(format);
9747 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
9748 fProps.optimalTilingFeatures == 0) {
9749 unsupported = format;
9750 break;
9751 }
9752 }
9753 if (unsupported != VK_FORMAT_UNDEFINED) {
9754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9755 "vkCreateImage parameter, "
9756 "VkFormat pCreateInfo->format, "
9757 "contains unsupported format");
9758 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
9759 VkImageCreateInfo image_create_info;
9760 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9761 image_create_info.pNext = NULL;
9762 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9763 image_create_info.format = unsupported;
9764 image_create_info.extent.width = 32;
9765 image_create_info.extent.height = 32;
9766 image_create_info.extent.depth = 1;
9767 image_create_info.mipLevels = 1;
9768 image_create_info.arrayLayers = 1;
9769 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9770 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9771 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9772 image_create_info.flags = 0;
9773
9774 VkImage localImage;
9775 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
9776 m_errorMonitor->VerifyFound();
9777
9778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9779 "vkCreateRenderPass parameter, "
9780 "VkFormat in "
9781 "pCreateInfo->pAttachments");
9782 // Create renderpass with unsupported format - Expect FORMAT_UNSUPPORTED
9783 VkAttachmentDescription att;
9784 att.format = unsupported;
9785 att.samples = VK_SAMPLE_COUNT_1_BIT;
9786 att.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
9787 att.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
9788 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
9789 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
9790 att.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9791 att.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9792
9793 VkRenderPassCreateInfo rp_info = {};
9794 VkRenderPass rp;
9795 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9796 rp_info.attachmentCount = 1;
9797 rp_info.pAttachments = &att;
9798 rp_info.subpassCount = 0;
9799 rp_info.pSubpasses = NULL;
9800 vkCreateRenderPass(m_device->handle(), &rp_info, NULL, &rp);
9801 m_errorMonitor->VerifyFound();
9802 }
9803}
9804
9805TEST_F(VkLayerTest, ImageLayerViewTests) {
9806 VkResult ret;
9807 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
9808
9809 ASSERT_NO_FATAL_FAILURE(InitState());
9810
9811 VkImageObj image(m_device);
9812 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9813 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
9814 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
9815 VK_IMAGE_TILING_OPTIMAL, 0);
9816 ASSERT_TRUE(image.initialized());
9817
9818 VkImageView imgView;
9819 VkImageViewCreateInfo imgViewInfo = {};
9820 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9821 imgViewInfo.image = image.handle();
9822 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
9823 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
9824 imgViewInfo.subresourceRange.layerCount = 1;
9825 imgViewInfo.subresourceRange.baseMipLevel = 0;
9826 imgViewInfo.subresourceRange.levelCount = 1;
9827 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9828
9829 m_errorMonitor->SetDesiredFailureMsg(
9830 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9831 "vkCreateImageView called with baseMipLevel");
9832 // View can't have baseMipLevel >= image's mipLevels - Expect
9833 // VIEW_CREATE_ERROR
9834 imgViewInfo.subresourceRange.baseMipLevel = 1;
9835 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9836 m_errorMonitor->VerifyFound();
9837 imgViewInfo.subresourceRange.baseMipLevel = 0;
9838
9839 m_errorMonitor->SetDesiredFailureMsg(
9840 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9841 "vkCreateImageView called with baseArrayLayer");
9842 // View can't have baseArrayLayer >= image's arraySize - Expect
9843 // VIEW_CREATE_ERROR
9844 imgViewInfo.subresourceRange.baseArrayLayer = 1;
9845 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9846 m_errorMonitor->VerifyFound();
9847 imgViewInfo.subresourceRange.baseArrayLayer = 0;
9848
9849 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9850 "vkCreateImageView called with 0 in "
9851 "pCreateInfo->subresourceRange."
9852 "levelCount");
9853 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
9854 imgViewInfo.subresourceRange.levelCount = 0;
9855 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9856 m_errorMonitor->VerifyFound();
9857 imgViewInfo.subresourceRange.levelCount = 1;
9858
9859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9860 "vkCreateImageView called with 0 in "
9861 "pCreateInfo->subresourceRange."
9862 "layerCount");
9863 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
9864 imgViewInfo.subresourceRange.layerCount = 0;
9865 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9866 m_errorMonitor->VerifyFound();
9867 imgViewInfo.subresourceRange.layerCount = 1;
9868
9869 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9870 "but both must be color formats");
9871 // Can't use depth format for view into color image - Expect INVALID_FORMAT
9872 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
9873 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9874 m_errorMonitor->VerifyFound();
9875 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
9876
9877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9878 "Formats MUST be IDENTICAL unless "
9879 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
9880 "was set on image creation.");
9881 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
9882 // VIEW_CREATE_ERROR
9883 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
9884 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9885 m_errorMonitor->VerifyFound();
9886 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
9887
9888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9889 "can support ImageViews with "
9890 "differing formats but they must be "
9891 "in the same compatibility class.");
9892 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
9893 // VIEW_CREATE_ERROR
9894 VkImageCreateInfo mutImgInfo = image.create_info();
9895 VkImage mutImage;
9896 mutImgInfo.format = VK_FORMAT_R8_UINT;
9897 assert(
9898 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
9899 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
9900 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
9901 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9902 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
9903 ASSERT_VK_SUCCESS(ret);
9904 imgViewInfo.image = mutImage;
9905 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9906 m_errorMonitor->VerifyFound();
9907 imgViewInfo.image = image.handle();
9908 vkDestroyImage(m_device->handle(), mutImage, NULL);
9909}
9910
9911TEST_F(VkLayerTest, MiscImageLayerTests) {
9912
9913 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
9914
9915 ASSERT_NO_FATAL_FAILURE(InitState());
9916
9917 VkImageObj image(m_device);
9918 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9919 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
9920 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
9921 VK_IMAGE_TILING_OPTIMAL, 0);
9922 ASSERT_TRUE(image.initialized());
9923
9924 m_errorMonitor->SetDesiredFailureMsg(
9925 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9926 "number of layers in image subresource is zero");
9927 vk_testing::Buffer buffer;
9928 VkMemoryPropertyFlags reqs = 0;
9929 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
9930 VkBufferImageCopy region = {};
9931 region.bufferRowLength = 128;
9932 region.bufferImageHeight = 128;
9933 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9934 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
9935 region.imageSubresource.layerCount = 0;
9936 region.imageExtent.height = 4;
9937 region.imageExtent.width = 4;
9938 region.imageExtent.depth = 1;
9939 m_commandBuffer->BeginCommandBuffer();
9940 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
9941 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
9942 1, &region);
9943 m_errorMonitor->VerifyFound();
9944 region.imageSubresource.layerCount = 1;
9945
9946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9947 "aspectMasks for each region must "
9948 "specify only COLOR or DEPTH or "
9949 "STENCIL");
9950 // Expect MISMATCHED_IMAGE_ASPECT
9951 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
9952 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
9953 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
9954 1, &region);
9955 m_errorMonitor->VerifyFound();
9956 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9957
9958 m_errorMonitor->SetDesiredFailureMsg(
9959 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9960 "If the format of srcImage is a depth, stencil, depth stencil or "
9961 "integer-based format then filter must be VK_FILTER_NEAREST");
9962 // Expect INVALID_FILTER
9963 VkImageObj intImage1(m_device);
9964 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
9965 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
9966 0);
9967 VkImageObj intImage2(m_device);
9968 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
9969 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
9970 0);
9971 VkImageBlit blitRegion = {};
9972 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9973 blitRegion.srcSubresource.baseArrayLayer = 0;
9974 blitRegion.srcSubresource.layerCount = 1;
9975 blitRegion.srcSubresource.mipLevel = 0;
9976 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9977 blitRegion.dstSubresource.baseArrayLayer = 0;
9978 blitRegion.dstSubresource.layerCount = 1;
9979 blitRegion.dstSubresource.mipLevel = 0;
9980
9981 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
9982 intImage1.layout(), intImage2.handle(), intImage2.layout(),
9983 16, &blitRegion, VK_FILTER_LINEAR);
9984 m_errorMonitor->VerifyFound();
9985
9986 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9987 "called with 0 in ppMemoryBarriers");
9988 VkImageMemoryBarrier img_barrier;
9989 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9990 img_barrier.pNext = NULL;
9991 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9992 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9993 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9994 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9995 img_barrier.image = image.handle();
9996 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9997 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9998 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9999 img_barrier.subresourceRange.baseArrayLayer = 0;
10000 img_barrier.subresourceRange.baseMipLevel = 0;
10001 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
10002 img_barrier.subresourceRange.layerCount = 0;
10003 img_barrier.subresourceRange.levelCount = 1;
10004 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10005 VK_PIPELINE_STAGE_HOST_BIT,
10006 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10007 nullptr, 1, &img_barrier);
10008 m_errorMonitor->VerifyFound();
10009 img_barrier.subresourceRange.layerCount = 1;
10010}
10011
10012TEST_F(VkLayerTest, ImageFormatLimits) {
10013
10014 TEST_DESCRIPTION("Exceed the limits of image format ");
10015
10016 m_errorMonitor->SetDesiredFailureMsg(
10017 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10018 "CreateImage extents exceed allowable limits for format");
10019 VkImageCreateInfo image_create_info = {};
10020 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10021 image_create_info.pNext = NULL;
10022 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10023 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10024 image_create_info.extent.width = 32;
10025 image_create_info.extent.height = 32;
10026 image_create_info.extent.depth = 1;
10027 image_create_info.mipLevels = 1;
10028 image_create_info.arrayLayers = 1;
10029 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10030 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
10031 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
10032 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
10033 image_create_info.flags = 0;
10034
10035 VkImage nullImg;
10036 VkImageFormatProperties imgFmtProps;
10037 vkGetPhysicalDeviceImageFormatProperties(
10038 gpu(), image_create_info.format, image_create_info.imageType,
10039 image_create_info.tiling, image_create_info.usage,
10040 image_create_info.flags, &imgFmtProps);
10041 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
10042 // Expect INVALID_FORMAT_LIMITS_VIOLATION
10043 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
10044 m_errorMonitor->VerifyFound();
10045 image_create_info.extent.depth = 1;
10046
10047 m_errorMonitor->SetDesiredFailureMsg(
10048 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10049 "exceeds allowable maximum supported by format of");
10050 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
10051 // Expect INVALID_FORMAT_LIMITS_VIOLATION
10052 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
10053 m_errorMonitor->VerifyFound();
10054 image_create_info.mipLevels = 1;
10055
10056 m_errorMonitor->SetDesiredFailureMsg(
10057 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10058 "exceeds allowable maximum supported by format of");
10059 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
10060 // Expect INVALID_FORMAT_LIMITS_VIOLATION
10061 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
10062 m_errorMonitor->VerifyFound();
10063 image_create_info.arrayLayers = 1;
10064
10065 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10066 "is not supported by format");
10067 int samples = imgFmtProps.sampleCounts >> 1;
10068 image_create_info.samples = (VkSampleCountFlagBits)samples;
10069 // Expect INVALID_FORMAT_LIMITS_VIOLATION
10070 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
10071 m_errorMonitor->VerifyFound();
10072 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10073
10074 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10075 "pCreateInfo->initialLayout, must be "
10076 "VK_IMAGE_LAYOUT_UNDEFINED or "
10077 "VK_IMAGE_LAYOUT_PREINITIALIZED");
10078 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10079 // Expect INVALID_LAYOUT
10080 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
10081 m_errorMonitor->VerifyFound();
10082 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
10083}
10084
Karl Schultz6addd812016-02-02 17:17:23 -070010085TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060010086 VkResult err;
10087 bool pass;
10088
10089 // Create color images with different format sizes and try to copy between them
10090 m_errorMonitor->SetDesiredFailureMsg(
10091 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10092 "vkCmdCopyImage called with unmatched source and dest image format sizes");
10093
10094 ASSERT_NO_FATAL_FAILURE(InitState());
10095
10096 // Create two images of different types and try to copy between them
10097 VkImage srcImage;
10098 VkImage dstImage;
10099 VkDeviceMemory srcMem;
10100 VkDeviceMemory destMem;
10101 VkMemoryRequirements memReqs;
10102
10103 VkImageCreateInfo image_create_info = {};
10104 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10105 image_create_info.pNext = NULL;
10106 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10107 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10108 image_create_info.extent.width = 32;
10109 image_create_info.extent.height = 32;
10110 image_create_info.extent.depth = 1;
10111 image_create_info.mipLevels = 1;
10112 image_create_info.arrayLayers = 1;
10113 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10114 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
10115 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
10116 image_create_info.flags = 0;
10117
10118 err =
10119 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
10120 ASSERT_VK_SUCCESS(err);
10121
10122 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
10123 // Introduce failure by creating second image with a different-sized format.
10124 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
10125
10126 err =
10127 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
10128 ASSERT_VK_SUCCESS(err);
10129
10130 // Allocate memory
10131 VkMemoryAllocateInfo memAlloc = {};
10132 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10133 memAlloc.pNext = NULL;
10134 memAlloc.allocationSize = 0;
10135 memAlloc.memoryTypeIndex = 0;
10136
10137 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
10138 memAlloc.allocationSize = memReqs.size;
10139 pass =
10140 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
10141 ASSERT_TRUE(pass);
10142 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
10143 ASSERT_VK_SUCCESS(err);
10144
10145 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
10146 memAlloc.allocationSize = memReqs.size;
10147 pass =
10148 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
10149 ASSERT_TRUE(pass);
10150 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
10151 ASSERT_VK_SUCCESS(err);
10152
10153 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
10154 ASSERT_VK_SUCCESS(err);
10155 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
10156 ASSERT_VK_SUCCESS(err);
10157
10158 BeginCommandBuffer();
10159 VkImageCopy copyRegion;
10160 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10161 copyRegion.srcSubresource.mipLevel = 0;
10162 copyRegion.srcSubresource.baseArrayLayer = 0;
10163 copyRegion.srcSubresource.layerCount = 0;
10164 copyRegion.srcOffset.x = 0;
10165 copyRegion.srcOffset.y = 0;
10166 copyRegion.srcOffset.z = 0;
10167 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10168 copyRegion.dstSubresource.mipLevel = 0;
10169 copyRegion.dstSubresource.baseArrayLayer = 0;
10170 copyRegion.dstSubresource.layerCount = 0;
10171 copyRegion.dstOffset.x = 0;
10172 copyRegion.dstOffset.y = 0;
10173 copyRegion.dstOffset.z = 0;
10174 copyRegion.extent.width = 1;
10175 copyRegion.extent.height = 1;
10176 copyRegion.extent.depth = 1;
10177 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
10178 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
10179 EndCommandBuffer();
10180
10181 m_errorMonitor->VerifyFound();
10182
10183 vkDestroyImage(m_device->device(), srcImage, NULL);
10184 vkDestroyImage(m_device->device(), dstImage, NULL);
10185 vkFreeMemory(m_device->device(), srcMem, NULL);
10186 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060010187}
10188
Karl Schultz6addd812016-02-02 17:17:23 -070010189TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
10190 VkResult err;
10191 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060010192
Mark Lobodzinskidb117632016-03-31 10:45:56 -060010193 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070010194 m_errorMonitor->SetDesiredFailureMsg(
10195 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060010196 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010197
Mike Stroyana3082432015-09-25 13:39:21 -060010198 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060010199
10200 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070010201 VkImage srcImage;
10202 VkImage dstImage;
10203 VkDeviceMemory srcMem;
10204 VkDeviceMemory destMem;
10205 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060010206
10207 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010208 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10209 image_create_info.pNext = NULL;
10210 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10211 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10212 image_create_info.extent.width = 32;
10213 image_create_info.extent.height = 32;
10214 image_create_info.extent.depth = 1;
10215 image_create_info.mipLevels = 1;
10216 image_create_info.arrayLayers = 1;
10217 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10218 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
10219 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
10220 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010221
Karl Schultz6addd812016-02-02 17:17:23 -070010222 err =
10223 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010224 ASSERT_VK_SUCCESS(err);
10225
Karl Schultzbdb75952016-04-19 11:36:49 -060010226 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
10227
Mark Lobodzinskidb117632016-03-31 10:45:56 -060010228 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070010229 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060010230 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
10231 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010232
Karl Schultz6addd812016-02-02 17:17:23 -070010233 err =
10234 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010235 ASSERT_VK_SUCCESS(err);
10236
10237 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010238 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010239 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10240 memAlloc.pNext = NULL;
10241 memAlloc.allocationSize = 0;
10242 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010243
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060010244 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010245 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010246 pass =
10247 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010248 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010249 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010250 ASSERT_VK_SUCCESS(err);
10251
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010252 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010253 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010254 pass =
10255 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010256 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010257 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010258 ASSERT_VK_SUCCESS(err);
10259
10260 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
10261 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010262 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060010263 ASSERT_VK_SUCCESS(err);
10264
10265 BeginCommandBuffer();
10266 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010267 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010268 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060010269 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010270 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010271 copyRegion.srcOffset.x = 0;
10272 copyRegion.srcOffset.y = 0;
10273 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010274 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010275 copyRegion.dstSubresource.mipLevel = 0;
10276 copyRegion.dstSubresource.baseArrayLayer = 0;
10277 copyRegion.dstSubresource.layerCount = 0;
10278 copyRegion.dstOffset.x = 0;
10279 copyRegion.dstOffset.y = 0;
10280 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010281 copyRegion.extent.width = 1;
10282 copyRegion.extent.height = 1;
10283 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070010284 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
10285 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060010286 EndCommandBuffer();
10287
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010288 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060010289
Chia-I Wuf7458c52015-10-26 21:10:41 +080010290 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010291 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010292 vkFreeMemory(m_device->device(), srcMem, NULL);
10293 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060010294}
10295
Karl Schultz6addd812016-02-02 17:17:23 -070010296TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
10297 VkResult err;
10298 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060010299
Karl Schultz6addd812016-02-02 17:17:23 -070010300 m_errorMonitor->SetDesiredFailureMsg(
10301 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010302 "vkCmdResolveImage called with source sample count less than 2.");
10303
Mike Stroyana3082432015-09-25 13:39:21 -060010304 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060010305
10306 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070010307 VkImage srcImage;
10308 VkImage dstImage;
10309 VkDeviceMemory srcMem;
10310 VkDeviceMemory destMem;
10311 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060010312
10313 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010314 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10315 image_create_info.pNext = NULL;
10316 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10317 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10318 image_create_info.extent.width = 32;
10319 image_create_info.extent.height = 1;
10320 image_create_info.extent.depth = 1;
10321 image_create_info.mipLevels = 1;
10322 image_create_info.arrayLayers = 1;
10323 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10324 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10325 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
10326 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010327
Karl Schultz6addd812016-02-02 17:17:23 -070010328 err =
10329 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010330 ASSERT_VK_SUCCESS(err);
10331
Karl Schultz6addd812016-02-02 17:17:23 -070010332 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010333
Karl Schultz6addd812016-02-02 17:17:23 -070010334 err =
10335 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010336 ASSERT_VK_SUCCESS(err);
10337
10338 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010339 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010340 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10341 memAlloc.pNext = NULL;
10342 memAlloc.allocationSize = 0;
10343 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010344
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060010345 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010346 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010347 pass =
10348 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010349 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010350 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010351 ASSERT_VK_SUCCESS(err);
10352
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010353 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010354 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010355 pass =
10356 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010357 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010358 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010359 ASSERT_VK_SUCCESS(err);
10360
10361 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
10362 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010363 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060010364 ASSERT_VK_SUCCESS(err);
10365
10366 BeginCommandBuffer();
10367 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070010368 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
10369 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060010370 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010371 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010372 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060010373 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010374 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010375 resolveRegion.srcOffset.x = 0;
10376 resolveRegion.srcOffset.y = 0;
10377 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010378 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010379 resolveRegion.dstSubresource.mipLevel = 0;
10380 resolveRegion.dstSubresource.baseArrayLayer = 0;
10381 resolveRegion.dstSubresource.layerCount = 0;
10382 resolveRegion.dstOffset.x = 0;
10383 resolveRegion.dstOffset.y = 0;
10384 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010385 resolveRegion.extent.width = 1;
10386 resolveRegion.extent.height = 1;
10387 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070010388 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
10389 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060010390 EndCommandBuffer();
10391
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010392 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060010393
Chia-I Wuf7458c52015-10-26 21:10:41 +080010394 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010395 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010396 vkFreeMemory(m_device->device(), srcMem, NULL);
10397 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060010398}
10399
Karl Schultz6addd812016-02-02 17:17:23 -070010400TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
10401 VkResult err;
10402 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060010403
Karl Schultz6addd812016-02-02 17:17:23 -070010404 m_errorMonitor->SetDesiredFailureMsg(
10405 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010406 "vkCmdResolveImage called with dest sample count greater than 1.");
10407
Mike Stroyana3082432015-09-25 13:39:21 -060010408 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060010409
Chris Forbesa7530692016-05-08 12:35:39 +120010410 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070010411 VkImage srcImage;
10412 VkImage dstImage;
10413 VkDeviceMemory srcMem;
10414 VkDeviceMemory destMem;
10415 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060010416
10417 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010418 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10419 image_create_info.pNext = NULL;
10420 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10421 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10422 image_create_info.extent.width = 32;
10423 image_create_info.extent.height = 1;
10424 image_create_info.extent.depth = 1;
10425 image_create_info.mipLevels = 1;
10426 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120010427 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070010428 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10429 // Note: Some implementations expect color attachment usage for any
10430 // multisample surface
10431 image_create_info.usage =
10432 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10433 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010434
Karl Schultz6addd812016-02-02 17:17:23 -070010435 err =
10436 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010437 ASSERT_VK_SUCCESS(err);
10438
Karl Schultz6addd812016-02-02 17:17:23 -070010439 // Note: Some implementations expect color attachment usage for any
10440 // multisample surface
10441 image_create_info.usage =
10442 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010443
Karl Schultz6addd812016-02-02 17:17:23 -070010444 err =
10445 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010446 ASSERT_VK_SUCCESS(err);
10447
10448 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010449 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010450 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10451 memAlloc.pNext = NULL;
10452 memAlloc.allocationSize = 0;
10453 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010454
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060010455 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010456 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010457 pass =
10458 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010459 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010460 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010461 ASSERT_VK_SUCCESS(err);
10462
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010463 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010464 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010465 pass =
10466 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010467 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010468 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010469 ASSERT_VK_SUCCESS(err);
10470
10471 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
10472 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010473 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060010474 ASSERT_VK_SUCCESS(err);
10475
10476 BeginCommandBuffer();
10477 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070010478 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
10479 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060010480 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010481 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010482 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060010483 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010484 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010485 resolveRegion.srcOffset.x = 0;
10486 resolveRegion.srcOffset.y = 0;
10487 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010488 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010489 resolveRegion.dstSubresource.mipLevel = 0;
10490 resolveRegion.dstSubresource.baseArrayLayer = 0;
10491 resolveRegion.dstSubresource.layerCount = 0;
10492 resolveRegion.dstOffset.x = 0;
10493 resolveRegion.dstOffset.y = 0;
10494 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010495 resolveRegion.extent.width = 1;
10496 resolveRegion.extent.height = 1;
10497 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070010498 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
10499 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060010500 EndCommandBuffer();
10501
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010502 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060010503
Chia-I Wuf7458c52015-10-26 21:10:41 +080010504 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010505 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010506 vkFreeMemory(m_device->device(), srcMem, NULL);
10507 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060010508}
10509
Karl Schultz6addd812016-02-02 17:17:23 -070010510TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
10511 VkResult err;
10512 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060010513
Karl Schultz6addd812016-02-02 17:17:23 -070010514 m_errorMonitor->SetDesiredFailureMsg(
10515 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010516 "vkCmdResolveImage called with unmatched source and dest formats.");
10517
Mike Stroyana3082432015-09-25 13:39:21 -060010518 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060010519
10520 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070010521 VkImage srcImage;
10522 VkImage dstImage;
10523 VkDeviceMemory srcMem;
10524 VkDeviceMemory destMem;
10525 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060010526
10527 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010528 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10529 image_create_info.pNext = NULL;
10530 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10531 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10532 image_create_info.extent.width = 32;
10533 image_create_info.extent.height = 1;
10534 image_create_info.extent.depth = 1;
10535 image_create_info.mipLevels = 1;
10536 image_create_info.arrayLayers = 1;
10537 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
10538 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10539 // Note: Some implementations expect color attachment usage for any
10540 // multisample surface
10541 image_create_info.usage =
10542 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10543 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010544
Karl Schultz6addd812016-02-02 17:17:23 -070010545 err =
10546 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010547 ASSERT_VK_SUCCESS(err);
10548
Karl Schultz6addd812016-02-02 17:17:23 -070010549 // Set format to something other than source image
10550 image_create_info.format = VK_FORMAT_R32_SFLOAT;
10551 // Note: Some implementations expect color attachment usage for any
10552 // multisample surface
10553 image_create_info.usage =
10554 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10555 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010556
Karl Schultz6addd812016-02-02 17:17:23 -070010557 err =
10558 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010559 ASSERT_VK_SUCCESS(err);
10560
10561 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010562 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010563 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10564 memAlloc.pNext = NULL;
10565 memAlloc.allocationSize = 0;
10566 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010567
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060010568 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010569 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010570 pass =
10571 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010572 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010573 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010574 ASSERT_VK_SUCCESS(err);
10575
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010576 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010577 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010578 pass =
10579 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010580 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010581 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010582 ASSERT_VK_SUCCESS(err);
10583
10584 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
10585 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010586 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060010587 ASSERT_VK_SUCCESS(err);
10588
10589 BeginCommandBuffer();
10590 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070010591 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
10592 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060010593 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010594 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010595 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060010596 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010597 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010598 resolveRegion.srcOffset.x = 0;
10599 resolveRegion.srcOffset.y = 0;
10600 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010601 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010602 resolveRegion.dstSubresource.mipLevel = 0;
10603 resolveRegion.dstSubresource.baseArrayLayer = 0;
10604 resolveRegion.dstSubresource.layerCount = 0;
10605 resolveRegion.dstOffset.x = 0;
10606 resolveRegion.dstOffset.y = 0;
10607 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010608 resolveRegion.extent.width = 1;
10609 resolveRegion.extent.height = 1;
10610 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070010611 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
10612 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060010613 EndCommandBuffer();
10614
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010615 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060010616
Chia-I Wuf7458c52015-10-26 21:10:41 +080010617 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010618 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010619 vkFreeMemory(m_device->device(), srcMem, NULL);
10620 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060010621}
10622
Karl Schultz6addd812016-02-02 17:17:23 -070010623TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
10624 VkResult err;
10625 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060010626
Karl Schultz6addd812016-02-02 17:17:23 -070010627 m_errorMonitor->SetDesiredFailureMsg(
10628 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010629 "vkCmdResolveImage called with unmatched source and dest image types.");
10630
Mike Stroyana3082432015-09-25 13:39:21 -060010631 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060010632
10633 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070010634 VkImage srcImage;
10635 VkImage dstImage;
10636 VkDeviceMemory srcMem;
10637 VkDeviceMemory destMem;
10638 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060010639
10640 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010641 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10642 image_create_info.pNext = NULL;
10643 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10644 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10645 image_create_info.extent.width = 32;
10646 image_create_info.extent.height = 1;
10647 image_create_info.extent.depth = 1;
10648 image_create_info.mipLevels = 1;
10649 image_create_info.arrayLayers = 1;
10650 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
10651 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10652 // Note: Some implementations expect color attachment usage for any
10653 // multisample surface
10654 image_create_info.usage =
10655 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10656 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010657
Karl Schultz6addd812016-02-02 17:17:23 -070010658 err =
10659 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010660 ASSERT_VK_SUCCESS(err);
10661
Karl Schultz6addd812016-02-02 17:17:23 -070010662 image_create_info.imageType = VK_IMAGE_TYPE_1D;
10663 // Note: Some implementations expect color attachment usage for any
10664 // multisample surface
10665 image_create_info.usage =
10666 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10667 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010668
Karl Schultz6addd812016-02-02 17:17:23 -070010669 err =
10670 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010671 ASSERT_VK_SUCCESS(err);
10672
10673 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010674 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010675 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10676 memAlloc.pNext = NULL;
10677 memAlloc.allocationSize = 0;
10678 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010679
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060010680 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010681 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010682 pass =
10683 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010684 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010685 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010686 ASSERT_VK_SUCCESS(err);
10687
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010688 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010689 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010690 pass =
10691 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010692 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010693 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010694 ASSERT_VK_SUCCESS(err);
10695
10696 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
10697 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010698 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060010699 ASSERT_VK_SUCCESS(err);
10700
10701 BeginCommandBuffer();
10702 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070010703 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
10704 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060010705 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010706 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010707 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060010708 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010709 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010710 resolveRegion.srcOffset.x = 0;
10711 resolveRegion.srcOffset.y = 0;
10712 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010713 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010714 resolveRegion.dstSubresource.mipLevel = 0;
10715 resolveRegion.dstSubresource.baseArrayLayer = 0;
10716 resolveRegion.dstSubresource.layerCount = 0;
10717 resolveRegion.dstOffset.x = 0;
10718 resolveRegion.dstOffset.y = 0;
10719 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010720 resolveRegion.extent.width = 1;
10721 resolveRegion.extent.height = 1;
10722 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070010723 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
10724 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060010725 EndCommandBuffer();
10726
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010727 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060010728
Chia-I Wuf7458c52015-10-26 21:10:41 +080010729 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010730 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010731 vkFreeMemory(m_device->device(), srcMem, NULL);
10732 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060010733}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010734
Karl Schultz6addd812016-02-02 17:17:23 -070010735TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010736 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070010737 // to using a DS format, then cause it to hit error due to COLOR_BIT not
10738 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010739 // The image format check comes 2nd in validation so we trigger it first,
10740 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070010741 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010742
Karl Schultz6addd812016-02-02 17:17:23 -070010743 m_errorMonitor->SetDesiredFailureMsg(
10744 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010745 "Combination depth/stencil image formats can have only the ");
10746
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010747 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010748
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010749 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010750 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
10751 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010752
10753 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010754 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10755 ds_pool_ci.pNext = NULL;
10756 ds_pool_ci.maxSets = 1;
10757 ds_pool_ci.poolSizeCount = 1;
10758 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010759
10760 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010761 err =
10762 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010763 ASSERT_VK_SUCCESS(err);
10764
10765 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010766 dsl_binding.binding = 0;
10767 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
10768 dsl_binding.descriptorCount = 1;
10769 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10770 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010771
10772 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010773 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10774 ds_layout_ci.pNext = NULL;
10775 ds_layout_ci.bindingCount = 1;
10776 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010777 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010778 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10779 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010780 ASSERT_VK_SUCCESS(err);
10781
10782 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010783 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010784 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010785 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010786 alloc_info.descriptorPool = ds_pool;
10787 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010788 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10789 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010790 ASSERT_VK_SUCCESS(err);
10791
Karl Schultz6addd812016-02-02 17:17:23 -070010792 VkImage image_bad;
10793 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010794 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -070010795 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010796 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070010797 const int32_t tex_width = 32;
10798 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010799
10800 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010801 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10802 image_create_info.pNext = NULL;
10803 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10804 image_create_info.format = tex_format_bad;
10805 image_create_info.extent.width = tex_width;
10806 image_create_info.extent.height = tex_height;
10807 image_create_info.extent.depth = 1;
10808 image_create_info.mipLevels = 1;
10809 image_create_info.arrayLayers = 1;
10810 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10811 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10812 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
10813 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
10814 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010815
Karl Schultz6addd812016-02-02 17:17:23 -070010816 err =
10817 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010818 ASSERT_VK_SUCCESS(err);
10819 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070010820 image_create_info.usage =
10821 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10822 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
10823 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010824 ASSERT_VK_SUCCESS(err);
10825
10826 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010827 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10828 image_view_create_info.image = image_bad;
10829 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
10830 image_view_create_info.format = tex_format_bad;
10831 image_view_create_info.subresourceRange.baseArrayLayer = 0;
10832 image_view_create_info.subresourceRange.baseMipLevel = 0;
10833 image_view_create_info.subresourceRange.layerCount = 1;
10834 image_view_create_info.subresourceRange.levelCount = 1;
10835 image_view_create_info.subresourceRange.aspectMask =
10836 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010837
10838 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070010839 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
10840 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010841
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010842 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010843
Chia-I Wuf7458c52015-10-26 21:10:41 +080010844 vkDestroyImage(m_device->device(), image_bad, NULL);
10845 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010846 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10847 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010848}
Tobin Ehliscde08892015-09-22 10:11:37 -060010849#endif // IMAGE_TESTS
10850
Tony Barbour300a6082015-04-07 13:44:53 -060010851int main(int argc, char **argv) {
10852 int result;
10853
Cody Northrop8e54a402016-03-08 22:25:52 -070010854#ifdef ANDROID
10855 int vulkanSupport = InitVulkan();
10856 if (vulkanSupport == 0)
10857 return 1;
10858#endif
10859
Tony Barbour300a6082015-04-07 13:44:53 -060010860 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060010861 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060010862
10863 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
10864
10865 result = RUN_ALL_TESTS();
10866
Tony Barbour6918cd52015-04-09 12:58:51 -060010867 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060010868 return result;
10869}