blob: 7dbe90cc095e4a189720ace34726844e918c190c [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>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Karl Schultz6addd812016-02-02 17:17:23 -070021 */
Tony Barbour65c48b32015-11-17 10:02:56 -070022
Cody Northrop8e54a402016-03-08 22:25:52 -070023#ifdef ANDROID
24#include "vulkan_wrapper.h"
25#else
David Pinedo9316d3b2015-11-06 12:54:48 -070026#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070027#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060028
29#if defined(ANDROID) && defined(VALIDATION_APK)
30#include <android/log.h>
31#include <android_native_app_glue.h>
32#endif
33
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060034#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060035#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060036#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070037#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060038
Mark Lobodzinski3780e142015-05-14 15:08:13 -050039#define GLM_FORCE_RADIANS
40#include "glm/glm.hpp"
41#include <glm/gtc/matrix_transform.hpp>
42
Dustin Gravesffa90fa2016-05-06 11:20:38 -060043#define PARAMETER_VALIDATION_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060044#define MEM_TRACKER_TESTS 1
45#define OBJ_TRACKER_TESTS 1
46#define DRAW_STATE_TESTS 1
47#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120048#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060049#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060050#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060051
Mark Lobodzinski3780e142015-05-14 15:08:13 -050052//--------------------------------------------------------------------------------------
53// Mesh and VertexFormat Data
54//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070055struct Vertex {
56 float posX, posY, posZ, posW; // Position data
57 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050058};
59
Karl Schultz6addd812016-02-02 17:17:23 -070060#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050061
62typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070063 BsoFailNone = 0x00000000,
64 BsoFailLineWidth = 0x00000001,
65 BsoFailDepthBias = 0x00000002,
66 BsoFailViewport = 0x00000004,
67 BsoFailScissor = 0x00000008,
68 BsoFailBlend = 0x00000010,
69 BsoFailDepthBounds = 0x00000020,
70 BsoFailStencilReadMask = 0x00000040,
71 BsoFailStencilWriteMask = 0x00000080,
72 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060073 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060074 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050075} BsoFailSelect;
76
77struct vktriangle_vs_uniform {
78 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070079 float mvp[4][4];
80 float position[3][4];
81 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050082};
83
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050084static const char bindStateVertShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120085 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070086 "vec2 vertices[3];\n"
87 "out gl_PerVertex {\n"
88 " vec4 gl_Position;\n"
89 "};\n"
90 "void main() {\n"
91 " vertices[0] = vec2(-1.0, -1.0);\n"
92 " vertices[1] = vec2( 1.0, -1.0);\n"
93 " vertices[2] = vec2( 0.0, 1.0);\n"
94 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
95 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050096
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050097static const char bindStateFragShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120098 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070099 "\n"
100 "layout(location = 0) out vec4 uFragColor;\n"
101 "void main(){\n"
102 " uFragColor = vec4(0,1,0,1);\n"
103 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500104
Karl Schultz6addd812016-02-02 17:17:23 -0700105static VKAPI_ATTR VkBool32 VKAPI_CALL
106myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
107 uint64_t srcObject, size_t location, int32_t msgCode,
108 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -0600109
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600110
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600111// ********************************************************
112// ErrorMonitor Usage:
113//
114// Call SetDesiredFailureMsg with a string to be compared against all
115// encountered log messages. Passing NULL will match all log messages.
116// logMsg will return true for skipCall only if msg is matched or NULL.
117//
118// Call DesiredMsgFound to determine if the desired failure message
119// was encountered.
120
Tony Barbour300a6082015-04-07 13:44:53 -0600121class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700122 public:
123 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600124 test_platform_thread_create_mutex(&m_mutex);
125 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700126 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700127 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600128 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600129 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600130
Dustin Graves48458142016-04-29 16:11:55 -0600131 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
132
Karl Schultz6addd812016-02-02 17:17:23 -0700133 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200134 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600135 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600136 m_failureMsg.clear();
137 m_otherMsgs.clear();
138 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700139 m_msgFound = VK_FALSE;
140 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600141 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600142 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600143
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600144 VkBool32 CheckForDesiredMsg(const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600145 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600146 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600147 if (m_bailout != NULL) {
148 *m_bailout = true;
149 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600150 string errorString(msgString);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600151 if (errorString.find(m_desiredMsg) != string::npos) {
152 if (m_msgFound) { // If multiple matches, don't lose all but the last!
153 m_otherMsgs.push_back(m_failureMsg);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600154 }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600155 m_failureMsg = errorString;
156 m_msgFound = VK_TRUE;
157 result = VK_TRUE;
158 } else {
159 m_otherMsgs.push_back(errorString);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600160 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600161 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600162 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600163 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600164
Karl Schultz6addd812016-02-02 17:17:23 -0700165 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600166
Karl Schultz6addd812016-02-02 17:17:23 -0700167 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600168
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600169 VkDebugReportFlagsEXT GetMessageFlags(void) { return m_msgFlags; }
170
Karl Schultz6addd812016-02-02 17:17:23 -0700171 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600172
Karl Schultz6addd812016-02-02 17:17:23 -0700173 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600174
Karl Schultz6addd812016-02-02 17:17:23 -0700175 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600176 vector<string> otherMsgs = GetOtherFailureMsgs();
177 cout << "Other error messages logged for this test were:" << endl;
178 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
179 cout << " " << *iter << endl;
180 }
181 }
182
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600183 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200184
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600185 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
186 void ExpectSuccess(VkDebugReportFlagsEXT message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
187 m_msgFlags = message_flag_mask;
188 // Match ANY message matching specified type
189 SetDesiredFailureMsg(message_flag_mask, "");
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200190 }
191
192 void VerifyFound() {
193 // Not seeing the desired message is a failure. /Before/ throwing, dump
194 // any other messages.
195 if (!DesiredMsgFound()) {
196 DumpFailureMsgs();
197 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
198 }
199 }
200
201 void VerifyNotFound() {
202 // ExpectSuccess() configured us to match anything. Any error is a
203 // failure.
204 if (DesiredMsgFound()) {
205 DumpFailureMsgs();
206 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
207 }
208 }
209
Karl Schultz6addd812016-02-02 17:17:23 -0700210 private:
211 VkFlags m_msgFlags;
212 string m_desiredMsg;
213 string m_failureMsg;
214 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600215 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700216 bool *m_bailout;
217 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600218};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500219
Karl Schultz6addd812016-02-02 17:17:23 -0700220static VKAPI_ATTR VkBool32 VKAPI_CALL
221myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
222 uint64_t srcObject, size_t location, int32_t msgCode,
223 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600224 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
225 if (msgFlags & errMonitor->GetMessageFlags()) {
226 return errMonitor->CheckForDesiredMsg(pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600227 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600228 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600229}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500230
Karl Schultz6addd812016-02-02 17:17:23 -0700231class VkLayerTest : public VkRenderFramework {
232 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800233 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
234 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700235 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
236 BsoFailSelect failMask);
237 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
238 VkPipelineObj &pipelineobj,
239 VkDescriptorSetObj &descriptorSet,
240 BsoFailSelect failMask);
241 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
242 VkDescriptorSetObj &descriptorSet,
243 BsoFailSelect failMask) {
244 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
245 failMask);
246 }
Tony Barbour300a6082015-04-07 13:44:53 -0600247
Tony Barbourfe3351b2015-07-28 10:17:20 -0600248 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700249 VkResult BeginCommandBuffer() {
250 return BeginCommandBuffer(*m_commandBuffer);
251 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800252 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700253 void Draw(uint32_t vertexCount, uint32_t instanceCount,
254 uint32_t firstVertex, uint32_t firstInstance) {
255 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
256 firstInstance);
257 }
258 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
259 uint32_t firstIndex, int32_t vertexOffset,
260 uint32_t firstInstance) {
261 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
262 vertexOffset, firstInstance);
263 }
Mark Muellerdfe37552016-07-07 14:47:42 -0600264 void QueueCommandBuffer(bool checkSuccess = true) {
265 m_commandBuffer->QueueCommandBuffer(checkSuccess); }
Karl Schultz6addd812016-02-02 17:17:23 -0700266 void QueueCommandBuffer(const VkFence &fence) {
267 m_commandBuffer->QueueCommandBuffer(fence);
268 }
269 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
270 VkDeviceSize offset, uint32_t binding) {
271 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
272 }
273 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
274 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
275 }
276
277 protected:
278 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600279 bool m_enableWSI;
Tony Barbour300a6082015-04-07 13:44:53 -0600280
281 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600282 std::vector<const char *> instance_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600283 std::vector<const char *> instance_extension_names;
284 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600285
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700286 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600287 /*
288 * Since CreateDbgMsgCallback is an instance level extension call
289 * any extension / layer that utilizes that feature also needs
290 * to be enabled at create instance time.
291 */
Karl Schultz6addd812016-02-02 17:17:23 -0700292 // Use Threading layer first to protect others from
293 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700294 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600295 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800296 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700297 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800298 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600299 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700300 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -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;
Tony Barbour4c70d102016-08-08 16:06:56 -0600335 InitFramework(instance_layer_names, instance_extension_names,
336 device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600337 }
338
339 virtual void TearDown() {
340 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600341 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600342 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600343 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600344
345 VkLayerTest() {
346 m_enableWSI = false;
347 }
Tony Barbour300a6082015-04-07 13:44:53 -0600348};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500349
Karl Schultz6addd812016-02-02 17:17:23 -0700350VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600351 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600352
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800353 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600354
355 /*
356 * For render test all drawing happens in a single render pass
357 * on a single command buffer.
358 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200359 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800360 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600361 }
362
363 return result;
364}
365
Karl Schultz6addd812016-02-02 17:17:23 -0700366VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600367 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600368
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200369 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800370 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200371 }
Tony Barbour300a6082015-04-07 13:44:53 -0600372
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800373 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600374
375 return result;
376}
377
Karl Schultz6addd812016-02-02 17:17:23 -0700378void VkLayerTest::VKTriangleTest(const char *vertShaderText,
379 const char *fragShaderText,
380 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500381 // Create identity matrix
382 int i;
383 struct vktriangle_vs_uniform data;
384
385 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700386 glm::mat4 View = glm::mat4(1.0f);
387 glm::mat4 Model = glm::mat4(1.0f);
388 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500389 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700390 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500391
392 memcpy(&data.mvp, &MVP[0][0], matrixSize);
393
Karl Schultz6addd812016-02-02 17:17:23 -0700394 static const Vertex tri_data[] = {
395 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
396 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
397 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500398 };
399
Karl Schultz6addd812016-02-02 17:17:23 -0700400 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500401 data.position[i][0] = tri_data[i].posX;
402 data.position[i][1] = tri_data[i].posY;
403 data.position[i][2] = tri_data[i].posZ;
404 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700405 data.color[i][0] = tri_data[i].r;
406 data.color[i][1] = tri_data[i].g;
407 data.color[i][2] = tri_data[i].b;
408 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500409 }
410
411 ASSERT_NO_FATAL_FAILURE(InitState());
412 ASSERT_NO_FATAL_FAILURE(InitViewport());
413
Karl Schultz6addd812016-02-02 17:17:23 -0700414 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
415 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500416
Karl Schultz6addd812016-02-02 17:17:23 -0700417 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
418 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
419 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500420
421 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800422 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500423 pipelineobj.AddShader(&vs);
424 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600425 if (failMask & BsoFailLineWidth) {
426 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600427 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
428 ia_state.sType =
429 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
430 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
431 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600432 }
433 if (failMask & BsoFailDepthBias) {
434 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600435 VkPipelineRasterizationStateCreateInfo rs_state = {};
436 rs_state.sType =
437 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
438 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600439 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600440 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600441 }
Karl Schultz6addd812016-02-02 17:17:23 -0700442 // Viewport and scissors must stay in synch or other errors will occur than
443 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600444 if (failMask & BsoFailViewport) {
445 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600446 m_viewports.clear();
447 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600448 }
449 if (failMask & BsoFailScissor) {
450 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600451 m_scissors.clear();
452 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600453 }
454 if (failMask & BsoFailBlend) {
455 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600456 VkPipelineColorBlendAttachmentState att_state = {};
457 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
458 att_state.blendEnable = VK_TRUE;
459 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600460 }
461 if (failMask & BsoFailDepthBounds) {
462 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
463 }
464 if (failMask & BsoFailStencilReadMask) {
465 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
466 }
467 if (failMask & BsoFailStencilWriteMask) {
468 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
469 }
470 if (failMask & BsoFailStencilReference) {
471 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
472 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500473
474 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700475 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
476 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500477
478 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600479 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500480
Tony Barbourfe3351b2015-07-28 10:17:20 -0600481 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500482
483 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600484 if (failMask & BsoFailIndexBuffer) {
485 // Use DrawIndexed w/o an index buffer bound
486 DrawIndexed(3, 1, 0, 0, 0);
487 } else {
488 Draw(3, 1, 0, 0);
489 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500490
Mark Muellerd4914412016-06-13 17:52:06 -0600491 if (failMask & BsoFailCmdClearAttachments) {
492 VkClearAttachment color_attachment = {};
493 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
494 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
495 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
496
497 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
498 &color_attachment, 1, &clear_rect);
499 }
500
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500501 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600502 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500503
Tony Barbourfe3351b2015-07-28 10:17:20 -0600504 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500505}
506
Karl Schultz6addd812016-02-02 17:17:23 -0700507void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
508 VkPipelineObj &pipelineobj,
509 VkDescriptorSetObj &descriptorSet,
510 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500511 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700512 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
513 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500514 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700515 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
516 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500517 }
518
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800519 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700520 // Make sure depthWriteEnable is set so that Depth fail test will work
521 // correctly
522 // Make sure stencilTestEnable is set so that Stencil fail test will work
523 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600524 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800525 stencil.failOp = VK_STENCIL_OP_KEEP;
526 stencil.passOp = VK_STENCIL_OP_KEEP;
527 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
528 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600529
530 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
531 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600532 ds_ci.pNext = NULL;
533 ds_ci.depthTestEnable = VK_FALSE;
534 ds_ci.depthWriteEnable = VK_TRUE;
535 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
536 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600537 if (failMask & BsoFailDepthBounds) {
538 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600539 ds_ci.maxDepthBounds = 0.0f;
540 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600541 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600542 ds_ci.stencilTestEnable = VK_TRUE;
543 ds_ci.front = stencil;
544 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600545
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600546 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600547 pipelineobj.SetViewport(m_viewports);
548 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800549 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700550 VkResult err = pipelineobj.CreateVKPipeline(
551 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600552 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800553 commandBuffer->BindPipeline(pipelineobj);
554 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500555}
556
Ian Elliott2c1daf52016-05-12 09:41:46 -0600557class VkWsiEnabledLayerTest : public VkLayerTest {
558 public:
559protected:
560 VkWsiEnabledLayerTest() {
561 m_enableWSI = true;
562 }
563};
564
Mark Muellerdfe37552016-07-07 14:47:42 -0600565class VkBufferTest {
566public:
567 enum eTestEnFlags {
568 eDoubleDelete,
569 eInvalidDeviceOffset,
570 eInvalidMemoryOffset,
571 eBindNullBuffer,
572 eFreeInvalidHandle,
573 };
574
575 enum eTestConditions {
576 eOffsetAlignment = 1
577 };
578
579 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice,
580 eTestEnFlags aTestFlag,
581 VkBufferUsageFlags aBufferUsage = 0) {
582 if (eInvalidDeviceOffset != aTestFlag &&
583 eInvalidMemoryOffset != aTestFlag) {
584 return true;
585 }
586 VkDeviceSize offset_limit = 0;
587 if (eInvalidMemoryOffset == aTestFlag) {
588 VkBuffer vulkanBuffer;
589 VkBufferCreateInfo buffer_create_info = {};
590 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
591 buffer_create_info.size = 32;
592 buffer_create_info.usage = aBufferUsage;
593
594 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr,
595 &vulkanBuffer);
596 VkMemoryRequirements memory_reqs = {0};
597
598 vkGetBufferMemoryRequirements(aVulkanDevice->device(),
599 vulkanBuffer, &memory_reqs);
600 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
601 offset_limit = memory_reqs.alignment;
602 }
603 else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT |
604 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
605 offset_limit =
606 aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
607 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
608 offset_limit =
609 aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
610 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
611 offset_limit =
612 aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
613 }
614 if (eOffsetAlignment < offset_limit) {
615 return true;
616 }
617 return false;
618 }
619
620 // A constructor which performs validation tests within construction.
621 VkBufferTest(VkDeviceObj *aVulkanDevice,
622 VkBufferUsageFlags aBufferUsage,
623 eTestEnFlags aTestFlag)
624 : AllocateCurrent(false), BoundCurrent(false),
625 CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
626
627 if (eBindNullBuffer == aTestFlag) {
628 VulkanMemory = 0;
629 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
630 } else {
631 VkBufferCreateInfo buffer_create_info = {};
632 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
633 buffer_create_info.size = 32;
634 buffer_create_info.usage = aBufferUsage;
635
636 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr,
637 &VulkanBuffer);
638
639 CreateCurrent = true;
640
641 VkMemoryRequirements memory_requirements;
642 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer,
643 &memory_requirements);
644
645 VkMemoryAllocateInfo memory_allocate_info = {};
646 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
647 memory_allocate_info.allocationSize = memory_requirements.size;
648 bool pass = aVulkanDevice->phy().
649 set_memory_type(memory_requirements.memoryTypeBits,
650 &memory_allocate_info,
651 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
652 if (!pass) {
653 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
654 return;
655 }
656
657 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL,
658 &VulkanMemory);
659 AllocateCurrent = true;
660 // NB: 1 is intentionally an invalid offset value
661 const bool offset_en = eInvalidDeviceOffset == aTestFlag ||
662 eInvalidMemoryOffset == aTestFlag;
663 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory,
664 offset_en ? eOffsetAlignment : 0);
665 BoundCurrent = true;
666
667 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
668 }
669 }
670
671 ~VkBufferTest() {
672 if (CreateCurrent) {
673 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
674 }
675 if (AllocateCurrent) {
676 if (InvalidDeleteEn) {
677 union {
678 VkDeviceMemory device_memory;
679 unsigned long long index_access;
680 } bad_index;
681
682 bad_index.device_memory = VulkanMemory;
683 bad_index.index_access++;
684
685 vkFreeMemory(VulkanDevice,
686 bad_index.device_memory,
687 nullptr);
688 }
689 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
690 }
691 }
692
693 bool GetBufferCurrent() {
694 return AllocateCurrent && BoundCurrent && CreateCurrent;
695 }
696
697 const VkBuffer &GetBuffer() {
698 return VulkanBuffer;
699 }
700
701 void TestDoubleDestroy() {
702 // Destroy the buffer but leave the flag set, which will cause
703 // the buffer to be destroyed again in the destructor.
704 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
705 }
706
707protected:
708 bool AllocateCurrent;
709 bool BoundCurrent;
710 bool CreateCurrent;
711 bool InvalidDeleteEn;
712
713 VkBuffer VulkanBuffer;
714 VkDevice VulkanDevice;
715 VkDeviceMemory VulkanMemory;
716
717};
718
719class VkVerticesObj {
720public:
721 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount,
722 unsigned aBindingCount, unsigned aByteStride,
723 VkDeviceSize aVertexCount, const float *aVerticies)
724 : BoundCurrent(false),
725 AttributeCount(aAttributeCount),
726 BindingCount(aBindingCount),
727 BindId(BindIdGenerator),
728 PipelineVertexInputStateCreateInfo(),
729 VulkanMemoryBuffer(aVulkanDevice, 1,
730 static_cast<int>(aByteStride * aVertexCount),
731 reinterpret_cast<const void *>(aVerticies),
732 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
733 BindIdGenerator++; // NB: This can wrap w/misuse
734
735 VertexInputAttributeDescription =
736 new VkVertexInputAttributeDescription[AttributeCount];
737 VertexInputBindingDescription =
738 new VkVertexInputBindingDescription[BindingCount];
739
740 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions =
741 VertexInputAttributeDescription;
742 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount =
743 AttributeCount;
744 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions =
745 VertexInputBindingDescription;
746 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount =
747 BindingCount;
748 PipelineVertexInputStateCreateInfo.sType =
749 VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
750
751 unsigned i = 0;
752 do {
753 VertexInputAttributeDescription[i].binding = BindId;
754 VertexInputAttributeDescription[i].location = i;
755 VertexInputAttributeDescription[i].format =
756 VK_FORMAT_R32G32B32_SFLOAT;
757 VertexInputAttributeDescription[i].offset =
758 sizeof(float) * aByteStride;
759 i++;
760 } while (AttributeCount < i);
761
762 i = 0;
763 do {
764 VertexInputBindingDescription[i].binding = BindId;
765 VertexInputBindingDescription[i].stride = aByteStride;
766 VertexInputBindingDescription[i].inputRate =
767 VK_VERTEX_INPUT_RATE_VERTEX;
768 i++;
769 } while (BindingCount < i);
770 }
771
772 ~VkVerticesObj() {
773 if (VertexInputAttributeDescription) {
774 delete[] VertexInputAttributeDescription;
775 }
776 if (VertexInputBindingDescription) {
777 delete[] VertexInputBindingDescription;
778 }
779 }
780
781 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
782 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription,
783 AttributeCount);
784 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription,
785 BindingCount);
786 return true;
787 }
788
789 void BindVertexBuffers(VkCommandBuffer aCommandBuffer,
790 unsigned aOffsetCount = 0,
791 VkDeviceSize *aOffsetList = nullptr) {
792 VkDeviceSize *offsetList;
793 unsigned offsetCount;
794
795 if (aOffsetCount) {
796 offsetList = aOffsetList;
797 offsetCount = aOffsetCount;
798 } else {
799 offsetList = new VkDeviceSize[1]();
800 offsetCount = 1;
801 }
802
803 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount,
804 &VulkanMemoryBuffer.handle(), offsetList);
805 BoundCurrent = true;
806
807 if (!aOffsetCount) {
808 delete [] offsetList;
809 }
810 }
811
812protected:
813 static uint32_t BindIdGenerator;
814
815 bool BoundCurrent;
816 unsigned AttributeCount;
817 unsigned BindingCount;
818 uint32_t BindId;
819
820 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
821 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
822 VkVertexInputBindingDescription *VertexInputBindingDescription;
823 VkConstantBufferObj VulkanMemoryBuffer;
824};
825
826uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500827// ********************************************************************************************************************
828// ********************************************************************************************************************
829// ********************************************************************************************************************
830// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600831#if PARAMETER_VALIDATION_TESTS
832TEST_F(VkLayerTest, RequiredParameter) {
833 TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
834 "pointer, array, and array count parameters");
835
836 ASSERT_NO_FATAL_FAILURE(InitState());
837
838 m_errorMonitor->SetDesiredFailureMsg(
839 VK_DEBUG_REPORT_ERROR_BIT_EXT,
840 "required parameter pFeatures specified as NULL");
841 // Specify NULL for a pointer to a handle
842 // Expected to trigger an error with
843 // parameter_validation::validate_required_pointer
844 vkGetPhysicalDeviceFeatures(gpu(), NULL);
845 m_errorMonitor->VerifyFound();
846
847 m_errorMonitor->SetDesiredFailureMsg(
848 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600849 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600850 // Specify NULL for pointer to array count
851 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600852 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600853 m_errorMonitor->VerifyFound();
854
855 m_errorMonitor->SetDesiredFailureMsg(
856 VK_DEBUG_REPORT_ERROR_BIT_EXT,
857 "parameter viewportCount must be greater than 0");
858 // Specify 0 for a required array count
859 // Expected to trigger an error with parameter_validation::validate_array
860 VkViewport view_port = {};
861 m_commandBuffer->SetViewport(0, 0, &view_port);
862 m_errorMonitor->VerifyFound();
863
864 m_errorMonitor->SetDesiredFailureMsg(
865 VK_DEBUG_REPORT_ERROR_BIT_EXT,
866 "required parameter pViewports specified as NULL");
867 // Specify NULL for a required array
868 // Expected to trigger an error with parameter_validation::validate_array
869 m_commandBuffer->SetViewport(0, 1, NULL);
870 m_errorMonitor->VerifyFound();
871
872 m_errorMonitor->SetDesiredFailureMsg(
873 VK_DEBUG_REPORT_ERROR_BIT_EXT,
874 "required parameter memory specified as VK_NULL_HANDLE");
875 // Specify VK_NULL_HANDLE for a required handle
876 // Expected to trigger an error with
877 // parameter_validation::validate_required_handle
878 vkUnmapMemory(device(), VK_NULL_HANDLE);
879 m_errorMonitor->VerifyFound();
880
881 m_errorMonitor->SetDesiredFailureMsg(
882 VK_DEBUG_REPORT_ERROR_BIT_EXT,
883 "required parameter pFences[0] specified as VK_NULL_HANDLE");
884 // Specify VK_NULL_HANDLE for a required handle array entry
885 // Expected to trigger an error with
886 // parameter_validation::validate_required_handle_array
887 VkFence fence = VK_NULL_HANDLE;
888 vkResetFences(device(), 1, &fence);
889 m_errorMonitor->VerifyFound();
890
891 m_errorMonitor->SetDesiredFailureMsg(
892 VK_DEBUG_REPORT_ERROR_BIT_EXT,
893 "required parameter pAllocateInfo specified as NULL");
894 // Specify NULL for a required struct pointer
895 // Expected to trigger an error with
896 // parameter_validation::validate_struct_type
897 VkDeviceMemory memory = VK_NULL_HANDLE;
898 vkAllocateMemory(device(), NULL, NULL, &memory);
899 m_errorMonitor->VerifyFound();
900
901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
902 "value of faceMask must not be 0");
903 // Specify 0 for a required VkFlags parameter
904 // Expected to trigger an error with parameter_validation::validate_flags
905 m_commandBuffer->SetStencilReference(0, 0);
906 m_errorMonitor->VerifyFound();
907
908 m_errorMonitor->SetDesiredFailureMsg(
909 VK_DEBUG_REPORT_ERROR_BIT_EXT,
910 "value of pSubmits[i].pWaitDstStageMask[0] must not be 0");
911 // Specify 0 for a required VkFlags array entry
912 // Expected to trigger an error with
913 // parameter_validation::validate_flags_array
914 VkSemaphore semaphore = VK_NULL_HANDLE;
915 VkPipelineStageFlags stageFlags = 0;
916 VkSubmitInfo submitInfo = {};
917 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
918 submitInfo.waitSemaphoreCount = 1;
919 submitInfo.pWaitSemaphores = &semaphore;
920 submitInfo.pWaitDstStageMask = &stageFlags;
921 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
922 m_errorMonitor->VerifyFound();
923}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600924
Dustin Gravesfce74c02016-05-10 11:42:58 -0600925TEST_F(VkLayerTest, ReservedParameter) {
926 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
927
928 ASSERT_NO_FATAL_FAILURE(InitState());
929
930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
931 " must be 0");
932 // Specify 0 for a reserved VkFlags parameter
933 // Expected to trigger an error with
934 // parameter_validation::validate_reserved_flags
935 VkEvent event_handle = VK_NULL_HANDLE;
936 VkEventCreateInfo event_info = {};
937 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
938 event_info.flags = 1;
939 vkCreateEvent(device(), &event_info, NULL, &event_handle);
940 m_errorMonitor->VerifyFound();
941}
942
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600943TEST_F(VkLayerTest, InvalidStructSType) {
944 TEST_DESCRIPTION("Specify an invalid VkStructureType for a Vulkan "
945 "structure's sType field");
946
947 ASSERT_NO_FATAL_FAILURE(InitState());
948
949 m_errorMonitor->SetDesiredFailureMsg(
950 VK_DEBUG_REPORT_ERROR_BIT_EXT,
951 "parameter pAllocateInfo->sType must be");
952 // Zero struct memory, effectively setting sType to
953 // VK_STRUCTURE_TYPE_APPLICATION_INFO
954 // Expected to trigger an error with
955 // parameter_validation::validate_struct_type
956 VkMemoryAllocateInfo alloc_info = {};
957 VkDeviceMemory memory = VK_NULL_HANDLE;
958 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
959 m_errorMonitor->VerifyFound();
960
961 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
962 "parameter pSubmits[0].sType must be");
963 // Zero struct memory, effectively setting sType to
964 // VK_STRUCTURE_TYPE_APPLICATION_INFO
965 // Expected to trigger an error with
966 // parameter_validation::validate_struct_type_array
967 VkSubmitInfo submit_info = {};
968 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
969 m_errorMonitor->VerifyFound();
970}
971
972TEST_F(VkLayerTest, InvalidStructPNext) {
973 TEST_DESCRIPTION(
974 "Specify an invalid value for a Vulkan structure's pNext field");
975
976 ASSERT_NO_FATAL_FAILURE(InitState());
977
978 m_errorMonitor->SetDesiredFailureMsg(
Dustin Gravesaf5c0292016-07-19 13:43:53 -0600979 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz38b50992016-07-11 16:09:09 -0600980 "value of pCreateInfo->pNext must be NULL");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600981 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be
Karl Schultz38b50992016-07-11 16:09:09 -0600982 // NULL.
983 // Need to pick a function that has no allowed pNext structure types.
984 // Expected to trigger an error with
985 // parameter_validation::validate_struct_pnext
986 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600987 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600988 // Zero-initialization will provide the correct sType
989 VkApplicationInfo app_info = {};
990 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
991 event_alloc_info.pNext = &app_info;
992 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
993 m_errorMonitor->VerifyFound();
994
995 m_errorMonitor->SetDesiredFailureMsg(
Dustin Gravesaf5c0292016-07-19 13:43:53 -0600996 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz38b50992016-07-11 16:09:09 -0600997 " chain includes a structure with unexpected VkStructureType ");
998 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
999 // a function that has allowed pNext structure types and specify
1000 // a structure type that is not allowed.
Dustin Gravesc99cf5a2016-05-09 14:40:29 -06001001 // Expected to trigger an error with
1002 // parameter_validation::validate_struct_pnext
1003 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -06001004 VkMemoryAllocateInfo memory_alloc_info = {};
1005 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1006 memory_alloc_info.pNext = &app_info;
1007 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -06001008 m_errorMonitor->VerifyFound();
1009
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -06001010 // Positive test to check parameter_validation and unique_objects support
1011 // for NV_dedicated_allocation
1012 uint32_t extension_count = 0;
1013 bool supports_nv_dedicated_allocation = false;
Dustin Gravese34a6172016-07-20 13:41:21 -06001014 VkResult err = vkEnumerateDeviceExtensionProperties(
1015 gpu(), nullptr, &extension_count, nullptr);
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -06001016 ASSERT_VK_SUCCESS(err);
1017
1018 if (extension_count > 0) {
1019 std::vector<VkExtensionProperties> available_extensions(
1020 extension_count);
1021
1022 err = vkEnumerateDeviceExtensionProperties(
1023 gpu(), nullptr, &extension_count, &available_extensions[0]);
1024 ASSERT_VK_SUCCESS(err);
1025
1026 for (const auto &extension_props : available_extensions) {
1027 if (strcmp(extension_props.extensionName,
1028 VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
1029 supports_nv_dedicated_allocation = true;
1030 }
1031 }
1032 }
1033
1034 if (supports_nv_dedicated_allocation) {
1035 m_errorMonitor->ExpectSuccess();
1036
1037 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info =
1038 {};
1039 dedicated_buffer_create_info.sType =
1040 VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
1041 dedicated_buffer_create_info.pNext = nullptr;
1042 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
1043
1044 uint32_t queue_family_index = 0;
1045 VkBufferCreateInfo buffer_create_info = {};
1046 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1047 buffer_create_info.pNext = &dedicated_buffer_create_info;
1048 buffer_create_info.size = 1024;
1049 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1050 buffer_create_info.queueFamilyIndexCount = 1;
1051 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1052
1053 VkBuffer buffer;
1054 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1055 NULL, &buffer);
1056 ASSERT_VK_SUCCESS(err);
1057
1058 VkMemoryRequirements memory_reqs;
1059 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1060
1061 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
1062 dedicated_memory_info.sType =
1063 VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
1064 dedicated_memory_info.pNext = nullptr;
1065 dedicated_memory_info.buffer = buffer;
1066 dedicated_memory_info.image = VK_NULL_HANDLE;
1067
1068 VkMemoryAllocateInfo memory_info = {};
1069 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1070 memory_info.pNext = &dedicated_memory_info;
1071 memory_info.allocationSize = memory_reqs.size;
1072
1073 bool pass;
1074 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1075 &memory_info, 0);
1076 ASSERT_TRUE(pass);
1077
1078 VkDeviceMemory buffer_memory;
1079 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1080 &buffer_memory);
1081 ASSERT_VK_SUCCESS(err);
1082
1083 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1084 ASSERT_VK_SUCCESS(err);
1085
1086 vkDestroyBuffer(m_device->device(), buffer, NULL);
1087 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1088
1089 m_errorMonitor->VerifyNotFound();
1090 }
Dustin Gravesc99cf5a2016-05-09 14:40:29 -06001091}
Dustin Graves5d33d532016-05-09 16:21:12 -06001092
1093TEST_F(VkLayerTest, UnrecognizedValue) {
1094 TEST_DESCRIPTION(
1095 "Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
1096
1097 ASSERT_NO_FATAL_FAILURE(InitState());
1098
1099 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1100 "does not fall within the begin..end "
1101 "range of the core VkFormat "
1102 "enumeration tokens");
1103 // Specify an invalid VkFormat value
1104 // Expected to trigger an error with
1105 // parameter_validation::validate_ranged_enum
1106 VkFormatProperties format_properties;
1107 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000),
1108 &format_properties);
1109 m_errorMonitor->VerifyFound();
1110
1111 m_errorMonitor->SetDesiredFailureMsg(
1112 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1113 "contains flag bits that are not recognized members of");
1114 // Specify an invalid VkFlags bitmask value
1115 // Expected to trigger an error with parameter_validation::validate_flags
1116 VkImageFormatProperties image_format_properties;
1117 vkGetPhysicalDeviceImageFormatProperties(
1118 gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D,
1119 VK_IMAGE_TILING_OPTIMAL, static_cast<VkImageUsageFlags>(1 << 25), 0,
1120 &image_format_properties);
1121 m_errorMonitor->VerifyFound();
1122
1123 m_errorMonitor->SetDesiredFailureMsg(
1124 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1125 "contains flag bits that are not recognized members of");
1126 // Specify an invalid VkFlags array entry
1127 // Expected to trigger an error with
1128 // parameter_validation::validate_flags_array
1129 VkSemaphore semaphore = VK_NULL_HANDLE;
1130 VkPipelineStageFlags stage_flags =
1131 static_cast<VkPipelineStageFlags>(1 << 25);
1132 VkSubmitInfo submit_info = {};
1133 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1134 submit_info.waitSemaphoreCount = 1;
1135 submit_info.pWaitSemaphores = &semaphore;
1136 submit_info.pWaitDstStageMask = &stage_flags;
1137 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1138 m_errorMonitor->VerifyFound();
1139
1140 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1141 "is neither VK_TRUE nor VK_FALSE");
1142 // Specify an invalid VkBool32 value
1143 // Expected to trigger a warning with
1144 // parameter_validation::validate_bool32
1145 VkSampler sampler = VK_NULL_HANDLE;
1146 VkSamplerCreateInfo sampler_info = {};
1147 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1148 sampler_info.pNext = NULL;
1149 sampler_info.magFilter = VK_FILTER_NEAREST;
1150 sampler_info.minFilter = VK_FILTER_NEAREST;
1151 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1152 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1153 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1154 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1155 sampler_info.mipLodBias = 1.0;
1156 sampler_info.maxAnisotropy = 1;
1157 sampler_info.compareEnable = VK_FALSE;
1158 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1159 sampler_info.minLod = 1.0;
1160 sampler_info.maxLod = 1.0;
1161 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1162 sampler_info.unnormalizedCoordinates = VK_FALSE;
1163 // Not VK_TRUE or VK_FALSE
1164 sampler_info.anisotropyEnable = 3;
1165 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1166 m_errorMonitor->VerifyFound();
1167}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001168
1169TEST_F(VkLayerTest, FailedReturnValue) {
1170 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1171
1172 ASSERT_NO_FATAL_FAILURE(InitState());
1173
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001174 // Find an unsupported image format
1175 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1176 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1177 VkFormat format = static_cast<VkFormat>(f);
1178 VkFormatProperties fProps = m_device->format_properties(format);
1179 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
1180 fProps.optimalTilingFeatures == 0) {
1181 unsupported = format;
1182 break;
1183 }
1184 }
1185
1186 if (unsupported != VK_FORMAT_UNDEFINED) {
1187 m_errorMonitor->SetDesiredFailureMsg(
1188 VK_DEBUG_REPORT_WARNING_BIT_EXT,
1189 "the requested format is not supported on this device");
1190 // Specify an unsupported VkFormat value to generate a
1191 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1192 // Expected to trigger a warning from
1193 // parameter_validation::validate_result
1194 VkImageFormatProperties image_format_properties;
1195 VkResult err = vkGetPhysicalDeviceImageFormatProperties(
1196 gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1197 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
1198 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1199 m_errorMonitor->VerifyFound();
1200 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001201}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001202
1203TEST_F(VkLayerTest, UpdateBufferAlignment) {
1204 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
1205 uint32_t updateData[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
1206
1207 ASSERT_NO_FATAL_FAILURE(InitState());
1208
1209 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1210 vk_testing::Buffer buffer;
1211 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1212
1213 BeginCommandBuffer();
1214 // Introduce failure by using dstOffset that is not multiple of 4
1215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1216 " is not a multiple of 4");
1217 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1218 m_errorMonitor->VerifyFound();
1219
1220 // Introduce failure by using dataSize that is not multiple of 4
1221 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1222 " is not a multiple of 4");
1223 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1224 m_errorMonitor->VerifyFound();
1225
1226 // Introduce failure by using dataSize that is < 0
1227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1228 "must be greater than zero and less than or equal to 65536");
1229 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1230 m_errorMonitor->VerifyFound();
1231
1232 // Introduce failure by using dataSize that is > 65536
1233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1234 "must be greater than zero and less than or equal to 65536");
1235 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1236 m_errorMonitor->VerifyFound();
1237
1238 EndCommandBuffer();
1239}
1240
1241TEST_F(VkLayerTest, FillBufferAlignment) {
1242 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1243
1244 ASSERT_NO_FATAL_FAILURE(InitState());
1245
1246 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1247 vk_testing::Buffer buffer;
1248 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1249
1250 BeginCommandBuffer();
1251
1252 // Introduce failure by using dstOffset that is not multiple of 4
1253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1254 " is not a multiple of 4");
1255 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1256 m_errorMonitor->VerifyFound();
1257
1258 // Introduce failure by using size that is not multiple of 4
1259 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1260 " is not a multiple of 4");
1261 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1262 m_errorMonitor->VerifyFound();
1263
1264 // Introduce failure by using size that is zero
1265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1266 "must be greater than zero");
1267 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1268 m_errorMonitor->VerifyFound();
1269
1270 EndCommandBuffer();
1271}
Dustin Graves40f35822016-06-23 11:12:53 -06001272
1273// This is a positive test. No failures are expected.
1274TEST_F(VkLayerTest, IgnoreUnrelatedDescriptor) {
1275 TEST_DESCRIPTION("Ensure that the vkUpdateDescriptorSet validation code "
1276 "is ignoring VkWriteDescriptorSet members that are not "
1277 "related to the descriptor type specified by "
1278 "VkWriteDescriptorSet::descriptorType. Correct "
1279 "validation behavior will result in the test running to "
1280 "completion without validation errors.");
1281
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001282 const uintptr_t invalid_ptr = 0xcdcdcdcd;
1283
Dustin Graves40f35822016-06-23 11:12:53 -06001284 ASSERT_NO_FATAL_FAILURE(InitState());
1285
1286 // Image Case
1287 {
1288 m_errorMonitor->ExpectSuccess();
1289
1290 VkImage image;
1291 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1292 const int32_t tex_width = 32;
1293 const int32_t tex_height = 32;
1294 VkImageCreateInfo image_create_info = {};
1295 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1296 image_create_info.pNext = NULL;
1297 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1298 image_create_info.format = tex_format;
1299 image_create_info.extent.width = tex_width;
1300 image_create_info.extent.height = tex_height;
1301 image_create_info.extent.depth = 1;
1302 image_create_info.mipLevels = 1;
1303 image_create_info.arrayLayers = 1;
1304 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis51cde412016-07-11 16:08:30 -06001305 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Dustin Graves40f35822016-06-23 11:12:53 -06001306 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1307 image_create_info.flags = 0;
1308 VkResult err =
1309 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1310 ASSERT_VK_SUCCESS(err);
1311
1312 VkMemoryRequirements memory_reqs;
1313 VkDeviceMemory image_memory;
1314 bool pass;
1315 VkMemoryAllocateInfo memory_info = {};
1316 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1317 memory_info.pNext = NULL;
1318 memory_info.allocationSize = 0;
1319 memory_info.memoryTypeIndex = 0;
1320 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
1321 memory_info.allocationSize = memory_reqs.size;
1322 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1323 &memory_info, 0);
1324 ASSERT_TRUE(pass);
1325 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1326 &image_memory);
1327 ASSERT_VK_SUCCESS(err);
1328 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
1329 ASSERT_VK_SUCCESS(err);
1330
1331 VkImageViewCreateInfo image_view_create_info = {};
1332 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1333 image_view_create_info.image = image;
1334 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
1335 image_view_create_info.format = tex_format;
1336 image_view_create_info.subresourceRange.layerCount = 1;
1337 image_view_create_info.subresourceRange.baseMipLevel = 0;
1338 image_view_create_info.subresourceRange.levelCount = 1;
1339 image_view_create_info.subresourceRange.aspectMask =
1340 VK_IMAGE_ASPECT_COLOR_BIT;
1341
1342 VkImageView view;
1343 err = vkCreateImageView(m_device->device(), &image_view_create_info,
1344 NULL, &view);
1345 ASSERT_VK_SUCCESS(err);
1346
1347 VkDescriptorPoolSize ds_type_count = {};
1348 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1349 ds_type_count.descriptorCount = 1;
1350
1351 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1352 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1353 ds_pool_ci.pNext = NULL;
1354 ds_pool_ci.maxSets = 1;
1355 ds_pool_ci.poolSizeCount = 1;
1356 ds_pool_ci.pPoolSizes = &ds_type_count;
1357
1358 VkDescriptorPool ds_pool;
1359 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1360 &ds_pool);
1361 ASSERT_VK_SUCCESS(err);
1362
1363 VkDescriptorSetLayoutBinding dsl_binding = {};
1364 dsl_binding.binding = 0;
1365 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1366 dsl_binding.descriptorCount = 1;
1367 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1368 dsl_binding.pImmutableSamplers = NULL;
1369
1370 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1371 ds_layout_ci.sType =
1372 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1373 ds_layout_ci.pNext = NULL;
1374 ds_layout_ci.bindingCount = 1;
1375 ds_layout_ci.pBindings = &dsl_binding;
1376 VkDescriptorSetLayout ds_layout;
1377 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1378 NULL, &ds_layout);
1379 ASSERT_VK_SUCCESS(err);
1380
1381 VkDescriptorSet descriptor_set;
1382 VkDescriptorSetAllocateInfo alloc_info = {};
1383 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1384 alloc_info.descriptorSetCount = 1;
1385 alloc_info.descriptorPool = ds_pool;
1386 alloc_info.pSetLayouts = &ds_layout;
1387 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1388 &descriptor_set);
1389 ASSERT_VK_SUCCESS(err);
1390
1391 VkDescriptorImageInfo image_info = {};
1392 image_info.imageView = view;
1393 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
1394
1395 VkWriteDescriptorSet descriptor_write;
1396 memset(&descriptor_write, 0, sizeof(descriptor_write));
1397 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1398 descriptor_write.dstSet = descriptor_set;
1399 descriptor_write.dstBinding = 0;
1400 descriptor_write.descriptorCount = 1;
1401 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1402 descriptor_write.pImageInfo = &image_info;
1403
1404 // Set pBufferInfo and pTexelBufferView to invalid values, which should
1405 // be
1406 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
1407 // This will most likely produce a crash if the parameter_validation
1408 // layer
1409 // does not correctly ignore pBufferInfo.
1410 descriptor_write.pBufferInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001411 reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001412 descriptor_write.pTexelBufferView =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001413 reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001414
1415 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1416 NULL);
1417
1418 m_errorMonitor->VerifyNotFound();
1419
Dustin Graves40f35822016-06-23 11:12:53 -06001420 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1421 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1422 vkDestroyImageView(m_device->device(), view, NULL);
1423 vkDestroyImage(m_device->device(), image, NULL);
1424 vkFreeMemory(m_device->device(), image_memory, NULL);
1425 }
1426
1427 // Buffer Case
1428 {
1429 m_errorMonitor->ExpectSuccess();
1430
1431 VkBuffer buffer;
1432 uint32_t queue_family_index = 0;
1433 VkBufferCreateInfo buffer_create_info = {};
1434 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1435 buffer_create_info.size = 1024;
1436 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1437 buffer_create_info.queueFamilyIndexCount = 1;
1438 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1439
1440 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1441 NULL, &buffer);
1442 ASSERT_VK_SUCCESS(err);
1443
1444 VkMemoryRequirements memory_reqs;
1445 VkDeviceMemory buffer_memory;
1446 bool pass;
1447 VkMemoryAllocateInfo memory_info = {};
1448 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1449 memory_info.pNext = NULL;
1450 memory_info.allocationSize = 0;
1451 memory_info.memoryTypeIndex = 0;
1452
1453 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1454 memory_info.allocationSize = memory_reqs.size;
1455 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1456 &memory_info, 0);
1457 ASSERT_TRUE(pass);
1458
1459 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1460 &buffer_memory);
1461 ASSERT_VK_SUCCESS(err);
1462 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1463 ASSERT_VK_SUCCESS(err);
1464
1465 VkDescriptorPoolSize ds_type_count = {};
1466 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1467 ds_type_count.descriptorCount = 1;
1468
1469 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1470 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1471 ds_pool_ci.pNext = NULL;
1472 ds_pool_ci.maxSets = 1;
1473 ds_pool_ci.poolSizeCount = 1;
1474 ds_pool_ci.pPoolSizes = &ds_type_count;
1475
1476 VkDescriptorPool ds_pool;
1477 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1478 &ds_pool);
1479 ASSERT_VK_SUCCESS(err);
1480
1481 VkDescriptorSetLayoutBinding dsl_binding = {};
1482 dsl_binding.binding = 0;
1483 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1484 dsl_binding.descriptorCount = 1;
1485 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1486 dsl_binding.pImmutableSamplers = NULL;
1487
1488 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1489 ds_layout_ci.sType =
1490 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1491 ds_layout_ci.pNext = NULL;
1492 ds_layout_ci.bindingCount = 1;
1493 ds_layout_ci.pBindings = &dsl_binding;
1494 VkDescriptorSetLayout ds_layout;
1495 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1496 NULL, &ds_layout);
1497 ASSERT_VK_SUCCESS(err);
1498
1499 VkDescriptorSet descriptor_set;
1500 VkDescriptorSetAllocateInfo alloc_info = {};
1501 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1502 alloc_info.descriptorSetCount = 1;
1503 alloc_info.descriptorPool = ds_pool;
1504 alloc_info.pSetLayouts = &ds_layout;
1505 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1506 &descriptor_set);
1507 ASSERT_VK_SUCCESS(err);
1508
1509 VkDescriptorBufferInfo buffer_info = {};
1510 buffer_info.buffer = buffer;
1511 buffer_info.offset = 0;
1512 buffer_info.range = 1024;
1513
1514 VkWriteDescriptorSet descriptor_write;
1515 memset(&descriptor_write, 0, sizeof(descriptor_write));
1516 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1517 descriptor_write.dstSet = descriptor_set;
1518 descriptor_write.dstBinding = 0;
1519 descriptor_write.descriptorCount = 1;
1520 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1521 descriptor_write.pBufferInfo = &buffer_info;
1522
1523 // Set pImageInfo and pTexelBufferView to invalid values, which should
1524 // be
1525 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
1526 // This will most likely produce a crash if the parameter_validation
1527 // layer
1528 // does not correctly ignore pImageInfo.
1529 descriptor_write.pImageInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001530 reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001531 descriptor_write.pTexelBufferView =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001532 reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001533
1534 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1535 NULL);
1536
1537 m_errorMonitor->VerifyNotFound();
1538
1539 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1540 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1541 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1542 vkDestroyBuffer(m_device->device(), buffer, NULL);
1543 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1544 }
1545
1546 // Texel Buffer Case
1547 {
1548 m_errorMonitor->ExpectSuccess();
1549
1550 VkBuffer buffer;
1551 uint32_t queue_family_index = 0;
1552 VkBufferCreateInfo buffer_create_info = {};
1553 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1554 buffer_create_info.size = 1024;
1555 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
1556 buffer_create_info.queueFamilyIndexCount = 1;
1557 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1558
1559 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1560 NULL, &buffer);
1561 ASSERT_VK_SUCCESS(err);
1562
1563 VkMemoryRequirements memory_reqs;
1564 VkDeviceMemory buffer_memory;
1565 bool pass;
1566 VkMemoryAllocateInfo memory_info = {};
1567 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1568 memory_info.pNext = NULL;
1569 memory_info.allocationSize = 0;
1570 memory_info.memoryTypeIndex = 0;
1571
1572 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1573 memory_info.allocationSize = memory_reqs.size;
1574 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1575 &memory_info, 0);
1576 ASSERT_TRUE(pass);
1577
1578 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1579 &buffer_memory);
1580 ASSERT_VK_SUCCESS(err);
1581 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1582 ASSERT_VK_SUCCESS(err);
1583
1584 VkBufferViewCreateInfo buff_view_ci = {};
1585 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
1586 buff_view_ci.buffer = buffer;
1587 buff_view_ci.format = VK_FORMAT_R8_UNORM;
1588 buff_view_ci.range = VK_WHOLE_SIZE;
1589 VkBufferView buffer_view;
1590 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL,
1591 &buffer_view);
1592
1593 VkDescriptorPoolSize ds_type_count = {};
1594 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1595 ds_type_count.descriptorCount = 1;
1596
1597 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1598 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1599 ds_pool_ci.pNext = NULL;
1600 ds_pool_ci.maxSets = 1;
1601 ds_pool_ci.poolSizeCount = 1;
1602 ds_pool_ci.pPoolSizes = &ds_type_count;
1603
1604 VkDescriptorPool ds_pool;
1605 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1606 &ds_pool);
1607 ASSERT_VK_SUCCESS(err);
1608
1609 VkDescriptorSetLayoutBinding dsl_binding = {};
1610 dsl_binding.binding = 0;
1611 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1612 dsl_binding.descriptorCount = 1;
1613 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1614 dsl_binding.pImmutableSamplers = NULL;
1615
1616 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1617 ds_layout_ci.sType =
1618 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1619 ds_layout_ci.pNext = NULL;
1620 ds_layout_ci.bindingCount = 1;
1621 ds_layout_ci.pBindings = &dsl_binding;
1622 VkDescriptorSetLayout ds_layout;
1623 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1624 NULL, &ds_layout);
1625 ASSERT_VK_SUCCESS(err);
1626
1627 VkDescriptorSet descriptor_set;
1628 VkDescriptorSetAllocateInfo alloc_info = {};
1629 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1630 alloc_info.descriptorSetCount = 1;
1631 alloc_info.descriptorPool = ds_pool;
1632 alloc_info.pSetLayouts = &ds_layout;
1633 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1634 &descriptor_set);
1635 ASSERT_VK_SUCCESS(err);
1636
1637 VkWriteDescriptorSet descriptor_write;
1638 memset(&descriptor_write, 0, sizeof(descriptor_write));
1639 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1640 descriptor_write.dstSet = descriptor_set;
1641 descriptor_write.dstBinding = 0;
1642 descriptor_write.descriptorCount = 1;
1643 descriptor_write.descriptorType =
1644 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1645 descriptor_write.pTexelBufferView = &buffer_view;
1646
1647 // Set pImageInfo and pBufferInfo to invalid values, which should be
1648 // ignored for descriptorType ==
1649 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
1650 // This will most likely produce a crash if the parameter_validation
1651 // layer
1652 // does not correctly ignore pImageInfo and pBufferInfo.
1653 descriptor_write.pImageInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001654 reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001655 descriptor_write.pBufferInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001656 reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001657
1658 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1659 NULL);
1660
1661 m_errorMonitor->VerifyNotFound();
1662
1663 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1664 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1665 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1666 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
1667 vkDestroyBuffer(m_device->device(), buffer, NULL);
1668 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1669 }
1670}
Cortd889ff92016-07-27 09:51:27 -07001671
1672TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1673 VkResult err;
1674
1675 TEST_DESCRIPTION("Attempt to use a non-solid polygon fill mode in a "
1676 "pipeline when this feature is not enabled.");
1677
1678 ASSERT_NO_FATAL_FAILURE(InitState());
1679 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1680
1681 std::vector<const char *> device_extension_names;
1682 auto features = m_device->phy().features();
1683 // Artificially disable support for non-solid fill modes
1684 features.fillModeNonSolid = false;
1685 // The sacrificial device object
1686 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1687
1688 VkRenderpassObj render_pass(&test_device);
1689
1690 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1691 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1692 pipeline_layout_ci.setLayoutCount = 0;
1693 pipeline_layout_ci.pSetLayouts = NULL;
1694
1695 VkPipelineLayout pipeline_layout;
1696 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL,
1697 &pipeline_layout);
1698 ASSERT_VK_SUCCESS(err);
1699
1700 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1701 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1702 rs_ci.pNext = nullptr;
1703 rs_ci.lineWidth = 1.0f;
1704 rs_ci.rasterizerDiscardEnable = true;
1705
1706 VkShaderObj vs(&test_device, bindStateVertShaderText,
1707 VK_SHADER_STAGE_VERTEX_BIT, this);
1708 VkShaderObj fs(&test_device, bindStateFragShaderText,
1709 VK_SHADER_STAGE_FRAGMENT_BIT, this);
1710
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001711 // Set polygonMode to unsupported value POINT, should fail
Cortd889ff92016-07-27 09:51:27 -07001712 m_errorMonitor->SetDesiredFailureMsg(
1713 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1714 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
1715 {
1716 VkPipelineObj pipe(&test_device);
1717 pipe.AddShader(&vs);
1718 pipe.AddShader(&fs);
1719 pipe.AddColorAttachment();
1720 // Introduce failure by setting unsupported polygon mode
1721 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1722 pipe.SetRasterization(&rs_ci);
1723 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1724 }
1725 m_errorMonitor->VerifyFound();
1726
1727 // Try again with polygonMode=LINE, should fail
1728 m_errorMonitor->SetDesiredFailureMsg(
1729 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1730 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
1731 {
1732 VkPipelineObj pipe(&test_device);
1733 pipe.AddShader(&vs);
1734 pipe.AddShader(&fs);
1735 pipe.AddColorAttachment();
1736 // Introduce failure by setting unsupported polygon mode
1737 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1738 pipe.SetRasterization(&rs_ci);
1739 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1740 }
1741 m_errorMonitor->VerifyFound();
1742
1743 // Try again with polygonMode=FILL. No error is expected
1744 m_errorMonitor->ExpectSuccess();
1745 {
1746 VkPipelineObj pipe(&test_device);
1747 pipe.AddShader(&vs);
1748 pipe.AddShader(&fs);
1749 pipe.AddColorAttachment();
1750 // Set polygonMode to a good value
1751 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
1752 pipe.SetRasterization(&rs_ci);
1753 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1754 }
1755 m_errorMonitor->VerifyNotFound();
1756
1757 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1758}
1759
Dustin Gravesffa90fa2016-05-06 11:20:38 -06001760#endif // PARAMETER_VALIDATION_TESTS
1761
Tobin Ehlis0788f522015-05-26 16:11:58 -06001762#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001763#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001764TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001765{
1766 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001767 VkFenceCreateInfo fenceInfo = {};
1768 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1769 fenceInfo.pNext = NULL;
1770 fenceInfo.flags = 0;
1771
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001772 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001773
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001774 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001775
1776 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1777 vk_testing::Buffer buffer;
1778 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001779
Tony Barbourfe3351b2015-07-28 10:17:20 -06001780 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001781 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001782 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001783
1784 testFence.init(*m_device, fenceInfo);
1785
1786 // Bypass framework since it does the waits automatically
1787 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001788 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001789 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1790 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001791 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001792 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001793 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001794 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001795 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001796 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001797 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001798
1799 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001800 ASSERT_VK_SUCCESS( err );
1801
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001802 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001803 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001804
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001805 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001806}
1807
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001808TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001809{
1810 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001811 VkFenceCreateInfo fenceInfo = {};
1812 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1813 fenceInfo.pNext = NULL;
1814 fenceInfo.flags = 0;
1815
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001817
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001818 ASSERT_NO_FATAL_FAILURE(InitState());
1819 ASSERT_NO_FATAL_FAILURE(InitViewport());
1820 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1821
Tony Barbourfe3351b2015-07-28 10:17:20 -06001822 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001823 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001824 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001825
1826 testFence.init(*m_device, fenceInfo);
1827
1828 // Bypass framework since it does the waits automatically
1829 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001830 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001831 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1832 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001833 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001834 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001835 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001836 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001837 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001838 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001839 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001840
1841 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001842 ASSERT_VK_SUCCESS( err );
1843
Jon Ashburnf19916e2016-01-11 13:12:43 -07001844 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001845 VkCommandBufferBeginInfo info = {};
1846 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1847 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001848 info.renderPass = VK_NULL_HANDLE;
1849 info.subpass = 0;
1850 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001851 info.occlusionQueryEnable = VK_FALSE;
1852 info.queryFlags = 0;
1853 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001854
1855 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001856 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001857
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001858 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001859}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001860#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001861
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001862// This is a positive test. No failures are expected.
1863TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
1864 VkResult err;
1865 bool pass;
1866
1867 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
1868 "the buffer, create an image, and bind the same memory to "
1869 "it");
1870
1871 m_errorMonitor->ExpectSuccess();
1872
1873 ASSERT_NO_FATAL_FAILURE(InitState());
1874
1875 VkBuffer buffer;
1876 VkImage image;
1877 VkDeviceMemory mem;
1878 VkMemoryRequirements mem_reqs;
1879
1880 VkBufferCreateInfo buf_info = {};
1881 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1882 buf_info.pNext = NULL;
1883 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1884 buf_info.size = 256;
1885 buf_info.queueFamilyIndexCount = 0;
1886 buf_info.pQueueFamilyIndices = NULL;
1887 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1888 buf_info.flags = 0;
1889 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1890 ASSERT_VK_SUCCESS(err);
1891
1892 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1893
1894 VkMemoryAllocateInfo alloc_info = {};
1895 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1896 alloc_info.pNext = NULL;
1897 alloc_info.memoryTypeIndex = 0;
1898
1899 // Ensure memory is big enough for both bindings
1900 alloc_info.allocationSize = 0x10000;
1901
1902 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1903 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1904 if (!pass) {
1905 vkDestroyBuffer(m_device->device(), buffer, NULL);
1906 return;
1907 }
1908
1909 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1910 ASSERT_VK_SUCCESS(err);
1911
1912 uint8_t *pData;
1913 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1914 (void **)&pData);
1915 ASSERT_VK_SUCCESS(err);
1916
Mark Lobodzinski2abefa92016-05-05 11:45:57 -06001917 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001918
1919 vkUnmapMemory(m_device->device(), mem);
1920
1921 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1922 ASSERT_VK_SUCCESS(err);
1923
1924 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
1925 // memory. In fact, it was never used by the GPU.
1926 // Just be be sure, wait for idle.
1927 vkDestroyBuffer(m_device->device(), buffer, NULL);
1928 vkDeviceWaitIdle(m_device->device());
1929
1930 VkImageCreateInfo image_create_info = {};
1931 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1932 image_create_info.pNext = NULL;
1933 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1934 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1935 image_create_info.extent.width = 64;
1936 image_create_info.extent.height = 64;
1937 image_create_info.extent.depth = 1;
1938 image_create_info.mipLevels = 1;
1939 image_create_info.arrayLayers = 1;
1940 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1941 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1942 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1943 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1944 image_create_info.queueFamilyIndexCount = 0;
1945 image_create_info.pQueueFamilyIndices = NULL;
1946 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1947 image_create_info.flags = 0;
1948
1949 VkMemoryAllocateInfo mem_alloc = {};
1950 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1951 mem_alloc.pNext = NULL;
1952 mem_alloc.allocationSize = 0;
1953 mem_alloc.memoryTypeIndex = 0;
1954
1955 /* Create a mappable image. It will be the texture if linear images are ok
1956 * to be textures or it will be the staging image if they are not.
1957 */
1958 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1959 ASSERT_VK_SUCCESS(err);
1960
1961 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
1962
1963 mem_alloc.allocationSize = mem_reqs.size;
1964
1965 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
1966 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1967 if (!pass) {
1968 vkDestroyImage(m_device->device(), image, NULL);
1969 return;
1970 }
1971
Tobin Ehlis077ded32016-05-12 17:39:13 -06001972 // VALIDATION FAILURE:
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001973 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1974 ASSERT_VK_SUCCESS(err);
1975
1976 m_errorMonitor->VerifyNotFound();
1977
Tony Barbourdf4c0042016-06-01 15:55:43 -06001978 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001979 vkDestroyBuffer(m_device->device(), buffer, NULL);
1980 vkDestroyImage(m_device->device(), image, NULL);
1981}
1982
Tobin Ehlisf11be982016-05-11 13:52:53 -06001983TEST_F(VkLayerTest, InvalidMemoryAliasing) {
1984 TEST_DESCRIPTION("Create a buffer and image, allocate memory, and bind the "
1985 "buffer and image to memory such that they will alias.");
1986 VkResult err;
1987 bool pass;
1988 ASSERT_NO_FATAL_FAILURE(InitState());
1989
Tobin Ehlis077ded32016-05-12 17:39:13 -06001990 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001991 VkImage image;
1992 VkDeviceMemory mem; // buffer will be bound first
1993 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001994 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001995
1996 VkBufferCreateInfo buf_info = {};
1997 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1998 buf_info.pNext = NULL;
1999 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2000 buf_info.size = 256;
2001 buf_info.queueFamilyIndexCount = 0;
2002 buf_info.pQueueFamilyIndices = NULL;
2003 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2004 buf_info.flags = 0;
2005 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
2006 ASSERT_VK_SUCCESS(err);
2007
Tobin Ehlis077ded32016-05-12 17:39:13 -06002008 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002009
2010 VkImageCreateInfo image_create_info = {};
2011 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2012 image_create_info.pNext = NULL;
2013 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2014 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
2015 image_create_info.extent.width = 64;
2016 image_create_info.extent.height = 64;
2017 image_create_info.extent.depth = 1;
2018 image_create_info.mipLevels = 1;
2019 image_create_info.arrayLayers = 1;
2020 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06002021 // Image tiling must be optimal to trigger error when aliasing linear buffer
2022 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06002023 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
2024 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
2025 image_create_info.queueFamilyIndexCount = 0;
2026 image_create_info.pQueueFamilyIndices = NULL;
2027 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2028 image_create_info.flags = 0;
2029
Tobin Ehlisf11be982016-05-11 13:52:53 -06002030 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2031 ASSERT_VK_SUCCESS(err);
2032
Tobin Ehlis077ded32016-05-12 17:39:13 -06002033 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
2034
2035 VkMemoryAllocateInfo alloc_info = {};
2036 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2037 alloc_info.pNext = NULL;
2038 alloc_info.memoryTypeIndex = 0;
2039 // Ensure memory is big enough for both bindings
2040 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
2041 pass = m_device->phy().set_memory_type(
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06002042 buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
2043 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002044 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06002045 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002046 vkDestroyImage(m_device->device(), image, NULL);
2047 return;
2048 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06002049 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2050 ASSERT_VK_SUCCESS(err);
2051 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
2052 ASSERT_VK_SUCCESS(err);
2053
Tobin Ehlisf11be982016-05-11 13:52:53 -06002054 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06002055 " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06002056 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06002057 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2058 m_errorMonitor->VerifyFound();
2059
2060 // Now correctly bind image to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06002061 // aliasing buffer2
2062 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
2063 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002064 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
2065 ASSERT_VK_SUCCESS(err);
2066 err = vkBindImageMemory(m_device->device(), image, mem_img, 0);
2067 ASSERT_VK_SUCCESS(err);
2068 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06002069 "is aliased with non-linear image 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06002070 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002071 m_errorMonitor->VerifyFound();
2072
2073 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06002074 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002075 vkDestroyImage(m_device->device(), image, NULL);
2076 vkFreeMemory(m_device->device(), mem, NULL);
2077 vkFreeMemory(m_device->device(), mem_img, NULL);
2078}
2079
Tobin Ehlis35372522016-05-12 08:32:31 -06002080TEST_F(VkLayerTest, InvalidMemoryMapping) {
2081 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
2082 VkResult err;
2083 bool pass;
2084 ASSERT_NO_FATAL_FAILURE(InitState());
2085
2086 VkBuffer buffer;
2087 VkDeviceMemory mem;
2088 VkMemoryRequirements mem_reqs;
2089
2090 VkBufferCreateInfo buf_info = {};
2091 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2092 buf_info.pNext = NULL;
2093 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2094 buf_info.size = 256;
2095 buf_info.queueFamilyIndexCount = 0;
2096 buf_info.pQueueFamilyIndices = NULL;
2097 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2098 buf_info.flags = 0;
2099 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
2100 ASSERT_VK_SUCCESS(err);
2101
2102 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
2103 VkMemoryAllocateInfo alloc_info = {};
2104 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2105 alloc_info.pNext = NULL;
2106 alloc_info.memoryTypeIndex = 0;
2107
2108 // Ensure memory is big enough for both bindings
2109 static const VkDeviceSize allocation_size = 0x10000;
2110 alloc_info.allocationSize = allocation_size;
2111 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2112 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2113 if (!pass) {
2114 vkDestroyBuffer(m_device->device(), buffer, NULL);
2115 return;
2116 }
2117 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2118 ASSERT_VK_SUCCESS(err);
2119
2120 uint8_t *pData;
2121 // Attempt to map memory size 0 is invalid
2122 m_errorMonitor->SetDesiredFailureMsg(
2123 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2124 "VkMapMemory: Attempting to map memory range of size zero");
2125 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
2126 m_errorMonitor->VerifyFound();
2127 // Map memory twice
2128 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2129 (void **)&pData);
2130 ASSERT_VK_SUCCESS(err);
2131 m_errorMonitor->SetDesiredFailureMsg(
2132 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2133 "VkMapMemory: Attempting to map memory on an already-mapped object ");
2134 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2135 (void **)&pData);
2136 m_errorMonitor->VerifyFound();
2137
2138 // Unmap the memory to avoid re-map error
2139 vkUnmapMemory(m_device->device(), mem);
2140 // overstep allocation with VK_WHOLE_SIZE
2141 m_errorMonitor->SetDesiredFailureMsg(
2142 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2143 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
2144 err = vkMapMemory(m_device->device(), mem, allocation_size + 1,
2145 VK_WHOLE_SIZE, 0, (void **)&pData);
2146 m_errorMonitor->VerifyFound();
2147 // overstep allocation w/o VK_WHOLE_SIZE
2148 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2149 " oversteps total array size 0x");
2150 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0,
2151 (void **)&pData);
2152 m_errorMonitor->VerifyFound();
2153 // Now error due to unmapping memory that's not mapped
2154 m_errorMonitor->SetDesiredFailureMsg(
2155 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2156 "Unmapping Memory without memory being mapped: ");
2157 vkUnmapMemory(m_device->device(), mem);
2158 m_errorMonitor->VerifyFound();
2159 // Now map memory and cause errors due to flushing invalid ranges
2160 err = vkMapMemory(m_device->device(), mem, 16, VK_WHOLE_SIZE, 0,
2161 (void **)&pData);
2162 ASSERT_VK_SUCCESS(err);
2163 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12002164 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06002165 mmr.memory = mem;
2166 mmr.offset = 15; // Error b/c offset less than offset of mapped mem
2167 m_errorMonitor->SetDesiredFailureMsg(
2168 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2169 ") is less than Memory Object's offset (");
2170 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2171 m_errorMonitor->VerifyFound();
2172 // Now flush range that oversteps mapped range
2173 vkUnmapMemory(m_device->device(), mem);
2174 err = vkMapMemory(m_device->device(), mem, 0, 256, 0, (void **)&pData);
2175 ASSERT_VK_SUCCESS(err);
2176 mmr.offset = 16;
2177 mmr.size = 256; // flushing bounds (272) exceed mapped bounds (256)
2178 m_errorMonitor->SetDesiredFailureMsg(
2179 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2180 ") exceeds the Memory Object's upper-bound (");
2181 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2182 m_errorMonitor->VerifyFound();
2183
2184 pass =
2185 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2186 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
2187 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
2188 if (!pass) {
2189 vkFreeMemory(m_device->device(), mem, NULL);
2190 vkDestroyBuffer(m_device->device(), buffer, NULL);
2191 return;
2192 }
2193 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
2194 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
2195
2196 vkDestroyBuffer(m_device->device(), buffer, NULL);
2197 vkFreeMemory(m_device->device(), mem, NULL);
2198}
2199
Ian Elliott1c32c772016-04-28 14:47:13 -06002200TEST_F(VkLayerTest, EnableWsiBeforeUse) {
2201 VkResult err;
2202 bool pass;
2203
Ian Elliott489eec02016-05-05 14:12:44 -06002204// FIXME: After we turn on this code for non-Linux platforms, uncomment the
2205// following declaration (which is temporarily being moved below):
2206// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002207 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2208 VkSwapchainCreateInfoKHR swapchain_create_info = {};
2209 uint32_t swapchain_image_count = 0;
2210// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2211 uint32_t image_index = 0;
2212// VkPresentInfoKHR present_info = {};
2213
2214 ASSERT_NO_FATAL_FAILURE(InitState());
2215
Ian Elliott3f06ce52016-04-29 14:46:21 -06002216#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
2217#if defined(VK_USE_PLATFORM_ANDROID_KHR)
2218 // Use the functions from the VK_KHR_android_surface extension without
2219 // enabling that extension:
2220
2221 // Create a surface:
2222 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002223 m_errorMonitor->SetDesiredFailureMsg(
2224 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2225 "extension was not enabled for this");
2226 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
2227 &surface);
2228 pass = (err != VK_SUCCESS);
2229 ASSERT_TRUE(pass);
2230 m_errorMonitor->VerifyFound();
2231#endif // VK_USE_PLATFORM_ANDROID_KHR
2232
2233
2234#if defined(VK_USE_PLATFORM_MIR_KHR)
2235 // Use the functions from the VK_KHR_mir_surface extension without enabling
2236 // that extension:
2237
2238 // Create a surface:
2239 VkMirSurfaceCreateInfoKHR mir_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002240 m_errorMonitor->SetDesiredFailureMsg(
2241 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2242 "extension was not enabled for this");
2243 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
2244 pass = (err != VK_SUCCESS);
2245 ASSERT_TRUE(pass);
2246 m_errorMonitor->VerifyFound();
2247
2248 // Tell whether an mir_connection supports presentation:
2249 MirConnection *mir_connection = NULL;
2250 m_errorMonitor->SetDesiredFailureMsg(
2251 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2252 "extension was not enabled for this");
2253 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
2254 visual_id);
2255 m_errorMonitor->VerifyFound();
2256#endif // VK_USE_PLATFORM_MIR_KHR
2257
2258
2259#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
2260 // Use the functions from the VK_KHR_wayland_surface extension without
2261 // enabling that extension:
2262
2263 // Create a surface:
2264 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002265 m_errorMonitor->SetDesiredFailureMsg(
2266 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2267 "extension was not enabled for this");
2268 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
2269 &surface);
2270 pass = (err != VK_SUCCESS);
2271 ASSERT_TRUE(pass);
2272 m_errorMonitor->VerifyFound();
2273
2274 // Tell whether an wayland_display supports presentation:
2275 struct wl_display wayland_display = {};
2276 m_errorMonitor->SetDesiredFailureMsg(
2277 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2278 "extension was not enabled for this");
2279 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
2280 &wayland_display);
2281 m_errorMonitor->VerifyFound();
2282#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06002283#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06002284
2285
2286#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002287// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2288// TO NON-LINUX PLATFORMS:
2289VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06002290 // Use the functions from the VK_KHR_win32_surface extension without
2291 // enabling that extension:
2292
2293 // Create a surface:
2294 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002295 m_errorMonitor->SetDesiredFailureMsg(
2296 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2297 "extension was not enabled for this");
2298 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
2299 &surface);
2300 pass = (err != VK_SUCCESS);
2301 ASSERT_TRUE(pass);
2302 m_errorMonitor->VerifyFound();
2303
2304 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002305 m_errorMonitor->SetDesiredFailureMsg(
2306 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2307 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06002308 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002309 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002310// Set this (for now, until all platforms are supported and tested):
2311#define NEED_TO_TEST_THIS_ON_PLATFORM
2312#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06002313
2314
Ian Elliott1c32c772016-04-28 14:47:13 -06002315#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002316// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2317// TO NON-LINUX PLATFORMS:
2318VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002319 // Use the functions from the VK_KHR_xcb_surface extension without enabling
2320 // that extension:
2321
2322 // Create a surface:
2323 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06002324 m_errorMonitor->SetDesiredFailureMsg(
2325 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2326 "extension was not enabled for this");
2327 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2328 pass = (err != VK_SUCCESS);
2329 ASSERT_TRUE(pass);
2330 m_errorMonitor->VerifyFound();
2331
2332 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002333 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002334 xcb_visualid_t visual_id = 0;
2335 m_errorMonitor->SetDesiredFailureMsg(
2336 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2337 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06002338 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -06002339 visual_id);
2340 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002341// Set this (for now, until all platforms are supported and tested):
2342#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002343#endif // VK_USE_PLATFORM_XCB_KHR
2344
2345
Ian Elliott12630812016-04-29 14:35:43 -06002346#if defined(VK_USE_PLATFORM_XLIB_KHR)
2347 // Use the functions from the VK_KHR_xlib_surface extension without enabling
2348 // that extension:
2349
2350 // Create a surface:
2351 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
Ian Elliott12630812016-04-29 14:35:43 -06002352 m_errorMonitor->SetDesiredFailureMsg(
2353 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2354 "extension was not enabled for this");
2355 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
2356 pass = (err != VK_SUCCESS);
2357 ASSERT_TRUE(pass);
2358 m_errorMonitor->VerifyFound();
2359
2360 // Tell whether an Xlib VisualID supports presentation:
2361 Display *dpy = NULL;
2362 VisualID visual = 0;
2363 m_errorMonitor->SetDesiredFailureMsg(
2364 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2365 "extension was not enabled for this");
2366 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
2367 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002368// Set this (for now, until all platforms are supported and tested):
2369#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06002370#endif // VK_USE_PLATFORM_XLIB_KHR
2371
2372
Ian Elliott1c32c772016-04-28 14:47:13 -06002373 // Use the functions from the VK_KHR_surface extension without enabling
2374 // that extension:
2375
Ian Elliott489eec02016-05-05 14:12:44 -06002376#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002377 // Destroy a surface:
2378 m_errorMonitor->SetDesiredFailureMsg(
2379 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2380 "extension was not enabled for this");
2381 vkDestroySurfaceKHR(instance(), surface, NULL);
2382 m_errorMonitor->VerifyFound();
2383
2384 // Check if surface supports presentation:
2385 VkBool32 supported = false;
2386 m_errorMonitor->SetDesiredFailureMsg(
2387 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2388 "extension was not enabled for this");
2389 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2390 pass = (err != VK_SUCCESS);
2391 ASSERT_TRUE(pass);
2392 m_errorMonitor->VerifyFound();
2393
2394 // Check surface capabilities:
2395 VkSurfaceCapabilitiesKHR capabilities = {};
2396 m_errorMonitor->SetDesiredFailureMsg(
2397 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2398 "extension was not enabled for this");
2399 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2400 &capabilities);
2401 pass = (err != VK_SUCCESS);
2402 ASSERT_TRUE(pass);
2403 m_errorMonitor->VerifyFound();
2404
2405 // Check surface formats:
2406 uint32_t format_count = 0;
2407 VkSurfaceFormatKHR *formats = NULL;
2408 m_errorMonitor->SetDesiredFailureMsg(
2409 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2410 "extension was not enabled for this");
2411 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2412 &format_count, formats);
2413 pass = (err != VK_SUCCESS);
2414 ASSERT_TRUE(pass);
2415 m_errorMonitor->VerifyFound();
2416
2417 // Check surface present modes:
2418 uint32_t present_mode_count = 0;
2419 VkSurfaceFormatKHR *present_modes = NULL;
2420 m_errorMonitor->SetDesiredFailureMsg(
2421 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2422 "extension was not enabled for this");
2423 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2424 &present_mode_count, present_modes);
2425 pass = (err != VK_SUCCESS);
2426 ASSERT_TRUE(pass);
2427 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002428#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002429
2430
2431 // Use the functions from the VK_KHR_swapchain extension without enabling
2432 // that extension:
2433
2434 // Create a swapchain:
2435 m_errorMonitor->SetDesiredFailureMsg(
2436 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2437 "extension was not enabled for this");
2438 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2439 swapchain_create_info.pNext = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002440 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
2441 NULL, &swapchain);
2442 pass = (err != VK_SUCCESS);
2443 ASSERT_TRUE(pass);
2444 m_errorMonitor->VerifyFound();
2445
2446 // Get the images from the swapchain:
2447 m_errorMonitor->SetDesiredFailureMsg(
2448 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2449 "extension was not enabled for this");
2450 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
2451 &swapchain_image_count, NULL);
2452 pass = (err != VK_SUCCESS);
2453 ASSERT_TRUE(pass);
2454 m_errorMonitor->VerifyFound();
2455
2456 // Try to acquire an image:
2457 m_errorMonitor->SetDesiredFailureMsg(
2458 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2459 "extension was not enabled for this");
2460 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
2461 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
2462 pass = (err != VK_SUCCESS);
2463 ASSERT_TRUE(pass);
2464 m_errorMonitor->VerifyFound();
2465
2466 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002467 //
2468 // NOTE: Currently can't test this because a real swapchain is needed (as
2469 // opposed to the fake one we created) in order for the layer to lookup the
2470 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06002471
2472 // Destroy the swapchain:
2473 m_errorMonitor->SetDesiredFailureMsg(
2474 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2475 "extension was not enabled for this");
2476 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
2477 m_errorMonitor->VerifyFound();
2478}
2479
Ian Elliott2c1daf52016-05-12 09:41:46 -06002480TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
Ian Elliott2c1daf52016-05-12 09:41:46 -06002481
Dustin Graves6c6d8982016-05-17 10:09:21 -06002482#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott2c1daf52016-05-12 09:41:46 -06002483 VkSurfaceKHR surface = VK_NULL_HANDLE;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002484
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002485 VkResult err;
2486 bool pass;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002487 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2488 VkSwapchainCreateInfoKHR swapchain_create_info = {};
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002489 // uint32_t swapchain_image_count = 0;
2490 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2491 // uint32_t image_index = 0;
2492 // VkPresentInfoKHR present_info = {};
Ian Elliott2c1daf52016-05-12 09:41:46 -06002493
2494 ASSERT_NO_FATAL_FAILURE(InitState());
2495
2496 // Use the create function from one of the VK_KHR_*_surface extension in
2497 // order to create a surface, testing all known errors in the process,
2498 // before successfully creating a surface:
2499 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002501 "required parameter pCreateInfo specified as NULL");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002502 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
2503 pass = (err != VK_SUCCESS);
2504 ASSERT_TRUE(pass);
2505 m_errorMonitor->VerifyFound();
2506
2507 // Next, try to create a surface with the wrong
2508 // VkXcbSurfaceCreateInfoKHR::sType:
2509 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
2510 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002511 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002512 "parameter pCreateInfo->sType must be");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002513 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2514 pass = (err != VK_SUCCESS);
2515 ASSERT_TRUE(pass);
2516 m_errorMonitor->VerifyFound();
2517
Ian Elliott2c1daf52016-05-12 09:41:46 -06002518 // Create a native window, and then correctly create a surface:
2519 xcb_connection_t *connection;
2520 xcb_screen_t *screen;
2521 xcb_window_t xcb_window;
2522 xcb_intern_atom_reply_t *atom_wm_delete_window;
2523
2524 const xcb_setup_t *setup;
2525 xcb_screen_iterator_t iter;
2526 int scr;
2527 uint32_t value_mask, value_list[32];
2528 int width = 1;
2529 int height = 1;
2530
2531 connection = xcb_connect(NULL, &scr);
2532 ASSERT_TRUE(connection != NULL);
2533 setup = xcb_get_setup(connection);
2534 iter = xcb_setup_roots_iterator(setup);
2535 while (scr-- > 0)
2536 xcb_screen_next(&iter);
2537 screen = iter.data;
2538
2539 xcb_window = xcb_generate_id(connection);
2540
2541 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
2542 value_list[0] = screen->black_pixel;
2543 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE |
2544 XCB_EVENT_MASK_STRUCTURE_NOTIFY;
2545
2546 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window,
2547 screen->root, 0, 0, width, height, 0,
2548 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual,
2549 value_mask, value_list);
2550
2551 /* Magic code that will send notification when window is destroyed */
2552 xcb_intern_atom_cookie_t cookie =
2553 xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
2554 xcb_intern_atom_reply_t *reply =
2555 xcb_intern_atom_reply(connection, cookie, 0);
2556
2557 xcb_intern_atom_cookie_t cookie2 =
2558 xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002559 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002560 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window,
2561 (*reply).atom, 4, 32, 1,
2562 &(*atom_wm_delete_window).atom);
2563 free(reply);
2564
2565 xcb_map_window(connection, xcb_window);
2566
2567 // Force the x/y coordinates to 100,100 results are identical in consecutive
2568 // runs
2569 const uint32_t coords[] = {100, 100};
2570 xcb_configure_window(connection, xcb_window,
2571 XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
2572
Ian Elliott2c1daf52016-05-12 09:41:46 -06002573 // Finally, try to correctly create a surface:
2574 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
2575 xcb_create_info.pNext = NULL;
2576 xcb_create_info.flags = 0;
2577 xcb_create_info.connection = connection;
2578 xcb_create_info.window = xcb_window;
2579 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2580 pass = (err == VK_SUCCESS);
2581 ASSERT_TRUE(pass);
2582
Ian Elliott2c1daf52016-05-12 09:41:46 -06002583 // Check if surface supports presentation:
2584
2585 // 1st, do so without having queried the queue families:
2586 VkBool32 supported = false;
2587 // TODO: Get the following error to come out:
2588 m_errorMonitor->SetDesiredFailureMsg(
2589 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2590 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
2591 "function");
2592 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2593 pass = (err != VK_SUCCESS);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002594 // ASSERT_TRUE(pass);
2595 // m_errorMonitor->VerifyFound();
Ian Elliott2c1daf52016-05-12 09:41:46 -06002596
2597 // Next, query a queue family index that's too large:
2598 m_errorMonitor->SetDesiredFailureMsg(
2599 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2600 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002601 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface,
2602 &supported);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002603 pass = (err != VK_SUCCESS);
2604 ASSERT_TRUE(pass);
2605 m_errorMonitor->VerifyFound();
2606
2607 // Finally, do so correctly:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002608 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2609 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002610 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2611 pass = (err == VK_SUCCESS);
2612 ASSERT_TRUE(pass);
2613
Ian Elliott2c1daf52016-05-12 09:41:46 -06002614 // Before proceeding, try to create a swapchain without having called
2615 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
2616 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2617 swapchain_create_info.pNext = NULL;
2618 swapchain_create_info.flags = 0;
2619 m_errorMonitor->SetDesiredFailureMsg(
2620 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2621 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002622 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2623 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002624 pass = (err != VK_SUCCESS);
2625 ASSERT_TRUE(pass);
2626 m_errorMonitor->VerifyFound();
2627
Ian Elliott2c1daf52016-05-12 09:41:46 -06002628 // Get the surface capabilities:
2629 VkSurfaceCapabilitiesKHR surface_capabilities;
2630
2631 // Do so correctly (only error logged by this entrypoint is if the
2632 // extension isn't enabled):
2633 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2634 &surface_capabilities);
2635 pass = (err == VK_SUCCESS);
2636 ASSERT_TRUE(pass);
2637
Ian Elliott2c1daf52016-05-12 09:41:46 -06002638 // Get the surface formats:
2639 uint32_t surface_format_count;
2640
2641 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002642 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002643 "required parameter pSurfaceFormatCount "
2644 "specified as NULL");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002645 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
2646 pass = (err == VK_SUCCESS);
2647 ASSERT_TRUE(pass);
2648 m_errorMonitor->VerifyFound();
2649
2650 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
2651 // correctly done a 1st try (to get the count):
2652 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski6a7e9332016-08-16 09:06:15 -06002653 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002654 "but no prior positive value has been seen for");
2655 surface_format_count = 0;
2656 vkGetPhysicalDeviceSurfaceFormatsKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002657 gpu(), surface, &surface_format_count,
2658 (VkSurfaceFormatKHR *)&surface_format_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002659 pass = (err == VK_SUCCESS);
2660 ASSERT_TRUE(pass);
2661 m_errorMonitor->VerifyFound();
2662
2663 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002664 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2665 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002666 pass = (err == VK_SUCCESS);
2667 ASSERT_TRUE(pass);
2668
2669 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002670 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(
2671 surface_format_count * sizeof(VkSurfaceFormatKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002672
2673 // Next, do a 2nd try with surface_format_count being set too high:
2674 surface_format_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2676 "that is greater than the value");
2677 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002678 surface_formats);
2679 pass = (err == VK_SUCCESS);
2680 ASSERT_TRUE(pass);
2681 m_errorMonitor->VerifyFound();
2682
2683 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002684 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2685 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002686 pass = (err == VK_SUCCESS);
2687 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002688 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002689 surface_formats);
2690 pass = (err == VK_SUCCESS);
2691 ASSERT_TRUE(pass);
2692
Ian Elliott2c1daf52016-05-12 09:41:46 -06002693 // Get the surface present modes:
2694 uint32_t surface_present_mode_count;
2695
2696 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002697 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002698 "required parameter pPresentModeCount "
2699 "specified as NULL");
2700
Ian Elliott2c1daf52016-05-12 09:41:46 -06002701 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
2702 pass = (err == VK_SUCCESS);
2703 ASSERT_TRUE(pass);
2704 m_errorMonitor->VerifyFound();
2705
2706 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
2707 // correctly done a 1st try (to get the count):
2708 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski6a7e9332016-08-16 09:06:15 -06002709 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002710 "but no prior positive value has been seen for");
2711 surface_present_mode_count = 0;
2712 vkGetPhysicalDeviceSurfacePresentModesKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002713 gpu(), surface, &surface_present_mode_count,
2714 (VkPresentModeKHR *)&surface_present_mode_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002715 pass = (err == VK_SUCCESS);
2716 ASSERT_TRUE(pass);
2717 m_errorMonitor->VerifyFound();
2718
2719 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002720 vkGetPhysicalDeviceSurfacePresentModesKHR(
2721 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002722 pass = (err == VK_SUCCESS);
2723 ASSERT_TRUE(pass);
2724
2725 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002726 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(
2727 surface_present_mode_count * sizeof(VkPresentModeKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002728
2729 // Next, do a 2nd try with surface_format_count being set too high:
2730 surface_present_mode_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2732 "that is greater than the value");
2733 vkGetPhysicalDeviceSurfacePresentModesKHR(
2734 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002735 pass = (err == VK_SUCCESS);
2736 ASSERT_TRUE(pass);
2737 m_errorMonitor->VerifyFound();
2738
2739 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002740 vkGetPhysicalDeviceSurfacePresentModesKHR(
2741 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002742 pass = (err == VK_SUCCESS);
2743 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002744 vkGetPhysicalDeviceSurfacePresentModesKHR(
2745 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002746 pass = (err == VK_SUCCESS);
2747 ASSERT_TRUE(pass);
2748
Ian Elliott2c1daf52016-05-12 09:41:46 -06002749 // Create a swapchain:
2750
2751 // First, try without a pointer to swapchain_create_info:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002753 "required parameter pCreateInfo "
2754 "specified as NULL");
2755
Ian Elliott2c1daf52016-05-12 09:41:46 -06002756 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
2757 pass = (err != VK_SUCCESS);
2758 ASSERT_TRUE(pass);
2759 m_errorMonitor->VerifyFound();
2760
2761 // Next, call with a non-NULL swapchain_create_info, that has the wrong
2762 // sType:
2763 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002765 "parameter pCreateInfo->sType must be");
2766
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002767 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2768 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002769 pass = (err != VK_SUCCESS);
2770 ASSERT_TRUE(pass);
2771 m_errorMonitor->VerifyFound();
2772
2773 // Next, call with a NULL swapchain pointer:
2774 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2775 swapchain_create_info.pNext = NULL;
2776 swapchain_create_info.flags = 0;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002778 "required parameter pSwapchain "
2779 "specified as NULL");
2780
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002781 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2782 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002783 pass = (err != VK_SUCCESS);
2784 ASSERT_TRUE(pass);
2785 m_errorMonitor->VerifyFound();
2786
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002787 // TODO: Enhance swapchain layer so that
2788 // swapchain_create_info.queueFamilyIndexCount is checked against something?
Ian Elliott2c1daf52016-05-12 09:41:46 -06002789
2790 // Next, call with a queue family index that's too large:
2791 uint32_t queueFamilyIndex[2] = {100000, 0};
2792 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2793 swapchain_create_info.queueFamilyIndexCount = 2;
2794 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
2795 m_errorMonitor->SetDesiredFailureMsg(
2796 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2797 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002798 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2799 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002800 pass = (err != VK_SUCCESS);
2801 ASSERT_TRUE(pass);
2802 m_errorMonitor->VerifyFound();
2803
2804 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
2805 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2806 swapchain_create_info.queueFamilyIndexCount = 1;
2807 m_errorMonitor->SetDesiredFailureMsg(
2808 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2809 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
2810 "pCreateInfo->pQueueFamilyIndices).");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002811 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2812 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002813 pass = (err != VK_SUCCESS);
2814 ASSERT_TRUE(pass);
2815 m_errorMonitor->VerifyFound();
2816
2817 // Next, call with an invalid imageSharingMode:
2818 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
2819 swapchain_create_info.queueFamilyIndexCount = 1;
2820 m_errorMonitor->SetDesiredFailureMsg(
2821 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2822 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002823 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2824 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002825 pass = (err != VK_SUCCESS);
2826 ASSERT_TRUE(pass);
2827 m_errorMonitor->VerifyFound();
2828 // Fix for the future:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002829 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2830 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002831 swapchain_create_info.queueFamilyIndexCount = 0;
2832 queueFamilyIndex[0] = 0;
2833 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
2834
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002835 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
Ian Elliott2c1daf52016-05-12 09:41:46 -06002836 // Get the images from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002837 // Acquire an image from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002838 // Present an image to a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002839 // Destroy the swapchain:
2840
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002841 // TODOs:
2842 //
2843 // - Try destroying the device without first destroying the swapchain
2844 //
2845 // - Try destroying the device without first destroying the surface
2846 //
2847 // - Try destroying the surface without first destroying the swapchain
Ian Elliott2c1daf52016-05-12 09:41:46 -06002848
2849 // Destroy the surface:
2850 vkDestroySurfaceKHR(instance(), surface, NULL);
2851
Ian Elliott2c1daf52016-05-12 09:41:46 -06002852 // Tear down the window:
2853 xcb_destroy_window(connection, xcb_window);
2854 xcb_disconnect(connection);
2855
2856#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002857 return;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002858#endif // VK_USE_PLATFORM_XCB_KHR
2859}
2860
Karl Schultz6addd812016-02-02 17:17:23 -07002861TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2862 VkResult err;
2863 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002864
Karl Schultz6addd812016-02-02 17:17:23 -07002865 m_errorMonitor->SetDesiredFailureMsg(
2866 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002867 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
2868
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002869 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002870
2871 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002872 VkImage image;
2873 VkDeviceMemory mem;
2874 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002875
Karl Schultz6addd812016-02-02 17:17:23 -07002876 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2877 const int32_t tex_width = 32;
2878 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002879
Tony Barboureb254902015-07-15 12:50:33 -06002880 VkImageCreateInfo image_create_info = {};
2881 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002882 image_create_info.pNext = NULL;
2883 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2884 image_create_info.format = tex_format;
2885 image_create_info.extent.width = tex_width;
2886 image_create_info.extent.height = tex_height;
2887 image_create_info.extent.depth = 1;
2888 image_create_info.mipLevels = 1;
2889 image_create_info.arrayLayers = 1;
2890 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2891 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2892 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2893 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002894
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002895 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002896 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002897 mem_alloc.pNext = NULL;
2898 mem_alloc.allocationSize = 0;
2899 // Introduce failure, do NOT set memProps to
2900 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
2901 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002902
Chia-I Wuf7458c52015-10-26 21:10:41 +08002903 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002904 ASSERT_VK_SUCCESS(err);
2905
Karl Schultz6addd812016-02-02 17:17:23 -07002906 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002907
Mark Lobodzinski23065352015-05-29 09:32:35 -05002908 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002909
Karl Schultz6addd812016-02-02 17:17:23 -07002910 pass =
2911 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
2912 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2913 if (!pass) { // If we can't find any unmappable memory this test doesn't
2914 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002915 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002916 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002917 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002918
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002919 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002920 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002921 ASSERT_VK_SUCCESS(err);
2922
2923 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002924 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002925 ASSERT_VK_SUCCESS(err);
2926
2927 // Map memory as if to initialize the image
2928 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07002929 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
2930 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002931
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002932 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002933
Chia-I Wuf7458c52015-10-26 21:10:41 +08002934 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002935 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002936}
2937
Karl Schultz6addd812016-02-02 17:17:23 -07002938TEST_F(VkLayerTest, RebindMemory) {
2939 VkResult err;
2940 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002941
Karl Schultz6addd812016-02-02 17:17:23 -07002942 m_errorMonitor->SetDesiredFailureMsg(
2943 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002944 "which has already been bound to mem object");
2945
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002946 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002947
2948 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002949 VkImage image;
2950 VkDeviceMemory mem1;
2951 VkDeviceMemory mem2;
2952 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002953
Karl Schultz6addd812016-02-02 17:17:23 -07002954 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2955 const int32_t tex_width = 32;
2956 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002957
Tony Barboureb254902015-07-15 12:50:33 -06002958 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002959 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2960 image_create_info.pNext = NULL;
2961 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2962 image_create_info.format = tex_format;
2963 image_create_info.extent.width = tex_width;
2964 image_create_info.extent.height = tex_height;
2965 image_create_info.extent.depth = 1;
2966 image_create_info.mipLevels = 1;
2967 image_create_info.arrayLayers = 1;
2968 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2969 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2970 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2971 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002972
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002973 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002974 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2975 mem_alloc.pNext = NULL;
2976 mem_alloc.allocationSize = 0;
2977 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002978
Karl Schultz6addd812016-02-02 17:17:23 -07002979 // Introduce failure, do NOT set memProps to
2980 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002981 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002982 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002983 ASSERT_VK_SUCCESS(err);
2984
Karl Schultz6addd812016-02-02 17:17:23 -07002985 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002986
2987 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002988 pass =
2989 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002990 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002991
2992 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002993 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002994 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002995 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002996 ASSERT_VK_SUCCESS(err);
2997
2998 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002999 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003000 ASSERT_VK_SUCCESS(err);
3001
Karl Schultz6addd812016-02-02 17:17:23 -07003002 // Introduce validation failure, try to bind a different memory object to
3003 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06003004 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003005
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003006 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003007
Chia-I Wuf7458c52015-10-26 21:10:41 +08003008 vkDestroyImage(m_device->device(), image, NULL);
3009 vkFreeMemory(m_device->device(), mem1, NULL);
3010 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003011}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05003012
Karl Schultz6addd812016-02-02 17:17:23 -07003013TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003014 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003015
Karl Schultz6addd812016-02-02 17:17:23 -07003016 m_errorMonitor->SetDesiredFailureMsg(
3017 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
3018 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06003019
3020 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06003021 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3022 fenceInfo.pNext = NULL;
3023 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06003024
Tony Barbour300a6082015-04-07 13:44:53 -06003025 ASSERT_NO_FATAL_FAILURE(InitState());
3026 ASSERT_NO_FATAL_FAILURE(InitViewport());
3027 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3028
Tony Barbourfe3351b2015-07-28 10:17:20 -06003029 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003030 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
3031 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06003032 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06003033
3034 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06003035
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003036 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08003037 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3038 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003039 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003040 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07003041 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003042 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003043 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08003044 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003045 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06003046
3047 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07003048 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06003049
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003050 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06003051}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003052// This is a positive test. We used to expect error in this case but spec now
3053// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07003054TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003055 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06003056 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06003057 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06003058 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3059 fenceInfo.pNext = NULL;
3060
Tony Barbour0b4d9562015-04-09 10:48:04 -06003061 ASSERT_NO_FATAL_FAILURE(InitState());
3062 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08003063 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003064 VkResult result = vkResetFences(m_device->device(), 1, fences);
3065 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06003066
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003067 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06003068}
Tobin Ehlis56ab9022016-08-17 17:59:31 -06003069#if 0 // A few devices have issues with this test so disabling for now
Chris Forbese70b7d32016-06-15 15:49:12 +12003070TEST_F(VkLayerTest, LongFenceChain)
3071{
3072 m_errorMonitor->ExpectSuccess();
3073
3074 ASSERT_NO_FATAL_FAILURE(InitState());
3075 VkResult err;
3076
3077 std::vector<VkFence> fences;
3078
3079 const int chainLength = 32768;
3080
3081 for (int i = 0; i < chainLength; i++) {
3082 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3083 VkFence fence;
3084 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3085 ASSERT_VK_SUCCESS(err);
3086
3087 fences.push_back(fence);
3088
3089 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3090 0, nullptr, 0, nullptr };
3091 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3092 ASSERT_VK_SUCCESS(err);
3093
3094 }
3095
3096 // BOOM, stack overflow.
3097 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
3098
3099 for (auto fence : fences)
3100 vkDestroyFence(m_device->device(), fence, nullptr);
3101
3102 m_errorMonitor->VerifyNotFound();
3103}
Tobin Ehlis56ab9022016-08-17 17:59:31 -06003104#endif
Chris Forbes18127d12016-06-08 16:52:28 +12003105TEST_F(VkLayerTest, CommandBufferSimultaneousUseSync)
3106{
3107 m_errorMonitor->ExpectSuccess();
3108
3109 ASSERT_NO_FATAL_FAILURE(InitState());
3110 VkResult err;
3111
3112 // Record (empty!) command buffer that can be submitted multiple times
3113 // simultaneously.
3114 VkCommandBufferBeginInfo cbbi = {
3115 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
3116 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr
3117 };
3118 m_commandBuffer->BeginCommandBuffer(&cbbi);
3119 m_commandBuffer->EndCommandBuffer();
3120
3121 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3122 VkFence fence;
3123 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3124 ASSERT_VK_SUCCESS(err);
3125
3126 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
3127 VkSemaphore s1, s2;
3128 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
3129 ASSERT_VK_SUCCESS(err);
3130 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
3131 ASSERT_VK_SUCCESS(err);
3132
3133 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
3134 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3135 1, &m_commandBuffer->handle(), 1, &s1 };
3136 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3137 ASSERT_VK_SUCCESS(err);
3138
3139 // Submit CB again, signaling s2.
3140 si.pSignalSemaphores = &s2;
3141 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
3142 ASSERT_VK_SUCCESS(err);
3143
3144 // Wait for fence.
3145 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3146 ASSERT_VK_SUCCESS(err);
3147
3148 // CB is still in flight from second submission, but semaphore s1 is no
3149 // longer in flight. delete it.
3150 vkDestroySemaphore(m_device->device(), s1, nullptr);
3151
3152 m_errorMonitor->VerifyNotFound();
3153
3154 // Force device idle and clean up remaining objects
3155 vkDeviceWaitIdle(m_device->device());
3156 vkDestroySemaphore(m_device->device(), s2, nullptr);
3157 vkDestroyFence(m_device->device(), fence, nullptr);
3158}
3159
Chris Forbes4e44c912016-06-16 10:20:00 +12003160TEST_F(VkLayerTest, FenceCreateSignaledWaitHandling)
3161{
3162 m_errorMonitor->ExpectSuccess();
3163
3164 ASSERT_NO_FATAL_FAILURE(InitState());
3165 VkResult err;
3166
3167 // A fence created signaled
3168 VkFenceCreateInfo fci1 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT };
3169 VkFence f1;
3170 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
3171 ASSERT_VK_SUCCESS(err);
3172
3173 // A fence created not
3174 VkFenceCreateInfo fci2 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3175 VkFence f2;
3176 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
3177 ASSERT_VK_SUCCESS(err);
3178
3179 // Submit the unsignaled fence
3180 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3181 0, nullptr, 0, nullptr };
3182 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
3183
3184 // Wait on both fences, with signaled first.
3185 VkFence fences[] = { f1, f2 };
3186 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
3187
3188 // Should have both retired!
3189 vkDestroyFence(m_device->device(), f1, nullptr);
3190 vkDestroyFence(m_device->device(), f2, nullptr);
3191
3192 m_errorMonitor->VerifyNotFound();
3193}
3194
Tobin Ehlis41376e12015-07-03 08:45:14 -06003195TEST_F(VkLayerTest, InvalidUsageBits)
3196{
Tony Barbourf92621a2016-05-02 14:28:12 -06003197 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003198 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06003199 "Initialize buffer with wrong usage then perform copy expecting errors "
3200 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003202 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06003203
3204 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06003205 VkImageObj image(m_device);
3206 // Initialize image with USAGE_INPUT_ATTACHMENT
Tobin Ehlis8b313c02016-05-25 15:01:52 -06003207 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003208 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
3209 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06003210
Tony Barbourf92621a2016-05-02 14:28:12 -06003211 VkImageView dsv;
3212 VkImageViewCreateInfo dsvci = {};
3213 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3214 dsvci.image = image.handle();
3215 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3216 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
3217 dsvci.subresourceRange.layerCount = 1;
3218 dsvci.subresourceRange.baseMipLevel = 0;
3219 dsvci.subresourceRange.levelCount = 1;
3220 dsvci.subresourceRange.aspectMask =
3221 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06003222
Tony Barbourf92621a2016-05-02 14:28:12 -06003223 // Create a view with depth / stencil aspect for image with different usage
3224 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003225
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003226 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06003227
3228 // Initialize buffer with TRANSFER_DST usage
3229 vk_testing::Buffer buffer;
3230 VkMemoryPropertyFlags reqs = 0;
3231 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3232 VkBufferImageCopy region = {};
3233 region.bufferRowLength = 128;
3234 region.bufferImageHeight = 128;
3235 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3236 region.imageSubresource.layerCount = 1;
3237 region.imageExtent.height = 16;
3238 region.imageExtent.width = 16;
3239 region.imageExtent.depth = 1;
3240
3241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3242 "Invalid usage flag for buffer ");
3243 // Buffer usage not set to TRANSFER_SRC and image usage not set to
3244 // TRANSFER_DST
3245 BeginCommandBuffer();
3246 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3247 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3248 1, &region);
3249 m_errorMonitor->VerifyFound();
3250
3251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3252 "Invalid usage flag for image ");
3253 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3254 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3255 1, &region);
3256 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06003257}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003258#endif // MEM_TRACKER_TESTS
3259
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06003260#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003261
3262TEST_F(VkLayerTest, LeakAnObject) {
3263 VkResult err;
3264
3265 TEST_DESCRIPTION(
3266 "Create a fence and destroy its device without first destroying the fence.");
3267
3268 // Note that we have to create a new device since destroying the
3269 // framework's device causes Teardown() to fail and just calling Teardown
3270 // will destroy the errorMonitor.
3271
3272 m_errorMonitor->SetDesiredFailureMsg(
3273 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003274 "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003275
3276 ASSERT_NO_FATAL_FAILURE(InitState());
3277
3278 const std::vector<VkQueueFamilyProperties> queue_props =
3279 m_device->queue_props;
3280 std::vector<VkDeviceQueueCreateInfo> queue_info;
3281 queue_info.reserve(queue_props.size());
3282 std::vector<std::vector<float>> queue_priorities;
3283 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
3284 VkDeviceQueueCreateInfo qi = {};
3285 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
3286 qi.pNext = NULL;
3287 qi.queueFamilyIndex = i;
3288 qi.queueCount = queue_props[i].queueCount;
3289 queue_priorities.emplace_back(qi.queueCount, 0.0f);
3290 qi.pQueuePriorities = queue_priorities[i].data();
3291 queue_info.push_back(qi);
3292 }
3293
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003294 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003295
3296 // The sacrificial device object
3297 VkDevice testDevice;
3298 VkDeviceCreateInfo device_create_info = {};
3299 auto features = m_device->phy().features();
3300 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
3301 device_create_info.pNext = NULL;
3302 device_create_info.queueCreateInfoCount = queue_info.size();
3303 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06003304 device_create_info.enabledLayerCount = 0;
3305 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003306 device_create_info.pEnabledFeatures = &features;
3307 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
3308 ASSERT_VK_SUCCESS(err);
3309
3310 VkFence fence;
3311 VkFenceCreateInfo fence_create_info = {};
3312 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3313 fence_create_info.pNext = NULL;
3314 fence_create_info.flags = 0;
3315 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
3316 ASSERT_VK_SUCCESS(err);
3317
3318 // Induce failure by not calling vkDestroyFence
3319 vkDestroyDevice(testDevice, NULL);
3320 m_errorMonitor->VerifyFound();
3321}
3322
3323TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
3324
3325 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
3326 "attempt to delete them from another.");
3327
3328 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3329 "FreeCommandBuffers is attempting to free Command Buffer");
3330
Tony Barbour6514a6b2016-08-12 09:37:19 -06003331 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003332 VkCommandPool command_pool_one;
3333 VkCommandPool command_pool_two;
3334
3335 VkCommandPoolCreateInfo pool_create_info{};
3336 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3337 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3338 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3339
3340 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3341 &command_pool_one);
3342
3343 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3344 &command_pool_two);
3345
3346 VkCommandBuffer command_buffer[9];
3347 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3348 command_buffer_allocate_info.sType =
3349 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3350 command_buffer_allocate_info.commandPool = command_pool_one;
3351 command_buffer_allocate_info.commandBufferCount = 9;
3352 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3353 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3354 command_buffer);
3355
3356 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
3357 &command_buffer[3]);
3358
3359 m_errorMonitor->VerifyFound();
3360
3361 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
3362 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
3363}
3364
3365TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
3366 VkResult err;
3367
3368 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
3369 "attempt to delete them from another.");
3370
3371 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3372 "FreeDescriptorSets is attempting to free descriptorSet");
3373
3374 ASSERT_NO_FATAL_FAILURE(InitState());
3375 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3376
3377 VkDescriptorPoolSize ds_type_count = {};
3378 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3379 ds_type_count.descriptorCount = 1;
3380
3381 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3382 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3383 ds_pool_ci.pNext = NULL;
3384 ds_pool_ci.flags = 0;
3385 ds_pool_ci.maxSets = 1;
3386 ds_pool_ci.poolSizeCount = 1;
3387 ds_pool_ci.pPoolSizes = &ds_type_count;
3388
3389 VkDescriptorPool ds_pool_one;
3390 err =
3391 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
3392 ASSERT_VK_SUCCESS(err);
3393
3394 // Create a second descriptor pool
3395 VkDescriptorPool ds_pool_two;
3396 err =
3397 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
3398 ASSERT_VK_SUCCESS(err);
3399
3400 VkDescriptorSetLayoutBinding dsl_binding = {};
3401 dsl_binding.binding = 0;
3402 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3403 dsl_binding.descriptorCount = 1;
3404 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3405 dsl_binding.pImmutableSamplers = NULL;
3406
3407 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3408 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3409 ds_layout_ci.pNext = NULL;
3410 ds_layout_ci.bindingCount = 1;
3411 ds_layout_ci.pBindings = &dsl_binding;
3412
3413 VkDescriptorSetLayout ds_layout;
3414 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3415 &ds_layout);
3416 ASSERT_VK_SUCCESS(err);
3417
3418 VkDescriptorSet descriptorSet;
3419 VkDescriptorSetAllocateInfo alloc_info = {};
3420 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3421 alloc_info.descriptorSetCount = 1;
3422 alloc_info.descriptorPool = ds_pool_one;
3423 alloc_info.pSetLayouts = &ds_layout;
3424 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3425 &descriptorSet);
3426 ASSERT_VK_SUCCESS(err);
3427
3428 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
3429
3430 m_errorMonitor->VerifyFound();
3431
3432 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3433 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
3434 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
3435}
3436
3437TEST_F(VkLayerTest, CreateUnknownObject) {
3438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003439 "Invalid Image Object ");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003440
3441 TEST_DESCRIPTION(
3442 "Pass an invalid image object handle into a Vulkan API call.");
3443
3444 ASSERT_NO_FATAL_FAILURE(InitState());
3445
3446 // Pass bogus handle into GetImageMemoryRequirements
3447 VkMemoryRequirements mem_reqs;
3448 uint64_t fakeImageHandle = 0xCADECADE;
3449 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
3450
3451 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
3452
3453 m_errorMonitor->VerifyFound();
3454}
3455
Karl Schultz6addd812016-02-02 17:17:23 -07003456TEST_F(VkLayerTest, PipelineNotBound) {
3457 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003458
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003459 TEST_DESCRIPTION(
3460 "Pass in an invalid pipeline object handle into a Vulkan API call.");
3461
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003463 "Invalid Pipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003464
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003465 ASSERT_NO_FATAL_FAILURE(InitState());
3466 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003467
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003468 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003469 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3470 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003471
3472 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003473 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3474 ds_pool_ci.pNext = NULL;
3475 ds_pool_ci.maxSets = 1;
3476 ds_pool_ci.poolSizeCount = 1;
3477 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003478
3479 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003480 err =
3481 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003482 ASSERT_VK_SUCCESS(err);
3483
3484 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003485 dsl_binding.binding = 0;
3486 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3487 dsl_binding.descriptorCount = 1;
3488 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3489 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003490
3491 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003492 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3493 ds_layout_ci.pNext = NULL;
3494 ds_layout_ci.bindingCount = 1;
3495 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003496
3497 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003498 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3499 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003500 ASSERT_VK_SUCCESS(err);
3501
3502 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003503 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003504 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003505 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003506 alloc_info.descriptorPool = ds_pool;
3507 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003508 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3509 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003510 ASSERT_VK_SUCCESS(err);
3511
3512 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003513 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3514 pipeline_layout_ci.pNext = NULL;
3515 pipeline_layout_ci.setLayoutCount = 1;
3516 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003517
3518 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003519 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3520 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003521 ASSERT_VK_SUCCESS(err);
3522
Mark Youngad779052016-01-06 14:26:04 -07003523 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003524
3525 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003526 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3527 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003528
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003529 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003530
Chia-I Wuf7458c52015-10-26 21:10:41 +08003531 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3532 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3533 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003534}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003535
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003536TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
3537 VkResult err;
3538
3539 TEST_DESCRIPTION("Test validation check for an invalid memory type index "
3540 "during bind[Buffer|Image]Memory time");
3541
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003542 ASSERT_NO_FATAL_FAILURE(InitState());
3543
3544 // Create an image, allocate memory, set a bad typeIndex and then try to
3545 // bind it
3546 VkImage image;
3547 VkDeviceMemory mem;
3548 VkMemoryRequirements mem_reqs;
3549 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3550 const int32_t tex_width = 32;
3551 const int32_t tex_height = 32;
3552
3553 VkImageCreateInfo image_create_info = {};
3554 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3555 image_create_info.pNext = NULL;
3556 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3557 image_create_info.format = tex_format;
3558 image_create_info.extent.width = tex_width;
3559 image_create_info.extent.height = tex_height;
3560 image_create_info.extent.depth = 1;
3561 image_create_info.mipLevels = 1;
3562 image_create_info.arrayLayers = 1;
3563 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3564 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3565 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3566 image_create_info.flags = 0;
3567
3568 VkMemoryAllocateInfo mem_alloc = {};
3569 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3570 mem_alloc.pNext = NULL;
3571 mem_alloc.allocationSize = 0;
3572 mem_alloc.memoryTypeIndex = 0;
3573
3574 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3575 ASSERT_VK_SUCCESS(err);
3576
3577 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
3578 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003579
3580 // Introduce Failure, select invalid TypeIndex
3581 VkPhysicalDeviceMemoryProperties memory_info;
3582
3583 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
3584 unsigned int i;
3585 for (i = 0; i < memory_info.memoryTypeCount; i++) {
3586 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
3587 mem_alloc.memoryTypeIndex = i;
3588 break;
3589 }
3590 }
3591 if (i >= memory_info.memoryTypeCount) {
3592 printf("No invalid memory type index could be found; skipped.\n");
3593 vkDestroyImage(m_device->device(), image, NULL);
3594 return;
3595 }
3596
3597 m_errorMonitor->SetDesiredFailureMsg(
3598 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3599 "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003600
3601 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3602 ASSERT_VK_SUCCESS(err);
3603
3604 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3605 (void)err;
3606
3607 m_errorMonitor->VerifyFound();
3608
3609 vkDestroyImage(m_device->device(), image, NULL);
3610 vkFreeMemory(m_device->device(), mem, NULL);
3611}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003612
Karl Schultz6addd812016-02-02 17:17:23 -07003613TEST_F(VkLayerTest, BindInvalidMemory) {
3614 VkResult err;
3615 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003616
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003618 "Invalid Device Memory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003619
Tobin Ehlisec598302015-09-15 15:02:17 -06003620 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003621
3622 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07003623 VkImage image;
3624 VkDeviceMemory mem;
3625 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003626
Karl Schultz6addd812016-02-02 17:17:23 -07003627 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3628 const int32_t tex_width = 32;
3629 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003630
3631 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003632 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3633 image_create_info.pNext = NULL;
3634 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3635 image_create_info.format = tex_format;
3636 image_create_info.extent.width = tex_width;
3637 image_create_info.extent.height = tex_height;
3638 image_create_info.extent.depth = 1;
3639 image_create_info.mipLevels = 1;
3640 image_create_info.arrayLayers = 1;
3641 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3642 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3643 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3644 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003645
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003646 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003647 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3648 mem_alloc.pNext = NULL;
3649 mem_alloc.allocationSize = 0;
3650 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003651
Chia-I Wuf7458c52015-10-26 21:10:41 +08003652 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003653 ASSERT_VK_SUCCESS(err);
3654
Karl Schultz6addd812016-02-02 17:17:23 -07003655 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003656
3657 mem_alloc.allocationSize = mem_reqs.size;
3658
Karl Schultz6addd812016-02-02 17:17:23 -07003659 pass =
3660 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003661 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003662
3663 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003664 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003665 ASSERT_VK_SUCCESS(err);
3666
3667 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003668 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003669
3670 // Try to bind free memory that has been freed
3671 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3672 // This may very well return an error.
3673 (void)err;
3674
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003675 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003676
Chia-I Wuf7458c52015-10-26 21:10:41 +08003677 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003678}
3679
Karl Schultz6addd812016-02-02 17:17:23 -07003680TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
3681 VkResult err;
3682 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003683
Karl Schultz6addd812016-02-02 17:17:23 -07003684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003685 "Invalid Image Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003686
Tobin Ehlisec598302015-09-15 15:02:17 -06003687 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003688
Karl Schultz6addd812016-02-02 17:17:23 -07003689 // Create an image object, allocate memory, destroy the object and then try
3690 // to bind it
3691 VkImage image;
3692 VkDeviceMemory mem;
3693 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003694
Karl Schultz6addd812016-02-02 17:17:23 -07003695 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3696 const int32_t tex_width = 32;
3697 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003698
3699 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003700 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3701 image_create_info.pNext = NULL;
3702 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3703 image_create_info.format = tex_format;
3704 image_create_info.extent.width = tex_width;
3705 image_create_info.extent.height = tex_height;
3706 image_create_info.extent.depth = 1;
3707 image_create_info.mipLevels = 1;
3708 image_create_info.arrayLayers = 1;
3709 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3710 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3711 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3712 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003713
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003714 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003715 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3716 mem_alloc.pNext = NULL;
3717 mem_alloc.allocationSize = 0;
3718 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003719
Chia-I Wuf7458c52015-10-26 21:10:41 +08003720 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003721 ASSERT_VK_SUCCESS(err);
3722
Karl Schultz6addd812016-02-02 17:17:23 -07003723 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003724
3725 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003726 pass =
3727 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003728 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003729
3730 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003731 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003732 ASSERT_VK_SUCCESS(err);
3733
3734 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003735 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003736 ASSERT_VK_SUCCESS(err);
3737
3738 // Now Try to bind memory to this destroyed object
3739 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3740 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003741 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003742
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003743 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003744
Chia-I Wuf7458c52015-10-26 21:10:41 +08003745 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003746}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003747
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003748#endif // OBJ_TRACKER_TESTS
3749
Tobin Ehlis0788f522015-05-26 16:11:58 -06003750#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06003751
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003752TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003753 TEST_DESCRIPTION("Submit command buffer created using one queue family and "
3754 "attempt to submit them on a queue created in a different "
3755 "queue family.");
3756
Tony Barbour6514a6b2016-08-12 09:37:19 -06003757 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003758 // This test is meaningless unless we have multiple queue families
3759 auto queue_family_properties = m_device->phy().queue_properties();
3760 if (queue_family_properties.size() < 2) {
3761 return;
3762 }
3763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3764 " is being submitted on queue ");
3765 // Get safe index of another queue family
3766 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
3767 ASSERT_NO_FATAL_FAILURE(InitState());
3768 // Create a second queue using a different queue family
3769 VkQueue other_queue;
3770 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3771
3772 // Record an empty cmd buffer
3773 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3774 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3775 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3776 vkEndCommandBuffer(m_commandBuffer->handle());
3777
3778 // And submit on the wrong queue
3779 VkSubmitInfo submit_info = {};
3780 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3781 submit_info.commandBufferCount = 1;
3782 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003783 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003784
3785 m_errorMonitor->VerifyFound();
3786
3787}
3788
Chris Forbes48a53902016-06-30 11:46:27 +12003789TEST_F(VkLayerTest, RenderPassInitialLayoutUndefined) {
3790 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass with an attachment's "
3791 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
3792 "the command buffer has prior knowledge of that "
3793 "attachment's layout.");
3794
3795 m_errorMonitor->ExpectSuccess();
3796
3797 ASSERT_NO_FATAL_FAILURE(InitState());
3798
3799 // A renderpass with one color attachment.
3800 VkAttachmentDescription attachment = {
3801 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3802 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3803 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3804 VK_IMAGE_LAYOUT_UNDEFINED,
3805 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3806 };
3807
3808 VkAttachmentReference att_ref = {
3809 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3810 };
3811
3812 VkSubpassDescription subpass = {
3813 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3814 1, &att_ref, nullptr, nullptr, 0, nullptr
3815 };
3816
3817 VkRenderPassCreateInfo rpci = {
3818 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3819 0, 1, &attachment, 1, &subpass, 0, nullptr
3820 };
3821
3822 VkRenderPass rp;
3823 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3824 ASSERT_VK_SUCCESS(err);
3825
3826 // A compatible framebuffer.
3827 VkImageObj image(m_device);
3828 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3829 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3830 VK_IMAGE_TILING_OPTIMAL, 0);
3831 ASSERT_TRUE(image.initialized());
3832
3833 VkImageViewCreateInfo ivci = {
3834 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3835 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3836 {
3837 VK_COMPONENT_SWIZZLE_IDENTITY,
3838 VK_COMPONENT_SWIZZLE_IDENTITY,
3839 VK_COMPONENT_SWIZZLE_IDENTITY,
3840 VK_COMPONENT_SWIZZLE_IDENTITY
3841 },
3842 {
3843 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3844 },
3845 };
3846 VkImageView view;
3847 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3848 ASSERT_VK_SUCCESS(err);
3849
3850 VkFramebufferCreateInfo fci = {
3851 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3852 0, rp, 1, &view,
3853 32, 32, 1
3854 };
3855 VkFramebuffer fb;
3856 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3857 ASSERT_VK_SUCCESS(err);
3858
3859 // Record a single command buffer which uses this renderpass twice. The
3860 // bug is triggered at the beginning of the second renderpass, when the
3861 // command buffer already has a layout recorded for the attachment.
3862 VkRenderPassBeginInfo rpbi = {
3863 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003864 rp, fb, { { 0, 0 } , { 32, 32 } },
Chris Forbes48a53902016-06-30 11:46:27 +12003865 0, nullptr
3866 };
3867 BeginCommandBuffer();
3868 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3869 VK_SUBPASS_CONTENTS_INLINE);
3870 vkCmdEndRenderPass(m_commandBuffer->handle());
3871 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3872 VK_SUBPASS_CONTENTS_INLINE);
3873
3874 m_errorMonitor->VerifyNotFound();
3875
3876 vkCmdEndRenderPass(m_commandBuffer->handle());
3877 EndCommandBuffer();
3878
3879 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3880 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3881 vkDestroyImageView(m_device->device(), view, nullptr);
3882}
3883
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06003884TEST_F(VkLayerTest, FramebufferBindingDestroyCommandPool) {
3885 TEST_DESCRIPTION("This test should pass. Create a Framebuffer and "
3886 "command buffer, bind them together, then destroy "
3887 "command pool and framebuffer and verify there are no "
3888 "errors.");
3889
3890 m_errorMonitor->ExpectSuccess();
3891
3892 ASSERT_NO_FATAL_FAILURE(InitState());
3893
3894 // A renderpass with one color attachment.
3895 VkAttachmentDescription attachment = {
3896 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3897 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3898 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3899 VK_IMAGE_LAYOUT_UNDEFINED,
3900 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3901 };
3902
3903 VkAttachmentReference att_ref = {
3904 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3905 };
3906
3907 VkSubpassDescription subpass = {
3908 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3909 1, &att_ref, nullptr, nullptr, 0, nullptr
3910 };
3911
3912 VkRenderPassCreateInfo rpci = {
3913 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3914 0, 1, &attachment, 1, &subpass, 0, nullptr
3915 };
3916
3917 VkRenderPass rp;
3918 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3919 ASSERT_VK_SUCCESS(err);
3920
3921 // A compatible framebuffer.
3922 VkImageObj image(m_device);
3923 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3924 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3925 VK_IMAGE_TILING_OPTIMAL, 0);
3926 ASSERT_TRUE(image.initialized());
3927
3928 VkImageViewCreateInfo ivci = {
3929 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3930 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3931 {
3932 VK_COMPONENT_SWIZZLE_IDENTITY,
3933 VK_COMPONENT_SWIZZLE_IDENTITY,
3934 VK_COMPONENT_SWIZZLE_IDENTITY,
3935 VK_COMPONENT_SWIZZLE_IDENTITY
3936 },
3937 {
3938 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3939 },
3940 };
3941 VkImageView view;
3942 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3943 ASSERT_VK_SUCCESS(err);
3944
3945 VkFramebufferCreateInfo fci = {
3946 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3947 0, rp, 1, &view,
3948 32, 32, 1
3949 };
3950 VkFramebuffer fb;
3951 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3952 ASSERT_VK_SUCCESS(err);
3953
3954 // Explicitly create a command buffer to bind the FB to so that we can then
3955 // destroy the command pool in order to implicitly free command buffer
3956 VkCommandPool command_pool;
3957 VkCommandPoolCreateInfo pool_create_info{};
3958 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3959 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3960 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3961 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3962 &command_pool);
3963
3964 VkCommandBuffer command_buffer;
3965 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3966 command_buffer_allocate_info.sType =
3967 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3968 command_buffer_allocate_info.commandPool = command_pool;
3969 command_buffer_allocate_info.commandBufferCount = 1;
3970 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3971 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3972 &command_buffer);
3973
3974 // Begin our cmd buffer with renderpass using our framebuffer
3975 VkRenderPassBeginInfo rpbi = {
3976 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
3977 rp, fb, { { 0, 0 } , { 32, 32 } },
3978 0, nullptr
3979 };
3980 VkCommandBufferBeginInfo begin_info{};
3981 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3982 vkBeginCommandBuffer(command_buffer, &begin_info);
3983
3984 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3985 vkCmdEndRenderPass(command_buffer);
3986 vkEndCommandBuffer(command_buffer);
Mark Lobodzinski7d10a822016-08-03 14:08:40 -06003987 vkDestroyImageView(m_device->device(), view, nullptr);
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06003988 // Destroy command pool to implicitly free command buffer
3989 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3990 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3991 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3992 m_errorMonitor->VerifyNotFound();
3993}
3994
Chris Forbes51bf7c92016-06-30 15:22:08 +12003995TEST_F(VkLayerTest, RenderPassSubpassZeroTransitionsApplied) {
3996 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass applies the layout "
3997 "transitions for the first subpass");
3998
3999 m_errorMonitor->ExpectSuccess();
4000
4001 ASSERT_NO_FATAL_FAILURE(InitState());
4002
4003 // A renderpass with one color attachment.
4004 VkAttachmentDescription attachment = {
4005 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
4006 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
4007 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4008 VK_IMAGE_LAYOUT_UNDEFINED,
4009 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4010 };
4011
4012 VkAttachmentReference att_ref = {
4013 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4014 };
4015
4016 VkSubpassDescription subpass = {
4017 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
4018 1, &att_ref, nullptr, nullptr, 0, nullptr
4019 };
4020
4021 VkSubpassDependency dep = {
Chris Forbescb4c7ad2016-07-06 10:28:18 +12004022 0, 0, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4023 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12004024 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4025 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4026 VK_DEPENDENCY_BY_REGION_BIT
4027 };
4028
4029 VkRenderPassCreateInfo rpci = {
4030 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4031 0, 1, &attachment, 1, &subpass, 1, &dep
4032 };
4033
4034 VkResult err;
4035 VkRenderPass rp;
4036 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4037 ASSERT_VK_SUCCESS(err);
4038
4039 // A compatible framebuffer.
4040 VkImageObj image(m_device);
4041 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
4042 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
4043 VK_IMAGE_TILING_OPTIMAL, 0);
4044 ASSERT_TRUE(image.initialized());
4045
4046 VkImageViewCreateInfo ivci = {
4047 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
4048 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
4049 {
4050 VK_COMPONENT_SWIZZLE_IDENTITY,
4051 VK_COMPONENT_SWIZZLE_IDENTITY,
4052 VK_COMPONENT_SWIZZLE_IDENTITY,
4053 VK_COMPONENT_SWIZZLE_IDENTITY
4054 },
4055 {
4056 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
4057 },
4058 };
4059 VkImageView view;
4060 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4061 ASSERT_VK_SUCCESS(err);
4062
4063 VkFramebufferCreateInfo fci = {
4064 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
4065 0, rp, 1, &view,
4066 32, 32, 1
4067 };
4068 VkFramebuffer fb;
4069 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4070 ASSERT_VK_SUCCESS(err);
4071
4072 // Record a single command buffer which issues a pipeline barrier w/
4073 // image memory barrier for the attachment. This detects the previously
4074 // missing tracking of the subpass layout by throwing a validation error
4075 // if it doesn't occur.
4076 VkRenderPassBeginInfo rpbi = {
4077 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06004078 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes51bf7c92016-06-30 15:22:08 +12004079 0, nullptr
4080 };
4081 BeginCommandBuffer();
4082 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
4083 VK_SUBPASS_CONTENTS_INLINE);
4084
4085 VkImageMemoryBarrier imb = {
4086 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, nullptr,
4087 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4088 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4089 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4090 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4091 VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
4092 image.handle(),
4093 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
4094 };
4095 vkCmdPipelineBarrier(m_commandBuffer->handle(),
Chris Forbescb4c7ad2016-07-06 10:28:18 +12004096 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4097 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12004098 VK_DEPENDENCY_BY_REGION_BIT,
4099 0, nullptr, 0, nullptr, 1, &imb);
4100
4101 vkCmdEndRenderPass(m_commandBuffer->handle());
4102 m_errorMonitor->VerifyNotFound();
4103 EndCommandBuffer();
4104
4105 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4106 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4107 vkDestroyImageView(m_device->device(), view, nullptr);
4108}
4109
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004110TEST_F(VkLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
4111 TEST_DESCRIPTION("Validate that when an imageView of a depth/stencil image "
4112 "is used as a depth/stencil framebuffer attachment, the "
4113 "aspectMask is ignored and both depth and stencil image "
4114 "subresources are used.");
4115
4116 VkFormatProperties format_properties;
4117 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT,
4118 &format_properties);
4119 if (!(format_properties.optimalTilingFeatures &
4120 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
4121 return;
4122 }
4123
4124 m_errorMonitor->ExpectSuccess();
4125
4126 ASSERT_NO_FATAL_FAILURE(InitState());
4127
4128 VkAttachmentDescription attachment = {
4129 0,
4130 VK_FORMAT_D32_SFLOAT_S8_UINT,
4131 VK_SAMPLE_COUNT_1_BIT,
4132 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4133 VK_ATTACHMENT_STORE_OP_STORE,
4134 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4135 VK_ATTACHMENT_STORE_OP_DONT_CARE,
4136 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4137 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
4138
4139 VkAttachmentReference att_ref = {
4140 0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
4141
4142 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4143 0, nullptr,
4144 0, nullptr,
4145 nullptr, &att_ref,
4146 0, nullptr};
4147
4148 VkSubpassDependency dep = {0,
4149 0,
4150 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4151 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4152 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4153 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4154 VK_DEPENDENCY_BY_REGION_BIT};
4155
4156 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
4157 nullptr,
4158 0,
4159 1,
4160 &attachment,
4161 1,
4162 &subpass,
4163 1,
4164 &dep};
4165
4166 VkResult err;
4167 VkRenderPass rp;
4168 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4169 ASSERT_VK_SUCCESS(err);
4170
4171 VkImageObj image(m_device);
4172 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
4173 0x26, // usage
4174 VK_IMAGE_TILING_OPTIMAL, 0);
4175 ASSERT_TRUE(image.initialized());
4176 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
4177
4178 VkImageViewCreateInfo ivci = {
4179 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4180 nullptr,
4181 0,
4182 image.handle(),
4183 VK_IMAGE_VIEW_TYPE_2D,
4184 VK_FORMAT_D32_SFLOAT_S8_UINT,
4185 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B,
4186 VK_COMPONENT_SWIZZLE_A},
4187 {0x2, 0, 1, 0, 1},
4188 };
4189 VkImageView view;
4190 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4191 ASSERT_VK_SUCCESS(err);
4192
4193 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
4194 nullptr,
4195 0,
4196 rp,
4197 1,
4198 &view,
4199 32,
4200 32,
4201 1};
4202 VkFramebuffer fb;
4203 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4204 ASSERT_VK_SUCCESS(err);
4205
4206 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
4207 nullptr,
4208 rp,
4209 fb,
4210 {{0, 0}, {32, 32}},
4211 0,
4212 nullptr};
4213 BeginCommandBuffer();
4214 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
4215 VK_SUBPASS_CONTENTS_INLINE);
4216
4217 VkImageMemoryBarrier imb = {};
4218 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4219 imb.pNext = nullptr;
4220 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4221 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4222 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4223 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4224 imb.srcQueueFamilyIndex = 0;
4225 imb.dstQueueFamilyIndex = 0;
4226 imb.image = image.handle();
4227 imb.subresourceRange.aspectMask = 0x6;
4228 imb.subresourceRange.baseMipLevel = 0;
4229 imb.subresourceRange.levelCount = 0x1;
4230 imb.subresourceRange.baseArrayLayer = 0;
4231 imb.subresourceRange.layerCount = 0x1;
4232
4233 vkCmdPipelineBarrier(m_commandBuffer->handle(),
4234 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4235 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4236 VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
4237 &imb);
4238
4239 vkCmdEndRenderPass(m_commandBuffer->handle());
4240 EndCommandBuffer();
4241 QueueCommandBuffer(false);
4242 m_errorMonitor->VerifyNotFound();
4243
4244 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4245 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4246 vkDestroyImageView(m_device->device(), view, nullptr);
4247}
Tony Barbourd5f7b822016-08-02 15:39:33 -06004248
Tony Barbour4e919972016-08-09 13:27:40 -06004249TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
4250 TEST_DESCRIPTION("Generate INVALID_RENDER_AREA error by beginning renderpass"
4251 "with extent outside of framebuffer");
4252 ASSERT_NO_FATAL_FAILURE(InitState());
4253 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4254
4255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4256 "Cannot execute a render pass with renderArea "
4257 "not within the bound of the framebuffer.");
4258
4259 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
4260 m_renderPassBeginInfo.renderArea.extent.width = 257;
4261 m_renderPassBeginInfo.renderArea.extent.height = 257;
4262 BeginCommandBuffer();
4263 m_errorMonitor->VerifyFound();
4264}
4265
4266TEST_F(VkLayerTest, DisabledIndependentBlend) {
4267 TEST_DESCRIPTION("Generate INDEPENDENT_BLEND by disabling independent "
4268 "blend and then specifying different blend states for two "
4269 "attachements");
4270 ASSERT_NO_FATAL_FAILURE(InitState());
4271
4272 m_errorMonitor->SetDesiredFailureMsg(
4273 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4274 "Invalid Pipeline CreateInfo: If independent blend feature not "
4275 "enabled, all elements of pAttachments must be identical");
4276 VkPhysicalDeviceFeatures features = {};
4277 features.independentBlend = VK_FALSE;
4278 std::vector<const char *> extension_names;
4279 VkDeviceObj noib_device(0, gpu(), extension_names, &features);
4280
4281 VkCommandPool cmd_pool;
4282 VkCommandPoolCreateInfo pool_create_info{};
4283 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4284 pool_create_info.queueFamilyIndex = noib_device.graphics_queue_node_index_;
4285 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4286
4287 vkCreateCommandPool(noib_device.device(), &pool_create_info, nullptr,
4288 &cmd_pool);
4289 {
4290 // Need cmd_buffer's destructor to be called before calling DestroyCommandPool
4291 VkCommandBufferObj cmd_buffer(&noib_device, cmd_pool);
4292 VkDescriptorSetObj descriptorSet(&noib_device);
4293 descriptorSet.AppendDummy();
4294 descriptorSet.CreateVKDescriptorSet(&cmd_buffer);
4295
4296 VkPipelineObj pipeline(&noib_device);
4297
4298 VkRenderpassObj renderpass(&noib_device);
4299
4300 VkShaderObj vs(&noib_device, bindStateVertShaderText,
4301 VK_SHADER_STAGE_VERTEX_BIT, this);
4302
4303 pipeline.AddShader(&vs);
4304
4305 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
4306 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
4307 att_state1.blendEnable = VK_TRUE;
4308 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
4309 att_state2.blendEnable = VK_FALSE;
4310 pipeline.AddColorAttachment(0, &att_state1);
4311 pipeline.AddColorAttachment(1, &att_state2);
4312 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(),
4313 renderpass.handle());
4314 m_errorMonitor->VerifyFound();
4315 }
4316 vkDestroyCommandPool(noib_device.device(), cmd_pool, NULL);
4317}
4318
4319TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
4320 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
4321 "depth attachments in subpass");
Tony Barbour6514a6b2016-08-12 09:37:19 -06004322 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbour4e919972016-08-09 13:27:40 -06004323
4324 m_errorMonitor->SetDesiredFailureMsg(
4325 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4326 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
4327
4328 // Create a renderPass with a single color attachment
4329 VkAttachmentReference attach = {};
4330 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4331 VkSubpassDescription subpass = {};
4332 VkRenderPassCreateInfo rpci = {};
4333 rpci.subpassCount = 1;
4334 rpci.pSubpasses = &subpass;
4335 rpci.attachmentCount = 1;
4336 VkAttachmentDescription attach_desc = {};
4337 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4338 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4339 rpci.pAttachments = &attach_desc;
4340 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4341 VkRenderPass rp;
4342 subpass.pDepthStencilAttachment = &attach;
4343 subpass.pColorAttachments = NULL;
4344 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4345 m_errorMonitor->VerifyFound();
4346}
4347
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004348TEST_F(VkLayerTest, RenderPassTransitionsAttachmentUnused) {
4349 TEST_DESCRIPTION("Ensure that layout transitions work correctly without "
4350 "errors, when an attachment reference is "
4351 "VK_ATTACHMENT_UNUSED");
4352
4353 m_errorMonitor->ExpectSuccess();
4354
4355 ASSERT_NO_FATAL_FAILURE(InitState());
4356
4357 // A renderpass with no attachments
4358 VkAttachmentReference att_ref = {
4359 VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4360 };
4361
4362 VkSubpassDescription subpass = {
4363 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
4364 1, &att_ref, nullptr, nullptr, 0, nullptr
4365 };
4366
4367 VkRenderPassCreateInfo rpci = {
4368 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4369 0, 0, nullptr, 1, &subpass, 0, nullptr
4370 };
4371
4372 VkRenderPass rp;
4373 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4374 ASSERT_VK_SUCCESS(err);
4375
4376 // A compatible framebuffer.
4377 VkFramebufferCreateInfo fci = {
4378 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
4379 0, rp, 0, nullptr,
4380 32, 32, 1
4381 };
4382 VkFramebuffer fb;
4383 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4384 ASSERT_VK_SUCCESS(err);
4385
4386 // Record a command buffer which just begins and ends the renderpass. The
4387 // bug manifests in BeginRenderPass.
4388 VkRenderPassBeginInfo rpbi = {
4389 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06004390 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004391 0, nullptr
4392 };
4393 BeginCommandBuffer();
4394 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
4395 VK_SUBPASS_CONTENTS_INLINE);
4396 vkCmdEndRenderPass(m_commandBuffer->handle());
4397 m_errorMonitor->VerifyNotFound();
4398 EndCommandBuffer();
4399
4400 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4401 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4402}
4403
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004404// This is a positive test. No errors are expected.
4405TEST_F(VkLayerTest, StencilLoadOp) {
4406 TEST_DESCRIPTION("Create a stencil-only attachment with a LOAD_OP set to "
4407 "CLEAR. stencil[Load|Store]Op used to be ignored.");
4408 VkResult result = VK_SUCCESS;
4409 VkImageFormatProperties formatProps;
4410 vkGetPhysicalDeviceImageFormatProperties(
4411 gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D,
4412 VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4413 VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
4414 0, &formatProps);
4415 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
4416 return;
4417 }
4418
4419 ASSERT_NO_FATAL_FAILURE(InitState());
4420 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
4421 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
4422 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4423 VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
4424 VkAttachmentDescription att = {};
4425 VkAttachmentReference ref = {};
4426 att.format = depth_stencil_fmt;
4427 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
4428 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
4429 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
4430 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
4431 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4432 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4433
4434 VkClearValue clear;
4435 clear.depthStencil.depth = 1.0;
4436 clear.depthStencil.stencil = 0;
4437 ref.attachment = 0;
4438 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4439
4440 VkSubpassDescription subpass = {};
4441 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
4442 subpass.flags = 0;
4443 subpass.inputAttachmentCount = 0;
4444 subpass.pInputAttachments = NULL;
4445 subpass.colorAttachmentCount = 0;
4446 subpass.pColorAttachments = NULL;
4447 subpass.pResolveAttachments = NULL;
4448 subpass.pDepthStencilAttachment = &ref;
4449 subpass.preserveAttachmentCount = 0;
4450 subpass.pPreserveAttachments = NULL;
4451
4452 VkRenderPass rp;
4453 VkRenderPassCreateInfo rp_info = {};
4454 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4455 rp_info.attachmentCount = 1;
4456 rp_info.pAttachments = &att;
4457 rp_info.subpassCount = 1;
4458 rp_info.pSubpasses = &subpass;
4459 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
4460 ASSERT_VK_SUCCESS(result);
4461
4462 VkImageView *depthView = m_depthStencil->BindInfo();
4463 VkFramebufferCreateInfo fb_info = {};
4464 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4465 fb_info.pNext = NULL;
4466 fb_info.renderPass = rp;
4467 fb_info.attachmentCount = 1;
4468 fb_info.pAttachments = depthView;
4469 fb_info.width = 100;
4470 fb_info.height = 100;
4471 fb_info.layers = 1;
4472 VkFramebuffer fb;
4473 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4474 ASSERT_VK_SUCCESS(result);
4475
4476
4477 VkRenderPassBeginInfo rpbinfo = {};
4478 rpbinfo.clearValueCount = 1;
4479 rpbinfo.pClearValues = &clear;
4480 rpbinfo.pNext = NULL;
4481 rpbinfo.renderPass = rp;
4482 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4483 rpbinfo.renderArea.extent.width = 100;
4484 rpbinfo.renderArea.extent.height = 100;
4485 rpbinfo.renderArea.offset.x = 0;
4486 rpbinfo.renderArea.offset.y = 0;
4487 rpbinfo.framebuffer = fb;
4488
4489 VkFence fence = {};
4490 VkFenceCreateInfo fence_ci = {};
4491 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4492 fence_ci.pNext = nullptr;
4493 fence_ci.flags = 0;
4494 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
4495 ASSERT_VK_SUCCESS(result);
4496
4497
4498 m_commandBuffer->BeginCommandBuffer();
4499 m_commandBuffer->BeginRenderPass(rpbinfo);
4500 m_commandBuffer->EndRenderPass();
4501 m_commandBuffer->EndCommandBuffer();
4502 m_commandBuffer->QueueCommandBuffer(fence);
4503
4504 VkImageObj destImage(m_device);
4505 destImage.init(100, 100, depth_stencil_fmt,
4506 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4507 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4508 VK_IMAGE_TILING_OPTIMAL, 0);
4509 VkImageMemoryBarrier barrier = {};
4510 VkImageSubresourceRange range;
4511 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4512 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4513 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4514 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT |
4515 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
4516 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4517 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
4518 barrier.image = m_depthStencil->handle();
4519 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4520 range.baseMipLevel = 0;
4521 range.levelCount = 1;
4522 range.baseArrayLayer = 0;
4523 range.layerCount = 1;
4524 barrier.subresourceRange = range;
4525 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
4526 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
4527 cmdbuf.BeginCommandBuffer();
4528 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4529 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4530 nullptr, 1, &barrier);
4531 barrier.srcAccessMask = 0;
4532 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4533 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
4534 barrier.image = destImage.handle();
4535 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4536 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4537 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4538 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4539 nullptr, 1, &barrier);
4540 VkImageCopy cregion;
4541 cregion.srcSubresource.aspectMask =
4542 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4543 cregion.srcSubresource.mipLevel = 0;
4544 cregion.srcSubresource.baseArrayLayer = 0;
4545 cregion.srcSubresource.layerCount = 1;
4546 cregion.srcOffset.x = 0;
4547 cregion.srcOffset.y = 0;
4548 cregion.srcOffset.z = 0;
4549 cregion.dstSubresource.aspectMask =
4550 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4551 cregion.dstSubresource.mipLevel = 0;
4552 cregion.dstSubresource.baseArrayLayer = 0;
4553 cregion.dstSubresource.layerCount = 1;
4554 cregion.dstOffset.x = 0;
4555 cregion.dstOffset.y = 0;
4556 cregion.dstOffset.z = 0;
4557 cregion.extent.width = 100;
4558 cregion.extent.height = 100;
4559 cregion.extent.depth = 1;
4560 cmdbuf.CopyImage(m_depthStencil->handle(),
4561 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
4562 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
4563 cmdbuf.EndCommandBuffer();
4564
4565 VkSubmitInfo submit_info;
4566 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4567 submit_info.pNext = NULL;
4568 submit_info.waitSemaphoreCount = 0;
4569 submit_info.pWaitSemaphores = NULL;
4570 submit_info.pWaitDstStageMask = NULL;
4571 submit_info.commandBufferCount = 1;
4572 submit_info.pCommandBuffers = &cmdbuf.handle();
4573 submit_info.signalSemaphoreCount = 0;
4574 submit_info.pSignalSemaphores = NULL;
4575
4576 m_errorMonitor->ExpectSuccess();
4577 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4578 m_errorMonitor->VerifyNotFound();
4579
Mark Lobodzinskid0440da2016-06-17 15:10:03 -06004580 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004581 vkDestroyFence(m_device->device(), fence, nullptr);
4582 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4583 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4584}
4585
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004586TEST_F(VkLayerTest, UnusedPreserveAttachment) {
4587 TEST_DESCRIPTION("Create a framebuffer where a subpass has a preserve "
4588 "attachment reference of VK_ATTACHMENT_UNUSED");
4589
4590 ASSERT_NO_FATAL_FAILURE(InitState());
4591 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4592
4593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4594 "must not be VK_ATTACHMENT_UNUSED");
4595
4596 VkAttachmentReference color_attach = {};
4597 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4598 color_attach.attachment = 0;
4599 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
4600 VkSubpassDescription subpass = {};
4601 subpass.colorAttachmentCount = 1;
4602 subpass.pColorAttachments = &color_attach;
4603 subpass.preserveAttachmentCount = 1;
4604 subpass.pPreserveAttachments = &preserve_attachment;
4605
4606 VkRenderPassCreateInfo rpci = {};
4607 rpci.subpassCount = 1;
4608 rpci.pSubpasses = &subpass;
4609 rpci.attachmentCount = 1;
4610 VkAttachmentDescription attach_desc = {};
4611 attach_desc.format = VK_FORMAT_UNDEFINED;
4612 rpci.pAttachments = &attach_desc;
4613 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4614 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004615 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004616
4617 m_errorMonitor->VerifyFound();
4618
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004619 if (result == VK_SUCCESS) {
4620 vkDestroyRenderPass(m_device->device(), rp, NULL);
4621 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004622}
4623
Chris Forbesc5389742016-06-29 11:49:23 +12004624TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004625 TEST_DESCRIPTION("Ensure that CreateRenderPass produces a validation error "
4626 "when the source of a subpass multisample resolve "
4627 "does not have multiple samples.");
4628
Chris Forbesc5389742016-06-29 11:49:23 +12004629 ASSERT_NO_FATAL_FAILURE(InitState());
4630
4631 m_errorMonitor->SetDesiredFailureMsg(
4632 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbes6655bb32016-07-01 18:27:30 +12004633 "Subpass 0 requests multisample resolve from attachment 0 which has "
4634 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12004635
4636 VkAttachmentDescription attachments[] = {
4637 {
4638 0, VK_FORMAT_R8G8B8A8_UNORM,
4639 VK_SAMPLE_COUNT_1_BIT,
4640 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4641 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4642 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4643 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4644 },
4645 {
4646 0, VK_FORMAT_R8G8B8A8_UNORM,
4647 VK_SAMPLE_COUNT_1_BIT,
4648 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4649 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4650 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4651 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4652 },
4653 };
4654
4655 VkAttachmentReference color = {
4656 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4657 };
4658
4659 VkAttachmentReference resolve = {
4660 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4661 };
4662
4663 VkSubpassDescription subpass = {
4664 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4665 0, nullptr,
4666 1, &color,
4667 &resolve,
4668 nullptr,
4669 0, nullptr
4670 };
4671
4672 VkRenderPassCreateInfo rpci = {
4673 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4674 0, 2, attachments, 1, &subpass, 0, nullptr
4675 };
4676
4677 VkRenderPass rp;
4678 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4679
4680 m_errorMonitor->VerifyFound();
4681
4682 if (err == VK_SUCCESS)
4683 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4684}
4685
4686TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004687 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4688 "when a subpass multisample resolve operation is "
4689 "requested, and the destination of that resolve has "
4690 "multiple samples.");
4691
Chris Forbesc5389742016-06-29 11:49:23 +12004692 ASSERT_NO_FATAL_FAILURE(InitState());
4693
4694 m_errorMonitor->SetDesiredFailureMsg(
4695 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4696 "Subpass 0 requests multisample resolve into attachment 1, which "
4697 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
4698
4699 VkAttachmentDescription attachments[] = {
4700 {
4701 0, VK_FORMAT_R8G8B8A8_UNORM,
4702 VK_SAMPLE_COUNT_4_BIT,
4703 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4704 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4705 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4706 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4707 },
4708 {
4709 0, VK_FORMAT_R8G8B8A8_UNORM,
4710 VK_SAMPLE_COUNT_4_BIT,
4711 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4712 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4713 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4714 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4715 },
4716 };
4717
4718 VkAttachmentReference color = {
4719 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4720 };
4721
4722 VkAttachmentReference resolve = {
4723 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4724 };
4725
4726 VkSubpassDescription subpass = {
4727 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4728 0, nullptr,
4729 1, &color,
4730 &resolve,
4731 nullptr,
4732 0, nullptr
4733 };
4734
4735 VkRenderPassCreateInfo rpci = {
4736 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4737 0, 2, attachments, 1, &subpass, 0, nullptr
4738 };
4739
4740 VkRenderPass rp;
4741 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4742
4743 m_errorMonitor->VerifyFound();
4744
4745 if (err == VK_SUCCESS)
4746 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4747}
4748
Chris Forbes3f128ef2016-06-29 14:58:53 +12004749TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004750 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4751 "when the color and depth attachments used by a subpass "
4752 "have inconsistent sample counts");
4753
Chris Forbes3f128ef2016-06-29 14:58:53 +12004754 ASSERT_NO_FATAL_FAILURE(InitState());
4755
4756 m_errorMonitor->SetDesiredFailureMsg(
4757 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4758 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
4759
4760 VkAttachmentDescription attachments[] = {
4761 {
4762 0, VK_FORMAT_R8G8B8A8_UNORM,
4763 VK_SAMPLE_COUNT_1_BIT,
4764 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4765 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4766 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4767 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4768 },
4769 {
4770 0, VK_FORMAT_R8G8B8A8_UNORM,
4771 VK_SAMPLE_COUNT_4_BIT,
4772 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4773 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4774 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4775 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4776 },
4777 };
4778
4779 VkAttachmentReference color[] = {
4780 {
4781 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4782 },
4783 {
4784 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4785 },
4786 };
4787
4788 VkSubpassDescription subpass = {
4789 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4790 0, nullptr,
4791 2, color,
4792 nullptr,
4793 nullptr,
4794 0, nullptr
4795 };
4796
4797 VkRenderPassCreateInfo rpci = {
4798 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4799 0, 2, attachments, 1, &subpass, 0, nullptr
4800 };
4801
4802 VkRenderPass rp;
4803 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4804
4805 m_errorMonitor->VerifyFound();
4806
4807 if (err == VK_SUCCESS)
4808 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4809}
4810
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004811TEST_F(VkLayerTest, FramebufferCreateErrors) {
4812 TEST_DESCRIPTION("Hit errors when attempting to create a framebuffer :\n"
4813 " 1. Mismatch between fb & renderPass attachmentCount\n"
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004814 " 2. Use a color image as depthStencil attachment\n"
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004815 " 3. Mismatch fb & renderPass attachment formats\n"
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004816 " 4. Mismatch fb & renderPass attachment #samples\n"
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004817 " 5. FB attachment w/ non-1 mip-levels\n"
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004818 " 6. FB attachment where dimensions don't match\n"
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004819 " 7. FB attachment w/o identity swizzle\n"
4820 " 8. FB dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004821
4822 ASSERT_NO_FATAL_FAILURE(InitState());
4823 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4824
4825 m_errorMonitor->SetDesiredFailureMsg(
4826 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004827 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
4828 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004829
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004830 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004831 VkAttachmentReference attach = {};
4832 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4833 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004834 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004835 VkRenderPassCreateInfo rpci = {};
4836 rpci.subpassCount = 1;
4837 rpci.pSubpasses = &subpass;
4838 rpci.attachmentCount = 1;
4839 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004840 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004841 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004842 rpci.pAttachments = &attach_desc;
4843 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4844 VkRenderPass rp;
4845 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4846 ASSERT_VK_SUCCESS(err);
4847
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004848 VkImageView ivs[2];
4849 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
4850 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004851 VkFramebufferCreateInfo fb_info = {};
4852 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4853 fb_info.pNext = NULL;
4854 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004855 // Set mis-matching attachmentCount
4856 fb_info.attachmentCount = 2;
4857 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004858 fb_info.width = 100;
4859 fb_info.height = 100;
4860 fb_info.layers = 1;
4861
4862 VkFramebuffer fb;
4863 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4864
4865 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004866 if (err == VK_SUCCESS) {
4867 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4868 }
4869 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004870
4871 // Create a renderPass with a depth-stencil attachment created with
4872 // IMAGE_USAGE_COLOR_ATTACHMENT
4873 // Add our color attachment to pDepthStencilAttachment
4874 subpass.pDepthStencilAttachment = &attach;
4875 subpass.pColorAttachments = NULL;
4876 VkRenderPass rp_ds;
4877 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
4878 ASSERT_VK_SUCCESS(err);
4879 // Set correct attachment count, but attachment has COLOR usage bit set
4880 fb_info.attachmentCount = 1;
4881 fb_info.renderPass = rp_ds;
4882
4883 m_errorMonitor->SetDesiredFailureMsg(
4884 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4885 " conflicts with the image's IMAGE_USAGE flags ");
4886 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4887
4888 m_errorMonitor->VerifyFound();
4889 if (err == VK_SUCCESS) {
4890 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4891 }
4892 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004893
4894 // Create new renderpass with alternate attachment format from fb
4895 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
4896 subpass.pDepthStencilAttachment = NULL;
4897 subpass.pColorAttachments = &attach;
4898 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4899 ASSERT_VK_SUCCESS(err);
4900
4901 // Cause error due to mis-matched formats between rp & fb
4902 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
4903 fb_info.renderPass = rp;
4904 m_errorMonitor->SetDesiredFailureMsg(
4905 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4906 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
4907 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4908
4909 m_errorMonitor->VerifyFound();
4910 if (err == VK_SUCCESS) {
4911 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4912 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004913 vkDestroyRenderPass(m_device->device(), rp, NULL);
4914
4915 // Create new renderpass with alternate sample count from fb
4916 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4917 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
4918 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4919 ASSERT_VK_SUCCESS(err);
4920
4921 // Cause error due to mis-matched sample count between rp & fb
4922 fb_info.renderPass = rp;
4923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4924 " has VK_SAMPLE_COUNT_1_BIT samples "
4925 "that do not match the "
4926 "VK_SAMPLE_COUNT_4_BIT ");
4927 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4928
4929 m_errorMonitor->VerifyFound();
4930 if (err == VK_SUCCESS) {
4931 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4932 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004933
4934 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004935
4936 // Create a custom imageView with non-1 mip levels
4937 VkImageObj image(m_device);
4938 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
4939 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4940 ASSERT_TRUE(image.initialized());
4941
4942 VkImageView view;
4943 VkImageViewCreateInfo ivci = {};
4944 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4945 ivci.image = image.handle();
4946 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4947 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4948 ivci.subresourceRange.layerCount = 1;
4949 ivci.subresourceRange.baseMipLevel = 0;
4950 // Set level count 2 (only 1 is allowed for FB attachment)
4951 ivci.subresourceRange.levelCount = 2;
4952 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4953 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4954 ASSERT_VK_SUCCESS(err);
4955 // Re-create renderpass to have matching sample count
4956 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4957 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4958 ASSERT_VK_SUCCESS(err);
4959
4960 fb_info.renderPass = rp;
4961 fb_info.pAttachments = &view;
4962 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4963 " has mip levelCount of 2 but only ");
4964 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4965
4966 m_errorMonitor->VerifyFound();
4967 if (err == VK_SUCCESS) {
4968 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4969 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004970 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004971 // Update view to original color buffer and grow FB dimensions too big
4972 fb_info.pAttachments = ivs;
4973 fb_info.height = 1024;
4974 fb_info.width = 1024;
4975 fb_info.layers = 2;
4976 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4977 " Attachment dimensions must be at "
4978 "least as large. ");
4979 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4980
4981 m_errorMonitor->VerifyFound();
4982 if (err == VK_SUCCESS) {
4983 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4984 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004985 // Create view attachment with non-identity swizzle
4986 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4987 ivci.image = image.handle();
4988 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4989 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4990 ivci.subresourceRange.layerCount = 1;
4991 ivci.subresourceRange.baseMipLevel = 0;
4992 ivci.subresourceRange.levelCount = 1;
4993 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4994 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4995 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4996 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4997 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4998 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4999 ASSERT_VK_SUCCESS(err);
5000
5001 fb_info.pAttachments = &view;
5002 fb_info.height = 100;
5003 fb_info.width = 100;
5004 fb_info.layers = 1;
5005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5006 " has non-identy swizzle. All "
5007 "framebuffer attachments must have "
5008 "been created with the identity "
5009 "swizzle. ");
5010 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
5011
5012 m_errorMonitor->VerifyFound();
5013 if (err == VK_SUCCESS) {
5014 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5015 }
5016 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06005017 // Request fb that exceeds max dimensions
5018 // reset attachment to color attachment
5019 fb_info.pAttachments = ivs;
5020 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
5021 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
5022 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
5023 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5024 " Requested VkFramebufferCreateInfo "
5025 "dimensions exceed physical device "
5026 "limits. ");
5027 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
5028
5029 m_errorMonitor->VerifyFound();
5030 if (err == VK_SUCCESS) {
5031 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5032 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06005033
Tobin Ehlis6cfda642016-06-22 16:12:58 -06005034 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06005035}
5036
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005037// This is a positive test. No errors should be generated.
Michael Lentine860b0fe2016-05-20 10:14:00 -05005038TEST_F(VkLayerTest, WaitEventThenSet) {
5039 TEST_DESCRIPTION(
5040 "Wait on a event then set it after the wait has been submitted.");
5041
Michael Lentine860b0fe2016-05-20 10:14:00 -05005042 m_errorMonitor->ExpectSuccess();
Tony Barbour6514a6b2016-08-12 09:37:19 -06005043 ASSERT_NO_FATAL_FAILURE(InitState());
Michael Lentine860b0fe2016-05-20 10:14:00 -05005044
5045 VkEvent event;
5046 VkEventCreateInfo event_create_info{};
5047 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5048 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
5049
5050 VkCommandPool command_pool;
5051 VkCommandPoolCreateInfo pool_create_info{};
5052 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5053 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5054 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5055 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5056 &command_pool);
5057
5058 VkCommandBuffer command_buffer;
5059 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5060 command_buffer_allocate_info.sType =
5061 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5062 command_buffer_allocate_info.commandPool = command_pool;
5063 command_buffer_allocate_info.commandBufferCount = 1;
5064 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5065 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5066 &command_buffer);
5067
5068 VkQueue queue = VK_NULL_HANDLE;
5069 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06005070 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005071
5072 {
5073 VkCommandBufferBeginInfo begin_info{};
5074 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5075 vkBeginCommandBuffer(command_buffer, &begin_info);
5076
5077 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT,
5078 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
5079 nullptr, 0, nullptr);
5080 vkCmdResetEvent(command_buffer, event,
5081 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
5082 vkEndCommandBuffer(command_buffer);
5083 }
5084 {
5085 VkSubmitInfo submit_info{};
5086 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5087 submit_info.commandBufferCount = 1;
5088 submit_info.pCommandBuffers = &command_buffer;
5089 submit_info.signalSemaphoreCount = 0;
5090 submit_info.pSignalSemaphores = nullptr;
5091 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5092 }
5093 { vkSetEvent(m_device->device(), event); }
5094
5095 vkQueueWaitIdle(queue);
5096
5097 vkDestroyEvent(m_device->device(), event, nullptr);
5098 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5099 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5100
5101 m_errorMonitor->VerifyNotFound();
5102}
Michael Lentine5627e692016-05-20 17:45:02 -05005103// This is a positive test. No errors should be generated.
Michael Lentinef01fb382016-07-21 17:24:56 -05005104TEST_F(VkLayerTest, QueryAndCopySecondaryCommandBuffers) {
5105 TEST_DESCRIPTION(
5106 "Issue a query on a secondary command buffery and copy it on a primary.");
5107
Tony Barbour6514a6b2016-08-12 09:37:19 -06005108 ASSERT_NO_FATAL_FAILURE(InitState());
Michael Lentinef01fb382016-07-21 17:24:56 -05005109 if ((m_device->queue_props.empty()) ||
5110 (m_device->queue_props[0].queueCount < 2))
5111 return;
5112
5113 m_errorMonitor->ExpectSuccess();
5114
5115 VkQueryPool query_pool;
5116 VkQueryPoolCreateInfo query_pool_create_info{};
5117 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5118 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
5119 query_pool_create_info.queryCount = 1;
5120 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
5121 &query_pool);
5122
5123 VkCommandPool command_pool;
5124 VkCommandPoolCreateInfo pool_create_info{};
5125 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5126 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5127 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5128 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5129 &command_pool);
5130
5131 VkCommandBuffer command_buffer;
5132 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5133 command_buffer_allocate_info.sType =
5134 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5135 command_buffer_allocate_info.commandPool = command_pool;
5136 command_buffer_allocate_info.commandBufferCount = 1;
5137 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5138 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5139 &command_buffer);
5140
5141 VkCommandBuffer secondary_command_buffer;
5142 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5143 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5144 &secondary_command_buffer);
5145
5146 VkQueue queue = VK_NULL_HANDLE;
5147 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5148 1, &queue);
5149
5150 uint32_t qfi = 0;
5151 VkBufferCreateInfo buff_create_info = {};
5152 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5153 buff_create_info.size = 1024;
5154 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
5155 buff_create_info.queueFamilyIndexCount = 1;
5156 buff_create_info.pQueueFamilyIndices = &qfi;
5157
5158 VkResult err;
5159 VkBuffer buffer;
5160 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
5161 ASSERT_VK_SUCCESS(err);
5162 VkMemoryAllocateInfo mem_alloc = {};
5163 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5164 mem_alloc.pNext = NULL;
5165 mem_alloc.allocationSize = 1024;
5166 mem_alloc.memoryTypeIndex = 0;
5167
5168 VkMemoryRequirements memReqs;
5169 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
5170 bool pass =
5171 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
5172 if (!pass) {
5173 vkDestroyBuffer(m_device->device(), buffer, NULL);
5174 return;
5175 }
5176
5177 VkDeviceMemory mem;
5178 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5179 ASSERT_VK_SUCCESS(err);
5180 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5181 ASSERT_VK_SUCCESS(err);
5182
5183 VkCommandBufferInheritanceInfo hinfo = {};
5184 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
5185 hinfo.renderPass = VK_NULL_HANDLE;
5186 hinfo.subpass = 0;
5187 hinfo.framebuffer = VK_NULL_HANDLE;
5188 hinfo.occlusionQueryEnable = VK_FALSE;
5189 hinfo.queryFlags = 0;
5190 hinfo.pipelineStatistics = 0;
5191
5192 {
5193 VkCommandBufferBeginInfo begin_info{};
5194 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5195 begin_info.pInheritanceInfo = &hinfo;
5196 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
5197
5198 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
5199 vkCmdWriteTimestamp(secondary_command_buffer,
5200 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
5201
5202 vkEndCommandBuffer(secondary_command_buffer);
5203
5204 begin_info.pInheritanceInfo = nullptr;
5205 vkBeginCommandBuffer(command_buffer, &begin_info);
5206
5207 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
5208 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer,
5209 0, 0, 0);
5210
5211 vkEndCommandBuffer(command_buffer);
5212 }
5213 {
5214 VkSubmitInfo submit_info{};
5215 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5216 submit_info.commandBufferCount = 1;
5217 submit_info.pCommandBuffers = &command_buffer;
5218 submit_info.signalSemaphoreCount = 0;
5219 submit_info.pSignalSemaphores = nullptr;
5220 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5221 }
5222
5223 vkQueueWaitIdle(queue);
5224
5225 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
5226 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5227 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
5228 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5229 vkDestroyBuffer(m_device->device(), buffer, NULL);
5230 vkFreeMemory(m_device->device(), mem, NULL);
5231
5232 m_errorMonitor->VerifyNotFound();
5233}
5234
5235// This is a positive test. No errors should be generated.
Michael Lentine5627e692016-05-20 17:45:02 -05005236TEST_F(VkLayerTest, QueryAndCopyMultipleCommandBuffers) {
5237 TEST_DESCRIPTION(
5238 "Issue a query and copy from it on a second command buffer.");
5239
Tony Barbour6514a6b2016-08-12 09:37:19 -06005240 ASSERT_NO_FATAL_FAILURE(InitState());
Michael Lentine5627e692016-05-20 17:45:02 -05005241 if ((m_device->queue_props.empty()) ||
5242 (m_device->queue_props[0].queueCount < 2))
5243 return;
5244
5245 m_errorMonitor->ExpectSuccess();
5246
5247 VkQueryPool query_pool;
5248 VkQueryPoolCreateInfo query_pool_create_info{};
5249 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5250 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
5251 query_pool_create_info.queryCount = 1;
5252 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
5253 &query_pool);
5254
5255 VkCommandPool command_pool;
5256 VkCommandPoolCreateInfo pool_create_info{};
5257 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5258 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5259 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5260 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5261 &command_pool);
5262
5263 VkCommandBuffer command_buffer[2];
5264 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5265 command_buffer_allocate_info.sType =
5266 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5267 command_buffer_allocate_info.commandPool = command_pool;
5268 command_buffer_allocate_info.commandBufferCount = 2;
5269 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5270 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5271 command_buffer);
5272
5273 VkQueue queue = VK_NULL_HANDLE;
5274 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5275 1, &queue);
5276
5277 uint32_t qfi = 0;
5278 VkBufferCreateInfo buff_create_info = {};
5279 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5280 buff_create_info.size = 1024;
5281 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
5282 buff_create_info.queueFamilyIndexCount = 1;
5283 buff_create_info.pQueueFamilyIndices = &qfi;
5284
5285 VkResult err;
5286 VkBuffer buffer;
5287 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
5288 ASSERT_VK_SUCCESS(err);
5289 VkMemoryAllocateInfo mem_alloc = {};
5290 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5291 mem_alloc.pNext = NULL;
5292 mem_alloc.allocationSize = 1024;
5293 mem_alloc.memoryTypeIndex = 0;
5294
5295 VkMemoryRequirements memReqs;
5296 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
5297 bool pass =
5298 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
5299 if (!pass) {
5300 vkDestroyBuffer(m_device->device(), buffer, NULL);
5301 return;
5302 }
5303
5304 VkDeviceMemory mem;
5305 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5306 ASSERT_VK_SUCCESS(err);
5307 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5308 ASSERT_VK_SUCCESS(err);
5309
5310 {
5311 VkCommandBufferBeginInfo begin_info{};
5312 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5313 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5314
5315 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
5316 vkCmdWriteTimestamp(command_buffer[0],
5317 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
5318
5319 vkEndCommandBuffer(command_buffer[0]);
5320
5321 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5322
5323 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer,
5324 0, 0, 0);
5325
5326 vkEndCommandBuffer(command_buffer[1]);
5327 }
5328 {
5329 VkSubmitInfo submit_info{};
5330 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5331 submit_info.commandBufferCount = 2;
5332 submit_info.pCommandBuffers = command_buffer;
5333 submit_info.signalSemaphoreCount = 0;
5334 submit_info.pSignalSemaphores = nullptr;
5335 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5336 }
5337
5338 vkQueueWaitIdle(queue);
5339
5340 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
5341 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
5342 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06005343 vkDestroyBuffer(m_device->device(), buffer, NULL);
5344 vkFreeMemory(m_device->device(), mem, NULL);
Michael Lentine5627e692016-05-20 17:45:02 -05005345
5346 m_errorMonitor->VerifyNotFound();
5347}
Michael Lentine860b0fe2016-05-20 10:14:00 -05005348
5349TEST_F(VkLayerTest, ResetEventThenSet) {
5350 TEST_DESCRIPTION(
5351 "Reset an event then set it after the reset has been submitted.");
5352
Michael Lentine860b0fe2016-05-20 10:14:00 -05005353 m_errorMonitor->ExpectSuccess();
5354
Tony Barbour6514a6b2016-08-12 09:37:19 -06005355 ASSERT_NO_FATAL_FAILURE(InitState());
Michael Lentine860b0fe2016-05-20 10:14:00 -05005356 VkEvent event;
5357 VkEventCreateInfo event_create_info{};
5358 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5359 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
5360
5361 VkCommandPool command_pool;
5362 VkCommandPoolCreateInfo pool_create_info{};
5363 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5364 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5365 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5366 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5367 &command_pool);
5368
5369 VkCommandBuffer command_buffer;
5370 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5371 command_buffer_allocate_info.sType =
5372 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5373 command_buffer_allocate_info.commandPool = command_pool;
5374 command_buffer_allocate_info.commandBufferCount = 1;
5375 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5376 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5377 &command_buffer);
5378
5379 VkQueue queue = VK_NULL_HANDLE;
5380 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06005381 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005382
5383 {
5384 VkCommandBufferBeginInfo begin_info{};
5385 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5386 vkBeginCommandBuffer(command_buffer, &begin_info);
5387
5388 vkCmdResetEvent(command_buffer, event,
5389 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
5390 vkCmdWaitEvents(command_buffer, 1, &event,
5391 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5392 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
5393 nullptr, 0, nullptr);
5394 vkEndCommandBuffer(command_buffer);
5395 }
5396 {
5397 VkSubmitInfo submit_info{};
5398 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5399 submit_info.commandBufferCount = 1;
5400 submit_info.pCommandBuffers = &command_buffer;
5401 submit_info.signalSemaphoreCount = 0;
5402 submit_info.pSignalSemaphores = nullptr;
5403 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5404 }
5405 {
Tony Barbour6514a6b2016-08-12 09:37:19 -06005406 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5407 "that is already in use by a "
5408 "command buffer.");
Michael Lentine860b0fe2016-05-20 10:14:00 -05005409 vkSetEvent(m_device->device(), event);
5410 m_errorMonitor->VerifyFound();
5411 }
5412
5413 vkQueueWaitIdle(queue);
5414
5415 vkDestroyEvent(m_device->device(), event, nullptr);
5416 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5417 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5418}
5419
5420// This is a positive test. No errors should be generated.
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005421TEST_F(VkLayerTest, TwoFencesThreeFrames) {
5422 TEST_DESCRIPTION("Two command buffers with two separate fences are each "
5423 "run through a Submit & WaitForFences cycle 3 times. This "
5424 "previously revealed a bug so running this positive test "
5425 "to prevent a regression.");
5426 m_errorMonitor->ExpectSuccess();
5427
5428 ASSERT_NO_FATAL_FAILURE(InitState());
5429 VkQueue queue = VK_NULL_HANDLE;
5430 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5431 0, &queue);
5432
5433 static const uint32_t NUM_OBJECTS = 2;
5434 static const uint32_t NUM_FRAMES = 3;
5435 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
5436 VkFence fences[NUM_OBJECTS] = {};
5437
5438 VkCommandPool cmd_pool;
5439 VkCommandPoolCreateInfo cmd_pool_ci = {};
5440 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5441 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
5442 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5443 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci,
5444 nullptr, &cmd_pool);
5445 ASSERT_VK_SUCCESS(err);
5446
5447 VkCommandBufferAllocateInfo cmd_buf_info = {};
5448 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5449 cmd_buf_info.commandPool = cmd_pool;
5450 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5451 cmd_buf_info.commandBufferCount = 1;
5452
5453 VkFenceCreateInfo fence_ci = {};
5454 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5455 fence_ci.pNext = nullptr;
5456 fence_ci.flags = 0;
5457
5458 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
5459 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info,
5460 &cmd_buffers[i]);
5461 ASSERT_VK_SUCCESS(err);
5462 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
5463 ASSERT_VK_SUCCESS(err);
5464 }
5465
5466 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
Tobin Ehlisf9025162016-05-26 06:55:21 -06005467 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
5468 // Create empty cmd buffer
5469 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
5470 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005471
Tobin Ehlisf9025162016-05-26 06:55:21 -06005472 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
5473 ASSERT_VK_SUCCESS(err);
5474 err = vkEndCommandBuffer(cmd_buffers[obj]);
5475 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005476
Tobin Ehlisf9025162016-05-26 06:55:21 -06005477 VkSubmitInfo submit_info = {};
5478 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5479 submit_info.commandBufferCount = 1;
5480 submit_info.pCommandBuffers = &cmd_buffers[obj];
5481 // Submit cmd buffer and wait for fence
5482 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
5483 ASSERT_VK_SUCCESS(err);
5484 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE,
5485 UINT64_MAX);
5486 ASSERT_VK_SUCCESS(err);
5487 err = vkResetFences(m_device->device(), 1, &fences[obj]);
5488 ASSERT_VK_SUCCESS(err);
5489 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005490 }
5491 m_errorMonitor->VerifyNotFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06005492 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
5493 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
5494 vkDestroyFence(m_device->device(), fences[i], nullptr);
5495 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005496}
5497// This is a positive test. No errors should be generated.
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005498TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
5499
5500 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5501 "submitted on separate queues followed by a QueueWaitIdle.");
5502
Tony Barbour6514a6b2016-08-12 09:37:19 -06005503 ASSERT_NO_FATAL_FAILURE(InitState());
Dustin Graves48458142016-04-29 16:11:55 -06005504 if ((m_device->queue_props.empty()) ||
5505 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005506 return;
5507
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005508 m_errorMonitor->ExpectSuccess();
5509
5510 VkSemaphore semaphore;
5511 VkSemaphoreCreateInfo semaphore_create_info{};
5512 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5513 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5514 &semaphore);
5515
5516 VkCommandPool command_pool;
5517 VkCommandPoolCreateInfo pool_create_info{};
5518 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5519 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5520 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5521 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5522 &command_pool);
5523
5524 VkCommandBuffer command_buffer[2];
5525 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5526 command_buffer_allocate_info.sType =
5527 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5528 command_buffer_allocate_info.commandPool = command_pool;
5529 command_buffer_allocate_info.commandBufferCount = 2;
5530 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5531 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5532 command_buffer);
5533
5534 VkQueue queue = VK_NULL_HANDLE;
5535 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5536 1, &queue);
5537
5538 {
5539 VkCommandBufferBeginInfo begin_info{};
5540 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5541 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5542
5543 vkCmdPipelineBarrier(command_buffer[0],
5544 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5545 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5546 0, nullptr, 0, nullptr);
5547
5548 VkViewport viewport{};
5549 viewport.maxDepth = 1.0f;
5550 viewport.minDepth = 0.0f;
5551 viewport.width = 512;
5552 viewport.height = 512;
5553 viewport.x = 0;
5554 viewport.y = 0;
5555 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5556 vkEndCommandBuffer(command_buffer[0]);
5557 }
5558 {
5559 VkCommandBufferBeginInfo begin_info{};
5560 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5561 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5562
5563 VkViewport viewport{};
5564 viewport.maxDepth = 1.0f;
5565 viewport.minDepth = 0.0f;
5566 viewport.width = 512;
5567 viewport.height = 512;
5568 viewport.x = 0;
5569 viewport.y = 0;
5570 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5571 vkEndCommandBuffer(command_buffer[1]);
5572 }
5573 {
5574 VkSubmitInfo submit_info{};
5575 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5576 submit_info.commandBufferCount = 1;
5577 submit_info.pCommandBuffers = &command_buffer[0];
5578 submit_info.signalSemaphoreCount = 1;
5579 submit_info.pSignalSemaphores = &semaphore;
5580 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5581 }
5582 {
5583 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5584 VkSubmitInfo submit_info{};
5585 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5586 submit_info.commandBufferCount = 1;
5587 submit_info.pCommandBuffers = &command_buffer[1];
5588 submit_info.waitSemaphoreCount = 1;
5589 submit_info.pWaitSemaphores = &semaphore;
5590 submit_info.pWaitDstStageMask = flags;
5591 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5592 }
5593
5594 vkQueueWaitIdle(m_device->m_queue);
5595
5596 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5597 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5598 &command_buffer[0]);
5599 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5600
5601 m_errorMonitor->VerifyNotFound();
5602}
5603
5604// This is a positive test. No errors should be generated.
5605TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
5606
5607 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5608 "submitted on separate queues, the second having a fence"
5609 "followed by a QueueWaitIdle.");
5610
Tony Barbour6514a6b2016-08-12 09:37:19 -06005611 ASSERT_NO_FATAL_FAILURE(InitState());
Dustin Graves48458142016-04-29 16:11:55 -06005612 if ((m_device->queue_props.empty()) ||
5613 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005614 return;
5615
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005616 m_errorMonitor->ExpectSuccess();
5617
5618 VkFence fence;
5619 VkFenceCreateInfo fence_create_info{};
5620 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5621 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5622
5623 VkSemaphore semaphore;
5624 VkSemaphoreCreateInfo semaphore_create_info{};
5625 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5626 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5627 &semaphore);
5628
5629 VkCommandPool command_pool;
5630 VkCommandPoolCreateInfo pool_create_info{};
5631 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5632 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5633 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5634 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5635 &command_pool);
5636
5637 VkCommandBuffer command_buffer[2];
5638 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5639 command_buffer_allocate_info.sType =
5640 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5641 command_buffer_allocate_info.commandPool = command_pool;
5642 command_buffer_allocate_info.commandBufferCount = 2;
5643 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5644 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5645 command_buffer);
5646
5647 VkQueue queue = VK_NULL_HANDLE;
5648 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5649 1, &queue);
5650
5651 {
5652 VkCommandBufferBeginInfo begin_info{};
5653 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5654 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5655
5656 vkCmdPipelineBarrier(command_buffer[0],
5657 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5658 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5659 0, nullptr, 0, nullptr);
5660
5661 VkViewport viewport{};
5662 viewport.maxDepth = 1.0f;
5663 viewport.minDepth = 0.0f;
5664 viewport.width = 512;
5665 viewport.height = 512;
5666 viewport.x = 0;
5667 viewport.y = 0;
5668 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5669 vkEndCommandBuffer(command_buffer[0]);
5670 }
5671 {
5672 VkCommandBufferBeginInfo begin_info{};
5673 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5674 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5675
5676 VkViewport viewport{};
5677 viewport.maxDepth = 1.0f;
5678 viewport.minDepth = 0.0f;
5679 viewport.width = 512;
5680 viewport.height = 512;
5681 viewport.x = 0;
5682 viewport.y = 0;
5683 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5684 vkEndCommandBuffer(command_buffer[1]);
5685 }
5686 {
5687 VkSubmitInfo submit_info{};
5688 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5689 submit_info.commandBufferCount = 1;
5690 submit_info.pCommandBuffers = &command_buffer[0];
5691 submit_info.signalSemaphoreCount = 1;
5692 submit_info.pSignalSemaphores = &semaphore;
5693 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5694 }
5695 {
5696 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5697 VkSubmitInfo submit_info{};
5698 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5699 submit_info.commandBufferCount = 1;
5700 submit_info.pCommandBuffers = &command_buffer[1];
5701 submit_info.waitSemaphoreCount = 1;
5702 submit_info.pWaitSemaphores = &semaphore;
5703 submit_info.pWaitDstStageMask = flags;
5704 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5705 }
5706
5707 vkQueueWaitIdle(m_device->m_queue);
5708
5709 vkDestroyFence(m_device->device(), fence, nullptr);
5710 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5711 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5712 &command_buffer[0]);
5713 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5714
5715 m_errorMonitor->VerifyNotFound();
5716}
5717
5718// This is a positive test. No errors should be generated.
5719TEST_F(VkLayerTest,
5720 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
5721
5722 TEST_DESCRIPTION(
5723 "Two command buffers, each in a separate QueueSubmit call "
5724 "submitted on separate queues, the second having a fence"
5725 "followed by two consecutive WaitForFences calls on the same fence.");
5726
Tony Barbour6514a6b2016-08-12 09:37:19 -06005727 ASSERT_NO_FATAL_FAILURE(InitState());
Dustin Graves48458142016-04-29 16:11:55 -06005728 if ((m_device->queue_props.empty()) ||
5729 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005730 return;
5731
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005732 m_errorMonitor->ExpectSuccess();
5733
5734 VkFence fence;
5735 VkFenceCreateInfo fence_create_info{};
5736 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5737 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5738
5739 VkSemaphore semaphore;
5740 VkSemaphoreCreateInfo semaphore_create_info{};
5741 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5742 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5743 &semaphore);
5744
5745 VkCommandPool command_pool;
5746 VkCommandPoolCreateInfo pool_create_info{};
5747 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5748 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5749 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5750 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5751 &command_pool);
5752
5753 VkCommandBuffer command_buffer[2];
5754 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5755 command_buffer_allocate_info.sType =
5756 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5757 command_buffer_allocate_info.commandPool = command_pool;
5758 command_buffer_allocate_info.commandBufferCount = 2;
5759 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5760 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5761 command_buffer);
5762
5763 VkQueue queue = VK_NULL_HANDLE;
5764 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5765 1, &queue);
5766
5767 {
5768 VkCommandBufferBeginInfo begin_info{};
5769 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5770 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5771
5772 vkCmdPipelineBarrier(command_buffer[0],
5773 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5774 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5775 0, nullptr, 0, nullptr);
5776
5777 VkViewport viewport{};
5778 viewport.maxDepth = 1.0f;
5779 viewport.minDepth = 0.0f;
5780 viewport.width = 512;
5781 viewport.height = 512;
5782 viewport.x = 0;
5783 viewport.y = 0;
5784 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5785 vkEndCommandBuffer(command_buffer[0]);
5786 }
5787 {
5788 VkCommandBufferBeginInfo begin_info{};
5789 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5790 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5791
5792 VkViewport viewport{};
5793 viewport.maxDepth = 1.0f;
5794 viewport.minDepth = 0.0f;
5795 viewport.width = 512;
5796 viewport.height = 512;
5797 viewport.x = 0;
5798 viewport.y = 0;
5799 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5800 vkEndCommandBuffer(command_buffer[1]);
5801 }
5802 {
5803 VkSubmitInfo submit_info{};
5804 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5805 submit_info.commandBufferCount = 1;
5806 submit_info.pCommandBuffers = &command_buffer[0];
5807 submit_info.signalSemaphoreCount = 1;
5808 submit_info.pSignalSemaphores = &semaphore;
5809 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5810 }
5811 {
5812 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5813 VkSubmitInfo submit_info{};
5814 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5815 submit_info.commandBufferCount = 1;
5816 submit_info.pCommandBuffers = &command_buffer[1];
5817 submit_info.waitSemaphoreCount = 1;
5818 submit_info.pWaitSemaphores = &semaphore;
5819 submit_info.pWaitDstStageMask = flags;
5820 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5821 }
5822
5823 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5824 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5825
5826 vkDestroyFence(m_device->device(), fence, nullptr);
5827 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5828 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5829 &command_buffer[0]);
5830 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5831
5832 m_errorMonitor->VerifyNotFound();
5833}
5834
Chris Forbes0f8126b2016-06-20 17:48:22 +12005835TEST_F(VkLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour6514a6b2016-08-12 09:37:19 -06005836
5837 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes0f8126b2016-06-20 17:48:22 +12005838 if ((m_device->queue_props.empty()) ||
5839 (m_device->queue_props[0].queueCount < 2)) {
5840 printf("Test requires two queues, skipping\n");
5841 return;
5842 }
5843
5844 VkResult err;
5845
5846 m_errorMonitor->ExpectSuccess();
5847
5848 VkQueue q0 = m_device->m_queue;
5849 VkQueue q1 = nullptr;
5850 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
5851 ASSERT_NE(q1, nullptr);
5852
5853 // An (empty) command buffer. We must have work in the first submission --
5854 // the layer treats unfenced work differently from fenced work.
5855 VkCommandPoolCreateInfo cpci = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0 };
5856 VkCommandPool pool;
5857 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
5858 ASSERT_VK_SUCCESS(err);
5859 VkCommandBufferAllocateInfo cbai = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr,
5860 pool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1
5861 };
5862 VkCommandBuffer cb;
5863 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
5864 ASSERT_VK_SUCCESS(err);
5865 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
5866 0, nullptr
5867 };
5868 err = vkBeginCommandBuffer(cb, &cbbi);
5869 ASSERT_VK_SUCCESS(err);
5870 err = vkEndCommandBuffer(cb);
5871 ASSERT_VK_SUCCESS(err);
5872
5873 // A semaphore
5874 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
5875 VkSemaphore s;
5876 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
5877 ASSERT_VK_SUCCESS(err);
5878
5879 // First submission, to q0
5880 VkSubmitInfo s0 = {
5881 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5882 0, nullptr, nullptr,
5883 1, &cb,
5884 1, &s
5885 };
5886
5887 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
5888 ASSERT_VK_SUCCESS(err);
5889
5890 // Second submission, to q1, waiting on s
5891 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
5892 VkSubmitInfo s1 = {
5893 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5894 1, &s, &waitmask,
5895 0, nullptr,
5896 0, nullptr
5897 };
5898
5899 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
5900 ASSERT_VK_SUCCESS(err);
5901
5902 // Wait for q0 idle
5903 err = vkQueueWaitIdle(q0);
5904 ASSERT_VK_SUCCESS(err);
5905
5906 // Command buffer should have been completed (it was on q0); reset the pool.
5907 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
5908
5909 m_errorMonitor->VerifyNotFound();
5910
5911 // Force device completely idle and clean up resources
5912 vkDeviceWaitIdle(m_device->device());
5913 vkDestroyCommandPool(m_device->device(), pool, nullptr);
5914 vkDestroySemaphore(m_device->device(), s, nullptr);
5915}
Chris Forbes0f8126b2016-06-20 17:48:22 +12005916
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005917// This is a positive test. No errors should be generated.
5918TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
5919
5920 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5921 "submitted on separate queues, the second having a fence, "
5922 "followed by a WaitForFences call.");
5923
Tony Barbour6514a6b2016-08-12 09:37:19 -06005924 ASSERT_NO_FATAL_FAILURE(InitState());
Dustin Graves48458142016-04-29 16:11:55 -06005925 if ((m_device->queue_props.empty()) ||
5926 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005927 return;
5928
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005929 m_errorMonitor->ExpectSuccess();
5930
Tony Barbour6514a6b2016-08-12 09:37:19 -06005931 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005932 VkFence fence;
5933 VkFenceCreateInfo fence_create_info{};
5934 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5935 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5936
5937 VkSemaphore semaphore;
5938 VkSemaphoreCreateInfo semaphore_create_info{};
5939 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5940 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5941 &semaphore);
5942
5943 VkCommandPool command_pool;
5944 VkCommandPoolCreateInfo pool_create_info{};
5945 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5946 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5947 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5948 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5949 &command_pool);
5950
5951 VkCommandBuffer command_buffer[2];
5952 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5953 command_buffer_allocate_info.sType =
5954 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5955 command_buffer_allocate_info.commandPool = command_pool;
5956 command_buffer_allocate_info.commandBufferCount = 2;
5957 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5958 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5959 command_buffer);
5960
5961 VkQueue queue = VK_NULL_HANDLE;
5962 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5963 1, &queue);
5964
5965
5966 {
5967 VkCommandBufferBeginInfo begin_info{};
5968 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5969 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5970
5971 vkCmdPipelineBarrier(command_buffer[0],
5972 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5973 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5974 0, nullptr, 0, nullptr);
5975
5976 VkViewport viewport{};
5977 viewport.maxDepth = 1.0f;
5978 viewport.minDepth = 0.0f;
5979 viewport.width = 512;
5980 viewport.height = 512;
5981 viewport.x = 0;
5982 viewport.y = 0;
5983 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5984 vkEndCommandBuffer(command_buffer[0]);
5985 }
5986 {
5987 VkCommandBufferBeginInfo begin_info{};
5988 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5989 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5990
5991 VkViewport viewport{};
5992 viewport.maxDepth = 1.0f;
5993 viewport.minDepth = 0.0f;
5994 viewport.width = 512;
5995 viewport.height = 512;
5996 viewport.x = 0;
5997 viewport.y = 0;
5998 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5999 vkEndCommandBuffer(command_buffer[1]);
6000 }
6001 {
6002 VkSubmitInfo submit_info{};
6003 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6004 submit_info.commandBufferCount = 1;
6005 submit_info.pCommandBuffers = &command_buffer[0];
6006 submit_info.signalSemaphoreCount = 1;
6007 submit_info.pSignalSemaphores = &semaphore;
6008 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
6009 }
6010 {
6011 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6012 VkSubmitInfo submit_info{};
6013 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6014 submit_info.commandBufferCount = 1;
6015 submit_info.pCommandBuffers = &command_buffer[1];
6016 submit_info.waitSemaphoreCount = 1;
6017 submit_info.pWaitSemaphores = &semaphore;
6018 submit_info.pWaitDstStageMask = flags;
6019 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
6020 }
6021
6022 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6023
6024 vkDestroyFence(m_device->device(), fence, nullptr);
6025 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
6026 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6027 &command_buffer[0]);
6028 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6029
6030 m_errorMonitor->VerifyNotFound();
6031}
6032
6033// This is a positive test. No errors should be generated.
6034TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
6035
6036 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
6037 "on the same queue, sharing a signal/wait semaphore, the "
6038 "second having a fence, "
6039 "followed by a WaitForFences call.");
6040
6041 m_errorMonitor->ExpectSuccess();
6042
Tony Barbour6514a6b2016-08-12 09:37:19 -06006043 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006044 VkFence fence;
6045 VkFenceCreateInfo fence_create_info{};
6046 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6047 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6048
6049 VkSemaphore semaphore;
6050 VkSemaphoreCreateInfo semaphore_create_info{};
6051 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
6052 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
6053 &semaphore);
6054
6055 VkCommandPool command_pool;
6056 VkCommandPoolCreateInfo pool_create_info{};
6057 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6058 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6059 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6060 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6061 &command_pool);
6062
6063 VkCommandBuffer command_buffer[2];
6064 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6065 command_buffer_allocate_info.sType =
6066 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6067 command_buffer_allocate_info.commandPool = command_pool;
6068 command_buffer_allocate_info.commandBufferCount = 2;
6069 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6070 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6071 command_buffer);
6072
6073 {
6074 VkCommandBufferBeginInfo begin_info{};
6075 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6076 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6077
6078 vkCmdPipelineBarrier(command_buffer[0],
6079 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6080 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6081 0, nullptr, 0, nullptr);
6082
6083 VkViewport viewport{};
6084 viewport.maxDepth = 1.0f;
6085 viewport.minDepth = 0.0f;
6086 viewport.width = 512;
6087 viewport.height = 512;
6088 viewport.x = 0;
6089 viewport.y = 0;
6090 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6091 vkEndCommandBuffer(command_buffer[0]);
6092 }
6093 {
6094 VkCommandBufferBeginInfo begin_info{};
6095 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6096 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6097
6098 VkViewport viewport{};
6099 viewport.maxDepth = 1.0f;
6100 viewport.minDepth = 0.0f;
6101 viewport.width = 512;
6102 viewport.height = 512;
6103 viewport.x = 0;
6104 viewport.y = 0;
6105 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6106 vkEndCommandBuffer(command_buffer[1]);
6107 }
6108 {
6109 VkSubmitInfo submit_info{};
6110 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6111 submit_info.commandBufferCount = 1;
6112 submit_info.pCommandBuffers = &command_buffer[0];
6113 submit_info.signalSemaphoreCount = 1;
6114 submit_info.pSignalSemaphores = &semaphore;
6115 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6116 }
6117 {
6118 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6119 VkSubmitInfo submit_info{};
6120 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6121 submit_info.commandBufferCount = 1;
6122 submit_info.pCommandBuffers = &command_buffer[1];
6123 submit_info.waitSemaphoreCount = 1;
6124 submit_info.pWaitSemaphores = &semaphore;
6125 submit_info.pWaitDstStageMask = flags;
6126 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
6127 }
6128
6129 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6130
6131 vkDestroyFence(m_device->device(), fence, nullptr);
6132 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
6133 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6134 &command_buffer[0]);
6135 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6136
6137 m_errorMonitor->VerifyNotFound();
6138}
6139
6140// This is a positive test. No errors should be generated.
6141TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
6142
6143 TEST_DESCRIPTION(
6144 "Two command buffers, each in a separate QueueSubmit call "
6145 "on the same queue, no fences, followed by a third QueueSubmit with NO "
6146 "SubmitInfos but with a fence, followed by a WaitForFences call.");
6147
6148 m_errorMonitor->ExpectSuccess();
6149
Tony Barbour6514a6b2016-08-12 09:37:19 -06006150 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006151 VkFence fence;
6152 VkFenceCreateInfo fence_create_info{};
6153 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6154 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6155
6156 VkCommandPool command_pool;
6157 VkCommandPoolCreateInfo pool_create_info{};
6158 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6159 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6160 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6161 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6162 &command_pool);
6163
6164 VkCommandBuffer command_buffer[2];
6165 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6166 command_buffer_allocate_info.sType =
6167 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6168 command_buffer_allocate_info.commandPool = command_pool;
6169 command_buffer_allocate_info.commandBufferCount = 2;
6170 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6171 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6172 command_buffer);
6173
6174 {
6175 VkCommandBufferBeginInfo begin_info{};
6176 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6177 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6178
6179 vkCmdPipelineBarrier(command_buffer[0],
6180 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6181 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6182 0, nullptr, 0, nullptr);
6183
6184 VkViewport viewport{};
6185 viewport.maxDepth = 1.0f;
6186 viewport.minDepth = 0.0f;
6187 viewport.width = 512;
6188 viewport.height = 512;
6189 viewport.x = 0;
6190 viewport.y = 0;
6191 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6192 vkEndCommandBuffer(command_buffer[0]);
6193 }
6194 {
6195 VkCommandBufferBeginInfo begin_info{};
6196 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6197 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6198
6199 VkViewport viewport{};
6200 viewport.maxDepth = 1.0f;
6201 viewport.minDepth = 0.0f;
6202 viewport.width = 512;
6203 viewport.height = 512;
6204 viewport.x = 0;
6205 viewport.y = 0;
6206 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6207 vkEndCommandBuffer(command_buffer[1]);
6208 }
6209 {
6210 VkSubmitInfo submit_info{};
6211 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6212 submit_info.commandBufferCount = 1;
6213 submit_info.pCommandBuffers = &command_buffer[0];
6214 submit_info.signalSemaphoreCount = 0;
6215 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
6216 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6217 }
6218 {
6219 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6220 VkSubmitInfo submit_info{};
6221 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6222 submit_info.commandBufferCount = 1;
6223 submit_info.pCommandBuffers = &command_buffer[1];
6224 submit_info.waitSemaphoreCount = 0;
6225 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
6226 submit_info.pWaitDstStageMask = flags;
6227 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6228 }
6229
6230 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
6231
Mike Stroyancd1c3e52016-06-21 09:20:01 -06006232 VkResult err =
6233 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6234 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006235
6236 vkDestroyFence(m_device->device(), fence, nullptr);
6237 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6238 &command_buffer[0]);
6239 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6240
6241 m_errorMonitor->VerifyNotFound();
6242}
6243
6244// This is a positive test. No errors should be generated.
6245TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
6246
6247 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
6248 "on the same queue, the second having a fence, followed "
6249 "by a WaitForFences call.");
6250
6251 m_errorMonitor->ExpectSuccess();
6252
Tony Barbour6514a6b2016-08-12 09:37:19 -06006253 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006254 VkFence fence;
6255 VkFenceCreateInfo fence_create_info{};
6256 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6257 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6258
6259 VkCommandPool command_pool;
6260 VkCommandPoolCreateInfo pool_create_info{};
6261 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6262 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6263 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6264 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6265 &command_pool);
6266
6267 VkCommandBuffer command_buffer[2];
6268 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6269 command_buffer_allocate_info.sType =
6270 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6271 command_buffer_allocate_info.commandPool = command_pool;
6272 command_buffer_allocate_info.commandBufferCount = 2;
6273 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6274 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6275 command_buffer);
6276
6277 {
6278 VkCommandBufferBeginInfo begin_info{};
6279 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6280 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6281
6282 vkCmdPipelineBarrier(command_buffer[0],
6283 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6284 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6285 0, nullptr, 0, nullptr);
6286
6287 VkViewport viewport{};
6288 viewport.maxDepth = 1.0f;
6289 viewport.minDepth = 0.0f;
6290 viewport.width = 512;
6291 viewport.height = 512;
6292 viewport.x = 0;
6293 viewport.y = 0;
6294 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6295 vkEndCommandBuffer(command_buffer[0]);
6296 }
6297 {
6298 VkCommandBufferBeginInfo begin_info{};
6299 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6300 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6301
6302 VkViewport viewport{};
6303 viewport.maxDepth = 1.0f;
6304 viewport.minDepth = 0.0f;
6305 viewport.width = 512;
6306 viewport.height = 512;
6307 viewport.x = 0;
6308 viewport.y = 0;
6309 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6310 vkEndCommandBuffer(command_buffer[1]);
6311 }
6312 {
6313 VkSubmitInfo submit_info{};
6314 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6315 submit_info.commandBufferCount = 1;
6316 submit_info.pCommandBuffers = &command_buffer[0];
6317 submit_info.signalSemaphoreCount = 0;
6318 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
6319 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6320 }
6321 {
6322 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6323 VkSubmitInfo submit_info{};
6324 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6325 submit_info.commandBufferCount = 1;
6326 submit_info.pCommandBuffers = &command_buffer[1];
6327 submit_info.waitSemaphoreCount = 0;
6328 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
6329 submit_info.pWaitDstStageMask = flags;
6330 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
6331 }
6332
6333 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6334
6335 vkDestroyFence(m_device->device(), fence, nullptr);
6336 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6337 &command_buffer[0]);
6338 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6339
6340 m_errorMonitor->VerifyNotFound();
6341}
6342
6343// This is a positive test. No errors should be generated.
6344TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
6345
6346 TEST_DESCRIPTION(
6347 "Two command buffers each in a separate SubmitInfo sent in a single "
6348 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour6514a6b2016-08-12 09:37:19 -06006349 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006350
6351 m_errorMonitor->ExpectSuccess();
6352
6353 VkFence fence;
6354 VkFenceCreateInfo fence_create_info{};
6355 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6356 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6357
6358 VkSemaphore semaphore;
6359 VkSemaphoreCreateInfo semaphore_create_info{};
6360 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
6361 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
6362 &semaphore);
6363
6364 VkCommandPool command_pool;
6365 VkCommandPoolCreateInfo pool_create_info{};
6366 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6367 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6368 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6369 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6370 &command_pool);
6371
6372 VkCommandBuffer command_buffer[2];
6373 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6374 command_buffer_allocate_info.sType =
6375 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6376 command_buffer_allocate_info.commandPool = command_pool;
6377 command_buffer_allocate_info.commandBufferCount = 2;
6378 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6379 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6380 command_buffer);
6381
6382 {
6383 VkCommandBufferBeginInfo begin_info{};
6384 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6385 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6386
6387 vkCmdPipelineBarrier(command_buffer[0],
6388 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6389 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6390 0, nullptr, 0, nullptr);
6391
6392 VkViewport viewport{};
6393 viewport.maxDepth = 1.0f;
6394 viewport.minDepth = 0.0f;
6395 viewport.width = 512;
6396 viewport.height = 512;
6397 viewport.x = 0;
6398 viewport.y = 0;
6399 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6400 vkEndCommandBuffer(command_buffer[0]);
6401 }
6402 {
6403 VkCommandBufferBeginInfo begin_info{};
6404 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6405 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6406
6407 VkViewport viewport{};
6408 viewport.maxDepth = 1.0f;
6409 viewport.minDepth = 0.0f;
6410 viewport.width = 512;
6411 viewport.height = 512;
6412 viewport.x = 0;
6413 viewport.y = 0;
6414 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6415 vkEndCommandBuffer(command_buffer[1]);
6416 }
6417 {
6418 VkSubmitInfo submit_info[2];
6419 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6420
6421 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6422 submit_info[0].pNext = NULL;
6423 submit_info[0].commandBufferCount = 1;
6424 submit_info[0].pCommandBuffers = &command_buffer[0];
6425 submit_info[0].signalSemaphoreCount = 1;
6426 submit_info[0].pSignalSemaphores = &semaphore;
6427 submit_info[0].waitSemaphoreCount = 0;
6428 submit_info[0].pWaitSemaphores = NULL;
6429 submit_info[0].pWaitDstStageMask = 0;
6430
6431 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6432 submit_info[1].pNext = NULL;
6433 submit_info[1].commandBufferCount = 1;
6434 submit_info[1].pCommandBuffers = &command_buffer[1];
6435 submit_info[1].waitSemaphoreCount = 1;
6436 submit_info[1].pWaitSemaphores = &semaphore;
6437 submit_info[1].pWaitDstStageMask = flags;
6438 submit_info[1].signalSemaphoreCount = 0;
6439 submit_info[1].pSignalSemaphores = NULL;
6440 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
6441 }
6442
6443 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6444
6445 vkDestroyFence(m_device->device(), fence, nullptr);
6446 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6447 &command_buffer[0]);
6448 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006449 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006450
6451 m_errorMonitor->VerifyNotFound();
6452}
6453
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006454TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006455 TEST_DESCRIPTION(
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006456 "Run a simple draw calls to validate failure when Depth Bias dynamic "
6457 "state is required but not correctly bound.");
6458
Tony Barbour6514a6b2016-08-12 09:37:19 -06006459 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006460 // Dynamic depth bias
6461 m_errorMonitor->SetDesiredFailureMsg(
6462 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6463 "Dynamic depth bias state not set for this command buffer");
6464 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6465 BsoFailDepthBias);
6466 m_errorMonitor->VerifyFound();
6467}
6468
6469TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
6470 TEST_DESCRIPTION(
6471 "Run a simple draw calls to validate failure when Line Width dynamic "
6472 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006473
Tony Barbour6514a6b2016-08-12 09:37:19 -06006474 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006475 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07006476 m_errorMonitor->SetDesiredFailureMsg(
6477 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006478 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006479 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6480 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006481 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006482}
6483
6484TEST_F(VkLayerTest, DynamicViewportNotBound) {
6485 TEST_DESCRIPTION(
6486 "Run a simple draw calls to validate failure when Viewport dynamic "
6487 "state is required but not correctly bound.");
6488
Tony Barbour6514a6b2016-08-12 09:37:19 -06006489 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006490 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07006491 m_errorMonitor->SetDesiredFailureMsg(
6492 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006493 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006494 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6495 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006496 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006497}
6498
6499TEST_F(VkLayerTest, DynamicScissorNotBound) {
6500 TEST_DESCRIPTION(
6501 "Run a simple draw calls to validate failure when Scissor dynamic "
6502 "state is required but not correctly bound.");
6503
Tony Barbour6514a6b2016-08-12 09:37:19 -06006504 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006505 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07006506 m_errorMonitor->SetDesiredFailureMsg(
6507 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006508 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006509 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6510 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006511 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006512}
6513
Cortd713fe82016-07-27 09:51:27 -07006514TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006515 TEST_DESCRIPTION(
Tobin Ehlis21c88352016-05-26 06:15:45 -06006516 "Run a simple draw calls to validate failure when Blend Constants "
6517 "dynamic state is required but not correctly bound.");
Tony Barbour6514a6b2016-08-12 09:37:19 -06006518
6519 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06006520 // Dynamic blend constant state
6521 m_errorMonitor->SetDesiredFailureMsg(
6522 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6523 "Dynamic blend constants state not set for this command buffer");
6524 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6525 BsoFailBlend);
6526 m_errorMonitor->VerifyFound();
6527}
6528
6529TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
6530 TEST_DESCRIPTION(
6531 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006532 "state is required but not correctly bound.");
Tony Barbour6514a6b2016-08-12 09:37:19 -06006533
6534 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06006535 if (!m_device->phy().features().depthBounds) {
6536 printf("Device does not support depthBounds test; skipped.\n");
6537 return;
6538 }
6539 // Dynamic depth bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006540 m_errorMonitor->SetDesiredFailureMsg(
6541 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006542 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006543 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6544 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006545 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006546}
6547
6548TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
6549 TEST_DESCRIPTION(
6550 "Run a simple draw calls to validate failure when Stencil Read dynamic "
6551 "state is required but not correctly bound.");
Tony Barbour6514a6b2016-08-12 09:37:19 -06006552
6553 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006554 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07006555 m_errorMonitor->SetDesiredFailureMsg(
6556 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006557 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006558 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6559 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006560 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006561}
6562
6563TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
6564 TEST_DESCRIPTION(
6565 "Run a simple draw calls to validate failure when Stencil Write dynamic"
6566 " state is required but not correctly bound.");
Tony Barbour6514a6b2016-08-12 09:37:19 -06006567
6568 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006569 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07006570 m_errorMonitor->SetDesiredFailureMsg(
6571 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006572 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006573 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6574 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006575 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006576}
6577
6578TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
6579 TEST_DESCRIPTION(
6580 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
6581 "state is required but not correctly bound.");
Tony Barbour6514a6b2016-08-12 09:37:19 -06006582
6583 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006584 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07006585 m_errorMonitor->SetDesiredFailureMsg(
6586 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006587 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006588 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6589 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006590 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06006591}
6592
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06006593TEST_F(VkLayerTest, IndexBufferNotBound) {
6594 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Tony Barbour6514a6b2016-08-12 09:37:19 -06006595
6596 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06006597 m_errorMonitor->SetDesiredFailureMsg(
6598 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6599 "Index buffer object not bound to this command buffer when Indexed ");
6600 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6601 BsoFailIndexBuffer);
6602 m_errorMonitor->VerifyFound();
6603}
6604
Karl Schultz6addd812016-02-02 17:17:23 -07006605TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Karl Schultz6addd812016-02-02 17:17:23 -07006606 m_errorMonitor->SetDesiredFailureMsg(
6607 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6608 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
6609 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006610
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006611 ASSERT_NO_FATAL_FAILURE(InitState());
6612 ASSERT_NO_FATAL_FAILURE(InitViewport());
6613 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6614
Karl Schultz6addd812016-02-02 17:17:23 -07006615 // We luck out b/c by default the framework creates CB w/ the
6616 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006617 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006618 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
6619 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006620 EndCommandBuffer();
6621
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006622 // Bypass framework since it does the waits automatically
6623 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006624 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08006625 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6626 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006627 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006628 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07006629 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006630 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006631 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08006632 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006633 submit_info.pSignalSemaphores = NULL;
6634
Chris Forbes40028e22016-06-13 09:59:34 +12006635 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07006636 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006637
Karl Schultz6addd812016-02-02 17:17:23 -07006638 // Cause validation error by re-submitting cmd buffer that should only be
6639 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12006640 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006641
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006642 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006643}
6644
Karl Schultz6addd812016-02-02 17:17:23 -07006645TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006646 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07006647 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006648
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006649 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006650 "Unable to allocate 1 descriptors of "
6651 "type "
6652 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006653
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006654 ASSERT_NO_FATAL_FAILURE(InitState());
6655 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006656
Karl Schultz6addd812016-02-02 17:17:23 -07006657 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
6658 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006659 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006660 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6661 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006662
6663 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006664 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6665 ds_pool_ci.pNext = NULL;
6666 ds_pool_ci.flags = 0;
6667 ds_pool_ci.maxSets = 1;
6668 ds_pool_ci.poolSizeCount = 1;
6669 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006670
6671 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006672 err =
6673 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006674 ASSERT_VK_SUCCESS(err);
6675
6676 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006677 dsl_binding.binding = 0;
6678 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6679 dsl_binding.descriptorCount = 1;
6680 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6681 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006682
6683 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006684 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6685 ds_layout_ci.pNext = NULL;
6686 ds_layout_ci.bindingCount = 1;
6687 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006688
6689 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006690 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6691 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006692 ASSERT_VK_SUCCESS(err);
6693
6694 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006695 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006696 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006697 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006698 alloc_info.descriptorPool = ds_pool;
6699 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006700 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6701 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006702
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006703 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006704
Chia-I Wuf7458c52015-10-26 21:10:41 +08006705 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6706 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006707}
6708
Karl Schultz6addd812016-02-02 17:17:23 -07006709TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
6710 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06006711
Karl Schultz6addd812016-02-02 17:17:23 -07006712 m_errorMonitor->SetDesiredFailureMsg(
6713 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6714 "It is invalid to call vkFreeDescriptorSets() with a pool created "
6715 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006716
Tobin Ehlise735c692015-10-08 13:13:50 -06006717 ASSERT_NO_FATAL_FAILURE(InitState());
6718 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06006719
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006720 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006721 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6722 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06006723
6724 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006725 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6726 ds_pool_ci.pNext = NULL;
6727 ds_pool_ci.maxSets = 1;
6728 ds_pool_ci.poolSizeCount = 1;
6729 ds_pool_ci.flags = 0;
6730 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
6731 // app can only call vkResetDescriptorPool on this pool.;
6732 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06006733
6734 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006735 err =
6736 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06006737 ASSERT_VK_SUCCESS(err);
6738
6739 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006740 dsl_binding.binding = 0;
6741 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6742 dsl_binding.descriptorCount = 1;
6743 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6744 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06006745
6746 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006747 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6748 ds_layout_ci.pNext = NULL;
6749 ds_layout_ci.bindingCount = 1;
6750 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06006751
6752 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006753 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6754 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06006755 ASSERT_VK_SUCCESS(err);
6756
6757 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006758 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006759 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006760 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006761 alloc_info.descriptorPool = ds_pool;
6762 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006763 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6764 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06006765 ASSERT_VK_SUCCESS(err);
6766
6767 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006768 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06006769
Chia-I Wuf7458c52015-10-26 21:10:41 +08006770 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6771 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06006772}
6773
Karl Schultz6addd812016-02-02 17:17:23 -07006774TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006775 // Attempt to clear Descriptor Pool with bad object.
6776 // ObjectTracker should catch this.
Tony Barbour6514a6b2016-08-12 09:37:19 -06006777
6778 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzbdb75952016-04-19 11:36:49 -06006779 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006780 "Invalid Descriptor Pool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006781 uint64_t fake_pool_handle = 0xbaad6001;
6782 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
6783 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06006784 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006785}
6786
Karl Schultz6addd812016-02-02 17:17:23 -07006787TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006788 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
6789 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006790 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06006791 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006792
6793 uint64_t fake_set_handle = 0xbaad6001;
6794 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006795 VkResult err;
6796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006797 "Invalid Descriptor Set Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06006798
6799 ASSERT_NO_FATAL_FAILURE(InitState());
6800
6801 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
6802 layout_bindings[0].binding = 0;
6803 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6804 layout_bindings[0].descriptorCount = 1;
6805 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
6806 layout_bindings[0].pImmutableSamplers = NULL;
6807
6808 VkDescriptorSetLayout descriptor_set_layout;
6809 VkDescriptorSetLayoutCreateInfo dslci = {};
6810 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6811 dslci.pNext = NULL;
6812 dslci.bindingCount = 1;
6813 dslci.pBindings = layout_bindings;
6814 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006815 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006816
6817 VkPipelineLayout pipeline_layout;
6818 VkPipelineLayoutCreateInfo plci = {};
6819 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6820 plci.pNext = NULL;
6821 plci.setLayoutCount = 1;
6822 plci.pSetLayouts = &descriptor_set_layout;
6823 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006824 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006825
6826 BeginCommandBuffer();
6827 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006828 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06006829 m_errorMonitor->VerifyFound();
6830 EndCommandBuffer();
6831 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
6832 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006833}
6834
Karl Schultz6addd812016-02-02 17:17:23 -07006835TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006836 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
6837 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006838 uint64_t fake_layout_handle = 0xbaad6001;
6839 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006841 "Invalid Descriptor Set Layout Object 0xbaad6001");
Tony Barbour6514a6b2016-08-12 09:37:19 -06006842 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzbdb75952016-04-19 11:36:49 -06006843 VkPipelineLayout pipeline_layout;
6844 VkPipelineLayoutCreateInfo plci = {};
6845 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6846 plci.pNext = NULL;
6847 plci.setLayoutCount = 1;
6848 plci.pSetLayouts = &bad_layout;
6849 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
6850
6851 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006852}
6853
Mark Muellerd4914412016-06-13 17:52:06 -06006854TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
6855 TEST_DESCRIPTION("This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
6856 "1) A uniform buffer update must have a valid buffer index."
6857 "2) When using an array of descriptors in a single WriteDescriptor,"
6858 " the descriptor types and stageflags must all be the same."
6859 "3) Immutable Sampler state must match across descriptors");
6860
6861 const char *invalid_BufferInfo_ErrorMessage =
6862 "vkUpdateDescriptorSets: if pDescriptorWrites[0].descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, "
6863 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or "
6864 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pDescriptorWrites[0].pBufferInfo must not be NULL";
6865 const char *stateFlag_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006866 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006867 const char *immutable_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006868 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006869
Mark Muellerd4914412016-06-13 17:52:06 -06006870 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_BufferInfo_ErrorMessage);
6871
6872 ASSERT_NO_FATAL_FAILURE(InitState());
6873 VkDescriptorPoolSize ds_type_count[4] = {};
6874 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6875 ds_type_count[0].descriptorCount = 1;
6876 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6877 ds_type_count[1].descriptorCount = 1;
6878 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6879 ds_type_count[2].descriptorCount = 1;
6880 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6881 ds_type_count[3].descriptorCount = 1;
6882
6883 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6884 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6885 ds_pool_ci.maxSets = 1;
6886 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
6887 ds_pool_ci.pPoolSizes = ds_type_count;
6888
6889 VkDescriptorPool ds_pool;
6890 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6891 ASSERT_VK_SUCCESS(err);
6892
Mark Muellerb9896722016-06-16 09:54:29 -06006893 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006894 layout_binding[0].binding = 0;
6895 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6896 layout_binding[0].descriptorCount = 1;
6897 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6898 layout_binding[0].pImmutableSamplers = NULL;
6899
6900 layout_binding[1].binding = 1;
6901 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6902 layout_binding[1].descriptorCount = 1;
6903 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6904 layout_binding[1].pImmutableSamplers = NULL;
6905
6906 VkSamplerCreateInfo sampler_ci = {};
6907 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6908 sampler_ci.pNext = NULL;
6909 sampler_ci.magFilter = VK_FILTER_NEAREST;
6910 sampler_ci.minFilter = VK_FILTER_NEAREST;
6911 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6912 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6913 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6914 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6915 sampler_ci.mipLodBias = 1.0;
6916 sampler_ci.anisotropyEnable = VK_FALSE;
6917 sampler_ci.maxAnisotropy = 1;
6918 sampler_ci.compareEnable = VK_FALSE;
6919 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6920 sampler_ci.minLod = 1.0;
6921 sampler_ci.maxLod = 1.0;
6922 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6923 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6924 VkSampler sampler;
6925
6926 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6927 ASSERT_VK_SUCCESS(err);
6928
6929 layout_binding[2].binding = 2;
6930 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6931 layout_binding[2].descriptorCount = 1;
6932 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6933 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
6934
Mark Muellerd4914412016-06-13 17:52:06 -06006935 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6936 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6937 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
6938 ds_layout_ci.pBindings = layout_binding;
6939 VkDescriptorSetLayout ds_layout;
6940 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6941 ASSERT_VK_SUCCESS(err);
6942
6943 VkDescriptorSetAllocateInfo alloc_info = {};
6944 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6945 alloc_info.descriptorSetCount = 1;
6946 alloc_info.descriptorPool = ds_pool;
6947 alloc_info.pSetLayouts = &ds_layout;
6948 VkDescriptorSet descriptorSet;
6949 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6950 ASSERT_VK_SUCCESS(err);
6951
6952 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6953 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6954 pipeline_layout_ci.pNext = NULL;
6955 pipeline_layout_ci.setLayoutCount = 1;
6956 pipeline_layout_ci.pSetLayouts = &ds_layout;
6957
6958 VkPipelineLayout pipeline_layout;
6959 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6960 ASSERT_VK_SUCCESS(err);
6961
Mark Mueller5c838ce2016-06-16 09:54:29 -06006962 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006963 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6964 descriptor_write.dstSet = descriptorSet;
6965 descriptor_write.dstBinding = 0;
6966 descriptor_write.descriptorCount = 1;
6967 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6968
Mark Mueller5c838ce2016-06-16 09:54:29 -06006969 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06006970 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6971 m_errorMonitor->VerifyFound();
6972
6973 // Create a buffer to update the descriptor with
6974 uint32_t qfi = 0;
6975 VkBufferCreateInfo buffCI = {};
6976 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6977 buffCI.size = 1024;
6978 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6979 buffCI.queueFamilyIndexCount = 1;
6980 buffCI.pQueueFamilyIndices = &qfi;
6981
6982 VkBuffer dyub;
6983 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6984 ASSERT_VK_SUCCESS(err);
6985 VkDescriptorBufferInfo buffInfo = {};
6986 buffInfo.buffer = dyub;
6987 buffInfo.offset = 0;
6988 buffInfo.range = 1024;
6989
6990 descriptor_write.pBufferInfo = &buffInfo;
6991 descriptor_write.descriptorCount = 2;
6992
Mark Mueller5c838ce2016-06-16 09:54:29 -06006993 // 2) The stateFlags don't match between the first and second descriptor
Mark Muellerd4914412016-06-13 17:52:06 -06006994 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, stateFlag_ErrorMessage);
6995 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6996 m_errorMonitor->VerifyFound();
6997
Mark Mueller5c838ce2016-06-16 09:54:29 -06006998 // 3) The second descriptor has a null_ptr pImmutableSamplers and
6999 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06007000 descriptor_write.dstBinding = 1;
7001 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06007002
7003
7004 // Make pImageInfo index non-null to avoid complaints of it missing
7005 VkDescriptorImageInfo imageInfo = {};
7006 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
7007 descriptor_write.pImageInfo = &imageInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06007008 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, immutable_ErrorMessage);
7009 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7010 m_errorMonitor->VerifyFound();
7011
Mark Muellerd4914412016-06-13 17:52:06 -06007012 vkDestroyBuffer(m_device->device(), dyub, NULL);
7013 vkDestroySampler(m_device->device(), sampler, NULL);
7014 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7015 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7016 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7017}
7018
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06007019TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
7020 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7021 "due to a buffer dependency being destroyed.");
7022 ASSERT_NO_FATAL_FAILURE(InitState());
7023
7024 VkImageObj image(m_device);
7025 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
7026 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
7027 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
7028 VK_IMAGE_TILING_OPTIMAL, 0);
7029 ASSERT_TRUE(image.initialized());
7030
7031 VkBuffer buffer;
7032 VkDeviceMemory mem;
7033 VkMemoryRequirements mem_reqs;
7034
7035 VkBufferCreateInfo buf_info = {};
7036 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7037 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7038 buf_info.size = 256;
7039 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7040 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
7041 ASSERT_VK_SUCCESS(err);
7042
7043 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
7044
7045 VkMemoryAllocateInfo alloc_info = {};
7046 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7047 alloc_info.allocationSize = 256;
7048 bool pass = false;
7049 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
7050 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
7051 if (!pass) {
7052 vkDestroyBuffer(m_device->device(), buffer, NULL);
7053 return;
7054 }
7055 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
7056 ASSERT_VK_SUCCESS(err);
7057
7058 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
7059 ASSERT_VK_SUCCESS(err);
7060
7061 VkBufferImageCopy region = {};
7062 region.bufferRowLength = 128;
7063 region.bufferImageHeight = 128;
7064 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7065
7066 region.imageSubresource.layerCount = 1;
7067 region.imageExtent.height = 4;
7068 region.imageExtent.width = 4;
7069 region.imageExtent.depth = 1;
7070 m_commandBuffer->BeginCommandBuffer();
7071 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
7072 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
7073 1, &region);
7074 m_commandBuffer->EndCommandBuffer();
7075
7076 m_errorMonitor->SetDesiredFailureMsg(
7077 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7078 " that is invalid because bound buffer ");
7079 // Destroy buffer dependency prior to submit to cause ERROR
7080 vkDestroyBuffer(m_device->device(), buffer, NULL);
7081
7082 VkSubmitInfo submit_info = {};
7083 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7084 submit_info.commandBufferCount = 1;
7085 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7086 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7087
7088 m_errorMonitor->VerifyFound();
7089 vkFreeMemory(m_device->handle(), mem, NULL);
7090}
7091
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007092TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
7093 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7094 "due to an image dependency being destroyed.");
7095 ASSERT_NO_FATAL_FAILURE(InitState());
7096
7097 VkImage image;
7098 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7099 VkImageCreateInfo image_create_info = {};
7100 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7101 image_create_info.pNext = NULL;
7102 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7103 image_create_info.format = tex_format;
7104 image_create_info.extent.width = 32;
7105 image_create_info.extent.height = 32;
7106 image_create_info.extent.depth = 1;
7107 image_create_info.mipLevels = 1;
7108 image_create_info.arrayLayers = 1;
7109 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7110 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7111 image_create_info.usage =
7112 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7113 image_create_info.flags = 0;
7114 VkResult err =
7115 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7116 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007117 // Have to bind memory to image before recording cmd in cmd buffer using it
7118 VkMemoryRequirements mem_reqs;
7119 VkDeviceMemory image_mem;
7120 bool pass;
7121 VkMemoryAllocateInfo mem_alloc = {};
7122 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7123 mem_alloc.pNext = NULL;
7124 mem_alloc.memoryTypeIndex = 0;
7125 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
7126 mem_alloc.allocationSize = mem_reqs.size;
7127 pass =
7128 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
7129 ASSERT_TRUE(pass);
7130 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
7131 ASSERT_VK_SUCCESS(err);
7132 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
7133 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007134
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007135 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06007136 VkClearColorValue ccv;
7137 ccv.float32[0] = 1.0f;
7138 ccv.float32[1] = 1.0f;
7139 ccv.float32[2] = 1.0f;
7140 ccv.float32[3] = 1.0f;
7141 VkImageSubresourceRange isr = {};
7142 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007143 isr.baseArrayLayer = 0;
7144 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06007145 isr.layerCount = 1;
7146 isr.levelCount = 1;
7147 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
7148 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007149 m_commandBuffer->EndCommandBuffer();
7150
7151 m_errorMonitor->SetDesiredFailureMsg(
7152 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
7153 // Destroy image dependency prior to submit to cause ERROR
7154 vkDestroyImage(m_device->device(), image, NULL);
7155
7156 VkSubmitInfo submit_info = {};
7157 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7158 submit_info.commandBufferCount = 1;
7159 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7160 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7161
7162 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007163 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007164}
7165
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007166TEST_F(VkLayerTest, ImageMemoryNotBound) {
7167 TEST_DESCRIPTION(
7168 "Attempt to draw with an image which has not had memory bound to it.");
7169 ASSERT_NO_FATAL_FAILURE(InitState());
7170
7171 VkImage image;
7172 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7173 VkImageCreateInfo image_create_info = {};
7174 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7175 image_create_info.pNext = NULL;
7176 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7177 image_create_info.format = tex_format;
7178 image_create_info.extent.width = 32;
7179 image_create_info.extent.height = 32;
7180 image_create_info.extent.depth = 1;
7181 image_create_info.mipLevels = 1;
7182 image_create_info.arrayLayers = 1;
7183 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7184 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7185 image_create_info.usage =
7186 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7187 image_create_info.flags = 0;
7188 VkResult err =
7189 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7190 ASSERT_VK_SUCCESS(err);
7191 // Have to bind memory to image before recording cmd in cmd buffer using it
7192 VkMemoryRequirements mem_reqs;
7193 VkDeviceMemory image_mem;
7194 bool pass;
7195 VkMemoryAllocateInfo mem_alloc = {};
7196 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7197 mem_alloc.pNext = NULL;
7198 mem_alloc.memoryTypeIndex = 0;
7199 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
7200 mem_alloc.allocationSize = mem_reqs.size;
7201 pass =
7202 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
7203 ASSERT_TRUE(pass);
7204 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
7205 ASSERT_VK_SUCCESS(err);
7206
7207 // Introduce error, do not call vkBindImageMemory(m_device->device(), image,
7208 // image_mem, 0);
7209 m_errorMonitor->SetDesiredFailureMsg(
7210 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7211 "used without first calling vkBindImageMemory");
7212
7213 m_commandBuffer->BeginCommandBuffer();
7214 VkClearColorValue ccv;
7215 ccv.float32[0] = 1.0f;
7216 ccv.float32[1] = 1.0f;
7217 ccv.float32[2] = 1.0f;
7218 ccv.float32[3] = 1.0f;
7219 VkImageSubresourceRange isr = {};
7220 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7221 isr.baseArrayLayer = 0;
7222 isr.baseMipLevel = 0;
7223 isr.layerCount = 1;
7224 isr.levelCount = 1;
7225 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
7226 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
7227 m_commandBuffer->EndCommandBuffer();
7228
7229 m_errorMonitor->VerifyFound();
7230 vkDestroyImage(m_device->device(), image, NULL);
7231 vkFreeMemory(m_device->device(), image_mem, nullptr);
7232}
7233
7234TEST_F(VkLayerTest, BufferMemoryNotBound) {
7235 TEST_DESCRIPTION(
7236 "Attempt to copy from a buffer which has not had memory bound to it.");
7237 ASSERT_NO_FATAL_FAILURE(InitState());
7238
7239 VkImageObj image(m_device);
7240 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
7241 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
7242 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
7243 VK_IMAGE_TILING_OPTIMAL, 0);
7244 ASSERT_TRUE(image.initialized());
7245
7246 VkBuffer buffer;
7247 VkDeviceMemory mem;
7248 VkMemoryRequirements mem_reqs;
7249
7250 VkBufferCreateInfo buf_info = {};
7251 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7252 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7253 buf_info.size = 256;
7254 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7255 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
7256 ASSERT_VK_SUCCESS(err);
7257
7258 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
7259
7260 VkMemoryAllocateInfo alloc_info = {};
7261 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7262 alloc_info.allocationSize = 256;
7263 bool pass = false;
7264 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
7265 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
7266 if (!pass) {
7267 vkDestroyBuffer(m_device->device(), buffer, NULL);
7268 return;
7269 }
7270 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
7271 ASSERT_VK_SUCCESS(err);
7272
7273 // Introduce failure by not calling vkBindBufferMemory(m_device->device(),
7274 // buffer, mem, 0);
7275 m_errorMonitor->SetDesiredFailureMsg(
7276 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7277 "used without first calling vkBindBufferMemory");
7278 VkBufferImageCopy region = {};
7279 region.bufferRowLength = 128;
7280 region.bufferImageHeight = 128;
7281 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7282
7283 region.imageSubresource.layerCount = 1;
7284 region.imageExtent.height = 4;
7285 region.imageExtent.width = 4;
7286 region.imageExtent.depth = 1;
7287 m_commandBuffer->BeginCommandBuffer();
7288 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
7289 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
7290 1, &region);
7291 m_commandBuffer->EndCommandBuffer();
7292
7293 m_errorMonitor->VerifyFound();
7294
7295 vkDestroyBuffer(m_device->device(), buffer, NULL);
7296 vkFreeMemory(m_device->handle(), mem, NULL);
7297}
7298
Tobin Ehlis85940f52016-07-07 16:57:21 -06007299TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
7300 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7301 "due to an event dependency being destroyed.");
7302 ASSERT_NO_FATAL_FAILURE(InitState());
7303
7304 VkEvent event;
7305 VkEventCreateInfo evci = {};
7306 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
7307 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
7308 ASSERT_VK_SUCCESS(result);
7309
7310 m_commandBuffer->BeginCommandBuffer();
7311 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event,
7312 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
7313 m_commandBuffer->EndCommandBuffer();
7314
7315 m_errorMonitor->SetDesiredFailureMsg(
7316 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
7317 // Destroy event dependency prior to submit to cause ERROR
7318 vkDestroyEvent(m_device->device(), event, NULL);
7319
7320 VkSubmitInfo submit_info = {};
7321 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7322 submit_info.commandBufferCount = 1;
7323 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7324 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7325
7326 m_errorMonitor->VerifyFound();
7327}
7328
Tobin Ehlisdbea7552016-07-08 14:33:31 -06007329TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
7330 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7331 "due to a query pool dependency being destroyed.");
7332 ASSERT_NO_FATAL_FAILURE(InitState());
7333
7334 VkQueryPool query_pool;
7335 VkQueryPoolCreateInfo qpci{};
7336 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
7337 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
7338 qpci.queryCount = 1;
7339 VkResult result =
7340 vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
7341 ASSERT_VK_SUCCESS(result);
7342
7343 m_commandBuffer->BeginCommandBuffer();
7344 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
7345 m_commandBuffer->EndCommandBuffer();
7346
7347 m_errorMonitor->SetDesiredFailureMsg(
7348 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7349 " that is invalid because bound query pool ");
7350 // Destroy query pool dependency prior to submit to cause ERROR
7351 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
7352
7353 VkSubmitInfo submit_info = {};
7354 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7355 submit_info.commandBufferCount = 1;
7356 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7357 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7358
7359 m_errorMonitor->VerifyFound();
7360}
7361
Tobin Ehlis24130d92016-07-08 15:50:53 -06007362TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
7363 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7364 "due to a pipeline dependency being destroyed.");
7365 ASSERT_NO_FATAL_FAILURE(InitState());
7366 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7367
7368 VkResult err;
7369
7370 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7371 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7372
7373 VkPipelineLayout pipeline_layout;
7374 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7375 &pipeline_layout);
7376 ASSERT_VK_SUCCESS(err);
7377
7378 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7379 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7380 vp_state_ci.viewportCount = 1;
7381 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06007382 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06007383 vp_state_ci.scissorCount = 1;
7384 VkRect2D scissors = {}; // Dummy scissors to point to
7385 vp_state_ci.pScissors = &scissors;
7386 // No dynamic state
7387 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
7388 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7389
7390 VkPipelineShaderStageCreateInfo shaderStages[2];
7391 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7392
7393 VkShaderObj vs(m_device, bindStateVertShaderText,
7394 VK_SHADER_STAGE_VERTEX_BIT, this);
7395 VkShaderObj fs(m_device, bindStateFragShaderText,
7396 VK_SHADER_STAGE_FRAGMENT_BIT,
7397 this); // We shouldn't need a fragment shader
7398 // but add it to be able to run on more devices
7399 shaderStages[0] = vs.GetStageCreateInfo();
7400 shaderStages[1] = fs.GetStageCreateInfo();
7401
7402 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7403 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7404
7405 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7406 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7407 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7408
7409 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7410 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7411
7412 VkPipelineColorBlendAttachmentState att = {};
7413 att.blendEnable = VK_FALSE;
7414 att.colorWriteMask = 0xf;
7415
7416 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7417 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7418 cb_ci.attachmentCount = 1;
7419 cb_ci.pAttachments = &att;
7420
7421 VkGraphicsPipelineCreateInfo gp_ci = {};
7422 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7423 gp_ci.stageCount = 2;
7424 gp_ci.pStages = shaderStages;
7425 gp_ci.pVertexInputState = &vi_ci;
7426 gp_ci.pInputAssemblyState = &ia_ci;
7427 gp_ci.pViewportState = &vp_state_ci;
7428 gp_ci.pRasterizationState = &rs_ci;
7429 gp_ci.pColorBlendState = &cb_ci;
7430 gp_ci.pDynamicState = &dyn_state_ci;
7431 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7432 gp_ci.layout = pipeline_layout;
7433 gp_ci.renderPass = renderPass();
7434
7435 VkPipelineCacheCreateInfo pc_ci = {};
7436 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7437
7438 VkPipeline pipeline;
7439 VkPipelineCache pipelineCache;
7440 err =
7441 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
7442 ASSERT_VK_SUCCESS(err);
7443
7444 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7445 &gp_ci, NULL, &pipeline);
7446 ASSERT_VK_SUCCESS(err);
7447
7448 m_commandBuffer->BeginCommandBuffer();
7449 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7450 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
7451 m_commandBuffer->EndCommandBuffer();
7452 // Now destroy pipeline in order to cause error when submitting
7453 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
7454
7455 m_errorMonitor->SetDesiredFailureMsg(
7456 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7457 " that is invalid because bound pipeline ");
7458
7459 VkSubmitInfo submit_info = {};
7460 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7461 submit_info.commandBufferCount = 1;
7462 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7463 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7464
7465 m_errorMonitor->VerifyFound();
7466 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7467 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7468}
7469
Karl Schultz6addd812016-02-02 17:17:23 -07007470TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06007471 // Attempt to bind an invalid Pipeline to a valid Command Buffer
7472 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007473 // Create a valid cmd buffer
7474 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06007475 uint64_t fake_pipeline_handle = 0xbaad6001;
7476 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06007477 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06007478 "Invalid Pipeline Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06007479 ASSERT_NO_FATAL_FAILURE(InitState());
7480 BeginCommandBuffer();
7481 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7482 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
7483 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06007484 // Now issue a draw call with no pipeline bound
7485 m_errorMonitor->SetDesiredFailureMsg(
7486 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7487 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tony Barbourdf4c0042016-06-01 15:55:43 -06007488
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06007489 BeginCommandBuffer();
7490 Draw(1, 0, 0, 0);
7491 m_errorMonitor->VerifyFound();
7492 // Finally same check once more but with Dispatch/Compute
7493 m_errorMonitor->SetDesiredFailureMsg(
7494 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7495 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06007496 BeginCommandBuffer();
7497 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
7498 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007499}
7500
Karl Schultz6addd812016-02-02 17:17:23 -07007501TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
7502 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
7503 // CommandBuffer
7504 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007505
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007506 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007507 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007508
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007509 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06007510 ASSERT_NO_FATAL_FAILURE(InitViewport());
7511 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007512 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007513 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7514 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007515
7516 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007517 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7518 ds_pool_ci.pNext = NULL;
7519 ds_pool_ci.maxSets = 1;
7520 ds_pool_ci.poolSizeCount = 1;
7521 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06007522
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007523 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007524 err =
7525 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007526 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007527
Tony Barboureb254902015-07-15 12:50:33 -06007528 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007529 dsl_binding.binding = 0;
7530 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7531 dsl_binding.descriptorCount = 1;
7532 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7533 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007534
Tony Barboureb254902015-07-15 12:50:33 -06007535 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007536 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7537 ds_layout_ci.pNext = NULL;
7538 ds_layout_ci.bindingCount = 1;
7539 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007540 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007541 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7542 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007543 ASSERT_VK_SUCCESS(err);
7544
7545 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007546 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007547 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007548 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007549 alloc_info.descriptorPool = ds_pool;
7550 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007551 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7552 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007553 ASSERT_VK_SUCCESS(err);
7554
Tony Barboureb254902015-07-15 12:50:33 -06007555 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007556 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7557 pipeline_layout_ci.pNext = NULL;
7558 pipeline_layout_ci.setLayoutCount = 1;
7559 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007560
7561 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007562 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7563 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007564 ASSERT_VK_SUCCESS(err);
7565
Karl Schultz6addd812016-02-02 17:17:23 -07007566 VkShaderObj vs(m_device, bindStateVertShaderText,
7567 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06007568 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07007569 // on more devices
7570 VkShaderObj fs(m_device, bindStateFragShaderText,
7571 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007572
Tony Barbourc95e4ac2015-08-04 17:05:26 -06007573 VkPipelineObj pipe(m_device);
7574 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007575 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06007576 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06007577 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06007578
7579 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007580 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7581 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7582 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7583 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7584 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007585
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007586 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007587
Chia-I Wuf7458c52015-10-26 21:10:41 +08007588 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7589 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7590 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007591}
7592
Karl Schultz6addd812016-02-02 17:17:23 -07007593TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007594 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07007595 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007596
Karl Schultz6addd812016-02-02 17:17:23 -07007597 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007598 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
7599 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007600
7601 ASSERT_NO_FATAL_FAILURE(InitState());
7602 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007603 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7604 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007605
7606 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007607 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7608 ds_pool_ci.pNext = NULL;
7609 ds_pool_ci.maxSets = 1;
7610 ds_pool_ci.poolSizeCount = 1;
7611 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007612
7613 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007614 err =
7615 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007616 ASSERT_VK_SUCCESS(err);
7617
7618 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007619 dsl_binding.binding = 0;
7620 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7621 dsl_binding.descriptorCount = 1;
7622 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7623 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007624
7625 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007626 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7627 ds_layout_ci.pNext = NULL;
7628 ds_layout_ci.bindingCount = 1;
7629 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007630 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007631 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7632 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007633 ASSERT_VK_SUCCESS(err);
7634
7635 VkDescriptorSet descriptorSet;
7636 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007637 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007638 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007639 alloc_info.descriptorPool = ds_pool;
7640 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007641 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7642 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007643 ASSERT_VK_SUCCESS(err);
7644
Karl Schultz6addd812016-02-02 17:17:23 -07007645 VkBufferView view =
7646 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007647 VkWriteDescriptorSet descriptor_write;
7648 memset(&descriptor_write, 0, sizeof(descriptor_write));
7649 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7650 descriptor_write.dstSet = descriptorSet;
7651 descriptor_write.dstBinding = 0;
7652 descriptor_write.descriptorCount = 1;
7653 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7654 descriptor_write.pTexelBufferView = &view;
7655
7656 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7657
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007658 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007659
7660 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7661 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7662}
7663
Mark Youngd339ba32016-05-30 13:28:35 -06007664TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
7665 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has"
7666 " no memory bound to it.");
7667
7668 VkResult err;
7669 m_errorMonitor->SetDesiredFailureMsg(
7670 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -06007671 "used without first calling vkBindBufferMemory");
Mark Youngd339ba32016-05-30 13:28:35 -06007672
7673 ASSERT_NO_FATAL_FAILURE(InitState());
7674
7675 // Create a buffer with no bound memory and then attempt to create
7676 // a buffer view.
7677 VkBufferCreateInfo buff_ci = {};
7678 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7679 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7680 buff_ci.size = 256;
7681 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7682 VkBuffer buffer;
7683 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
7684 ASSERT_VK_SUCCESS(err);
7685
7686 VkBufferViewCreateInfo buff_view_ci = {};
7687 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
7688 buff_view_ci.buffer = buffer;
7689 buff_view_ci.format = VK_FORMAT_R8_UNORM;
7690 buff_view_ci.range = VK_WHOLE_SIZE;
7691 VkBufferView buff_view;
7692 err =
7693 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
7694
7695 m_errorMonitor->VerifyFound();
7696 vkDestroyBuffer(m_device->device(), buffer, NULL);
7697 // If last error is success, it still created the view, so delete it.
7698 if (err == VK_SUCCESS) {
7699 vkDestroyBufferView(m_device->device(), buff_view, NULL);
7700 }
7701}
7702
Karl Schultz6addd812016-02-02 17:17:23 -07007703TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
7704 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
7705 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07007706 // 1. No dynamicOffset supplied
7707 // 2. Too many dynamicOffsets supplied
7708 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07007709 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007711 " requires 1 dynamicOffsets, but only "
7712 "0 dynamicOffsets are left in "
7713 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007714
7715 ASSERT_NO_FATAL_FAILURE(InitState());
7716 ASSERT_NO_FATAL_FAILURE(InitViewport());
7717 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7718
7719 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007720 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7721 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007722
7723 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007724 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7725 ds_pool_ci.pNext = NULL;
7726 ds_pool_ci.maxSets = 1;
7727 ds_pool_ci.poolSizeCount = 1;
7728 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007729
7730 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007731 err =
7732 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007733 ASSERT_VK_SUCCESS(err);
7734
7735 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007736 dsl_binding.binding = 0;
7737 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7738 dsl_binding.descriptorCount = 1;
7739 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7740 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007741
7742 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007743 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7744 ds_layout_ci.pNext = NULL;
7745 ds_layout_ci.bindingCount = 1;
7746 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007747 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007748 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7749 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007750 ASSERT_VK_SUCCESS(err);
7751
7752 VkDescriptorSet descriptorSet;
7753 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007754 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007755 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007756 alloc_info.descriptorPool = ds_pool;
7757 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007758 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7759 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007760 ASSERT_VK_SUCCESS(err);
7761
7762 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007763 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7764 pipeline_layout_ci.pNext = NULL;
7765 pipeline_layout_ci.setLayoutCount = 1;
7766 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007767
7768 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007769 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7770 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007771 ASSERT_VK_SUCCESS(err);
7772
7773 // Create a buffer to update the descriptor with
7774 uint32_t qfi = 0;
7775 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007776 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7777 buffCI.size = 1024;
7778 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7779 buffCI.queueFamilyIndexCount = 1;
7780 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007781
7782 VkBuffer dyub;
7783 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7784 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007785 // Allocate memory and bind to buffer so we can make it to the appropriate
7786 // error
7787 VkMemoryAllocateInfo mem_alloc = {};
7788 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7789 mem_alloc.pNext = NULL;
7790 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12007791 mem_alloc.memoryTypeIndex = 0;
7792
7793 VkMemoryRequirements memReqs;
7794 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
7795 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
7796 0);
7797 if (!pass) {
7798 vkDestroyBuffer(m_device->device(), dyub, NULL);
7799 return;
7800 }
7801
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007802 VkDeviceMemory mem;
7803 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
7804 ASSERT_VK_SUCCESS(err);
7805 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
7806 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007807 // Correctly update descriptor to avoid "NOT_UPDATED" error
7808 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007809 buffInfo.buffer = dyub;
7810 buffInfo.offset = 0;
7811 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007812
7813 VkWriteDescriptorSet descriptor_write;
7814 memset(&descriptor_write, 0, sizeof(descriptor_write));
7815 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7816 descriptor_write.dstSet = descriptorSet;
7817 descriptor_write.dstBinding = 0;
7818 descriptor_write.descriptorCount = 1;
7819 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7820 descriptor_write.pBufferInfo = &buffInfo;
7821
7822 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7823
7824 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007825 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7826 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7827 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007828 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007829 uint32_t pDynOff[2] = {512, 756};
7830 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07007831 m_errorMonitor->SetDesiredFailureMsg(
7832 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07007833 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07007834 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7835 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7836 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12007837 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007838 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7840 " dynamic offset 512 combined with "
7841 "offset 0 and range 1024 that "
7842 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07007843 // Create PSO to be used for draw-time errors below
7844 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007845 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007846 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007847 "out gl_PerVertex { \n"
7848 " vec4 gl_Position;\n"
7849 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007850 "void main(){\n"
7851 " gl_Position = vec4(1);\n"
7852 "}\n";
7853 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007854 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007855 "\n"
7856 "layout(location=0) out vec4 x;\n"
7857 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7858 "void main(){\n"
7859 " x = vec4(bar.y);\n"
7860 "}\n";
7861 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7862 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7863 VkPipelineObj pipe(m_device);
7864 pipe.AddShader(&vs);
7865 pipe.AddShader(&fs);
7866 pipe.AddColorAttachment();
7867 pipe.CreateVKPipeline(pipeline_layout, renderPass());
7868
Karl Schultz6addd812016-02-02 17:17:23 -07007869 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7870 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7871 // This update should succeed, but offset size of 512 will overstep buffer
7872 // /w range 1024 & size 1024
7873 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7874 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7875 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07007876 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007877 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007878
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007879 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06007880 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007881
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007882 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007883 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007884 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7885}
7886
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007887TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
7888 TEST_DESCRIPTION("Attempt to update a descriptor with a non-sparse buffer "
7889 "that doesn't have memory bound");
7890 VkResult err;
7891 m_errorMonitor->SetDesiredFailureMsg(
7892 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7893 " used without first calling vkBindBufferMemory.");
7894
7895 ASSERT_NO_FATAL_FAILURE(InitState());
7896 ASSERT_NO_FATAL_FAILURE(InitViewport());
7897 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7898
7899 VkDescriptorPoolSize ds_type_count = {};
7900 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7901 ds_type_count.descriptorCount = 1;
7902
7903 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7904 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7905 ds_pool_ci.pNext = NULL;
7906 ds_pool_ci.maxSets = 1;
7907 ds_pool_ci.poolSizeCount = 1;
7908 ds_pool_ci.pPoolSizes = &ds_type_count;
7909
7910 VkDescriptorPool ds_pool;
7911 err =
7912 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
7913 ASSERT_VK_SUCCESS(err);
7914
7915 VkDescriptorSetLayoutBinding dsl_binding = {};
7916 dsl_binding.binding = 0;
7917 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7918 dsl_binding.descriptorCount = 1;
7919 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7920 dsl_binding.pImmutableSamplers = NULL;
7921
7922 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7923 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7924 ds_layout_ci.pNext = NULL;
7925 ds_layout_ci.bindingCount = 1;
7926 ds_layout_ci.pBindings = &dsl_binding;
7927 VkDescriptorSetLayout ds_layout;
7928 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7929 &ds_layout);
7930 ASSERT_VK_SUCCESS(err);
7931
7932 VkDescriptorSet descriptorSet;
7933 VkDescriptorSetAllocateInfo alloc_info = {};
7934 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7935 alloc_info.descriptorSetCount = 1;
7936 alloc_info.descriptorPool = ds_pool;
7937 alloc_info.pSetLayouts = &ds_layout;
7938 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7939 &descriptorSet);
7940 ASSERT_VK_SUCCESS(err);
7941
7942 // Create a buffer to update the descriptor with
7943 uint32_t qfi = 0;
7944 VkBufferCreateInfo buffCI = {};
7945 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7946 buffCI.size = 1024;
7947 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7948 buffCI.queueFamilyIndexCount = 1;
7949 buffCI.pQueueFamilyIndices = &qfi;
7950
7951 VkBuffer dyub;
7952 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7953 ASSERT_VK_SUCCESS(err);
7954
7955 // Attempt to update descriptor without binding memory to it
7956 VkDescriptorBufferInfo buffInfo = {};
7957 buffInfo.buffer = dyub;
7958 buffInfo.offset = 0;
7959 buffInfo.range = 1024;
7960
7961 VkWriteDescriptorSet descriptor_write;
7962 memset(&descriptor_write, 0, sizeof(descriptor_write));
7963 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7964 descriptor_write.dstSet = descriptorSet;
7965 descriptor_write.dstBinding = 0;
7966 descriptor_write.descriptorCount = 1;
7967 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7968 descriptor_write.pBufferInfo = &buffInfo;
7969
7970 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7971 m_errorMonitor->VerifyFound();
7972
7973 vkDestroyBuffer(m_device->device(), dyub, NULL);
7974 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7975 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7976}
7977
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007978TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007979 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007980 ASSERT_NO_FATAL_FAILURE(InitState());
7981 ASSERT_NO_FATAL_FAILURE(InitViewport());
7982 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7983
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007984 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007985 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007986 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7987 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7988 pipeline_layout_ci.pushConstantRangeCount = 1;
7989 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7990
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007991 //
7992 // Check for invalid push constant ranges in pipeline layouts.
7993 //
7994 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007995 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007996 char const *msg;
7997 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007998
Karl Schultzc81037d2016-05-12 08:11:23 -06007999 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
8000 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
8001 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
8002 "vkCreatePipelineLayout() call has push constants index 0 with "
8003 "size 0."},
8004 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
8005 "vkCreatePipelineLayout() call has push constants index 0 with "
8006 "size 1."},
8007 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
8008 "vkCreatePipelineLayout() call has push constants index 0 with "
8009 "size 1."},
8010 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
8011 "vkCreatePipelineLayout() call has push constants index 0 with "
8012 "size 0."},
8013 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
8014 "vkCreatePipelineLayout() call has push constants index 0 with "
8015 "offset 1. Offset must"},
8016 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
8017 "vkCreatePipelineLayout() call has push constants index 0 "
8018 "with offset "},
8019 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
8020 "vkCreatePipelineLayout() call has push constants "
8021 "index 0 with offset "},
8022 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
8023 "vkCreatePipelineLayout() call has push constants index 0 "
8024 "with offset "},
8025 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
8026 "vkCreatePipelineLayout() call has push "
8027 "constants index 0 with offset "},
8028 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
8029 "vkCreatePipelineLayout() call has push "
8030 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008031 }};
8032
8033 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06008034 for (const auto &iter : range_tests) {
8035 pc_range = iter.range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8037 iter.msg);
8038 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
8039 NULL, &pipeline_layout);
8040 m_errorMonitor->VerifyFound();
8041 if (VK_SUCCESS == err) {
8042 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8043 }
8044 }
8045
8046 // Check for invalid stage flag
8047 pc_range.offset = 0;
8048 pc_range.size = 16;
8049 pc_range.stageFlags = 0;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008050 m_errorMonitor->SetDesiredFailureMsg(
8051 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008052 "vkCreatePipelineLayout() call has no stageFlags set.");
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008053 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8054 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008055 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008056 if (VK_SUCCESS == err) {
8057 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8058 }
8059
8060 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06008061 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008062 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06008063 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008064 char const *msg;
8065 };
8066
Karl Schultzc81037d2016-05-12 08:11:23 -06008067 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008068 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8069 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8070 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8071 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8072 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
8073 "vkCreatePipelineLayout() call has push constants with overlapping "
8074 "ranges: 0:[0, 4), 1:[0, 4)"},
8075 {
8076 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8077 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
8078 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
8079 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
8080 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
8081 "vkCreatePipelineLayout() call has push constants with "
8082 "overlapping "
8083 "ranges: 3:[12, 20), 4:[16, 20)",
8084 },
8085 {
8086 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
8087 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
8088 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
8089 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
8090 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
8091 "vkCreatePipelineLayout() call has push constants with "
8092 "overlapping "
8093 "ranges: 0:[16, 20), 1:[12, 20)",
8094 },
8095 {
8096 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
8097 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
8098 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
8099 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
8100 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
8101 "vkCreatePipelineLayout() call has push constants with "
8102 "overlapping "
8103 "ranges: 0:[16, 20), 3:[12, 20)",
8104 },
8105 {
8106 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
8107 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
8108 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
8109 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
8110 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
8111 "vkCreatePipelineLayout() call has push constants with "
8112 "overlapping "
8113 "ranges: 0:[16, 20), 2:[4, 100)",
8114 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008115
Karl Schultzc81037d2016-05-12 08:11:23 -06008116 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008117 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06008118 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
8119 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008120 iter.msg);
8121 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
8122 NULL, &pipeline_layout);
8123 m_errorMonitor->VerifyFound();
8124 if (VK_SUCCESS == err) {
8125 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8126 }
8127 }
8128
8129 // Run some positive tests to make sure overlap checking in the layer is OK
Karl Schultzc81037d2016-05-12 08:11:23 -06008130 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos =
8131 {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8132 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
8133 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
8134 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
8135 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
8136 ""},
8137 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
8138 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
8139 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
8140 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
8141 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
8142 ""}}};
8143 for (const auto &iter : overlapping_range_tests_pos) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008144 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
8145 m_errorMonitor->ExpectSuccess();
8146 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
8147 NULL, &pipeline_layout);
8148 m_errorMonitor->VerifyNotFound();
8149 if (VK_SUCCESS == err) {
8150 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8151 }
8152 }
8153
8154 //
8155 // CmdPushConstants tests
8156 //
Karl Schultzc81037d2016-05-12 08:11:23 -06008157 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008158
8159 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzc81037d2016-05-12 08:11:23 -06008160 const std::array<PipelineLayoutTestCase, 16> cmd_range_tests = {{
8161 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
8162 "vkCmdPushConstants() call has push constants with size 0. Size "
8163 "must be greater than zero and a multiple of 4."},
8164 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
8165 "vkCmdPushConstants() call has push constants with size 1. Size "
8166 "must be greater than zero and a multiple of 4."},
8167 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
8168 "vkCmdPushConstants() call has push constants with size 1. Size "
8169 "must be greater than zero and a multiple of 4."},
8170 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
8171 "vkCmdPushConstants() call has push constants with offset 1. "
8172 "Offset must be a multiple of 4."},
8173 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
8174 "vkCmdPushConstants() call has push constants with offset 1. "
8175 "Offset must be a multiple of 4."},
8176 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
8177 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
8178 "0x1 not within flag-matching ranges in pipeline layout"},
8179 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
8180 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
8181 "0x1 not within flag-matching ranges in pipeline layout"},
8182 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
8183 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
8184 "0x1 not within flag-matching ranges in pipeline layout"},
8185 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
8186 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
8187 "0x1 not within flag-matching ranges in pipeline layout"},
8188 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
8189 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
8190 "any of the ranges in pipeline layout"},
8191 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
8192 0, 16},
8193 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
8194 "any of the ranges in pipeline layout"},
8195 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008196 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06008197 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008198 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06008199 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008200 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06008201 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008202 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06008203 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008204 "vkCmdPushConstants() call has push constants with offset "},
8205 }};
8206
8207 // Two ranges for testing robustness
Karl Schultzc81037d2016-05-12 08:11:23 -06008208 const VkPushConstantRange pc_range2[] = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008209 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06008210 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008211 };
Karl Schultzc81037d2016-05-12 08:11:23 -06008212 pipeline_layout_ci.pushConstantRangeCount =
8213 sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008214 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008215 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8216 &pipeline_layout);
8217 ASSERT_VK_SUCCESS(err);
8218 BeginCommandBuffer();
Karl Schultzc81037d2016-05-12 08:11:23 -06008219 for (const auto &iter : cmd_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8221 iter.msg);
8222 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
Karl Schultzc81037d2016-05-12 08:11:23 -06008223 iter.range.stageFlags, iter.range.offset,
8224 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008225 m_errorMonitor->VerifyFound();
8226 }
8227
8228 // Check for invalid stage flag
8229 m_errorMonitor->SetDesiredFailureMsg(
8230 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8231 "vkCmdPushConstants() call has no stageFlags set.");
8232 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0,
Karl Schultzc81037d2016-05-12 08:11:23 -06008233 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008234 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06008235 EndCommandBuffer();
8236 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
8237 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008238
Karl Schultzc81037d2016-05-12 08:11:23 -06008239 // overlapping range tests with cmd
8240 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
8241 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
8242 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
8243 "0x1 not within flag-matching ranges in pipeline layout"},
8244 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
8245 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
8246 "0x1 not within flag-matching ranges in pipeline layout"},
8247 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
8248 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
8249 "0x1 not within flag-matching ranges in pipeline layout"},
8250 }};
8251 const VkPushConstantRange pc_range3[] = {
8252 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
8253 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
8254 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8255 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
8256 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
8257 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
8258 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
8259 };
8260 pipeline_layout_ci.pushConstantRangeCount =
8261 sizeof(pc_range3) / sizeof(VkPushConstantRange);
8262 pipeline_layout_ci.pPushConstantRanges = pc_range3;
8263 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8264 &pipeline_layout);
8265 ASSERT_VK_SUCCESS(err);
8266 BeginCommandBuffer();
8267 for (const auto &iter : cmd_overlap_tests) {
8268 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8269 iter.msg);
8270 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
8271 iter.range.stageFlags, iter.range.offset,
8272 iter.range.size, dummy_values);
8273 m_errorMonitor->VerifyFound();
8274 }
8275 EndCommandBuffer();
8276 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
8277 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8278
8279 // positive overlapping range tests with cmd
8280 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
8281 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
8282 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
8283 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
8284 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
8285 }};
8286 const VkPushConstantRange pc_range4[] = {
8287 {VK_SHADER_STAGE_VERTEX_BIT, 0, 64},
8288 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
8289 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
8290 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8291 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
8292 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
8293 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
8294 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
8295 };
8296 pipeline_layout_ci.pushConstantRangeCount =
8297 sizeof(pc_range4) / sizeof(VkPushConstantRange);
8298 pipeline_layout_ci.pPushConstantRanges = pc_range4;
8299 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8300 &pipeline_layout);
8301 ASSERT_VK_SUCCESS(err);
8302 BeginCommandBuffer();
8303 for (const auto &iter : cmd_overlap_tests_pos) {
8304 m_errorMonitor->ExpectSuccess();
8305 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
8306 iter.range.stageFlags, iter.range.offset,
8307 iter.range.size, dummy_values);
8308 m_errorMonitor->VerifyNotFound();
8309 }
8310 EndCommandBuffer();
8311 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008312 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8313}
8314
Karl Schultz6addd812016-02-02 17:17:23 -07008315TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07008316 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07008317 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008318
8319 ASSERT_NO_FATAL_FAILURE(InitState());
8320 ASSERT_NO_FATAL_FAILURE(InitViewport());
8321 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8322
Mike Stroyanb8a61002016-06-20 16:00:28 -06008323 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
8324 VkImageTiling tiling;
8325 VkFormatProperties format_properties;
8326 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
8327 if (format_properties.linearTilingFeatures &
8328 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
8329 tiling = VK_IMAGE_TILING_LINEAR;
8330 } else if (format_properties.optimalTilingFeatures &
8331 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
8332 tiling = VK_IMAGE_TILING_OPTIMAL;
8333 } else {
8334 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
8335 "skipped.\n");
8336 return;
8337 }
8338
Tobin Ehlis559c6382015-11-05 09:52:49 -07008339 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
8340 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008341 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8342 ds_type_count[0].descriptorCount = 10;
8343 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8344 ds_type_count[1].descriptorCount = 2;
8345 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
8346 ds_type_count[2].descriptorCount = 2;
8347 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
8348 ds_type_count[3].descriptorCount = 5;
8349 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
8350 // type
8351 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8352 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
8353 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008354
8355 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008356 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8357 ds_pool_ci.pNext = NULL;
8358 ds_pool_ci.maxSets = 5;
8359 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
8360 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008361
8362 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008363 err =
8364 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008365 ASSERT_VK_SUCCESS(err);
8366
8367 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
8368 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008369 dsl_binding[0].binding = 0;
8370 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8371 dsl_binding[0].descriptorCount = 5;
8372 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
8373 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008374
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008375 // Create layout identical to set0 layout but w/ different stageFlags
8376 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008377 dsl_fs_stage_only.binding = 0;
8378 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8379 dsl_fs_stage_only.descriptorCount = 5;
8380 dsl_fs_stage_only.stageFlags =
8381 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
8382 // bind time
8383 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008384 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008385 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8386 ds_layout_ci.pNext = NULL;
8387 ds_layout_ci.bindingCount = 1;
8388 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008389 static const uint32_t NUM_LAYOUTS = 4;
8390 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008391 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008392 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
8393 // layout for error case
8394 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8395 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008396 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008397 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07008398 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8399 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008400 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008401 dsl_binding[0].binding = 0;
8402 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008403 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008404 dsl_binding[1].binding = 1;
8405 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
8406 dsl_binding[1].descriptorCount = 2;
8407 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
8408 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008409 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008410 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07008411 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8412 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008413 ASSERT_VK_SUCCESS(err);
8414 dsl_binding[0].binding = 0;
8415 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008416 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008417 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008418 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8419 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008420 ASSERT_VK_SUCCESS(err);
8421 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008422 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07008423 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8424 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008425 ASSERT_VK_SUCCESS(err);
8426
8427 static const uint32_t NUM_SETS = 4;
8428 VkDescriptorSet descriptorSet[NUM_SETS] = {};
8429 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008430 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008431 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008432 alloc_info.descriptorPool = ds_pool;
8433 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008434 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8435 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008436 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008437 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008438 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008439 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07008440 err =
8441 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008442 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008443
8444 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008445 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8446 pipeline_layout_ci.pNext = NULL;
8447 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
8448 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008449
8450 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008451 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8452 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008453 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008454 // Create pipelineLayout with only one setLayout
8455 pipeline_layout_ci.setLayoutCount = 1;
8456 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008457 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8458 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008459 ASSERT_VK_SUCCESS(err);
8460 // Create pipelineLayout with 2 descriptor setLayout at index 0
8461 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
8462 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07008463 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8464 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008465 ASSERT_VK_SUCCESS(err);
8466 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
8467 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
8468 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07008469 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8470 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008471 ASSERT_VK_SUCCESS(err);
8472 // Create pipelineLayout with UB type, but stageFlags for FS only
8473 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
8474 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07008475 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8476 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008477 ASSERT_VK_SUCCESS(err);
8478 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
8479 VkDescriptorSetLayout pl_bad_s0[2] = {};
8480 pl_bad_s0[0] = ds_layout_fs_only;
8481 pl_bad_s0[1] = ds_layout[1];
8482 pipeline_layout_ci.setLayoutCount = 2;
8483 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
8484 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07008485 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8486 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008487 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008488
8489 // Create a buffer to update the descriptor with
8490 uint32_t qfi = 0;
8491 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008492 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8493 buffCI.size = 1024;
8494 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
8495 buffCI.queueFamilyIndexCount = 1;
8496 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008497
8498 VkBuffer dyub;
8499 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
8500 ASSERT_VK_SUCCESS(err);
8501 // Correctly update descriptor to avoid "NOT_UPDATED" error
8502 static const uint32_t NUM_BUFFS = 5;
8503 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008504 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07008505 buffInfo[i].buffer = dyub;
8506 buffInfo[i].offset = 0;
8507 buffInfo[i].range = 1024;
8508 }
Karl Schultz6addd812016-02-02 17:17:23 -07008509 VkImage image;
Karl Schultz6addd812016-02-02 17:17:23 -07008510 const int32_t tex_width = 32;
8511 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008512 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008513 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8514 image_create_info.pNext = NULL;
8515 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8516 image_create_info.format = tex_format;
8517 image_create_info.extent.width = tex_width;
8518 image_create_info.extent.height = tex_height;
8519 image_create_info.extent.depth = 1;
8520 image_create_info.mipLevels = 1;
8521 image_create_info.arrayLayers = 1;
8522 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyanb8a61002016-06-20 16:00:28 -06008523 image_create_info.tiling = tiling;
8524 image_create_info.usage =
8525 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07008526 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008527 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
8528 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008529
Karl Schultz6addd812016-02-02 17:17:23 -07008530 VkMemoryRequirements memReqs;
8531 VkDeviceMemory imageMem;
8532 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008533 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008534 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8535 memAlloc.pNext = NULL;
8536 memAlloc.allocationSize = 0;
8537 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008538 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
8539 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008540 pass =
8541 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008542 ASSERT_TRUE(pass);
8543 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
8544 ASSERT_VK_SUCCESS(err);
8545 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
8546 ASSERT_VK_SUCCESS(err);
8547
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008548 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008549 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8550 image_view_create_info.image = image;
8551 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8552 image_view_create_info.format = tex_format;
8553 image_view_create_info.subresourceRange.layerCount = 1;
8554 image_view_create_info.subresourceRange.baseMipLevel = 0;
8555 image_view_create_info.subresourceRange.levelCount = 1;
8556 image_view_create_info.subresourceRange.aspectMask =
8557 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008558
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008559 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008560 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8561 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008562 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008563 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008564 imageInfo[0].imageView = view;
8565 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
8566 imageInfo[1].imageView = view;
8567 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008568 imageInfo[2].imageView = view;
8569 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
8570 imageInfo[3].imageView = view;
8571 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008572
8573 static const uint32_t NUM_SET_UPDATES = 3;
8574 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
8575 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8576 descriptor_write[0].dstSet = descriptorSet[0];
8577 descriptor_write[0].dstBinding = 0;
8578 descriptor_write[0].descriptorCount = 5;
8579 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8580 descriptor_write[0].pBufferInfo = buffInfo;
8581 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8582 descriptor_write[1].dstSet = descriptorSet[1];
8583 descriptor_write[1].dstBinding = 0;
8584 descriptor_write[1].descriptorCount = 2;
8585 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8586 descriptor_write[1].pImageInfo = imageInfo;
8587 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8588 descriptor_write[2].dstSet = descriptorSet[1];
8589 descriptor_write[2].dstBinding = 1;
8590 descriptor_write[2].descriptorCount = 2;
8591 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008592 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008593
8594 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008595
Tobin Ehlis88452832015-12-03 09:40:56 -07008596 // Create PSO to be used for draw-time errors below
8597 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12008598 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07008599 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008600 "out gl_PerVertex {\n"
8601 " vec4 gl_Position;\n"
8602 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07008603 "void main(){\n"
8604 " gl_Position = vec4(1);\n"
8605 "}\n";
8606 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12008607 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07008608 "\n"
8609 "layout(location=0) out vec4 x;\n"
8610 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
8611 "void main(){\n"
8612 " x = vec4(bar.y);\n"
8613 "}\n";
8614 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8615 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008616 VkPipelineObj pipe(m_device);
8617 pipe.AddShader(&vs);
8618 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07008619 pipe.AddColorAttachment();
8620 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07008621
8622 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07008623
Karl Schultz6addd812016-02-02 17:17:23 -07008624 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8625 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8626 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
8627 // of PSO
8628 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
8629 // cmd_pipeline.c
8630 // due to the fact that cmd_alloc_dset_data() has not been called in
8631 // cmd_bind_graphics_pipeline()
8632 // TODO : Want to cause various binding incompatibility issues here to test
8633 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07008634 // First cause various verify_layout_compatibility() fails
8635 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008636 // verify_set_layout_compatibility fail cases:
8637 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07008638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06008639 "Invalid Pipeline Layout Object ");
Karl Schultz6addd812016-02-02 17:17:23 -07008640 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8641 VK_PIPELINE_BIND_POINT_GRAPHICS,
8642 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
8643 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008644 m_errorMonitor->VerifyFound();
8645
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008646 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07008647 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8648 " attempting to bind set to index 1");
8649 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8650 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
8651 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008652 m_errorMonitor->VerifyFound();
8653
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008654 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008655 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
8656 // descriptors
8657 m_errorMonitor->SetDesiredFailureMsg(
8658 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008659 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07008660 vkCmdBindDescriptorSets(
8661 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8662 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008663 m_errorMonitor->VerifyFound();
8664
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008665 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
8666 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07008667 m_errorMonitor->SetDesiredFailureMsg(
8668 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008669 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07008670 vkCmdBindDescriptorSets(
8671 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8672 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008673 m_errorMonitor->VerifyFound();
8674
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008675 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
8676 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07008677 m_errorMonitor->SetDesiredFailureMsg(
8678 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008679 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07008680 vkCmdBindDescriptorSets(
8681 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8682 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008683 m_errorMonitor->VerifyFound();
8684
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008685 // Cause INFO messages due to disturbing previously bound Sets
8686 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07008687 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8688 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8689 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008690 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07008691 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008692 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008693 " previously bound as set #0 was disturbed ");
8694 vkCmdBindDescriptorSets(
8695 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8696 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008697 m_errorMonitor->VerifyFound();
8698
Karl Schultz6addd812016-02-02 17:17:23 -07008699 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8700 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8701 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008702 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008704 " newly bound as set #0 so set #1 and "
8705 "any subsequent sets were disturbed ");
8706 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8707 VK_PIPELINE_BIND_POINT_GRAPHICS,
8708 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008709 m_errorMonitor->VerifyFound();
8710
Tobin Ehlis10fad692016-07-07 12:00:36 -06008711 // Now that we're done actively using the pipelineLayout that gfx pipeline
8712 // was created with, we should be able to delete it. Do that now to verify
8713 // that validation obeys pipelineLayout lifetime
8714 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
8715
Tobin Ehlis88452832015-12-03 09:40:56 -07008716 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07008717 // 1. Error due to not binding required set (we actually use same code as
8718 // above to disturb set0)
8719 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8720 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8721 2, &descriptorSet[0], 0, NULL);
8722 vkCmdBindDescriptorSets(
8723 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8724 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
8725 m_errorMonitor->SetDesiredFailureMsg(
8726 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8727 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07008728 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008729 m_errorMonitor->VerifyFound();
8730
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008731 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008732 // 2. Error due to bound set not being compatible with PSO's
8733 // VkPipelineLayout (diff stageFlags in this case)
8734 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8735 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8736 2, &descriptorSet[0], 0, NULL);
8737 m_errorMonitor->SetDesiredFailureMsg(
8738 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8739 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07008740 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008741 m_errorMonitor->VerifyFound();
8742
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008743 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07008744 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008745 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
8746 }
8747 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06008748 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
8749 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008750 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008751 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8752 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008753 vkFreeMemory(m_device->device(), imageMem, NULL);
8754 vkDestroyImage(m_device->device(), image, NULL);
8755 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008756}
Tobin Ehlis559c6382015-11-05 09:52:49 -07008757
Karl Schultz6addd812016-02-02 17:17:23 -07008758TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008759
Karl Schultz6addd812016-02-02 17:17:23 -07008760 m_errorMonitor->SetDesiredFailureMsg(
8761 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008762 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008763
8764 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008765 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008766 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008767 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008768
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008769 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008770}
8771
Karl Schultz6addd812016-02-02 17:17:23 -07008772TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
8773 VkResult err;
8774 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008775
Karl Schultz6addd812016-02-02 17:17:23 -07008776 m_errorMonitor->SetDesiredFailureMsg(
8777 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07008778 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008779
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008780 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008781
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008782 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008783 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06008784 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008785 cmd.commandPool = m_commandPool;
8786 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008787 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06008788
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008789 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06008790 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008791
8792 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008793 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008794 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008795 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06008796 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008797 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
8798 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008799 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008800
8801 // The error should be caught by validation of the BeginCommandBuffer call
8802 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
8803
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008804 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008805 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008806}
8807
Karl Schultz6addd812016-02-02 17:17:23 -07008808TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008809 // Cause error due to Begin while recording CB
8810 // Then cause 2 errors for attempting to reset CB w/o having
8811 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
8812 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008813 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008814 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008815
8816 ASSERT_NO_FATAL_FAILURE(InitState());
8817
8818 // Calls AllocateCommandBuffers
8819 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
8820
Karl Schultz6addd812016-02-02 17:17:23 -07008821 // Force the failure by setting the Renderpass and Framebuffer fields with
8822 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008823 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008824 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008825 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8826 cmd_buf_info.pNext = NULL;
8827 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008828 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008829
8830 // Begin CB to transition to recording state
8831 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
8832 // Can't re-begin. This should trigger error
8833 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008834 m_errorMonitor->VerifyFound();
8835
Karl Schultz6addd812016-02-02 17:17:23 -07008836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8837 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008838 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
8839 // Reset attempt will trigger error due to incorrect CommandPool state
8840 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008841 m_errorMonitor->VerifyFound();
8842
Karl Schultz6addd812016-02-02 17:17:23 -07008843 m_errorMonitor->SetDesiredFailureMsg(
8844 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8845 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008846 // Transition CB to RECORDED state
8847 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
8848 // Now attempting to Begin will implicitly reset, which triggers error
8849 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008850 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008851}
8852
Karl Schultz6addd812016-02-02 17:17:23 -07008853TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008854 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07008855 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008856
Karl Schultz6addd812016-02-02 17:17:23 -07008857 m_errorMonitor->SetDesiredFailureMsg(
8858 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008859 "Invalid Pipeline CreateInfo State: Vtx Shader required");
8860
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008861 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008862 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008863
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008864 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008865 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8866 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06008867
8868 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008869 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8870 ds_pool_ci.pNext = NULL;
8871 ds_pool_ci.maxSets = 1;
8872 ds_pool_ci.poolSizeCount = 1;
8873 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008874
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008875 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008876 err =
8877 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008878 ASSERT_VK_SUCCESS(err);
8879
Tony Barboureb254902015-07-15 12:50:33 -06008880 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008881 dsl_binding.binding = 0;
8882 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8883 dsl_binding.descriptorCount = 1;
8884 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8885 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008886
Tony Barboureb254902015-07-15 12:50:33 -06008887 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008888 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8889 ds_layout_ci.pNext = NULL;
8890 ds_layout_ci.bindingCount = 1;
8891 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06008892
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008893 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008894 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8895 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008896 ASSERT_VK_SUCCESS(err);
8897
8898 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008899 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008900 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008901 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008902 alloc_info.descriptorPool = ds_pool;
8903 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008904 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8905 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008906 ASSERT_VK_SUCCESS(err);
8907
Tony Barboureb254902015-07-15 12:50:33 -06008908 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008909 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8910 pipeline_layout_ci.setLayoutCount = 1;
8911 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008912
8913 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008914 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8915 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008916 ASSERT_VK_SUCCESS(err);
8917
Tobin Ehlise68360f2015-10-01 11:15:13 -06008918 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008919 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06008920
8921 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008922 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8923 vp_state_ci.scissorCount = 1;
8924 vp_state_ci.pScissors = &sc;
8925 vp_state_ci.viewportCount = 1;
8926 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008927
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008928 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8929 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8930 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8931 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8932 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8933 rs_state_ci.depthClampEnable = VK_FALSE;
8934 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8935 rs_state_ci.depthBiasEnable = VK_FALSE;
8936
Tony Barboureb254902015-07-15 12:50:33 -06008937 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008938 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8939 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008940 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008941 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8942 gp_ci.layout = pipeline_layout;
8943 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06008944
8945 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008946 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8947 pc_ci.initialDataSize = 0;
8948 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008949
8950 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06008951 VkPipelineCache pipelineCache;
8952
Karl Schultz6addd812016-02-02 17:17:23 -07008953 err =
8954 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06008955 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008956 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8957 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008958
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008959 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008960
Chia-I Wuf7458c52015-10-26 21:10:41 +08008961 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8962 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8963 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8964 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008965}
Tobin Ehlis912df022015-09-17 08:46:18 -06008966/*// TODO : This test should be good, but needs Tess support in compiler to run
8967TEST_F(VkLayerTest, InvalidPatchControlPoints)
8968{
8969 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06008970 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008971
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008972 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008973 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
8974primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008975
Tobin Ehlis912df022015-09-17 08:46:18 -06008976 ASSERT_NO_FATAL_FAILURE(InitState());
8977 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06008978
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008979 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06008980 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008981 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008982
8983 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8984 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8985 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008986 ds_pool_ci.poolSizeCount = 1;
8987 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06008988
8989 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008990 err = vkCreateDescriptorPool(m_device->device(),
8991VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06008992 ASSERT_VK_SUCCESS(err);
8993
8994 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08008995 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06008996 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08008997 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008998 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8999 dsl_binding.pImmutableSamplers = NULL;
9000
9001 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009002 ds_layout_ci.sType =
9003VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06009004 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009005 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07009006 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06009007
9008 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009009 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9010&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06009011 ASSERT_VK_SUCCESS(err);
9012
9013 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07009014 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
9015VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06009016 ASSERT_VK_SUCCESS(err);
9017
9018 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009019 pipeline_layout_ci.sType =
9020VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06009021 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009022 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06009023 pipeline_layout_ci.pSetLayouts = &ds_layout;
9024
9025 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009026 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9027&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06009028 ASSERT_VK_SUCCESS(err);
9029
9030 VkPipelineShaderStageCreateInfo shaderStages[3];
9031 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
9032
Karl Schultz6addd812016-02-02 17:17:23 -07009033 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
9034this);
Tobin Ehlis912df022015-09-17 08:46:18 -06009035 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07009036 VkShaderObj
9037tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
9038this);
9039 VkShaderObj
9040te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
9041this);
Tobin Ehlis912df022015-09-17 08:46:18 -06009042
Karl Schultz6addd812016-02-02 17:17:23 -07009043 shaderStages[0].sType =
9044VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009045 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06009046 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07009047 shaderStages[1].sType =
9048VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009049 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06009050 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07009051 shaderStages[2].sType =
9052VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009053 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06009054 shaderStages[2].shader = te.handle();
9055
9056 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009057 iaCI.sType =
9058VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08009059 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06009060
9061 VkPipelineTessellationStateCreateInfo tsCI = {};
9062 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
9063 tsCI.patchControlPoints = 0; // This will cause an error
9064
9065 VkGraphicsPipelineCreateInfo gp_ci = {};
9066 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9067 gp_ci.pNext = NULL;
9068 gp_ci.stageCount = 3;
9069 gp_ci.pStages = shaderStages;
9070 gp_ci.pVertexInputState = NULL;
9071 gp_ci.pInputAssemblyState = &iaCI;
9072 gp_ci.pTessellationState = &tsCI;
9073 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009074 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06009075 gp_ci.pMultisampleState = NULL;
9076 gp_ci.pDepthStencilState = NULL;
9077 gp_ci.pColorBlendState = NULL;
9078 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9079 gp_ci.layout = pipeline_layout;
9080 gp_ci.renderPass = renderPass();
9081
9082 VkPipelineCacheCreateInfo pc_ci = {};
9083 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9084 pc_ci.pNext = NULL;
9085 pc_ci.initialSize = 0;
9086 pc_ci.initialData = 0;
9087 pc_ci.maxSize = 0;
9088
9089 VkPipeline pipeline;
9090 VkPipelineCache pipelineCache;
9091
Karl Schultz6addd812016-02-02 17:17:23 -07009092 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
9093&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06009094 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009095 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9096&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06009097
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009098 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009099
Chia-I Wuf7458c52015-10-26 21:10:41 +08009100 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9101 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9102 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9103 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06009104}
9105*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06009106// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07009107TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07009108 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009109
Karl Schultz6addd812016-02-02 17:17:23 -07009110 m_errorMonitor->SetDesiredFailureMsg(
9111 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009112 "Gfx Pipeline viewport count (1) must match scissor count (0).");
9113
Tobin Ehlise68360f2015-10-01 11:15:13 -06009114 ASSERT_NO_FATAL_FAILURE(InitState());
9115 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06009116
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009117 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009118 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9119 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009120
9121 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009122 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9123 ds_pool_ci.maxSets = 1;
9124 ds_pool_ci.poolSizeCount = 1;
9125 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009126
9127 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009128 err =
9129 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009130 ASSERT_VK_SUCCESS(err);
9131
9132 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009133 dsl_binding.binding = 0;
9134 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9135 dsl_binding.descriptorCount = 1;
9136 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009137
9138 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009139 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9140 ds_layout_ci.bindingCount = 1;
9141 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009142
9143 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009144 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9145 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009146 ASSERT_VK_SUCCESS(err);
9147
9148 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009149 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009150 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009151 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009152 alloc_info.descriptorPool = ds_pool;
9153 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009154 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9155 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009156 ASSERT_VK_SUCCESS(err);
9157
9158 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009159 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9160 pipeline_layout_ci.setLayoutCount = 1;
9161 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009162
9163 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009164 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9165 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009166 ASSERT_VK_SUCCESS(err);
9167
9168 VkViewport vp = {}; // Just need dummy vp to point to
9169
9170 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009171 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9172 vp_state_ci.scissorCount = 0;
9173 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
9174 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009175
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009176 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
9177 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9178 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
9179 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
9180 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9181 rs_state_ci.depthClampEnable = VK_FALSE;
9182 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
9183 rs_state_ci.depthBiasEnable = VK_FALSE;
9184
Cody Northropeb3a6c12015-10-05 14:44:45 -06009185 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07009186 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06009187
Karl Schultz6addd812016-02-02 17:17:23 -07009188 VkShaderObj vs(m_device, bindStateVertShaderText,
9189 VK_SHADER_STAGE_VERTEX_BIT, this);
9190 VkShaderObj fs(m_device, bindStateFragShaderText,
9191 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009192 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009193 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08009194 shaderStages[0] = vs.GetStageCreateInfo();
9195 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009196
9197 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009198 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9199 gp_ci.stageCount = 2;
9200 gp_ci.pStages = shaderStages;
9201 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009202 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07009203 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9204 gp_ci.layout = pipeline_layout;
9205 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009206
9207 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009208 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009209
9210 VkPipeline pipeline;
9211 VkPipelineCache pipelineCache;
9212
Karl Schultz6addd812016-02-02 17:17:23 -07009213 err =
9214 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009215 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009216 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9217 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009218
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009219 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009220
Chia-I Wuf7458c52015-10-26 21:10:41 +08009221 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9222 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9223 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9224 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009225}
Karl Schultz6addd812016-02-02 17:17:23 -07009226// Don't set viewport state in PSO. This is an error b/c we always need this
9227// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06009228// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07009229TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06009230 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07009231 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009232
Karl Schultz6addd812016-02-02 17:17:23 -07009233 m_errorMonitor->SetDesiredFailureMsg(
9234 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009235 "Gfx Pipeline pViewportState is null. Even if ");
9236
Tobin Ehlise68360f2015-10-01 11:15:13 -06009237 ASSERT_NO_FATAL_FAILURE(InitState());
9238 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06009239
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009240 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009241 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9242 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009243
9244 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009245 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9246 ds_pool_ci.maxSets = 1;
9247 ds_pool_ci.poolSizeCount = 1;
9248 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009249
9250 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009251 err =
9252 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009253 ASSERT_VK_SUCCESS(err);
9254
9255 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009256 dsl_binding.binding = 0;
9257 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9258 dsl_binding.descriptorCount = 1;
9259 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009260
9261 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009262 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9263 ds_layout_ci.bindingCount = 1;
9264 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009265
9266 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009267 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9268 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009269 ASSERT_VK_SUCCESS(err);
9270
9271 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009272 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009273 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009274 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009275 alloc_info.descriptorPool = ds_pool;
9276 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009277 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9278 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009279 ASSERT_VK_SUCCESS(err);
9280
9281 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009282 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9283 pipeline_layout_ci.setLayoutCount = 1;
9284 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009285
9286 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009287 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9288 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009289 ASSERT_VK_SUCCESS(err);
9290
9291 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
9292 // Set scissor as dynamic to avoid second error
9293 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009294 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9295 dyn_state_ci.dynamicStateCount = 1;
9296 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009297
Cody Northropeb3a6c12015-10-05 14:44:45 -06009298 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07009299 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06009300
Karl Schultz6addd812016-02-02 17:17:23 -07009301 VkShaderObj vs(m_device, bindStateVertShaderText,
9302 VK_SHADER_STAGE_VERTEX_BIT, this);
9303 VkShaderObj fs(m_device, bindStateFragShaderText,
9304 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009305 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009306 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08009307 shaderStages[0] = vs.GetStageCreateInfo();
9308 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009309
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009310
9311 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
9312 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9313 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
9314 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
9315 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9316 rs_state_ci.depthClampEnable = VK_FALSE;
9317 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
9318 rs_state_ci.depthBiasEnable = VK_FALSE;
9319
Tobin Ehlise68360f2015-10-01 11:15:13 -06009320 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009321 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9322 gp_ci.stageCount = 2;
9323 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009324 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07009325 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
9326 // should cause validation error
9327 gp_ci.pDynamicState = &dyn_state_ci;
9328 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9329 gp_ci.layout = pipeline_layout;
9330 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009331
9332 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009333 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009334
9335 VkPipeline pipeline;
9336 VkPipelineCache pipelineCache;
9337
Karl Schultz6addd812016-02-02 17:17:23 -07009338 err =
9339 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009340 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009341 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9342 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009343
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009344 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009345
Chia-I Wuf7458c52015-10-26 21:10:41 +08009346 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9347 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9348 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9349 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009350}
9351// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07009352// Then run second test where dynamic scissor count doesn't match PSO scissor
9353// count
9354TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
9355 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009356
Karl Schultz6addd812016-02-02 17:17:23 -07009357 m_errorMonitor->SetDesiredFailureMsg(
9358 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009359 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
9360
Tobin Ehlise68360f2015-10-01 11:15:13 -06009361 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009362
9363 if (!m_device->phy().features().multiViewport) {
9364 printf("Device does not support multiple viewports/scissors; skipped.\n");
9365 return;
9366 }
9367
Tobin Ehlise68360f2015-10-01 11:15:13 -06009368 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06009369
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009370 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009371 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9372 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009373
9374 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009375 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9376 ds_pool_ci.maxSets = 1;
9377 ds_pool_ci.poolSizeCount = 1;
9378 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009379
9380 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009381 err =
9382 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009383 ASSERT_VK_SUCCESS(err);
9384
9385 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009386 dsl_binding.binding = 0;
9387 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9388 dsl_binding.descriptorCount = 1;
9389 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009390
9391 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009392 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9393 ds_layout_ci.bindingCount = 1;
9394 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009395
9396 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009397 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9398 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009399 ASSERT_VK_SUCCESS(err);
9400
9401 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009402 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009403 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009404 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009405 alloc_info.descriptorPool = ds_pool;
9406 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009407 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9408 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009409 ASSERT_VK_SUCCESS(err);
9410
9411 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009412 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9413 pipeline_layout_ci.setLayoutCount = 1;
9414 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009415
9416 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009417 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9418 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009419 ASSERT_VK_SUCCESS(err);
9420
9421 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009422 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9423 vp_state_ci.viewportCount = 1;
9424 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
9425 vp_state_ci.scissorCount = 1;
9426 vp_state_ci.pScissors =
9427 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06009428
9429 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
9430 // Set scissor as dynamic to avoid that error
9431 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009432 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9433 dyn_state_ci.dynamicStateCount = 1;
9434 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009435
Cody Northropeb3a6c12015-10-05 14:44:45 -06009436 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07009437 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06009438
Karl Schultz6addd812016-02-02 17:17:23 -07009439 VkShaderObj vs(m_device, bindStateVertShaderText,
9440 VK_SHADER_STAGE_VERTEX_BIT, this);
9441 VkShaderObj fs(m_device, bindStateFragShaderText,
9442 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009443 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009444 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08009445 shaderStages[0] = vs.GetStageCreateInfo();
9446 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009447
Cody Northropf6622dc2015-10-06 10:33:21 -06009448 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9449 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9450 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009451 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06009452 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009453 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06009454 vi_ci.pVertexAttributeDescriptions = nullptr;
9455
9456 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9457 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9458 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9459
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009460 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009461 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06009462 rs_ci.pNext = nullptr;
9463
Mark Youngc89c6312016-03-31 16:03:20 -06009464 VkPipelineColorBlendAttachmentState att = {};
9465 att.blendEnable = VK_FALSE;
9466 att.colorWriteMask = 0xf;
9467
Cody Northropf6622dc2015-10-06 10:33:21 -06009468 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9469 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9470 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06009471 cb_ci.attachmentCount = 1;
9472 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06009473
Tobin Ehlise68360f2015-10-01 11:15:13 -06009474 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009475 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9476 gp_ci.stageCount = 2;
9477 gp_ci.pStages = shaderStages;
9478 gp_ci.pVertexInputState = &vi_ci;
9479 gp_ci.pInputAssemblyState = &ia_ci;
9480 gp_ci.pViewportState = &vp_state_ci;
9481 gp_ci.pRasterizationState = &rs_ci;
9482 gp_ci.pColorBlendState = &cb_ci;
9483 gp_ci.pDynamicState = &dyn_state_ci;
9484 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9485 gp_ci.layout = pipeline_layout;
9486 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009487
9488 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009489 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009490
9491 VkPipeline pipeline;
9492 VkPipelineCache pipelineCache;
9493
Karl Schultz6addd812016-02-02 17:17:23 -07009494 err =
9495 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009496 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009497 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9498 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009499
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009500 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009501
Tobin Ehlisd332f282015-10-02 11:00:56 -06009502 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07009503 // First need to successfully create the PSO from above by setting
9504 // pViewports
9505 m_errorMonitor->SetDesiredFailureMsg(
9506 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009507 "Dynamic scissor(s) 0 are used by PSO, ");
Karl Schultz6addd812016-02-02 17:17:23 -07009508
9509 VkViewport vp = {}; // Just need dummy vp to point to
9510 vp_state_ci.pViewports = &vp;
9511 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9512 &gp_ci, NULL, &pipeline);
9513 ASSERT_VK_SUCCESS(err);
9514 BeginCommandBuffer();
9515 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9516 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009517 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07009518 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009519 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07009520 Draw(1, 0, 0, 0);
9521
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009522 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07009523
9524 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9525 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9526 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9527 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009528 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07009529}
9530// Create PSO w/o non-zero scissorCount but no scissor data
9531// Then run second test where dynamic viewportCount doesn't match PSO
9532// viewportCount
9533TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
9534 VkResult err;
9535
9536 m_errorMonitor->SetDesiredFailureMsg(
9537 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9538 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
9539
9540 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009541
9542 if (!m_device->phy().features().multiViewport) {
9543 printf("Device does not support multiple viewports/scissors; skipped.\n");
9544 return;
9545 }
9546
Karl Schultz6addd812016-02-02 17:17:23 -07009547 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9548
9549 VkDescriptorPoolSize ds_type_count = {};
9550 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9551 ds_type_count.descriptorCount = 1;
9552
9553 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9554 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9555 ds_pool_ci.maxSets = 1;
9556 ds_pool_ci.poolSizeCount = 1;
9557 ds_pool_ci.pPoolSizes = &ds_type_count;
9558
9559 VkDescriptorPool ds_pool;
9560 err =
9561 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9562 ASSERT_VK_SUCCESS(err);
9563
9564 VkDescriptorSetLayoutBinding dsl_binding = {};
9565 dsl_binding.binding = 0;
9566 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9567 dsl_binding.descriptorCount = 1;
9568 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9569
9570 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9571 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9572 ds_layout_ci.bindingCount = 1;
9573 ds_layout_ci.pBindings = &dsl_binding;
9574
9575 VkDescriptorSetLayout ds_layout;
9576 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9577 &ds_layout);
9578 ASSERT_VK_SUCCESS(err);
9579
9580 VkDescriptorSet descriptorSet;
9581 VkDescriptorSetAllocateInfo alloc_info = {};
9582 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9583 alloc_info.descriptorSetCount = 1;
9584 alloc_info.descriptorPool = ds_pool;
9585 alloc_info.pSetLayouts = &ds_layout;
9586 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9587 &descriptorSet);
9588 ASSERT_VK_SUCCESS(err);
9589
9590 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9591 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9592 pipeline_layout_ci.setLayoutCount = 1;
9593 pipeline_layout_ci.pSetLayouts = &ds_layout;
9594
9595 VkPipelineLayout pipeline_layout;
9596 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9597 &pipeline_layout);
9598 ASSERT_VK_SUCCESS(err);
9599
9600 VkPipelineViewportStateCreateInfo vp_state_ci = {};
9601 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9602 vp_state_ci.scissorCount = 1;
9603 vp_state_ci.pScissors =
9604 NULL; // Null scissor w/ count of 1 should cause error
9605 vp_state_ci.viewportCount = 1;
9606 vp_state_ci.pViewports =
9607 NULL; // vp is dynamic (below) so this won't cause error
9608
9609 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
9610 // Set scissor as dynamic to avoid that error
9611 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
9612 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9613 dyn_state_ci.dynamicStateCount = 1;
9614 dyn_state_ci.pDynamicStates = &vp_state;
9615
9616 VkPipelineShaderStageCreateInfo shaderStages[2];
9617 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
9618
9619 VkShaderObj vs(m_device, bindStateVertShaderText,
9620 VK_SHADER_STAGE_VERTEX_BIT, this);
9621 VkShaderObj fs(m_device, bindStateFragShaderText,
9622 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009623 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009624 // but add it to be able to run on more devices
9625 shaderStages[0] = vs.GetStageCreateInfo();
9626 shaderStages[1] = fs.GetStageCreateInfo();
9627
9628 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9629 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9630 vi_ci.pNext = nullptr;
9631 vi_ci.vertexBindingDescriptionCount = 0;
9632 vi_ci.pVertexBindingDescriptions = nullptr;
9633 vi_ci.vertexAttributeDescriptionCount = 0;
9634 vi_ci.pVertexAttributeDescriptions = nullptr;
9635
9636 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9637 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9638 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9639
9640 VkPipelineRasterizationStateCreateInfo rs_ci = {};
9641 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9642 rs_ci.pNext = nullptr;
9643
Mark Youngc89c6312016-03-31 16:03:20 -06009644 VkPipelineColorBlendAttachmentState att = {};
9645 att.blendEnable = VK_FALSE;
9646 att.colorWriteMask = 0xf;
9647
Karl Schultz6addd812016-02-02 17:17:23 -07009648 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9649 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9650 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06009651 cb_ci.attachmentCount = 1;
9652 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07009653
9654 VkGraphicsPipelineCreateInfo gp_ci = {};
9655 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9656 gp_ci.stageCount = 2;
9657 gp_ci.pStages = shaderStages;
9658 gp_ci.pVertexInputState = &vi_ci;
9659 gp_ci.pInputAssemblyState = &ia_ci;
9660 gp_ci.pViewportState = &vp_state_ci;
9661 gp_ci.pRasterizationState = &rs_ci;
9662 gp_ci.pColorBlendState = &cb_ci;
9663 gp_ci.pDynamicState = &dyn_state_ci;
9664 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9665 gp_ci.layout = pipeline_layout;
9666 gp_ci.renderPass = renderPass();
9667
9668 VkPipelineCacheCreateInfo pc_ci = {};
9669 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9670
9671 VkPipeline pipeline;
9672 VkPipelineCache pipelineCache;
9673
9674 err =
9675 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9676 ASSERT_VK_SUCCESS(err);
9677 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9678 &gp_ci, NULL, &pipeline);
9679
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009680 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07009681
9682 // Now hit second fail case where we set scissor w/ different count than PSO
9683 // First need to successfully create the PSO from above by setting
9684 // pViewports
9685 m_errorMonitor->SetDesiredFailureMsg(
9686 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009687 "Dynamic viewport(s) 0 are used by PSO, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009688
Tobin Ehlisd332f282015-10-02 11:00:56 -06009689 VkRect2D sc = {}; // Just need dummy vp to point to
9690 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07009691 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9692 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06009693 ASSERT_VK_SUCCESS(err);
9694 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009695 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9696 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009697 VkViewport viewports[1] = {}; // don't care about data
Tobin Ehlisd332f282015-10-02 11:00:56 -06009698 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009699 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06009700 Draw(1, 0, 0, 0);
9701
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009702 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009703
Chia-I Wuf7458c52015-10-26 21:10:41 +08009704 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9705 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9706 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9707 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009708 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009709}
9710
Mark Young7394fdd2016-03-31 14:56:43 -06009711TEST_F(VkLayerTest, PSOLineWidthInvalid) {
9712 VkResult err;
9713
9714 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06009715 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06009716
9717 ASSERT_NO_FATAL_FAILURE(InitState());
9718 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9719
9720 VkDescriptorPoolSize ds_type_count = {};
9721 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9722 ds_type_count.descriptorCount = 1;
9723
9724 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9725 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9726 ds_pool_ci.maxSets = 1;
9727 ds_pool_ci.poolSizeCount = 1;
9728 ds_pool_ci.pPoolSizes = &ds_type_count;
9729
9730 VkDescriptorPool ds_pool;
9731 err =
9732 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9733 ASSERT_VK_SUCCESS(err);
9734
9735 VkDescriptorSetLayoutBinding dsl_binding = {};
9736 dsl_binding.binding = 0;
9737 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9738 dsl_binding.descriptorCount = 1;
9739 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9740
9741 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9742 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9743 ds_layout_ci.bindingCount = 1;
9744 ds_layout_ci.pBindings = &dsl_binding;
9745
9746 VkDescriptorSetLayout ds_layout;
9747 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9748 &ds_layout);
9749 ASSERT_VK_SUCCESS(err);
9750
9751 VkDescriptorSet descriptorSet;
9752 VkDescriptorSetAllocateInfo alloc_info = {};
9753 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9754 alloc_info.descriptorSetCount = 1;
9755 alloc_info.descriptorPool = ds_pool;
9756 alloc_info.pSetLayouts = &ds_layout;
9757 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9758 &descriptorSet);
9759 ASSERT_VK_SUCCESS(err);
9760
9761 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9762 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9763 pipeline_layout_ci.setLayoutCount = 1;
9764 pipeline_layout_ci.pSetLayouts = &ds_layout;
9765
9766 VkPipelineLayout pipeline_layout;
9767 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9768 &pipeline_layout);
9769 ASSERT_VK_SUCCESS(err);
9770
9771 VkPipelineViewportStateCreateInfo vp_state_ci = {};
9772 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9773 vp_state_ci.scissorCount = 1;
9774 vp_state_ci.pScissors = NULL;
9775 vp_state_ci.viewportCount = 1;
9776 vp_state_ci.pViewports = NULL;
9777
9778 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
9779 VK_DYNAMIC_STATE_SCISSOR,
9780 VK_DYNAMIC_STATE_LINE_WIDTH};
9781 // Set scissor as dynamic to avoid that error
9782 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
9783 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9784 dyn_state_ci.dynamicStateCount = 2;
9785 dyn_state_ci.pDynamicStates = dynamic_states;
9786
9787 VkPipelineShaderStageCreateInfo shaderStages[2];
9788 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
9789
9790 VkShaderObj vs(m_device, bindStateVertShaderText,
9791 VK_SHADER_STAGE_VERTEX_BIT, this);
9792 VkShaderObj fs(m_device, bindStateFragShaderText,
9793 VK_SHADER_STAGE_FRAGMENT_BIT,
9794 this); // TODO - We shouldn't need a fragment shader
9795 // but add it to be able to run on more devices
9796 shaderStages[0] = vs.GetStageCreateInfo();
9797 shaderStages[1] = fs.GetStageCreateInfo();
9798
9799 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9800 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9801 vi_ci.pNext = nullptr;
9802 vi_ci.vertexBindingDescriptionCount = 0;
9803 vi_ci.pVertexBindingDescriptions = nullptr;
9804 vi_ci.vertexAttributeDescriptionCount = 0;
9805 vi_ci.pVertexAttributeDescriptions = nullptr;
9806
9807 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9808 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9809 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9810
9811 VkPipelineRasterizationStateCreateInfo rs_ci = {};
9812 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9813 rs_ci.pNext = nullptr;
9814
Mark Young47107952016-05-02 15:59:55 -06009815 // Check too low (line width of -1.0f).
9816 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06009817
9818 VkPipelineColorBlendAttachmentState att = {};
9819 att.blendEnable = VK_FALSE;
9820 att.colorWriteMask = 0xf;
9821
9822 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9823 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9824 cb_ci.pNext = nullptr;
9825 cb_ci.attachmentCount = 1;
9826 cb_ci.pAttachments = &att;
9827
9828 VkGraphicsPipelineCreateInfo gp_ci = {};
9829 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9830 gp_ci.stageCount = 2;
9831 gp_ci.pStages = shaderStages;
9832 gp_ci.pVertexInputState = &vi_ci;
9833 gp_ci.pInputAssemblyState = &ia_ci;
9834 gp_ci.pViewportState = &vp_state_ci;
9835 gp_ci.pRasterizationState = &rs_ci;
9836 gp_ci.pColorBlendState = &cb_ci;
9837 gp_ci.pDynamicState = &dyn_state_ci;
9838 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9839 gp_ci.layout = pipeline_layout;
9840 gp_ci.renderPass = renderPass();
9841
9842 VkPipelineCacheCreateInfo pc_ci = {};
9843 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9844
9845 VkPipeline pipeline;
9846 VkPipelineCache pipelineCache;
9847
9848 err =
9849 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9850 ASSERT_VK_SUCCESS(err);
9851 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9852 &gp_ci, NULL, &pipeline);
9853
9854 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009855 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009856
9857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9858 "Attempt to set lineWidth to 65536");
9859
9860 // Check too high (line width of 65536.0f).
9861 rs_ci.lineWidth = 65536.0f;
9862
9863 err =
9864 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9865 ASSERT_VK_SUCCESS(err);
9866 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9867 &gp_ci, NULL, &pipeline);
9868
9869 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009870 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009871
9872 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06009873 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06009874
9875 dyn_state_ci.dynamicStateCount = 3;
9876
9877 rs_ci.lineWidth = 1.0f;
9878
9879 err =
9880 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9881 ASSERT_VK_SUCCESS(err);
9882 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9883 &gp_ci, NULL, &pipeline);
9884 BeginCommandBuffer();
9885 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9886 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
9887
9888 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06009889 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06009890 m_errorMonitor->VerifyFound();
9891
9892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9893 "Attempt to set lineWidth to 65536");
9894
9895 // Check too high with dynamic setting.
9896 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
9897 m_errorMonitor->VerifyFound();
9898 EndCommandBuffer();
9899
9900 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9901 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9902 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9903 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009904 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009905}
9906
Karl Schultz6addd812016-02-02 17:17:23 -07009907TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009908 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009909 m_errorMonitor->SetDesiredFailureMsg(
9910 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009911 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009912
9913 ASSERT_NO_FATAL_FAILURE(InitState());
9914 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009915
Tony Barbourfe3351b2015-07-28 10:17:20 -06009916 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009917 // Don't care about RenderPass handle b/c error should be flagged before
9918 // that
9919 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
9920 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009921
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009922 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009923}
9924
Karl Schultz6addd812016-02-02 17:17:23 -07009925TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009926 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009927 m_errorMonitor->SetDesiredFailureMsg(
9928 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009929 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009930
9931 ASSERT_NO_FATAL_FAILURE(InitState());
9932 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009933
Tony Barbourfe3351b2015-07-28 10:17:20 -06009934 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009935 // Just create a dummy Renderpass that's non-NULL so we can get to the
9936 // proper error
Chris Forbes38ae7c42016-06-21 20:51:44 +12009937 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
Karl Schultz6addd812016-02-02 17:17:23 -07009938 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009939
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009940 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009941}
9942
Chris Forbes2eeabe32016-06-21 20:52:34 +12009943TEST_F(VkLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
9944 m_errorMonitor->ExpectSuccess();
9945
9946 ASSERT_NO_FATAL_FAILURE(InitState());
9947 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9948
9949 BeginCommandBuffer(); // framework implicitly begins the renderpass.
9950 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // end implicit.
9951
9952 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
9953 VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9954 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9955 m_errorMonitor->VerifyNotFound();
9956 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
9957 VK_SUBPASS_CONTENTS_INLINE);
9958 m_errorMonitor->VerifyNotFound();
9959 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9960 m_errorMonitor->VerifyNotFound();
9961
9962 m_commandBuffer->EndCommandBuffer();
9963 m_errorMonitor->VerifyNotFound();
9964}
9965
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009966TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
9967 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
9968 "the number of renderPass attachments that use loadOp"
9969 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
9970
9971 ASSERT_NO_FATAL_FAILURE(InitState());
9972 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9973
9974 // Create a renderPass with a single attachment that uses loadOp CLEAR
9975 VkAttachmentReference attach = {};
9976 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9977 VkSubpassDescription subpass = {};
9978 subpass.inputAttachmentCount = 1;
9979 subpass.pInputAttachments = &attach;
9980 VkRenderPassCreateInfo rpci = {};
9981 rpci.subpassCount = 1;
9982 rpci.pSubpasses = &subpass;
9983 rpci.attachmentCount = 1;
9984 VkAttachmentDescription attach_desc = {};
9985 attach_desc.format = VK_FORMAT_UNDEFINED;
9986 // Set loadOp to CLEAR
9987 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9988 rpci.pAttachments = &attach_desc;
9989 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9990 VkRenderPass rp;
9991 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9992
9993 VkCommandBufferInheritanceInfo hinfo = {};
9994 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9995 hinfo.renderPass = VK_NULL_HANDLE;
9996 hinfo.subpass = 0;
9997 hinfo.framebuffer = VK_NULL_HANDLE;
9998 hinfo.occlusionQueryEnable = VK_FALSE;
9999 hinfo.queryFlags = 0;
10000 hinfo.pipelineStatistics = 0;
10001 VkCommandBufferBeginInfo info = {};
10002 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
10003 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
10004 info.pInheritanceInfo = &hinfo;
10005
10006 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
10007 VkRenderPassBeginInfo rp_begin = {};
10008 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
10009 rp_begin.pNext = NULL;
10010 rp_begin.renderPass = renderPass();
10011 rp_begin.framebuffer = framebuffer();
10012 rp_begin.clearValueCount = 0; // Should be 1
10013
10014 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7f0416c2016-07-15 16:01:13 -060010015 " has a clearValueCount of 0 but "
10016 "there must be at least 1 entries in "
10017 "pClearValues array to account for ");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -060010018
10019 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
10020 VK_SUBPASS_CONTENTS_INLINE);
10021
10022 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -060010023
10024 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -060010025}
10026
Cody Northrop3bb4d962016-05-09 16:15:57 -060010027TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
10028
10029 TEST_DESCRIPTION("End a command buffer with an active render pass");
10030
10031 m_errorMonitor->SetDesiredFailureMsg(
10032 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10033 "It is invalid to issue this call inside an active render pass");
10034
10035 ASSERT_NO_FATAL_FAILURE(InitState());
10036 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10037
10038 // The framework's BeginCommandBuffer calls CreateRenderPass
10039 BeginCommandBuffer();
10040
10041 // Call directly into vkEndCommandBuffer instead of the
10042 // the framework's EndCommandBuffer, which inserts a
10043 // vkEndRenderPass
10044 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
10045
10046 m_errorMonitor->VerifyFound();
10047
10048 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
10049 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
10050}
10051
Karl Schultz6addd812016-02-02 17:17:23 -070010052TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010053 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -070010054 m_errorMonitor->SetDesiredFailureMsg(
10055 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010056 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010057
10058 ASSERT_NO_FATAL_FAILURE(InitState());
10059 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010060
10061 // Renderpass is started here
10062 BeginCommandBuffer();
10063
10064 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010065 vk_testing::Buffer dstBuffer;
10066 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010067
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010068 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010069
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010070 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010071}
10072
Karl Schultz6addd812016-02-02 17:17:23 -070010073TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010074 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -070010075 m_errorMonitor->SetDesiredFailureMsg(
10076 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010077 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010078
10079 ASSERT_NO_FATAL_FAILURE(InitState());
10080 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010081
10082 // Renderpass is started here
10083 BeginCommandBuffer();
10084
10085 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010086 vk_testing::Buffer dstBuffer;
10087 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010088
Karl Schultz6addd812016-02-02 17:17:23 -070010089 VkDeviceSize dstOffset = 0;
10090 VkDeviceSize dataSize = 1024;
Karl Schultzee344492016-07-11 15:09:57 -060010091 const void *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010092
Karl Schultz6addd812016-02-02 17:17:23 -070010093 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
10094 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010095
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010096 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010097}
10098
Karl Schultz6addd812016-02-02 17:17:23 -070010099TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010100 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010101 m_errorMonitor->SetDesiredFailureMsg(
10102 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010103 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010104
10105 ASSERT_NO_FATAL_FAILURE(InitState());
10106 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010107
10108 // Renderpass is started here
10109 BeginCommandBuffer();
10110
Michael Lentine0a369f62016-02-03 16:51:46 -060010111 VkClearColorValue clear_color;
10112 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -070010113 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
10114 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
10115 const int32_t tex_width = 32;
10116 const int32_t tex_height = 32;
10117 VkImageCreateInfo image_create_info = {};
10118 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10119 image_create_info.pNext = NULL;
10120 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10121 image_create_info.format = tex_format;
10122 image_create_info.extent.width = tex_width;
10123 image_create_info.extent.height = tex_height;
10124 image_create_info.extent.depth = 1;
10125 image_create_info.mipLevels = 1;
10126 image_create_info.arrayLayers = 1;
10127 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10128 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
10129 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010130
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010131 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -070010132 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
10133 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010134
Karl Schultz6addd812016-02-02 17:17:23 -070010135 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
10136 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010137
Karl Schultz6addd812016-02-02 17:17:23 -070010138 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
10139 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010140
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010141 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010142}
10143
Karl Schultz6addd812016-02-02 17:17:23 -070010144TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010145 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010146 m_errorMonitor->SetDesiredFailureMsg(
10147 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010148 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010149
10150 ASSERT_NO_FATAL_FAILURE(InitState());
10151 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010152
10153 // Renderpass is started here
10154 BeginCommandBuffer();
10155
10156 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -070010157 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070010158 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
10159 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10160 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
10161 image_create_info.extent.width = 64;
10162 image_create_info.extent.height = 64;
10163 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10164 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010165
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010166 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -070010167 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
10168 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010169
Karl Schultz6addd812016-02-02 17:17:23 -070010170 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
10171 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010172
Karl Schultz6addd812016-02-02 17:17:23 -070010173 vkCmdClearDepthStencilImage(
10174 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
10175 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
10176 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010177
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010178 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010179}
10180
Karl Schultz6addd812016-02-02 17:17:23 -070010181TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060010182 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010183 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010184
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -060010186 "vkCmdClearAttachments(): This call "
Karl Schultz6addd812016-02-02 17:17:23 -070010187 "must be issued inside an active "
10188 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010189
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010190 ASSERT_NO_FATAL_FAILURE(InitState());
10191 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010192
10193 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010194 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010195 ASSERT_VK_SUCCESS(err);
10196
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060010197 VkClearAttachment color_attachment;
10198 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10199 color_attachment.clearValue.color.float32[0] = 0;
10200 color_attachment.clearValue.color.float32[1] = 0;
10201 color_attachment.clearValue.color.float32[2] = 0;
10202 color_attachment.clearValue.color.float32[3] = 0;
10203 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070010204 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
10205 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
10206 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010207
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010208 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010209}
10210
Karl Schultz9e66a292016-04-21 15:57:51 -060010211TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
10212 // Try to add a buffer memory barrier with no buffer.
10213 m_errorMonitor->SetDesiredFailureMsg(
10214 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10215 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
10216
10217 ASSERT_NO_FATAL_FAILURE(InitState());
10218 BeginCommandBuffer();
10219
10220 VkBufferMemoryBarrier buf_barrier = {};
10221 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
10222 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10223 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10224 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10225 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10226 buf_barrier.buffer = VK_NULL_HANDLE;
10227 buf_barrier.offset = 0;
10228 buf_barrier.size = VK_WHOLE_SIZE;
10229 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10230 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
10231 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
10232
10233 m_errorMonitor->VerifyFound();
10234}
10235
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010236TEST_F(VkLayerTest, InvalidBarriers) {
10237 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
10238
10239 m_errorMonitor->SetDesiredFailureMsg(
10240 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
10241
10242 ASSERT_NO_FATAL_FAILURE(InitState());
10243 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10244
10245 VkMemoryBarrier mem_barrier = {};
10246 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
10247 mem_barrier.pNext = NULL;
10248 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10249 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10250 BeginCommandBuffer();
10251 // BeginCommandBuffer() starts a render pass
10252 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10253 VK_PIPELINE_STAGE_HOST_BIT,
10254 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
10255 &mem_barrier, 0, nullptr, 0, nullptr);
10256 m_errorMonitor->VerifyFound();
10257
10258 m_errorMonitor->SetDesiredFailureMsg(
10259 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10260 "Image Layout cannot be transitioned to UNDEFINED");
10261 VkImageObj image(m_device);
10262 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
10263 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10264 ASSERT_TRUE(image.initialized());
10265 VkImageMemoryBarrier img_barrier = {};
10266 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
10267 img_barrier.pNext = NULL;
10268 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10269 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10270 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10271 // New layout can't be UNDEFINED
10272 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
10273 img_barrier.image = image.handle();
10274 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10275 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10276 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10277 img_barrier.subresourceRange.baseArrayLayer = 0;
10278 img_barrier.subresourceRange.baseMipLevel = 0;
10279 img_barrier.subresourceRange.layerCount = 1;
10280 img_barrier.subresourceRange.levelCount = 1;
10281 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10282 VK_PIPELINE_STAGE_HOST_BIT,
10283 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10284 nullptr, 1, &img_barrier);
10285 m_errorMonitor->VerifyFound();
10286 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10287
10288 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10289 "Subresource must have the sum of the "
10290 "baseArrayLayer");
10291 // baseArrayLayer + layerCount must be <= image's arrayLayers
10292 img_barrier.subresourceRange.baseArrayLayer = 1;
10293 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10294 VK_PIPELINE_STAGE_HOST_BIT,
10295 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10296 nullptr, 1, &img_barrier);
10297 m_errorMonitor->VerifyFound();
10298 img_barrier.subresourceRange.baseArrayLayer = 0;
10299
10300 m_errorMonitor->SetDesiredFailureMsg(
10301 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10302 "Subresource must have the sum of the baseMipLevel");
10303 // baseMipLevel + levelCount must be <= image's mipLevels
10304 img_barrier.subresourceRange.baseMipLevel = 1;
10305 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10306 VK_PIPELINE_STAGE_HOST_BIT,
10307 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10308 nullptr, 1, &img_barrier);
10309 m_errorMonitor->VerifyFound();
10310 img_barrier.subresourceRange.baseMipLevel = 0;
10311
10312 m_errorMonitor->SetDesiredFailureMsg(
10313 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10314 "Buffer Barriers cannot be used during a render pass");
10315 vk_testing::Buffer buffer;
10316 buffer.init(*m_device, 256);
10317 VkBufferMemoryBarrier buf_barrier = {};
10318 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
10319 buf_barrier.pNext = NULL;
10320 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10321 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10322 buf_barrier.buffer = buffer.handle();
10323 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10324 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10325 buf_barrier.offset = 0;
10326 buf_barrier.size = VK_WHOLE_SIZE;
10327 // Can't send buffer barrier during a render pass
10328 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10329 VK_PIPELINE_STAGE_HOST_BIT,
10330 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
10331 &buf_barrier, 0, nullptr);
10332 m_errorMonitor->VerifyFound();
10333 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
10334
10335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10336 "which is not less than total size");
10337 buf_barrier.offset = 257;
10338 // Offset greater than total size
10339 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10340 VK_PIPELINE_STAGE_HOST_BIT,
10341 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
10342 &buf_barrier, 0, nullptr);
10343 m_errorMonitor->VerifyFound();
10344 buf_barrier.offset = 0;
10345
10346 m_errorMonitor->SetDesiredFailureMsg(
10347 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
10348 buf_barrier.size = 257;
10349 // Size greater than total size
10350 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10351 VK_PIPELINE_STAGE_HOST_BIT,
10352 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
10353 &buf_barrier, 0, nullptr);
10354 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010355
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010356 // Now exercise barrier aspect bit errors, first DS
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010357 m_errorMonitor->SetDesiredFailureMsg(
10358 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10359 "Image is a depth and stencil format and thus must "
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010360 "have either one or both of VK_IMAGE_ASPECT_DEPTH_BIT and "
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010361 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
10362 VkDepthStencilObj ds_image(m_device);
10363 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
10364 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -060010365 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
10366 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010367 img_barrier.image = ds_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060010368 // Use of COLOR aspect on DS image is error
10369 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010370 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10371 VK_PIPELINE_STAGE_HOST_BIT,
10372 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10373 nullptr, 1, &img_barrier);
10374 m_errorMonitor->VerifyFound();
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010375 // Now test depth-only
10376 VkFormatProperties format_props;
10377
10378 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(),
10379 VK_FORMAT_D16_UNORM, &format_props);
10380 if (format_props.optimalTilingFeatures &
10381 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
10382 m_errorMonitor->SetDesiredFailureMsg(
10383 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10384 "Image is a depth-only format and thus must "
10385 "have VK_IMAGE_ASPECT_DEPTH_BIT set.");
10386 VkDepthStencilObj d_image(m_device);
10387 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
10388 ASSERT_TRUE(d_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -060010389 img_barrier.oldLayout =
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010390 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -060010391 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010392 img_barrier.image = d_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060010393 // Use of COLOR aspect on depth image is error
10394 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010395 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10396 VK_PIPELINE_STAGE_HOST_BIT,
10397 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
10398 0, nullptr, 1, &img_barrier);
10399 m_errorMonitor->VerifyFound();
10400 }
10401 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(),
10402 VK_FORMAT_S8_UINT, &format_props);
10403 if (format_props.optimalTilingFeatures &
10404 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
10405 // Now test stencil-only
10406 m_errorMonitor->SetDesiredFailureMsg(
10407 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10408 "Image is a stencil-only format and thus must "
10409 "have VK_IMAGE_ASPECT_STENCIL_BIT set.");
10410 VkDepthStencilObj s_image(m_device);
10411 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
10412 ASSERT_TRUE(s_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -060010413 img_barrier.oldLayout =
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010414 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -060010415 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010416 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060010417 // Use of COLOR aspect on depth image is error
10418 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010419 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10420 VK_PIPELINE_STAGE_HOST_BIT,
10421 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
10422 0, nullptr, 1, &img_barrier);
10423 m_errorMonitor->VerifyFound();
10424 }
10425 // Finally test color
10426 m_errorMonitor->SetDesiredFailureMsg(
10427 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image is a color format and thus must "
10428 "have VK_IMAGE_ASPECT_COLOR_BIT set.");
10429 VkImageObj c_image(m_device);
10430 c_image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
10431 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10432 0);
10433 ASSERT_TRUE(c_image.initialized());
10434 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10435 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
10436 img_barrier.image = c_image.handle();
10437 // Set aspect to depth (non-color)
10438 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
10439 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10440 VK_PIPELINE_STAGE_HOST_BIT,
10441 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10442 nullptr, 1, &img_barrier);
10443 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010444}
10445
Karl Schultz6addd812016-02-02 17:17:23 -070010446TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010447 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010448 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010449
Karl Schultz6addd812016-02-02 17:17:23 -070010450 m_errorMonitor->SetDesiredFailureMsg(
10451 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010452 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
10453
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010454 ASSERT_NO_FATAL_FAILURE(InitState());
10455 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010456 uint32_t qfi = 0;
10457 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010458 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10459 buffCI.size = 1024;
10460 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
10461 buffCI.queueFamilyIndexCount = 1;
10462 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010463
10464 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010465 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010466 ASSERT_VK_SUCCESS(err);
10467
10468 BeginCommandBuffer();
10469 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -070010470 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10471 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010472 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -070010473 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
10474 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010475
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010476 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010477
Chia-I Wuf7458c52015-10-26 21:10:41 +080010478 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010479}
10480
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010481TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
10482 // Create an out-of-range queueFamilyIndex
10483 m_errorMonitor->SetDesiredFailureMsg(
10484 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -060010485 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
10486 "of the indices specified when the device was created, via the "
10487 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010488
10489 ASSERT_NO_FATAL_FAILURE(InitState());
10490 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10491 VkBufferCreateInfo buffCI = {};
10492 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10493 buffCI.size = 1024;
10494 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
10495 buffCI.queueFamilyIndexCount = 1;
10496 // Introduce failure by specifying invalid queue_family_index
10497 uint32_t qfi = 777;
10498 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -060010499 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010500
10501 VkBuffer ib;
10502 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
10503
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010504 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060010505 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010506}
10507
Karl Schultz6addd812016-02-02 17:17:23 -070010508TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Tobin Ehlis0c94db02016-07-19 10:49:32 -060010509 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands w/ a primary cmd buffer"
10510 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010511
Karl Schultz6addd812016-02-02 17:17:23 -070010512 m_errorMonitor->SetDesiredFailureMsg(
10513 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010514 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010515
10516 ASSERT_NO_FATAL_FAILURE(InitState());
10517 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010518
10519 BeginCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -060010520
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010521 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
10522 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010523
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010524 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010525}
10526
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010527TEST_F(VkLayerTest, DSUsageBitsErrors) {
10528 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
10529 "that do not have correct usage bits sets.");
10530 VkResult err;
10531
10532 ASSERT_NO_FATAL_FAILURE(InitState());
10533 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10534 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10535 ds_type_count[i].type = VkDescriptorType(i);
10536 ds_type_count[i].descriptorCount = 1;
10537 }
10538 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10539 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10540 ds_pool_ci.pNext = NULL;
10541 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10542 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10543 ds_pool_ci.pPoolSizes = ds_type_count;
10544
10545 VkDescriptorPool ds_pool;
10546 err =
10547 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10548 ASSERT_VK_SUCCESS(err);
10549
10550 // Create 10 layouts where each has a single descriptor of different type
10551 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] =
10552 {};
10553 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10554 dsl_binding[i].binding = 0;
10555 dsl_binding[i].descriptorType = VkDescriptorType(i);
10556 dsl_binding[i].descriptorCount = 1;
10557 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
10558 dsl_binding[i].pImmutableSamplers = NULL;
10559 }
10560
10561 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10562 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10563 ds_layout_ci.pNext = NULL;
10564 ds_layout_ci.bindingCount = 1;
10565 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
10566 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10567 ds_layout_ci.pBindings = dsl_binding + i;
10568 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
10569 NULL, ds_layouts + i);
10570 ASSERT_VK_SUCCESS(err);
10571 }
10572 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10573 VkDescriptorSetAllocateInfo alloc_info = {};
10574 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10575 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10576 alloc_info.descriptorPool = ds_pool;
10577 alloc_info.pSetLayouts = ds_layouts;
10578 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10579 descriptor_sets);
10580 ASSERT_VK_SUCCESS(err);
10581
10582 // Create a buffer & bufferView to be used for invalid updates
10583 VkBufferCreateInfo buff_ci = {};
10584 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10585 // This usage is not valid for any descriptor type
10586 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
10587 buff_ci.size = 256;
10588 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10589 VkBuffer buffer;
10590 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10591 ASSERT_VK_SUCCESS(err);
10592
10593 VkBufferViewCreateInfo buff_view_ci = {};
10594 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
10595 buff_view_ci.buffer = buffer;
10596 buff_view_ci.format = VK_FORMAT_R8_UNORM;
10597 buff_view_ci.range = VK_WHOLE_SIZE;
10598 VkBufferView buff_view;
10599 err =
10600 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
10601 ASSERT_VK_SUCCESS(err);
10602
10603 // Create an image to be used for invalid updates
10604 VkImageCreateInfo image_ci = {};
10605 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10606 image_ci.imageType = VK_IMAGE_TYPE_2D;
10607 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
10608 image_ci.extent.width = 64;
10609 image_ci.extent.height = 64;
10610 image_ci.extent.depth = 1;
10611 image_ci.mipLevels = 1;
10612 image_ci.arrayLayers = 1;
10613 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
10614 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10615 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10616 // This usage is not valid for any descriptor type
10617 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
10618 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10619 VkImage image;
10620 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10621 ASSERT_VK_SUCCESS(err);
10622 // Bind memory to image
10623 VkMemoryRequirements mem_reqs;
10624 VkDeviceMemory image_mem;
10625 bool pass;
10626 VkMemoryAllocateInfo mem_alloc = {};
10627 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10628 mem_alloc.pNext = NULL;
10629 mem_alloc.allocationSize = 0;
10630 mem_alloc.memoryTypeIndex = 0;
10631 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10632 mem_alloc.allocationSize = mem_reqs.size;
10633 pass =
10634 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10635 ASSERT_TRUE(pass);
10636 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10637 ASSERT_VK_SUCCESS(err);
10638 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10639 ASSERT_VK_SUCCESS(err);
10640 // Now create view for image
10641 VkImageViewCreateInfo image_view_ci = {};
10642 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10643 image_view_ci.image = image;
10644 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
10645 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10646 image_view_ci.subresourceRange.layerCount = 1;
10647 image_view_ci.subresourceRange.baseArrayLayer = 0;
10648 image_view_ci.subresourceRange.levelCount = 1;
10649 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10650 VkImageView image_view;
10651 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
10652 &image_view);
10653 ASSERT_VK_SUCCESS(err);
10654
10655 VkDescriptorBufferInfo buff_info = {};
10656 buff_info.buffer = buffer;
10657 VkDescriptorImageInfo img_info = {};
10658 img_info.imageView = image_view;
10659 VkWriteDescriptorSet descriptor_write = {};
10660 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10661 descriptor_write.dstBinding = 0;
10662 descriptor_write.descriptorCount = 1;
10663 descriptor_write.pTexelBufferView = &buff_view;
10664 descriptor_write.pBufferInfo = &buff_info;
10665 descriptor_write.pImageInfo = &img_info;
10666
10667 // These error messages align with VkDescriptorType struct
10668 const char *error_msgs[] = {
10669 "", // placeholder, no error for SAMPLER descriptor
10670 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
10671 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
10672 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
10673 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
10674 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
10675 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
10676 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
10677 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
10678 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
10679 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
10680 // Start loop at 1 as SAMPLER desc type has no usage bit error
10681 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10682 descriptor_write.descriptorType = VkDescriptorType(i);
10683 descriptor_write.dstSet = descriptor_sets[i];
10684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10685 error_msgs[i]);
10686
10687 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
10688 NULL);
10689
10690 m_errorMonitor->VerifyFound();
10691 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
10692 }
10693 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
10694 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060010695 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010696 vkDestroyImageView(m_device->device(), image_view, NULL);
10697 vkDestroyBuffer(m_device->device(), buffer, NULL);
10698 vkDestroyBufferView(m_device->device(), buff_view, NULL);
10699 vkFreeDescriptorSets(m_device->device(), ds_pool,
10700 VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
10701 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10702}
10703
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010704TEST_F(VkLayerTest, DSBufferInfoErrors) {
10705 TEST_DESCRIPTION(
10706 "Attempt to update buffer descriptor set that has incorrect "
10707 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
10708 "1. offset value greater than buffer size\n"
10709 "2. range value of 0\n"
10710 "3. range value greater than buffer (size - offset)");
10711 VkResult err;
10712
10713 ASSERT_NO_FATAL_FAILURE(InitState());
10714 VkDescriptorPoolSize ds_type_count = {};
10715 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10716 ds_type_count.descriptorCount = 1;
10717
10718 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10719 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10720 ds_pool_ci.pNext = NULL;
10721 ds_pool_ci.maxSets = 1;
10722 ds_pool_ci.poolSizeCount = 1;
10723 ds_pool_ci.pPoolSizes = &ds_type_count;
10724
10725 VkDescriptorPool ds_pool;
10726 err =
10727 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10728 ASSERT_VK_SUCCESS(err);
10729
10730 // Create layout with single uniform buffer descriptor
10731 VkDescriptorSetLayoutBinding dsl_binding = {};
10732 dsl_binding.binding = 0;
10733 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10734 dsl_binding.descriptorCount = 1;
10735 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10736 dsl_binding.pImmutableSamplers = NULL;
10737
10738 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10739 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10740 ds_layout_ci.pNext = NULL;
10741 ds_layout_ci.bindingCount = 1;
10742 ds_layout_ci.pBindings = &dsl_binding;
10743 VkDescriptorSetLayout ds_layout;
10744 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10745 &ds_layout);
10746 ASSERT_VK_SUCCESS(err);
10747
10748 VkDescriptorSet descriptor_set = {};
10749 VkDescriptorSetAllocateInfo alloc_info = {};
10750 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10751 alloc_info.descriptorSetCount = 1;
10752 alloc_info.descriptorPool = ds_pool;
10753 alloc_info.pSetLayouts = &ds_layout;
10754 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10755 &descriptor_set);
10756 ASSERT_VK_SUCCESS(err);
10757
10758 // Create a buffer to be used for invalid updates
10759 VkBufferCreateInfo buff_ci = {};
10760 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10761 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10762 buff_ci.size = 256;
10763 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10764 VkBuffer buffer;
10765 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10766 ASSERT_VK_SUCCESS(err);
10767 // Have to bind memory to buffer before descriptor update
10768 VkMemoryAllocateInfo mem_alloc = {};
10769 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10770 mem_alloc.pNext = NULL;
10771 mem_alloc.allocationSize = 256;
10772 mem_alloc.memoryTypeIndex = 0;
10773
10774 VkMemoryRequirements mem_reqs;
10775 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
10776 bool pass =
10777 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10778 if (!pass) {
10779 vkDestroyBuffer(m_device->device(), buffer, NULL);
10780 return;
10781 }
10782
10783 VkDeviceMemory mem;
10784 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
10785 ASSERT_VK_SUCCESS(err);
10786 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10787 ASSERT_VK_SUCCESS(err);
10788
10789 VkDescriptorBufferInfo buff_info = {};
10790 buff_info.buffer = buffer;
10791 // First make offset 1 larger than buffer size
10792 buff_info.offset = 257;
10793 buff_info.range = VK_WHOLE_SIZE;
10794 VkWriteDescriptorSet descriptor_write = {};
10795 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10796 descriptor_write.dstBinding = 0;
10797 descriptor_write.descriptorCount = 1;
10798 descriptor_write.pTexelBufferView = nullptr;
10799 descriptor_write.pBufferInfo = &buff_info;
10800 descriptor_write.pImageInfo = nullptr;
10801
10802 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10803 descriptor_write.dstSet = descriptor_set;
10804 m_errorMonitor->SetDesiredFailureMsg(
10805 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10806 " offset of 257 is greater than buffer ");
10807
10808 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10809
10810 m_errorMonitor->VerifyFound();
10811 // Now cause error due to range of 0
10812 buff_info.offset = 0;
10813 buff_info.range = 0;
10814 m_errorMonitor->SetDesiredFailureMsg(
10815 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10816 " range is not VK_WHOLE_SIZE and is zero, which is not allowed.");
10817
10818 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10819
10820 m_errorMonitor->VerifyFound();
10821 // Now cause error due to range exceeding buffer size - offset
10822 buff_info.offset = 128;
10823 buff_info.range = 200;
10824 m_errorMonitor->SetDesiredFailureMsg(
10825 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10826 " range is 200 which is greater than buffer size ");
10827
10828 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10829
10830 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010831 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010832 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10833 vkDestroyBuffer(m_device->device(), buffer, NULL);
10834 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10835 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10836}
10837
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010838TEST_F(VkLayerTest, DSAspectBitsErrors) {
10839 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10840 // are set, but could expand this test to hit more cases.
10841 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
10842 "that do not have correct aspect bits sets.");
10843 VkResult err;
10844
10845 ASSERT_NO_FATAL_FAILURE(InitState());
10846 VkDescriptorPoolSize ds_type_count = {};
10847 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10848 ds_type_count.descriptorCount = 1;
10849
10850 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10851 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10852 ds_pool_ci.pNext = NULL;
10853 ds_pool_ci.maxSets = 5;
10854 ds_pool_ci.poolSizeCount = 1;
10855 ds_pool_ci.pPoolSizes = &ds_type_count;
10856
10857 VkDescriptorPool ds_pool;
10858 err =
10859 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10860 ASSERT_VK_SUCCESS(err);
10861
10862 VkDescriptorSetLayoutBinding dsl_binding = {};
10863 dsl_binding.binding = 0;
10864 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10865 dsl_binding.descriptorCount = 1;
10866 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10867 dsl_binding.pImmutableSamplers = NULL;
10868
10869 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10870 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10871 ds_layout_ci.pNext = NULL;
10872 ds_layout_ci.bindingCount = 1;
10873 ds_layout_ci.pBindings = &dsl_binding;
10874 VkDescriptorSetLayout ds_layout;
10875 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10876 &ds_layout);
10877 ASSERT_VK_SUCCESS(err);
10878
10879 VkDescriptorSet descriptor_set = {};
10880 VkDescriptorSetAllocateInfo alloc_info = {};
10881 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10882 alloc_info.descriptorSetCount = 1;
10883 alloc_info.descriptorPool = ds_pool;
10884 alloc_info.pSetLayouts = &ds_layout;
10885 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10886 &descriptor_set);
10887 ASSERT_VK_SUCCESS(err);
10888
10889 // Create an image to be used for invalid updates
10890 VkImageCreateInfo image_ci = {};
10891 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10892 image_ci.imageType = VK_IMAGE_TYPE_2D;
10893 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10894 image_ci.extent.width = 64;
10895 image_ci.extent.height = 64;
10896 image_ci.extent.depth = 1;
10897 image_ci.mipLevels = 1;
10898 image_ci.arrayLayers = 1;
10899 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
10900 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10901 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10902 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10903 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10904 VkImage image;
10905 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10906 ASSERT_VK_SUCCESS(err);
10907 // Bind memory to image
10908 VkMemoryRequirements mem_reqs;
10909 VkDeviceMemory image_mem;
10910 bool pass;
10911 VkMemoryAllocateInfo mem_alloc = {};
10912 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10913 mem_alloc.pNext = NULL;
10914 mem_alloc.allocationSize = 0;
10915 mem_alloc.memoryTypeIndex = 0;
10916 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10917 mem_alloc.allocationSize = mem_reqs.size;
10918 pass =
10919 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10920 ASSERT_TRUE(pass);
10921 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10922 ASSERT_VK_SUCCESS(err);
10923 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10924 ASSERT_VK_SUCCESS(err);
10925 // Now create view for image
10926 VkImageViewCreateInfo image_view_ci = {};
10927 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10928 image_view_ci.image = image;
10929 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10930 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10931 image_view_ci.subresourceRange.layerCount = 1;
10932 image_view_ci.subresourceRange.baseArrayLayer = 0;
10933 image_view_ci.subresourceRange.levelCount = 1;
10934 // Setting both depth & stencil aspect bits is illegal for descriptor
10935 image_view_ci.subresourceRange.aspectMask =
10936 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
10937
10938 VkImageView image_view;
10939 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
10940 &image_view);
10941 ASSERT_VK_SUCCESS(err);
10942
10943 VkDescriptorImageInfo img_info = {};
10944 img_info.imageView = image_view;
10945 VkWriteDescriptorSet descriptor_write = {};
10946 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10947 descriptor_write.dstBinding = 0;
10948 descriptor_write.descriptorCount = 1;
10949 descriptor_write.pTexelBufferView = NULL;
10950 descriptor_write.pBufferInfo = NULL;
10951 descriptor_write.pImageInfo = &img_info;
10952 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10953 descriptor_write.dstSet = descriptor_set;
10954 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10955 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
10956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10957 error_msg);
10958
10959 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10960
10961 m_errorMonitor->VerifyFound();
10962 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10963 vkDestroyImage(m_device->device(), image, NULL);
10964 vkFreeMemory(m_device->device(), image_mem, NULL);
10965 vkDestroyImageView(m_device->device(), image_view, NULL);
10966 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10967 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10968}
10969
Karl Schultz6addd812016-02-02 17:17:23 -070010970TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010971 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010972 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010973
Karl Schultz6addd812016-02-02 17:17:23 -070010974 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010975 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10976 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10977 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010978
Tobin Ehlis3b780662015-05-28 12:11:26 -060010979 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010980 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010981 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010982 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10983 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010984
10985 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010986 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10987 ds_pool_ci.pNext = NULL;
10988 ds_pool_ci.maxSets = 1;
10989 ds_pool_ci.poolSizeCount = 1;
10990 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010991
Tobin Ehlis3b780662015-05-28 12:11:26 -060010992 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010993 err =
10994 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010995 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010996 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010997 dsl_binding.binding = 0;
10998 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10999 dsl_binding.descriptorCount = 1;
11000 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11001 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011002
Tony Barboureb254902015-07-15 12:50:33 -060011003 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011004 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11005 ds_layout_ci.pNext = NULL;
11006 ds_layout_ci.bindingCount = 1;
11007 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011008
Tobin Ehlis3b780662015-05-28 12:11:26 -060011009 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011010 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11011 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011012 ASSERT_VK_SUCCESS(err);
11013
11014 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011015 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011016 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011017 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011018 alloc_info.descriptorPool = ds_pool;
11019 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011020 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11021 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011022 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011023
Tobin Ehlis30db8f82016-05-05 08:19:48 -060011024 VkSamplerCreateInfo sampler_ci = {};
11025 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11026 sampler_ci.pNext = NULL;
11027 sampler_ci.magFilter = VK_FILTER_NEAREST;
11028 sampler_ci.minFilter = VK_FILTER_NEAREST;
11029 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11030 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11031 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11032 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11033 sampler_ci.mipLodBias = 1.0;
11034 sampler_ci.anisotropyEnable = VK_FALSE;
11035 sampler_ci.maxAnisotropy = 1;
11036 sampler_ci.compareEnable = VK_FALSE;
11037 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11038 sampler_ci.minLod = 1.0;
11039 sampler_ci.maxLod = 1.0;
11040 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11041 sampler_ci.unnormalizedCoordinates = VK_FALSE;
11042 VkSampler sampler;
11043 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11044 ASSERT_VK_SUCCESS(err);
11045
11046 VkDescriptorImageInfo info = {};
11047 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011048
11049 VkWriteDescriptorSet descriptor_write;
11050 memset(&descriptor_write, 0, sizeof(descriptor_write));
11051 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011052 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011053 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011054 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011055 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011056 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011057
11058 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11059
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011060 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011061
Chia-I Wuf7458c52015-10-26 21:10:41 +080011062 vkDestroySampler(m_device->device(), sampler, NULL);
11063 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11064 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011065}
11066
Karl Schultz6addd812016-02-02 17:17:23 -070011067TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011068 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070011069 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011070
Karl Schultz6addd812016-02-02 17:17:23 -070011071 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011072 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11073 " binding #0 with 1 total descriptors but update of 1 descriptors "
11074 "starting at binding offset of 0 combined with update array element "
11075 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011076
Tobin Ehlis3b780662015-05-28 12:11:26 -060011077 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011078 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011079 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011080 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11081 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011082
11083 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011084 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11085 ds_pool_ci.pNext = NULL;
11086 ds_pool_ci.maxSets = 1;
11087 ds_pool_ci.poolSizeCount = 1;
11088 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011089
Tobin Ehlis3b780662015-05-28 12:11:26 -060011090 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011091 err =
11092 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011093 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011094
Tony Barboureb254902015-07-15 12:50:33 -060011095 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011096 dsl_binding.binding = 0;
11097 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11098 dsl_binding.descriptorCount = 1;
11099 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11100 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060011101
11102 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011103 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11104 ds_layout_ci.pNext = NULL;
11105 ds_layout_ci.bindingCount = 1;
11106 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011107
Tobin Ehlis3b780662015-05-28 12:11:26 -060011108 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011109 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11110 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011111 ASSERT_VK_SUCCESS(err);
11112
11113 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011114 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011115 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011116 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011117 alloc_info.descriptorPool = ds_pool;
11118 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011119 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11120 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011121 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011122
Tobin Ehlis30db8f82016-05-05 08:19:48 -060011123 // Correctly update descriptor to avoid "NOT_UPDATED" error
11124 VkDescriptorBufferInfo buff_info = {};
11125 buff_info.buffer =
11126 VkBuffer(0); // Don't care about buffer handle for this test
11127 buff_info.offset = 0;
11128 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011129
11130 VkWriteDescriptorSet descriptor_write;
11131 memset(&descriptor_write, 0, sizeof(descriptor_write));
11132 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011133 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011134 descriptor_write.dstArrayElement =
11135 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080011136 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011137 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11138 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011139
11140 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11141
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011142 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011143
Chia-I Wuf7458c52015-10-26 21:10:41 +080011144 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11145 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011146}
11147
Karl Schultz6addd812016-02-02 17:17:23 -070011148TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
11149 // Create layout w/ count of 1 and attempt update to that layout w/ binding
11150 // index 2
11151 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011152
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011153 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11154 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011155
Tobin Ehlis3b780662015-05-28 12:11:26 -060011156 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011157 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011158 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011159 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11160 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011161
11162 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011163 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11164 ds_pool_ci.pNext = NULL;
11165 ds_pool_ci.maxSets = 1;
11166 ds_pool_ci.poolSizeCount = 1;
11167 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011168
Tobin Ehlis3b780662015-05-28 12:11:26 -060011169 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011170 err =
11171 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011172 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011173
Tony Barboureb254902015-07-15 12:50:33 -060011174 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011175 dsl_binding.binding = 0;
11176 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11177 dsl_binding.descriptorCount = 1;
11178 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11179 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060011180
11181 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011182 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11183 ds_layout_ci.pNext = NULL;
11184 ds_layout_ci.bindingCount = 1;
11185 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011186 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011187 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11188 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011189 ASSERT_VK_SUCCESS(err);
11190
11191 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011192 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011193 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011194 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011195 alloc_info.descriptorPool = ds_pool;
11196 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011197 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11198 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011199 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011200
Tony Barboureb254902015-07-15 12:50:33 -060011201 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011202 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11203 sampler_ci.pNext = NULL;
11204 sampler_ci.magFilter = VK_FILTER_NEAREST;
11205 sampler_ci.minFilter = VK_FILTER_NEAREST;
11206 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11207 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11208 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11209 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11210 sampler_ci.mipLodBias = 1.0;
11211 sampler_ci.anisotropyEnable = VK_FALSE;
11212 sampler_ci.maxAnisotropy = 1;
11213 sampler_ci.compareEnable = VK_FALSE;
11214 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11215 sampler_ci.minLod = 1.0;
11216 sampler_ci.maxLod = 1.0;
11217 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11218 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060011219
Tobin Ehlis3b780662015-05-28 12:11:26 -060011220 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011221 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011222 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011223
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011224 VkDescriptorImageInfo info = {};
11225 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011226
11227 VkWriteDescriptorSet descriptor_write;
11228 memset(&descriptor_write, 0, sizeof(descriptor_write));
11229 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011230 descriptor_write.dstSet = descriptorSet;
11231 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011232 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011233 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011234 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011235 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011236
11237 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11238
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011239 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011240
Chia-I Wuf7458c52015-10-26 21:10:41 +080011241 vkDestroySampler(m_device->device(), sampler, NULL);
11242 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11243 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011244}
11245
Karl Schultz6addd812016-02-02 17:17:23 -070011246TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
11247 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
11248 // types
11249 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011250
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis660bcdc2016-05-17 10:39:46 -060011252 ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011253
Tobin Ehlis3b780662015-05-28 12:11:26 -060011254 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011255
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011256 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011257 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11258 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011259
11260 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011261 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11262 ds_pool_ci.pNext = NULL;
11263 ds_pool_ci.maxSets = 1;
11264 ds_pool_ci.poolSizeCount = 1;
11265 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011266
Tobin Ehlis3b780662015-05-28 12:11:26 -060011267 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011268 err =
11269 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011270 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060011271 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011272 dsl_binding.binding = 0;
11273 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11274 dsl_binding.descriptorCount = 1;
11275 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11276 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011277
Tony Barboureb254902015-07-15 12:50:33 -060011278 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011279 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11280 ds_layout_ci.pNext = NULL;
11281 ds_layout_ci.bindingCount = 1;
11282 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011283
Tobin Ehlis3b780662015-05-28 12:11:26 -060011284 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011285 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11286 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011287 ASSERT_VK_SUCCESS(err);
11288
11289 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011290 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011291 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011292 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011293 alloc_info.descriptorPool = ds_pool;
11294 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011295 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11296 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011297 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011298
Tony Barboureb254902015-07-15 12:50:33 -060011299 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011300 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11301 sampler_ci.pNext = NULL;
11302 sampler_ci.magFilter = VK_FILTER_NEAREST;
11303 sampler_ci.minFilter = VK_FILTER_NEAREST;
11304 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11305 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11306 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11307 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11308 sampler_ci.mipLodBias = 1.0;
11309 sampler_ci.anisotropyEnable = VK_FALSE;
11310 sampler_ci.maxAnisotropy = 1;
11311 sampler_ci.compareEnable = VK_FALSE;
11312 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11313 sampler_ci.minLod = 1.0;
11314 sampler_ci.maxLod = 1.0;
11315 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11316 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011317 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011318 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011319 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011320
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011321 VkDescriptorImageInfo info = {};
11322 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011323
11324 VkWriteDescriptorSet descriptor_write;
11325 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -070011326 descriptor_write.sType =
11327 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011328 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011329 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011330 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011331 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011332 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011333
11334 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11335
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011336 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011337
Chia-I Wuf7458c52015-10-26 21:10:41 +080011338 vkDestroySampler(m_device->device(), sampler, NULL);
11339 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11340 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011341}
11342
Karl Schultz6addd812016-02-02 17:17:23 -070011343TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011344 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070011345 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011346
Karl Schultz6addd812016-02-02 17:17:23 -070011347 m_errorMonitor->SetDesiredFailureMsg(
11348 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011349 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011350
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011351 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011352 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
11353 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011354 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011355 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
11356 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011357
11358 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011359 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11360 ds_pool_ci.pNext = NULL;
11361 ds_pool_ci.maxSets = 1;
11362 ds_pool_ci.poolSizeCount = 1;
11363 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011364
11365 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011366 err =
11367 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011368 ASSERT_VK_SUCCESS(err);
11369
11370 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011371 dsl_binding.binding = 0;
11372 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11373 dsl_binding.descriptorCount = 1;
11374 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11375 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011376
11377 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011378 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11379 ds_layout_ci.pNext = NULL;
11380 ds_layout_ci.bindingCount = 1;
11381 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011382 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011383 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11384 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011385 ASSERT_VK_SUCCESS(err);
11386
11387 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011388 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011389 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011390 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011391 alloc_info.descriptorPool = ds_pool;
11392 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011393 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11394 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011395 ASSERT_VK_SUCCESS(err);
11396
Karl Schultz6addd812016-02-02 17:17:23 -070011397 VkSampler sampler =
11398 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011399
11400 VkDescriptorImageInfo descriptor_info;
11401 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11402 descriptor_info.sampler = sampler;
11403
11404 VkWriteDescriptorSet descriptor_write;
11405 memset(&descriptor_write, 0, sizeof(descriptor_write));
11406 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011407 descriptor_write.dstSet = descriptorSet;
11408 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011409 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011410 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11411 descriptor_write.pImageInfo = &descriptor_info;
11412
11413 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11414
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011415 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011416
Chia-I Wuf7458c52015-10-26 21:10:41 +080011417 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11418 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011419}
11420
Karl Schultz6addd812016-02-02 17:17:23 -070011421TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
11422 // Create a single combined Image/Sampler descriptor and send it an invalid
11423 // imageView
11424 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011425
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11427 "Attempted write update to combined "
11428 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -060011429 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011430
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011431 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011432 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011433 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11434 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011435
11436 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011437 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11438 ds_pool_ci.pNext = NULL;
11439 ds_pool_ci.maxSets = 1;
11440 ds_pool_ci.poolSizeCount = 1;
11441 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011442
11443 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011444 err =
11445 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011446 ASSERT_VK_SUCCESS(err);
11447
11448 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011449 dsl_binding.binding = 0;
11450 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11451 dsl_binding.descriptorCount = 1;
11452 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11453 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011454
11455 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011456 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11457 ds_layout_ci.pNext = NULL;
11458 ds_layout_ci.bindingCount = 1;
11459 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011460 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011461 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11462 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011463 ASSERT_VK_SUCCESS(err);
11464
11465 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011466 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011467 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011468 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011469 alloc_info.descriptorPool = ds_pool;
11470 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011471 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11472 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011473 ASSERT_VK_SUCCESS(err);
11474
11475 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011476 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11477 sampler_ci.pNext = NULL;
11478 sampler_ci.magFilter = VK_FILTER_NEAREST;
11479 sampler_ci.minFilter = VK_FILTER_NEAREST;
11480 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11481 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11482 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11483 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11484 sampler_ci.mipLodBias = 1.0;
11485 sampler_ci.anisotropyEnable = VK_FALSE;
11486 sampler_ci.maxAnisotropy = 1;
11487 sampler_ci.compareEnable = VK_FALSE;
11488 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11489 sampler_ci.minLod = 1.0;
11490 sampler_ci.maxLod = 1.0;
11491 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11492 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011493
11494 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011495 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011496 ASSERT_VK_SUCCESS(err);
11497
Karl Schultz6addd812016-02-02 17:17:23 -070011498 VkImageView view =
11499 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011500
11501 VkDescriptorImageInfo descriptor_info;
11502 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11503 descriptor_info.sampler = sampler;
11504 descriptor_info.imageView = view;
11505
11506 VkWriteDescriptorSet descriptor_write;
11507 memset(&descriptor_write, 0, sizeof(descriptor_write));
11508 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011509 descriptor_write.dstSet = descriptorSet;
11510 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011511 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011512 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11513 descriptor_write.pImageInfo = &descriptor_info;
11514
11515 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11516
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011517 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011518
Chia-I Wuf7458c52015-10-26 21:10:41 +080011519 vkDestroySampler(m_device->device(), sampler, NULL);
11520 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11521 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011522}
11523
Karl Schultz6addd812016-02-02 17:17:23 -070011524TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
11525 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
11526 // into the other
11527 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011528
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11530 " binding #1 with type "
11531 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
11532 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011533
Tobin Ehlis04356f92015-10-27 16:35:27 -060011534 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011535 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011536 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011537 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11538 ds_type_count[0].descriptorCount = 1;
11539 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
11540 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011541
11542 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011543 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11544 ds_pool_ci.pNext = NULL;
11545 ds_pool_ci.maxSets = 1;
11546 ds_pool_ci.poolSizeCount = 2;
11547 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011548
11549 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011550 err =
11551 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011552 ASSERT_VK_SUCCESS(err);
11553 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011554 dsl_binding[0].binding = 0;
11555 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11556 dsl_binding[0].descriptorCount = 1;
11557 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
11558 dsl_binding[0].pImmutableSamplers = NULL;
11559 dsl_binding[1].binding = 1;
11560 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11561 dsl_binding[1].descriptorCount = 1;
11562 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
11563 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011564
11565 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011566 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11567 ds_layout_ci.pNext = NULL;
11568 ds_layout_ci.bindingCount = 2;
11569 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011570
11571 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011572 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11573 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011574 ASSERT_VK_SUCCESS(err);
11575
11576 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011577 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011578 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011579 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011580 alloc_info.descriptorPool = ds_pool;
11581 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011582 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11583 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011584 ASSERT_VK_SUCCESS(err);
11585
11586 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011587 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11588 sampler_ci.pNext = NULL;
11589 sampler_ci.magFilter = VK_FILTER_NEAREST;
11590 sampler_ci.minFilter = VK_FILTER_NEAREST;
11591 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11592 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11593 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11594 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11595 sampler_ci.mipLodBias = 1.0;
11596 sampler_ci.anisotropyEnable = VK_FALSE;
11597 sampler_ci.maxAnisotropy = 1;
11598 sampler_ci.compareEnable = VK_FALSE;
11599 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11600 sampler_ci.minLod = 1.0;
11601 sampler_ci.maxLod = 1.0;
11602 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11603 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011604
11605 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011606 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011607 ASSERT_VK_SUCCESS(err);
11608
11609 VkDescriptorImageInfo info = {};
11610 info.sampler = sampler;
11611
11612 VkWriteDescriptorSet descriptor_write;
11613 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
11614 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011615 descriptor_write.dstSet = descriptorSet;
11616 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080011617 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011618 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11619 descriptor_write.pImageInfo = &info;
11620 // This write update should succeed
11621 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11622 // Now perform a copy update that fails due to type mismatch
11623 VkCopyDescriptorSet copy_ds_update;
11624 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11625 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11626 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -060011627 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011628 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011629 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +080011630 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011631 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11632
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011633 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011634 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070011635 m_errorMonitor->SetDesiredFailureMsg(
11636 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011637 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -060011638 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11639 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11640 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011641 copy_ds_update.srcBinding =
11642 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011643 copy_ds_update.dstSet = descriptorSet;
11644 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -060011645 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011646 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11647
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011648 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011649
Tobin Ehlis04356f92015-10-27 16:35:27 -060011650 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070011651 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011652 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
11653 "update array offset of 0 and update of "
11654 "5 descriptors oversteps total number "
11655 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011656
Tobin Ehlis04356f92015-10-27 16:35:27 -060011657 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11658 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11659 copy_ds_update.srcSet = descriptorSet;
11660 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011661 copy_ds_update.dstSet = descriptorSet;
11662 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070011663 copy_ds_update.descriptorCount =
11664 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060011665 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11666
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011667 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011668
Chia-I Wuf7458c52015-10-26 21:10:41 +080011669 vkDestroySampler(m_device->device(), sampler, NULL);
11670 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11671 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011672}
11673
Karl Schultz6addd812016-02-02 17:17:23 -070011674TEST_F(VkLayerTest, NumSamplesMismatch) {
11675 // Create CommandBuffer where MSAA samples doesn't match RenderPass
11676 // sampleCount
11677 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011678
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011680 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011681
Tobin Ehlis3b780662015-05-28 12:11:26 -060011682 ASSERT_NO_FATAL_FAILURE(InitState());
11683 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011684 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060011685 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011686 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011687
11688 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011689 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11690 ds_pool_ci.pNext = NULL;
11691 ds_pool_ci.maxSets = 1;
11692 ds_pool_ci.poolSizeCount = 1;
11693 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011694
Tobin Ehlis3b780662015-05-28 12:11:26 -060011695 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011696 err =
11697 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011698 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011699
Tony Barboureb254902015-07-15 12:50:33 -060011700 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080011701 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060011702 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080011703 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011704 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11705 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011706
Tony Barboureb254902015-07-15 12:50:33 -060011707 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11708 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11709 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011710 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011711 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011712
Tobin Ehlis3b780662015-05-28 12:11:26 -060011713 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011714 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11715 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011716 ASSERT_VK_SUCCESS(err);
11717
11718 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011719 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011720 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011721 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011722 alloc_info.descriptorPool = ds_pool;
11723 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011724 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11725 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011726 ASSERT_VK_SUCCESS(err);
11727
Tony Barboureb254902015-07-15 12:50:33 -060011728 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011729 pipe_ms_state_ci.sType =
11730 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11731 pipe_ms_state_ci.pNext = NULL;
11732 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11733 pipe_ms_state_ci.sampleShadingEnable = 0;
11734 pipe_ms_state_ci.minSampleShading = 1.0;
11735 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011736
Tony Barboureb254902015-07-15 12:50:33 -060011737 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011738 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11739 pipeline_layout_ci.pNext = NULL;
11740 pipeline_layout_ci.setLayoutCount = 1;
11741 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011742
11743 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011744 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11745 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011746 ASSERT_VK_SUCCESS(err);
11747
Karl Schultz6addd812016-02-02 17:17:23 -070011748 VkShaderObj vs(m_device, bindStateVertShaderText,
11749 VK_SHADER_STAGE_VERTEX_BIT, this);
11750 VkShaderObj fs(m_device, bindStateFragShaderText,
11751 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011752 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070011753 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011754 VkPipelineObj pipe(m_device);
11755 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011756 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011757 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011758 pipe.SetMSAA(&pipe_ms_state_ci);
11759 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011760
Tony Barbourfe3351b2015-07-28 10:17:20 -060011761 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070011762 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11763 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011764
Mark Young29927482016-05-04 14:38:51 -060011765 // Render triangle (the error should trigger on the attempt to draw).
11766 Draw(3, 1, 0, 0);
11767
11768 // Finalize recording of the command buffer
11769 EndCommandBuffer();
11770
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011771 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011772
Chia-I Wuf7458c52015-10-26 21:10:41 +080011773 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11774 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11775 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011776}
Mark Young29927482016-05-04 14:38:51 -060011777
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011778TEST_F(VkLayerTest, RenderPassIncompatible) {
11779 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
11780 "Initial case is drawing with an active renderpass that's "
11781 "not compatible with the bound PSO's creation renderpass");
11782 VkResult err;
11783
11784 ASSERT_NO_FATAL_FAILURE(InitState());
11785 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11786
11787 VkDescriptorSetLayoutBinding dsl_binding = {};
11788 dsl_binding.binding = 0;
11789 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11790 dsl_binding.descriptorCount = 1;
11791 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11792 dsl_binding.pImmutableSamplers = NULL;
11793
11794 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11795 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11796 ds_layout_ci.pNext = NULL;
11797 ds_layout_ci.bindingCount = 1;
11798 ds_layout_ci.pBindings = &dsl_binding;
11799
11800 VkDescriptorSetLayout ds_layout;
11801 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11802 &ds_layout);
11803 ASSERT_VK_SUCCESS(err);
11804
11805 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11806 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11807 pipeline_layout_ci.pNext = NULL;
11808 pipeline_layout_ci.setLayoutCount = 1;
11809 pipeline_layout_ci.pSetLayouts = &ds_layout;
11810
11811 VkPipelineLayout pipeline_layout;
11812 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11813 &pipeline_layout);
11814 ASSERT_VK_SUCCESS(err);
11815
11816 VkShaderObj vs(m_device, bindStateVertShaderText,
11817 VK_SHADER_STAGE_VERTEX_BIT, this);
11818 VkShaderObj fs(m_device, bindStateFragShaderText,
11819 VK_SHADER_STAGE_FRAGMENT_BIT,
11820 this); // We shouldn't need a fragment shader
11821 // but add it to be able to run on more devices
11822 // Create a renderpass that will be incompatible with default renderpass
11823 VkAttachmentReference attach = {};
11824 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11825 VkAttachmentReference color_att = {};
11826 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11827 VkSubpassDescription subpass = {};
11828 subpass.inputAttachmentCount = 1;
11829 subpass.pInputAttachments = &attach;
11830 subpass.colorAttachmentCount = 1;
11831 subpass.pColorAttachments = &color_att;
11832 VkRenderPassCreateInfo rpci = {};
11833 rpci.subpassCount = 1;
11834 rpci.pSubpasses = &subpass;
11835 rpci.attachmentCount = 1;
11836 VkAttachmentDescription attach_desc = {};
11837 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011838 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11839 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011840 rpci.pAttachments = &attach_desc;
11841 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11842 VkRenderPass rp;
11843 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11844 VkPipelineObj pipe(m_device);
11845 pipe.AddShader(&vs);
11846 pipe.AddShader(&fs);
11847 pipe.AddColorAttachment();
11848 VkViewport view_port = {};
11849 m_viewports.push_back(view_port);
11850 pipe.SetViewport(m_viewports);
11851 VkRect2D rect = {};
11852 m_scissors.push_back(rect);
11853 pipe.SetScissor(m_scissors);
11854 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11855
11856 VkCommandBufferInheritanceInfo cbii = {};
11857 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11858 cbii.renderPass = rp;
11859 cbii.subpass = 0;
11860 VkCommandBufferBeginInfo cbbi = {};
11861 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11862 cbbi.pInheritanceInfo = &cbii;
11863 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11864 VkRenderPassBeginInfo rpbi = {};
11865 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11866 rpbi.framebuffer = m_framebuffer;
11867 rpbi.renderPass = rp;
11868 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi,
11869 VK_SUBPASS_CONTENTS_INLINE);
11870 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11871 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11872
11873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11874 " is incompatible w/ gfx pipeline ");
11875 // Render triangle (the error should trigger on the attempt to draw).
11876 Draw(3, 1, 0, 0);
11877
11878 // Finalize recording of the command buffer
11879 EndCommandBuffer();
11880
11881 m_errorMonitor->VerifyFound();
11882
11883 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11884 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11885 vkDestroyRenderPass(m_device->device(), rp, NULL);
11886}
11887
Mark Youngc89c6312016-03-31 16:03:20 -060011888TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11889 // Create Pipeline where the number of blend attachments doesn't match the
11890 // number of color attachments. In this case, we don't add any color
11891 // blend attachments even though we have a color attachment.
11892 VkResult err;
11893
11894 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -060011895 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -060011896
11897 ASSERT_NO_FATAL_FAILURE(InitState());
11898 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11899 VkDescriptorPoolSize ds_type_count = {};
11900 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11901 ds_type_count.descriptorCount = 1;
11902
11903 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11904 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11905 ds_pool_ci.pNext = NULL;
11906 ds_pool_ci.maxSets = 1;
11907 ds_pool_ci.poolSizeCount = 1;
11908 ds_pool_ci.pPoolSizes = &ds_type_count;
11909
11910 VkDescriptorPool ds_pool;
11911 err =
11912 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11913 ASSERT_VK_SUCCESS(err);
11914
11915 VkDescriptorSetLayoutBinding dsl_binding = {};
11916 dsl_binding.binding = 0;
11917 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11918 dsl_binding.descriptorCount = 1;
11919 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11920 dsl_binding.pImmutableSamplers = NULL;
11921
11922 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11923 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11924 ds_layout_ci.pNext = NULL;
11925 ds_layout_ci.bindingCount = 1;
11926 ds_layout_ci.pBindings = &dsl_binding;
11927
11928 VkDescriptorSetLayout ds_layout;
11929 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11930 &ds_layout);
11931 ASSERT_VK_SUCCESS(err);
11932
11933 VkDescriptorSet descriptorSet;
11934 VkDescriptorSetAllocateInfo alloc_info = {};
11935 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11936 alloc_info.descriptorSetCount = 1;
11937 alloc_info.descriptorPool = ds_pool;
11938 alloc_info.pSetLayouts = &ds_layout;
11939 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11940 &descriptorSet);
11941 ASSERT_VK_SUCCESS(err);
11942
11943 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
11944 pipe_ms_state_ci.sType =
11945 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11946 pipe_ms_state_ci.pNext = NULL;
11947 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11948 pipe_ms_state_ci.sampleShadingEnable = 0;
11949 pipe_ms_state_ci.minSampleShading = 1.0;
11950 pipe_ms_state_ci.pSampleMask = NULL;
11951
11952 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11953 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11954 pipeline_layout_ci.pNext = NULL;
11955 pipeline_layout_ci.setLayoutCount = 1;
11956 pipeline_layout_ci.pSetLayouts = &ds_layout;
11957
11958 VkPipelineLayout pipeline_layout;
11959 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11960 &pipeline_layout);
11961 ASSERT_VK_SUCCESS(err);
11962
11963 VkShaderObj vs(m_device, bindStateVertShaderText,
11964 VK_SHADER_STAGE_VERTEX_BIT, this);
11965 VkShaderObj fs(m_device, bindStateFragShaderText,
11966 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011967 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -060011968 // but add it to be able to run on more devices
11969 VkPipelineObj pipe(m_device);
11970 pipe.AddShader(&vs);
11971 pipe.AddShader(&fs);
11972 pipe.SetMSAA(&pipe_ms_state_ci);
11973 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11974
11975 BeginCommandBuffer();
11976 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11977 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11978
Mark Young29927482016-05-04 14:38:51 -060011979 // Render triangle (the error should trigger on the attempt to draw).
11980 Draw(3, 1, 0, 0);
11981
11982 // Finalize recording of the command buffer
11983 EndCommandBuffer();
11984
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011985 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011986
11987 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11988 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11989 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11990}
Mark Young29927482016-05-04 14:38:51 -060011991
Mark Muellerd4914412016-06-13 17:52:06 -060011992TEST_F(VkLayerTest, MissingClearAttachment) {
11993 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
11994 "structure passed to vkCmdClearAttachments");
11995 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11996 "vkCmdClearAttachments() attachment index 1 not found in attachment "
11997 "reference array of active subpass 0");
11998
11999 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
12000 m_errorMonitor->VerifyFound();
12001}
12002
Karl Schultz6addd812016-02-02 17:17:23 -070012003TEST_F(VkLayerTest, ClearCmdNoDraw) {
12004 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
12005 // to issuing a Draw
12006 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012007
Karl Schultz6addd812016-02-02 17:17:23 -070012008 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -070012009 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012010 "vkCmdClearAttachments() issued on CB object ");
12011
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012012 ASSERT_NO_FATAL_FAILURE(InitState());
12013 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060012014
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012015 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012016 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12017 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012018
12019 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012020 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12021 ds_pool_ci.pNext = NULL;
12022 ds_pool_ci.maxSets = 1;
12023 ds_pool_ci.poolSizeCount = 1;
12024 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060012025
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012026 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070012027 err =
12028 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012029 ASSERT_VK_SUCCESS(err);
12030
Tony Barboureb254902015-07-15 12:50:33 -060012031 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012032 dsl_binding.binding = 0;
12033 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12034 dsl_binding.descriptorCount = 1;
12035 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12036 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012037
Tony Barboureb254902015-07-15 12:50:33 -060012038 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012039 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12040 ds_layout_ci.pNext = NULL;
12041 ds_layout_ci.bindingCount = 1;
12042 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012043
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012044 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012045 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
12046 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012047 ASSERT_VK_SUCCESS(err);
12048
12049 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012050 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012051 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012052 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012053 alloc_info.descriptorPool = ds_pool;
12054 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012055 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
12056 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012057 ASSERT_VK_SUCCESS(err);
12058
Tony Barboureb254902015-07-15 12:50:33 -060012059 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012060 pipe_ms_state_ci.sType =
12061 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
12062 pipe_ms_state_ci.pNext = NULL;
12063 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
12064 pipe_ms_state_ci.sampleShadingEnable = 0;
12065 pipe_ms_state_ci.minSampleShading = 1.0;
12066 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012067
Tony Barboureb254902015-07-15 12:50:33 -060012068 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012069 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12070 pipeline_layout_ci.pNext = NULL;
12071 pipeline_layout_ci.setLayoutCount = 1;
12072 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012073
12074 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012075 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
12076 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012077 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012078
Karl Schultz6addd812016-02-02 17:17:23 -070012079 VkShaderObj vs(m_device, bindStateVertShaderText,
12080 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060012081 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070012082 // on more devices
12083 VkShaderObj fs(m_device, bindStateFragShaderText,
12084 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012085
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012086 VkPipelineObj pipe(m_device);
12087 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012088 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012089 pipe.SetMSAA(&pipe_ms_state_ci);
12090 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060012091
12092 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012093
Karl Schultz6addd812016-02-02 17:17:23 -070012094 // Main thing we care about for this test is that the VkImage obj we're
12095 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012096 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060012097 VkClearAttachment color_attachment;
12098 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12099 color_attachment.clearValue.color.float32[0] = 1.0;
12100 color_attachment.clearValue.color.float32[1] = 1.0;
12101 color_attachment.clearValue.color.float32[2] = 1.0;
12102 color_attachment.clearValue.color.float32[3] = 1.0;
12103 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070012104 VkClearRect clear_rect = {
12105 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012106
Karl Schultz6addd812016-02-02 17:17:23 -070012107 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
12108 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012109
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012110 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012111
Chia-I Wuf7458c52015-10-26 21:10:41 +080012112 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12113 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12114 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012115}
12116
Karl Schultz6addd812016-02-02 17:17:23 -070012117TEST_F(VkLayerTest, VtxBufferBadIndex) {
12118 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012119
Karl Schultz6addd812016-02-02 17:17:23 -070012120 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012121 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -070012122 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012123
Tobin Ehlis502480b2015-06-24 15:53:07 -060012124 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060012125 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060012126 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060012127
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012128 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012129 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12130 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012131
12132 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012133 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12134 ds_pool_ci.pNext = NULL;
12135 ds_pool_ci.maxSets = 1;
12136 ds_pool_ci.poolSizeCount = 1;
12137 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060012138
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060012139 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070012140 err =
12141 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012142 ASSERT_VK_SUCCESS(err);
12143
Tony Barboureb254902015-07-15 12:50:33 -060012144 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012145 dsl_binding.binding = 0;
12146 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12147 dsl_binding.descriptorCount = 1;
12148 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12149 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012150
Tony Barboureb254902015-07-15 12:50:33 -060012151 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012152 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12153 ds_layout_ci.pNext = NULL;
12154 ds_layout_ci.bindingCount = 1;
12155 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060012156
Tobin Ehlis502480b2015-06-24 15:53:07 -060012157 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012158 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
12159 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012160 ASSERT_VK_SUCCESS(err);
12161
12162 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012163 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012164 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012165 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012166 alloc_info.descriptorPool = ds_pool;
12167 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012168 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
12169 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012170 ASSERT_VK_SUCCESS(err);
12171
Tony Barboureb254902015-07-15 12:50:33 -060012172 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012173 pipe_ms_state_ci.sType =
12174 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
12175 pipe_ms_state_ci.pNext = NULL;
12176 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12177 pipe_ms_state_ci.sampleShadingEnable = 0;
12178 pipe_ms_state_ci.minSampleShading = 1.0;
12179 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012180
Tony Barboureb254902015-07-15 12:50:33 -060012181 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012182 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12183 pipeline_layout_ci.pNext = NULL;
12184 pipeline_layout_ci.setLayoutCount = 1;
12185 pipeline_layout_ci.pSetLayouts = &ds_layout;
12186 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012187
Karl Schultz6addd812016-02-02 17:17:23 -070012188 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
12189 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012190 ASSERT_VK_SUCCESS(err);
12191
Karl Schultz6addd812016-02-02 17:17:23 -070012192 VkShaderObj vs(m_device, bindStateVertShaderText,
12193 VK_SHADER_STAGE_VERTEX_BIT, this);
12194 VkShaderObj fs(m_device, bindStateFragShaderText,
12195 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060012196 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070012197 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012198 VkPipelineObj pipe(m_device);
12199 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012200 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060012201 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012202 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060012203 pipe.SetViewport(m_viewports);
12204 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012205 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060012206
12207 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070012208 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
12209 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060012210 // Don't care about actual data, just need to get to draw to flag error
12211 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -070012212 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
12213 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060012214 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060012215 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012216
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012217 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012218
Chia-I Wuf7458c52015-10-26 21:10:41 +080012219 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12220 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12221 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012222}
Mark Muellerdfe37552016-07-07 14:47:42 -060012223
Mark Mueller2ee294f2016-08-04 12:59:48 -060012224TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
12225 TEST_DESCRIPTION("Use an invalid count in a vkEnumeratePhysicalDevices call."
12226 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour6514a6b2016-08-12 09:37:19 -060012227 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Mueller2ee294f2016-08-04 12:59:48 -060012228
12229 const char *mismatch_count_message =
12230 "Call to vkEnumeratePhysicalDevices() "
12231 "w/ pPhysicalDeviceCount value ";
12232
12233 const char *invalid_queueFamilyIndex_message =
12234 "Invalid queue create request in vkCreateDevice(). Invalid "
12235 "queueFamilyIndex ";
12236
12237 const char *unavailable_feature_message =
12238 "While calling vkCreateDevice(), requesting feature #";
12239
12240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
12241 mismatch_count_message);
Mark Mueller880fce52016-08-17 15:23:23 -060012242 // The following test fails with recent NVidia drivers.
12243 // By the time core_validation is reached, the NVidia
12244 // driver has sanitized the invalid condition and core_validation
12245 // is not introduced to the failure condition. This is not the case
12246 // with AMD and Mesa drivers. Futher investigation is required
12247// uint32_t count = static_cast<uint32_t>(~0);
12248// VkPhysicalDevice physical_device;
12249// vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
12250// m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060012251
12252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12253 invalid_queueFamilyIndex_message);
12254 float queue_priority = 0.0;
12255
12256 VkDeviceQueueCreateInfo queue_create_info = {};
12257 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
12258 queue_create_info.queueCount = 1;
12259 queue_create_info.pQueuePriorities = &queue_priority;
12260 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
12261
12262 VkPhysicalDeviceFeatures features = m_device->phy().features();
12263 VkDevice testDevice;
12264 VkDeviceCreateInfo device_create_info = {};
12265 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
12266 device_create_info.queueCreateInfoCount = 1;
12267 device_create_info.pQueueCreateInfos = &queue_create_info;
12268 device_create_info.pEnabledFeatures = &features;
12269 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12270 m_errorMonitor->VerifyFound();
12271
12272 queue_create_info.queueFamilyIndex = 1;
12273
12274 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
12275 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
12276 for (unsigned i = 0; i < feature_count; i++) {
12277 if (VK_FALSE == feature_array[i]) {
12278 feature_array[i] = VK_TRUE;
12279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12280 unavailable_feature_message);
12281 device_create_info.pEnabledFeatures = &features;
12282 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12283 m_errorMonitor->VerifyFound();
12284 break;
12285 }
12286 }
12287}
12288
12289TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
12290 TEST_DESCRIPTION("Use an invalid queue index in a vkCmdWaitEvents call."
12291 "End a command buffer with a query still in progress.");
12292
12293 const char *invalid_queue_index =
12294 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
12295 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
12296 "must be.";
12297
12298 const char *invalid_query =
12299 "Ending command buffer with in progress query: queryPool 0x";
12300
12301 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12302 invalid_queue_index);
12303
12304 ASSERT_NO_FATAL_FAILURE(InitState());
12305
12306 VkEvent event;
12307 VkEventCreateInfo event_create_info{};
12308 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12309 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12310
12311
12312 VkQueue queue = VK_NULL_HANDLE;
12313 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
12314 0, &queue);
12315
12316 BeginCommandBuffer();
12317
12318 VkImageObj image(m_device);
12319 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
12320 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12321 ASSERT_TRUE(image.initialized());
12322 VkImageMemoryBarrier img_barrier = {};
12323 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12324 img_barrier.pNext = NULL;
12325 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
12326 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
12327 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12328 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12329 img_barrier.image = image.handle();
12330 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060012331
12332 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
12333 // that layer validation catches the case when it is not.
12334 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012335 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12336 img_barrier.subresourceRange.baseArrayLayer = 0;
12337 img_barrier.subresourceRange.baseMipLevel = 0;
12338 img_barrier.subresourceRange.layerCount = 1;
12339 img_barrier.subresourceRange.levelCount = 1;
12340 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event,
12341 VK_PIPELINE_STAGE_HOST_BIT,
12342 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
12343 nullptr, 1, &img_barrier);
12344 m_errorMonitor->VerifyFound();
12345
12346 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12347 invalid_query);
12348
12349 VkQueryPool query_pool;
12350 VkQueryPoolCreateInfo query_pool_create_info = {};
12351 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12352 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
12353 query_pool_create_info.queryCount = 1;
12354 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
12355 &query_pool);
12356
12357 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/,
12358 1 /*queryCount*/);
12359 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
12360
12361 vkEndCommandBuffer(m_commandBuffer->handle());
12362 m_errorMonitor->VerifyFound();
12363
12364 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
12365 vkDestroyEvent(m_device->device(), event, nullptr);
12366}
12367
Mark Muellerdfe37552016-07-07 14:47:42 -060012368TEST_F(VkLayerTest, VertexBufferInvalid) {
12369 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
12370 "delete a buffer twice, use an invalid offset for each "
12371 "buffer type, and attempt to bind a null buffer");
12372
12373 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
12374 "using deleted buffer ";
12375 const char *double_destroy_message = "Cannot free buffer 0x";
12376 const char *invalid_offset_message = "vkBindBufferMemory(): "
12377 "memoryOffset is 0x";
12378 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
12379 "storage memoryOffset "
12380 "is 0x";
12381 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
12382 "texel memoryOffset "
12383 "is 0x";
12384 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
12385 "uniform memoryOffset "
12386 "is 0x";
12387 const char *bind_null_buffer_message = "In vkBindBufferMemory, attempting"
12388 " to Bind Obj(0x";
12389 const char *free_invalid_buffer_message = "Request to delete memory "
12390 "object 0x";
12391
12392 ASSERT_NO_FATAL_FAILURE(InitState());
12393 ASSERT_NO_FATAL_FAILURE(InitViewport());
12394 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12395
12396 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
12397 pipe_ms_state_ci.sType =
12398 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
12399 pipe_ms_state_ci.pNext = NULL;
12400 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12401 pipe_ms_state_ci.sampleShadingEnable = 0;
12402 pipe_ms_state_ci.minSampleShading = 1.0;
12403 pipe_ms_state_ci.pSampleMask = nullptr;
12404
12405 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12406 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12407 VkPipelineLayout pipeline_layout;
12408
12409 VkResult err = vkCreatePipelineLayout(m_device->device(),
12410 &pipeline_layout_ci, nullptr,
12411 &pipeline_layout);
12412 ASSERT_VK_SUCCESS(err);
12413
12414 VkShaderObj vs(m_device, bindStateVertShaderText,
12415 VK_SHADER_STAGE_VERTEX_BIT, this);
12416 VkShaderObj fs(m_device, bindStateFragShaderText,
12417 VK_SHADER_STAGE_FRAGMENT_BIT,
12418 this);
12419 VkPipelineObj pipe(m_device);
12420 pipe.AddShader(&vs);
12421 pipe.AddShader(&fs);
12422 pipe.AddColorAttachment();
12423 pipe.SetMSAA(&pipe_ms_state_ci);
12424 pipe.SetViewport(m_viewports);
12425 pipe.SetScissor(m_scissors);
12426 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12427
12428 BeginCommandBuffer();
12429 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
12430 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12431
12432 {
12433 // Create and bind a vertex buffer in a reduced scope, which will cause
12434 // it to be deleted upon leaving this scope
12435 const float vbo_data[3] = {1.f, 0.f, 1.f};
12436 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data),
12437 3, vbo_data);
12438 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
12439 draw_verticies.AddVertexInputToPipe(pipe);
12440 }
12441
12442 Draw(1, 0, 0, 0);
12443
12444 EndCommandBuffer();
12445
12446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12447 deleted_buffer_in_command_buffer);
12448 QueueCommandBuffer(false);
12449 m_errorMonitor->VerifyFound();
12450
12451 {
12452 // Create and bind a vertex buffer in a reduced scope, and delete it
12453 // twice, the second through the destructor
12454 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12455 VkBufferTest::eDoubleDelete);
12456 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12457 double_destroy_message);
12458 buffer_test.TestDoubleDestroy();
12459 }
12460 m_errorMonitor->VerifyFound();
12461
12462 if (VkBufferTest::
12463 GetTestConditionValid(m_device,
12464 VkBufferTest::eInvalidMemoryOffset)) {
12465 // Create and bind a memory buffer with an invalid offset.
12466 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12467 invalid_offset_message);
12468 VkBufferTest buffer_test(m_device,
12469 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
12470 VkBufferTest::eInvalidMemoryOffset);
12471 (void) buffer_test;
12472 m_errorMonitor->VerifyFound();
12473 }
12474
12475 if (VkBufferTest::
12476 GetTestConditionValid(m_device,
12477 VkBufferTest::eInvalidDeviceOffset,
12478 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
12479 // Create and bind a memory buffer with an invalid offset again,
12480 // but look for a texel buffer message.
12481 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12482 invalid_texel_buffer_offset_message);
12483 VkBufferTest buffer_test(m_device,
12484 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
12485 VkBufferTest::eInvalidDeviceOffset);
12486 (void) buffer_test;
12487 m_errorMonitor->VerifyFound();
12488 }
12489
12490 if (VkBufferTest::
12491 GetTestConditionValid(m_device,
12492 VkBufferTest::eInvalidDeviceOffset,
12493 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
12494 // Create and bind a memory buffer with an invalid offset again, but
12495 // look for a uniform buffer message.
12496 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12497 invalid_uniform_buffer_offset_message);
12498 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
12499 VkBufferTest::eInvalidDeviceOffset);
12500 (void) buffer_test;
12501 m_errorMonitor->VerifyFound();
12502 }
12503
12504 if (VkBufferTest::
12505 GetTestConditionValid(m_device,
12506 VkBufferTest::eInvalidDeviceOffset,
12507 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
12508 // Create and bind a memory buffer with an invalid offset again, but
12509 // look for a storage buffer message.
12510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12511 invalid_storage_buffer_offset_message);
12512 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12513 VkBufferTest::eInvalidDeviceOffset);
12514 (void) buffer_test;
12515 m_errorMonitor->VerifyFound();
12516 }
12517
12518 {
12519 // Attempt to bind a null buffer.
12520 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12521 bind_null_buffer_message);
12522 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12523 VkBufferTest::eBindNullBuffer);
12524 (void) buffer_test;
12525 m_errorMonitor->VerifyFound();
12526 }
12527
12528 {
12529 // Attempt to use an invalid handle to delete a buffer.
12530 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12531 free_invalid_buffer_message);
12532 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12533 VkBufferTest::eFreeInvalidHandle);
12534 (void) buffer_test;
12535 }
12536 m_errorMonitor->VerifyFound();
12537
12538 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12539}
12540
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012541// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
12542TEST_F(VkLayerTest, InvalidImageLayout) {
12543 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
12544 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
12545 "images in the wrong layout when they're copied or transitioned.");
12546 // 3 in ValidateCmdBufImageLayouts
12547 // * -1 Attempt to submit cmd buf w/ deleted image
12548 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
12549 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
12550 m_errorMonitor->SetDesiredFailureMsg(
12551 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12552 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12553
12554 ASSERT_NO_FATAL_FAILURE(InitState());
12555 // Create src & dst images to use for copy operations
12556 VkImage src_image;
12557 VkImage dst_image;
12558
12559 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
12560 const int32_t tex_width = 32;
12561 const int32_t tex_height = 32;
12562
12563 VkImageCreateInfo image_create_info = {};
12564 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12565 image_create_info.pNext = NULL;
12566 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12567 image_create_info.format = tex_format;
12568 image_create_info.extent.width = tex_width;
12569 image_create_info.extent.height = tex_height;
12570 image_create_info.extent.depth = 1;
12571 image_create_info.mipLevels = 1;
12572 image_create_info.arrayLayers = 4;
12573 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
12574 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
12575 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
12576 image_create_info.flags = 0;
12577
12578 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
12579 ASSERT_VK_SUCCESS(err);
12580 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
12581 ASSERT_VK_SUCCESS(err);
12582
12583 BeginCommandBuffer();
12584 VkImageCopy copyRegion;
12585 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12586 copyRegion.srcSubresource.mipLevel = 0;
12587 copyRegion.srcSubresource.baseArrayLayer = 0;
12588 copyRegion.srcSubresource.layerCount = 1;
12589 copyRegion.srcOffset.x = 0;
12590 copyRegion.srcOffset.y = 0;
12591 copyRegion.srcOffset.z = 0;
12592 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12593 copyRegion.dstSubresource.mipLevel = 0;
12594 copyRegion.dstSubresource.baseArrayLayer = 0;
12595 copyRegion.dstSubresource.layerCount = 1;
12596 copyRegion.dstOffset.x = 0;
12597 copyRegion.dstOffset.y = 0;
12598 copyRegion.dstOffset.z = 0;
12599 copyRegion.extent.width = 1;
12600 copyRegion.extent.height = 1;
12601 copyRegion.extent.depth = 1;
12602 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12603 m_errorMonitor->VerifyFound();
12604 // Now cause error due to src image layout changing
12605 m_errorMonitor->SetDesiredFailureMsg(
12606 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12607 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
12608 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12609 m_errorMonitor->VerifyFound();
12610 // Final src error is due to bad layout type
12611 m_errorMonitor->SetDesiredFailureMsg(
12612 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12613 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
12614 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12615 m_errorMonitor->VerifyFound();
12616 // Now verify same checks for dst
12617 m_errorMonitor->SetDesiredFailureMsg(
12618 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12619 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
12620 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12621 m_errorMonitor->VerifyFound();
12622 // Now cause error due to src image layout changing
12623 m_errorMonitor->SetDesiredFailureMsg(
12624 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12625 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
12626 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
12627 m_errorMonitor->VerifyFound();
12628 m_errorMonitor->SetDesiredFailureMsg(
12629 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12630 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
12631 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
12632 m_errorMonitor->VerifyFound();
12633 // Now cause error due to bad image layout transition in PipelineBarrier
12634 VkImageMemoryBarrier image_barrier[1] = {};
12635 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12636 image_barrier[0].image = src_image;
12637 image_barrier[0].subresourceRange.layerCount = 2;
12638 image_barrier[0].subresourceRange.levelCount = 2;
12639 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12640 m_errorMonitor->SetDesiredFailureMsg(
12641 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12642 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
12643 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
12644 m_errorMonitor->VerifyFound();
12645
12646 // Finally some layout errors at RenderPass create time
12647 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
12648 VkAttachmentReference attach = {};
12649 // perf warning for GENERAL layout w/ non-DS input attachment
12650 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12651 VkSubpassDescription subpass = {};
12652 subpass.inputAttachmentCount = 1;
12653 subpass.pInputAttachments = &attach;
12654 VkRenderPassCreateInfo rpci = {};
12655 rpci.subpassCount = 1;
12656 rpci.pSubpasses = &subpass;
12657 rpci.attachmentCount = 1;
12658 VkAttachmentDescription attach_desc = {};
12659 attach_desc.format = VK_FORMAT_UNDEFINED;
12660 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012661 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012662 VkRenderPass rp;
12663 m_errorMonitor->SetDesiredFailureMsg(
12664 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12665 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
12666 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12667 m_errorMonitor->VerifyFound();
12668 // error w/ non-general layout
12669 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12670
12671 m_errorMonitor->SetDesiredFailureMsg(
12672 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12673 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
12674 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12675 m_errorMonitor->VerifyFound();
12676 subpass.inputAttachmentCount = 0;
12677 subpass.colorAttachmentCount = 1;
12678 subpass.pColorAttachments = &attach;
12679 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12680 // perf warning for GENERAL layout on color attachment
12681 m_errorMonitor->SetDesiredFailureMsg(
12682 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12683 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
12684 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12685 m_errorMonitor->VerifyFound();
12686 // error w/ non-color opt or GENERAL layout for color attachment
12687 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12688 m_errorMonitor->SetDesiredFailureMsg(
12689 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12690 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12691 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12692 m_errorMonitor->VerifyFound();
12693 subpass.colorAttachmentCount = 0;
12694 subpass.pDepthStencilAttachment = &attach;
12695 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12696 // perf warning for GENERAL layout on DS attachment
12697 m_errorMonitor->SetDesiredFailureMsg(
12698 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Chris Forbesc5dd9bc2016-08-09 08:17:14 +120012699 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012700 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12701 m_errorMonitor->VerifyFound();
12702 // error w/ non-ds opt or GENERAL layout for color attachment
12703 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12704 m_errorMonitor->SetDesiredFailureMsg(
12705 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesc5dd9bc2016-08-09 08:17:14 +120012706 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012707 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12708 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012709 // For this error we need a valid renderpass so create default one
12710 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12711 attach.attachment = 0;
12712 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
12713 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12714 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12715 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12716 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12717 // Can't do a CLEAR load on READ_ONLY initialLayout
12718 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12719 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12720 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12722 " with invalid first layout "
12723 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
12724 "ONLY_OPTIMAL");
12725 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12726 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012727
12728 vkDestroyImage(m_device->device(), src_image, NULL);
12729 vkDestroyImage(m_device->device(), dst_image, NULL);
12730}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012731
12732TEST_F(VkLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
12733 TEST_DESCRIPTION("Positive test where we create a renderpass with an "
12734 "attachment that uses LOAD_OP_CLEAR, the first subpass "
12735 "has a valid layout, and a second subpass then uses a "
12736 "valid *READ_ONLY* layout.");
12737 m_errorMonitor->ExpectSuccess();
12738 ASSERT_NO_FATAL_FAILURE(InitState());
12739
12740 VkAttachmentReference attach[2] = {};
12741 attach[0].attachment = 0;
12742 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
12743 attach[1].attachment = 0;
12744 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12745 VkSubpassDescription subpasses[2] = {};
12746 // First subpass clears DS attach on load
12747 subpasses[0].pDepthStencilAttachment = &attach[0];
12748 // 2nd subpass reads in DS as input attachment
12749 subpasses[1].inputAttachmentCount = 1;
12750 subpasses[1].pInputAttachments = &attach[1];
12751 VkAttachmentDescription attach_desc = {};
12752 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
12753 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12754 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12755 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12756 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12757 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12758 attach_desc.initialLayout =
12759 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
12760 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12761 VkRenderPassCreateInfo rpci = {};
12762 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
12763 rpci.attachmentCount = 1;
12764 rpci.pAttachments = &attach_desc;
12765 rpci.subpassCount = 2;
12766 rpci.pSubpasses = subpasses;
12767
12768 // Now create RenderPass and verify no errors
12769 VkRenderPass rp;
12770 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12771 m_errorMonitor->VerifyNotFound();
12772
12773 vkDestroyRenderPass(m_device->device(), rp, NULL);
12774}
Tobin Ehlis4af23302016-07-19 10:50:30 -060012775
12776TEST_F(VkLayerTest, FramebufferIncompatible) {
12777 TEST_DESCRIPTION("Bind a secondary command buffer with with a framebuffer "
12778 "that does not match the framebuffer for the active "
12779 "renderpass.");
12780 ASSERT_NO_FATAL_FAILURE(InitState());
12781 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12782
12783 // A renderpass with one color attachment.
12784 VkAttachmentDescription attachment = {
12785 0,
12786 VK_FORMAT_B8G8R8A8_UNORM,
12787 VK_SAMPLE_COUNT_1_BIT,
12788 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12789 VK_ATTACHMENT_STORE_OP_STORE,
12790 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12791 VK_ATTACHMENT_STORE_OP_DONT_CARE,
12792 VK_IMAGE_LAYOUT_UNDEFINED,
12793 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
12794
12795 VkAttachmentReference att_ref = {0,
12796 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
12797
12798 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS,
12799 0, nullptr,
12800 1, &att_ref,
12801 nullptr, nullptr,
12802 0, nullptr};
12803
12804 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
12805 nullptr,
12806 0,
12807 1,
12808 &attachment,
12809 1,
12810 &subpass,
12811 0,
12812 nullptr};
12813
12814 VkRenderPass rp;
12815 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
12816 ASSERT_VK_SUCCESS(err);
12817
12818 // A compatible framebuffer.
12819 VkImageObj image(m_device);
12820 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM,
12821 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12822 ASSERT_TRUE(image.initialized());
12823
12824 VkImageViewCreateInfo ivci = {
12825 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
12826 nullptr,
12827 0,
12828 image.handle(),
12829 VK_IMAGE_VIEW_TYPE_2D,
12830 VK_FORMAT_B8G8R8A8_UNORM,
12831 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
12832 VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
12833 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
12834 };
12835 VkImageView view;
12836 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
12837 ASSERT_VK_SUCCESS(err);
12838
12839 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
12840 nullptr,
12841 0,
12842 rp,
12843 1,
12844 &view,
12845 32,
12846 32,
12847 1};
12848 VkFramebuffer fb;
12849 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
12850 ASSERT_VK_SUCCESS(err);
12851
12852 VkCommandBufferAllocateInfo cbai = {};
12853 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12854 cbai.commandPool = m_commandPool;
12855 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12856 cbai.commandBufferCount = 1;
12857
12858 VkCommandBuffer sec_cb;
12859 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
12860 ASSERT_VK_SUCCESS(err);
12861 VkCommandBufferBeginInfo cbbi = {};
12862 VkCommandBufferInheritanceInfo cbii = {};
12863 cbii.renderPass = renderPass();
12864 cbii.framebuffer = fb;
12865 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12866 cbbi.pNext = NULL;
12867 cbbi.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
12868 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
12869 cbbi.pInheritanceInfo = &cbii;
12870 vkBeginCommandBuffer(sec_cb, &cbbi);
12871 vkEndCommandBuffer(sec_cb);
12872
12873 BeginCommandBuffer();
12874
12875 m_errorMonitor->SetDesiredFailureMsg(
12876 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12877 " that is not the same as the primaryCB's current active framebuffer ");
12878 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
12879 m_errorMonitor->VerifyFound();
12880 // Cleanup
12881 vkDestroyImageView(m_device->device(), view, NULL);
12882 vkDestroyRenderPass(m_device->device(), rp, NULL);
12883 vkDestroyFramebuffer(m_device->device(), fb, NULL);
12884}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012885
12886TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
12887 TEST_DESCRIPTION("If logicOp is available on the device, set it to an "
12888 "invalid value. If logicOp is not available, attempt to "
12889 "use it and verify that we see the correct error.");
12890 ASSERT_NO_FATAL_FAILURE(InitState());
12891 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12892
12893 auto features = m_device->phy().features();
12894 // Set the expected error depending on whether or not logicOp available
12895 if (VK_FALSE == features.logicOp) {
12896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12897 "If logic operations feature not "
12898 "enabled, logicOpEnable must be "
12899 "VK_FALSE");
12900 } else {
12901 m_errorMonitor->SetDesiredFailureMsg(
12902 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12903 ", logicOp must be a valid VkLogicOp value");
12904 }
12905 // Create a pipeline using logicOp
12906 VkResult err;
12907
12908 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12909 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12910
12911 VkPipelineLayout pipeline_layout;
12912 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
12913 &pipeline_layout);
12914 ASSERT_VK_SUCCESS(err);
12915
12916 VkPipelineViewportStateCreateInfo vp_state_ci = {};
12917 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
12918 vp_state_ci.viewportCount = 1;
12919 VkViewport vp = {}; // Just need dummy vp to point to
12920 vp_state_ci.pViewports = &vp;
12921 vp_state_ci.scissorCount = 1;
12922 VkRect2D scissors = {}; // Dummy scissors to point to
12923 vp_state_ci.pScissors = &scissors;
12924 // No dynamic state
12925 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
12926 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
12927
12928 VkPipelineShaderStageCreateInfo shaderStages[2];
12929 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
12930
12931 VkShaderObj vs(m_device, bindStateVertShaderText,
12932 VK_SHADER_STAGE_VERTEX_BIT, this);
12933 VkShaderObj fs(m_device, bindStateFragShaderText,
12934 VK_SHADER_STAGE_FRAGMENT_BIT,
12935 this);
12936 shaderStages[0] = vs.GetStageCreateInfo();
12937 shaderStages[1] = fs.GetStageCreateInfo();
12938
12939 VkPipelineVertexInputStateCreateInfo vi_ci = {};
12940 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
12941
12942 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
12943 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
12944 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
12945
12946 VkPipelineRasterizationStateCreateInfo rs_ci = {};
12947 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
12948
12949 VkPipelineColorBlendAttachmentState att = {};
12950 att.blendEnable = VK_FALSE;
12951 att.colorWriteMask = 0xf;
12952
12953 VkPipelineColorBlendStateCreateInfo cb_ci = {};
12954 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
12955 // Enable logicOp & set logicOp to value 1 beyond allowed entries
12956 cb_ci.logicOpEnable = VK_TRUE;
12957 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
12958 cb_ci.attachmentCount = 1;
12959 cb_ci.pAttachments = &att;
12960
12961 VkGraphicsPipelineCreateInfo gp_ci = {};
12962 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
12963 gp_ci.stageCount = 2;
12964 gp_ci.pStages = shaderStages;
12965 gp_ci.pVertexInputState = &vi_ci;
12966 gp_ci.pInputAssemblyState = &ia_ci;
12967 gp_ci.pViewportState = &vp_state_ci;
12968 gp_ci.pRasterizationState = &rs_ci;
12969 gp_ci.pColorBlendState = &cb_ci;
12970 gp_ci.pDynamicState = &dyn_state_ci;
12971 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
12972 gp_ci.layout = pipeline_layout;
12973 gp_ci.renderPass = renderPass();
12974
12975 VkPipelineCacheCreateInfo pc_ci = {};
12976 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
12977
12978 VkPipeline pipeline;
12979 VkPipelineCache pipelineCache;
12980 err =
12981 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
12982 ASSERT_VK_SUCCESS(err);
12983
12984 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
12985 &gp_ci, NULL, &pipeline);
12986 m_errorMonitor->VerifyFound();
12987 if (VK_SUCCESS == err) {
12988 vkDestroyPipeline(m_device->device(), pipeline, NULL);
12989 }
12990 m_errorMonitor->VerifyFound();
12991 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
12992 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12993}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012994#endif // DRAW_STATE_TESTS
12995
Tobin Ehlis0788f522015-05-26 16:11:58 -060012996#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060012997#if GTEST_IS_THREADSAFE
12998struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012999 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013000 VkEvent event;
13001 bool bailout;
13002};
13003
Karl Schultz6addd812016-02-02 17:17:23 -070013004extern "C" void *AddToCommandBuffer(void *arg) {
13005 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013006
Mike Stroyana6d14942016-07-13 15:10:05 -060013007 for (int i = 0; i < 80000; i++) {
Karl Schultz6addd812016-02-02 17:17:23 -070013008 vkCmdSetEvent(data->commandBuffer, data->event,
13009 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013010 if (data->bailout) {
13011 break;
13012 }
13013 }
13014 return NULL;
13015}
13016
Karl Schultz6addd812016-02-02 17:17:23 -070013017TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013018 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013019
Karl Schultz6addd812016-02-02 17:17:23 -070013020 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13021 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013022
Mike Stroyanaccf7692015-05-12 16:00:45 -060013023 ASSERT_NO_FATAL_FAILURE(InitState());
13024 ASSERT_NO_FATAL_FAILURE(InitViewport());
13025 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13026
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013027 // Calls AllocateCommandBuffers
13028 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013029
13030 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013031 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013032
13033 VkEventCreateInfo event_info;
13034 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013035 VkResult err;
13036
13037 memset(&event_info, 0, sizeof(event_info));
13038 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13039
Chia-I Wuf7458c52015-10-26 21:10:41 +080013040 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013041 ASSERT_VK_SUCCESS(err);
13042
Mike Stroyanaccf7692015-05-12 16:00:45 -060013043 err = vkResetEvent(device(), event);
13044 ASSERT_VK_SUCCESS(err);
13045
13046 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013047 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013048 data.event = event;
13049 data.bailout = false;
13050 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013051
13052 // First do some correct operations using multiple threads.
13053 // Add many entries to command buffer from another thread.
13054 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13055 // Make non-conflicting calls from this thread at the same time.
13056 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013057 uint32_t count;
13058 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013059 }
13060 test_platform_thread_join(thread, NULL);
13061
13062 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013063 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013064 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013065 // Add many entries to command buffer from this thread at the same time.
13066 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013067
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013068 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013069 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013070
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013071 m_errorMonitor->SetBailout(NULL);
13072
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013073 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013074
Chia-I Wuf7458c52015-10-26 21:10:41 +080013075 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013076}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013077#endif // GTEST_IS_THREADSAFE
13078#endif // THREADING_TESTS
13079
Chris Forbes9f7ff632015-05-25 11:13:08 +120013080#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070013081TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013082 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
13083 "with an impossible code size");
13084
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013085 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013086 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013087
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013088 ASSERT_NO_FATAL_FAILURE(InitState());
13089 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13090
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013091 VkShaderModule module;
13092 VkShaderModuleCreateInfo moduleCreateInfo;
13093 struct icd_spv_header spv;
13094
13095 spv.magic = ICD_SPV_MAGIC;
13096 spv.version = ICD_SPV_VERSION;
13097 spv.gen_magic = 0;
13098
13099 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13100 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013101 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013102 moduleCreateInfo.codeSize = 4;
13103 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013104 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013105
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013106 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013107}
13108
Karl Schultz6addd812016-02-02 17:17:23 -070013109TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013110 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
13111 "with a bad magic number");
13112
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013114 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013115
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013116 ASSERT_NO_FATAL_FAILURE(InitState());
13117 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13118
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013119 VkShaderModule module;
13120 VkShaderModuleCreateInfo moduleCreateInfo;
13121 struct icd_spv_header spv;
13122
13123 spv.magic = ~ICD_SPV_MAGIC;
13124 spv.version = ICD_SPV_VERSION;
13125 spv.gen_magic = 0;
13126
13127 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13128 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013129 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013130 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13131 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013132 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013133
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013134 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013135}
13136
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013137#if 0
13138// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013139TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013140 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013141 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013142
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013143 ASSERT_NO_FATAL_FAILURE(InitState());
13144 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13145
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013146 VkShaderModule module;
13147 VkShaderModuleCreateInfo moduleCreateInfo;
13148 struct icd_spv_header spv;
13149
13150 spv.magic = ICD_SPV_MAGIC;
13151 spv.version = ~ICD_SPV_VERSION;
13152 spv.gen_magic = 0;
13153
13154 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13155 moduleCreateInfo.pNext = NULL;
13156
Karl Schultz6addd812016-02-02 17:17:23 -070013157 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013158 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13159 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013160 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013161
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013162 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013163}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013164#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013165
Karl Schultz6addd812016-02-02 17:17:23 -070013166TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013167 TEST_DESCRIPTION("Test that a warning is produced for a vertex output that "
13168 "is not consumed by the fragment stage");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013169 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013170 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013171
Chris Forbes9f7ff632015-05-25 11:13:08 +120013172 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013173 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013174
13175 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013176 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120013177 "\n"
13178 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070013179 "out gl_PerVertex {\n"
13180 " vec4 gl_Position;\n"
13181 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120013182 "void main(){\n"
13183 " gl_Position = vec4(1);\n"
13184 " x = 0;\n"
13185 "}\n";
13186 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013187 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120013188 "\n"
13189 "layout(location=0) out vec4 color;\n"
13190 "void main(){\n"
13191 " color = vec4(1);\n"
13192 "}\n";
13193
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013194 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13195 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013196
13197 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013198 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013199 pipe.AddShader(&vs);
13200 pipe.AddShader(&fs);
13201
Chris Forbes9f7ff632015-05-25 11:13:08 +120013202 VkDescriptorSetObj descriptorSet(m_device);
13203 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013204 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013205
Tony Barbour5781e8f2015-08-04 16:23:11 -060013206 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013207
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013208 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013209}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013210
Karl Schultz6addd812016-02-02 17:17:23 -070013211TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013212 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
13213 "which is not present in the outputs of the previous stage");
13214
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013216 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013217
Chris Forbes59cb88d2015-05-25 11:13:13 +120013218 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013219 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013220
13221 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013222 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120013223 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013224 "out gl_PerVertex {\n"
13225 " vec4 gl_Position;\n"
13226 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120013227 "void main(){\n"
13228 " gl_Position = vec4(1);\n"
13229 "}\n";
13230 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013231 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120013232 "\n"
13233 "layout(location=0) in float x;\n"
13234 "layout(location=0) out vec4 color;\n"
13235 "void main(){\n"
13236 " color = vec4(x);\n"
13237 "}\n";
13238
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013239 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13240 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120013241
13242 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013243 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120013244 pipe.AddShader(&vs);
13245 pipe.AddShader(&fs);
13246
Chris Forbes59cb88d2015-05-25 11:13:13 +120013247 VkDescriptorSetObj descriptorSet(m_device);
13248 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013249 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120013250
Tony Barbour5781e8f2015-08-04 16:23:11 -060013251 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013252
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013253 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120013254}
13255
Karl Schultz6addd812016-02-02 17:17:23 -070013256TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013257 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
13258 "within an interace block, which is not present in the outputs "
13259 "of the previous stage.");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013260 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013261 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013262
13263 ASSERT_NO_FATAL_FAILURE(InitState());
13264 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13265
13266 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013267 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130013268 "\n"
13269 "out gl_PerVertex {\n"
13270 " vec4 gl_Position;\n"
13271 "};\n"
13272 "void main(){\n"
13273 " gl_Position = vec4(1);\n"
13274 "}\n";
13275 char const *fsSource =
13276 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130013277 "\n"
13278 "in block { layout(location=0) float x; } ins;\n"
13279 "layout(location=0) out vec4 color;\n"
13280 "void main(){\n"
13281 " color = vec4(ins.x);\n"
13282 "}\n";
13283
13284 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13285 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13286
13287 VkPipelineObj pipe(m_device);
13288 pipe.AddColorAttachment();
13289 pipe.AddShader(&vs);
13290 pipe.AddShader(&fs);
13291
13292 VkDescriptorSetObj descriptorSet(m_device);
13293 descriptorSet.AppendDummy();
13294 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13295
13296 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13297
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013298 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013299}
13300
Karl Schultz6addd812016-02-02 17:17:23 -070013301TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013302 TEST_DESCRIPTION("Test that an error is produced for mismatched array sizes "
13303 "across the VS->FS interface");
Chris Forbes0036fd12016-01-26 14:19:49 +130013304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +130013305 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -070013306 "output arr[2] of float32' vs 'ptr to "
13307 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130013308
13309 ASSERT_NO_FATAL_FAILURE(InitState());
13310 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13311
13312 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013313 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130013314 "\n"
13315 "layout(location=0) out float x[2];\n"
13316 "out gl_PerVertex {\n"
13317 " vec4 gl_Position;\n"
13318 "};\n"
13319 "void main(){\n"
13320 " x[0] = 0; x[1] = 0;\n"
13321 " gl_Position = vec4(1);\n"
13322 "}\n";
13323 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013324 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130013325 "\n"
13326 "layout(location=0) in float x[3];\n"
13327 "layout(location=0) out vec4 color;\n"
13328 "void main(){\n"
13329 " color = vec4(x[0] + x[1] + x[2]);\n"
13330 "}\n";
13331
13332 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13333 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13334
13335 VkPipelineObj pipe(m_device);
13336 pipe.AddColorAttachment();
13337 pipe.AddShader(&vs);
13338 pipe.AddShader(&fs);
13339
13340 VkDescriptorSetObj descriptorSet(m_device);
13341 descriptorSet.AppendDummy();
13342 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13343
13344 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13345
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013346 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130013347}
13348
Karl Schultz6addd812016-02-02 17:17:23 -070013349TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013350 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
13351 "the VS->FS interface");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013352 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013353 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013354
Chris Forbesb56af562015-05-25 11:13:17 +120013355 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013356 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120013357
13358 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013359 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120013360 "\n"
13361 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070013362 "out gl_PerVertex {\n"
13363 " vec4 gl_Position;\n"
13364 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +120013365 "void main(){\n"
13366 " x = 0;\n"
13367 " gl_Position = vec4(1);\n"
13368 "}\n";
13369 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013370 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120013371 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013372 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +120013373 "layout(location=0) out vec4 color;\n"
13374 "void main(){\n"
13375 " color = vec4(x);\n"
13376 "}\n";
13377
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013378 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13379 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120013380
13381 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013382 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120013383 pipe.AddShader(&vs);
13384 pipe.AddShader(&fs);
13385
Chris Forbesb56af562015-05-25 11:13:17 +120013386 VkDescriptorSetObj descriptorSet(m_device);
13387 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013388 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120013389
Tony Barbour5781e8f2015-08-04 16:23:11 -060013390 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120013391
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013392 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120013393}
13394
Karl Schultz6addd812016-02-02 17:17:23 -070013395TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013396 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
13397 "the VS->FS interface, when the variable is contained within "
13398 "an interface block");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013399 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013400 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013401
13402 ASSERT_NO_FATAL_FAILURE(InitState());
13403 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13404
13405 char const *vsSource =
13406 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130013407 "\n"
13408 "out block { layout(location=0) int x; } outs;\n"
13409 "out gl_PerVertex {\n"
13410 " vec4 gl_Position;\n"
13411 "};\n"
13412 "void main(){\n"
13413 " outs.x = 0;\n"
13414 " gl_Position = vec4(1);\n"
13415 "}\n";
13416 char const *fsSource =
13417 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130013418 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013419 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +130013420 "layout(location=0) out vec4 color;\n"
13421 "void main(){\n"
13422 " color = vec4(ins.x);\n"
13423 "}\n";
13424
13425 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13426 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13427
13428 VkPipelineObj pipe(m_device);
13429 pipe.AddColorAttachment();
13430 pipe.AddShader(&vs);
13431 pipe.AddShader(&fs);
13432
13433 VkDescriptorSetObj descriptorSet(m_device);
13434 descriptorSet.AppendDummy();
13435 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13436
13437 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13438
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013439 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013440}
13441
13442TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013443 TEST_DESCRIPTION("Test that an error is produced for location mismatches across "
13444 "the VS->FS interface; This should manifest as a not-written/not-consumed "
13445 "pair, but flushes out broken walking of the interfaces");
Chris Forbese9928822016-02-17 14:44:52 +130013446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13447 "location 0.0 which is not written by vertex shader");
13448
13449 ASSERT_NO_FATAL_FAILURE(InitState());
13450 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13451
13452 char const *vsSource =
13453 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013454 "\n"
13455 "out block { layout(location=1) float x; } outs;\n"
13456 "out gl_PerVertex {\n"
13457 " vec4 gl_Position;\n"
13458 "};\n"
13459 "void main(){\n"
13460 " outs.x = 0;\n"
13461 " gl_Position = vec4(1);\n"
13462 "}\n";
13463 char const *fsSource =
13464 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013465 "\n"
13466 "in block { layout(location=0) float x; } ins;\n"
13467 "layout(location=0) out vec4 color;\n"
13468 "void main(){\n"
13469 " color = vec4(ins.x);\n"
13470 "}\n";
13471
13472 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13473 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13474
13475 VkPipelineObj pipe(m_device);
13476 pipe.AddColorAttachment();
13477 pipe.AddShader(&vs);
13478 pipe.AddShader(&fs);
13479
13480 VkDescriptorSetObj descriptorSet(m_device);
13481 descriptorSet.AppendDummy();
13482 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13483
13484 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13485
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013486 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013487}
13488
13489TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013490 TEST_DESCRIPTION("Test that an error is produced for component mismatches across the "
13491 "VS->FS interface. It's not enough to have the same set of locations in "
13492 "use; matching is defined in terms of spirv variables.");
Chris Forbese9928822016-02-17 14:44:52 +130013493 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13494 "location 0.1 which is not written by vertex shader");
13495
13496 ASSERT_NO_FATAL_FAILURE(InitState());
13497 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13498
13499 char const *vsSource =
13500 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013501 "\n"
13502 "out block { layout(location=0, component=0) float x; } outs;\n"
13503 "out gl_PerVertex {\n"
13504 " vec4 gl_Position;\n"
13505 "};\n"
13506 "void main(){\n"
13507 " outs.x = 0;\n"
13508 " gl_Position = vec4(1);\n"
13509 "}\n";
13510 char const *fsSource =
13511 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013512 "\n"
13513 "in block { layout(location=0, component=1) float x; } ins;\n"
13514 "layout(location=0) out vec4 color;\n"
13515 "void main(){\n"
13516 " color = vec4(ins.x);\n"
13517 "}\n";
13518
13519 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13520 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13521
13522 VkPipelineObj pipe(m_device);
13523 pipe.AddColorAttachment();
13524 pipe.AddShader(&vs);
13525 pipe.AddShader(&fs);
13526
13527 VkDescriptorSetObj descriptorSet(m_device);
13528 descriptorSet.AppendDummy();
13529 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13530
13531 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13532
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013533 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013534}
13535
Karl Schultz6addd812016-02-02 17:17:23 -070013536TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013537 TEST_DESCRIPTION("Test that a warning is produced for a vertex attribute which is "
13538 "not consumed by the vertex shader");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013539 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013540 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013541
Chris Forbesde136e02015-05-25 11:13:28 +120013542 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013543 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120013544
13545 VkVertexInputBindingDescription input_binding;
13546 memset(&input_binding, 0, sizeof(input_binding));
13547
13548 VkVertexInputAttributeDescription input_attrib;
13549 memset(&input_attrib, 0, sizeof(input_attrib));
13550 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13551
13552 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013553 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120013554 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013555 "out gl_PerVertex {\n"
13556 " vec4 gl_Position;\n"
13557 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +120013558 "void main(){\n"
13559 " gl_Position = vec4(1);\n"
13560 "}\n";
13561 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013562 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120013563 "\n"
13564 "layout(location=0) out vec4 color;\n"
13565 "void main(){\n"
13566 " color = vec4(1);\n"
13567 "}\n";
13568
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013569 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13570 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120013571
13572 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013573 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120013574 pipe.AddShader(&vs);
13575 pipe.AddShader(&fs);
13576
13577 pipe.AddVertexInputBindings(&input_binding, 1);
13578 pipe.AddVertexInputAttribs(&input_attrib, 1);
13579
Chris Forbesde136e02015-05-25 11:13:28 +120013580 VkDescriptorSetObj descriptorSet(m_device);
13581 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013582 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120013583
Tony Barbour5781e8f2015-08-04 16:23:11 -060013584 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120013585
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013586 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120013587}
13588
Karl Schultz6addd812016-02-02 17:17:23 -070013589TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013590 TEST_DESCRIPTION("Test that a warning is produced for a location mismatch on "
13591 "vertex attributes. This flushes out bad behavior in the interface walker");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013592 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013593 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +130013594
13595 ASSERT_NO_FATAL_FAILURE(InitState());
13596 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13597
13598 VkVertexInputBindingDescription input_binding;
13599 memset(&input_binding, 0, sizeof(input_binding));
13600
13601 VkVertexInputAttributeDescription input_attrib;
13602 memset(&input_attrib, 0, sizeof(input_attrib));
13603 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13604
13605 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013606 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130013607 "\n"
13608 "layout(location=1) in float x;\n"
13609 "out gl_PerVertex {\n"
13610 " vec4 gl_Position;\n"
13611 "};\n"
13612 "void main(){\n"
13613 " gl_Position = vec4(x);\n"
13614 "}\n";
13615 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013616 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130013617 "\n"
13618 "layout(location=0) out vec4 color;\n"
13619 "void main(){\n"
13620 " color = vec4(1);\n"
13621 "}\n";
13622
13623 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13624 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13625
13626 VkPipelineObj pipe(m_device);
13627 pipe.AddColorAttachment();
13628 pipe.AddShader(&vs);
13629 pipe.AddShader(&fs);
13630
13631 pipe.AddVertexInputBindings(&input_binding, 1);
13632 pipe.AddVertexInputAttribs(&input_attrib, 1);
13633
13634 VkDescriptorSetObj descriptorSet(m_device);
13635 descriptorSet.AppendDummy();
13636 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13637
13638 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13639
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013640 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130013641}
13642
Karl Schultz6addd812016-02-02 17:17:23 -070013643TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013644 TEST_DESCRIPTION("Test that an error is produced for a VS input which is not "
13645 "provided by a vertex attribute");
Karl Schultz6addd812016-02-02 17:17:23 -070013646 m_errorMonitor->SetDesiredFailureMsg(
13647 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013648 "VS consumes input at location 0 but not provided");
13649
Chris Forbes62e8e502015-05-25 11:13:29 +120013650 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013651 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120013652
13653 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013654 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120013655 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013656 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -070013657 "out gl_PerVertex {\n"
13658 " vec4 gl_Position;\n"
13659 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120013660 "void main(){\n"
13661 " gl_Position = x;\n"
13662 "}\n";
13663 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013664 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120013665 "\n"
13666 "layout(location=0) out vec4 color;\n"
13667 "void main(){\n"
13668 " color = vec4(1);\n"
13669 "}\n";
13670
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013671 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13672 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120013673
13674 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013675 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120013676 pipe.AddShader(&vs);
13677 pipe.AddShader(&fs);
13678
Chris Forbes62e8e502015-05-25 11:13:29 +120013679 VkDescriptorSetObj descriptorSet(m_device);
13680 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013681 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120013682
Tony Barbour5781e8f2015-08-04 16:23:11 -060013683 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120013684
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013685 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120013686}
13687
Karl Schultz6addd812016-02-02 17:17:23 -070013688TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013689 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the "
13690 "fundamental type (float/int/uint) of an attribute and the "
13691 "VS input that consumes it");
Karl Schultz6addd812016-02-02 17:17:23 -070013692 m_errorMonitor->SetDesiredFailureMsg(
13693 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013694 "location 0 does not match VS input type");
13695
Chris Forbesc97d98e2015-05-25 11:13:31 +120013696 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013697 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013698
13699 VkVertexInputBindingDescription input_binding;
13700 memset(&input_binding, 0, sizeof(input_binding));
13701
13702 VkVertexInputAttributeDescription input_attrib;
13703 memset(&input_attrib, 0, sizeof(input_attrib));
13704 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13705
13706 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013707 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120013708 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013709 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070013710 "out gl_PerVertex {\n"
13711 " vec4 gl_Position;\n"
13712 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120013713 "void main(){\n"
13714 " gl_Position = vec4(x);\n"
13715 "}\n";
13716 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013717 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120013718 "\n"
13719 "layout(location=0) out vec4 color;\n"
13720 "void main(){\n"
13721 " color = vec4(1);\n"
13722 "}\n";
13723
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013724 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13725 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013726
13727 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013728 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013729 pipe.AddShader(&vs);
13730 pipe.AddShader(&fs);
13731
13732 pipe.AddVertexInputBindings(&input_binding, 1);
13733 pipe.AddVertexInputAttribs(&input_attrib, 1);
13734
Chris Forbesc97d98e2015-05-25 11:13:31 +120013735 VkDescriptorSetObj descriptorSet(m_device);
13736 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013737 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013738
Tony Barbour5781e8f2015-08-04 16:23:11 -060013739 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013740
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013741 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013742}
13743
Chris Forbesc68b43c2016-04-06 11:18:47 +120013744TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013745 TEST_DESCRIPTION("Test that an error is produced for a pipeline containing multiple "
13746 "shaders for the same stage");
Chris Forbesc68b43c2016-04-06 11:18:47 +120013747 m_errorMonitor->SetDesiredFailureMsg(
13748 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13749 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
13750
13751 ASSERT_NO_FATAL_FAILURE(InitState());
13752 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13753
13754 char const *vsSource =
13755 "#version 450\n"
13756 "\n"
13757 "out gl_PerVertex {\n"
13758 " vec4 gl_Position;\n"
13759 "};\n"
13760 "void main(){\n"
13761 " gl_Position = vec4(1);\n"
13762 "}\n";
13763 char const *fsSource =
13764 "#version 450\n"
13765 "\n"
13766 "layout(location=0) out vec4 color;\n"
13767 "void main(){\n"
13768 " color = vec4(1);\n"
13769 "}\n";
13770
13771 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13772 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13773
13774 VkPipelineObj pipe(m_device);
13775 pipe.AddColorAttachment();
13776 pipe.AddShader(&vs);
13777 pipe.AddShader(&vs);
13778 pipe.AddShader(&fs);
13779
13780 VkDescriptorSetObj descriptorSet(m_device);
13781 descriptorSet.AppendDummy();
13782 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13783
13784 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13785
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013786 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120013787}
13788
Karl Schultz6addd812016-02-02 17:17:23 -070013789TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013790 TEST_DESCRIPTION("Test that pipeline validation accepts matrices passed "
13791 "as vertex attributes");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013792 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130013793
13794 ASSERT_NO_FATAL_FAILURE(InitState());
13795 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13796
13797 VkVertexInputBindingDescription input_binding;
13798 memset(&input_binding, 0, sizeof(input_binding));
13799
13800 VkVertexInputAttributeDescription input_attribs[2];
13801 memset(input_attribs, 0, sizeof(input_attribs));
13802
13803 for (int i = 0; i < 2; i++) {
13804 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
13805 input_attribs[i].location = i;
13806 }
13807
13808 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013809 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013810 "\n"
13811 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070013812 "out gl_PerVertex {\n"
13813 " vec4 gl_Position;\n"
13814 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013815 "void main(){\n"
13816 " gl_Position = x[0] + x[1];\n"
13817 "}\n";
13818 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013819 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013820 "\n"
13821 "layout(location=0) out vec4 color;\n"
13822 "void main(){\n"
13823 " color = vec4(1);\n"
13824 "}\n";
13825
13826 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13827 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13828
13829 VkPipelineObj pipe(m_device);
13830 pipe.AddColorAttachment();
13831 pipe.AddShader(&vs);
13832 pipe.AddShader(&fs);
13833
13834 pipe.AddVertexInputBindings(&input_binding, 1);
13835 pipe.AddVertexInputAttribs(input_attribs, 2);
13836
13837 VkDescriptorSetObj descriptorSet(m_device);
13838 descriptorSet.AppendDummy();
13839 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13840
13841 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13842
13843 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013844 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130013845}
13846
Chris Forbes2682b242015-11-24 11:13:14 +130013847TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
13848{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013849 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130013850
13851 ASSERT_NO_FATAL_FAILURE(InitState());
13852 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13853
13854 VkVertexInputBindingDescription input_binding;
13855 memset(&input_binding, 0, sizeof(input_binding));
13856
13857 VkVertexInputAttributeDescription input_attribs[2];
13858 memset(input_attribs, 0, sizeof(input_attribs));
13859
13860 for (int i = 0; i < 2; i++) {
13861 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
13862 input_attribs[i].location = i;
13863 }
13864
13865 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013866 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013867 "\n"
13868 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -070013869 "out gl_PerVertex {\n"
13870 " vec4 gl_Position;\n"
13871 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013872 "void main(){\n"
13873 " gl_Position = x[0] + x[1];\n"
13874 "}\n";
13875 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013876 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013877 "\n"
13878 "layout(location=0) out vec4 color;\n"
13879 "void main(){\n"
13880 " color = vec4(1);\n"
13881 "}\n";
13882
13883 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13884 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13885
13886 VkPipelineObj pipe(m_device);
13887 pipe.AddColorAttachment();
13888 pipe.AddShader(&vs);
13889 pipe.AddShader(&fs);
13890
13891 pipe.AddVertexInputBindings(&input_binding, 1);
13892 pipe.AddVertexInputAttribs(input_attribs, 2);
13893
13894 VkDescriptorSetObj descriptorSet(m_device);
13895 descriptorSet.AppendDummy();
13896 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13897
13898 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13899
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013900 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130013901}
Chris Forbes2682b242015-11-24 11:13:14 +130013902
Chris Forbesbc290ce2016-07-06 12:01:49 +120013903TEST_F(VkLayerTest, CreatePipelineAttribComponents)
13904{
Chris Forbes1cc79542016-07-20 11:13:44 +120013905 TEST_DESCRIPTION("Test that pipeline validation accepts consuming a vertex attribute "
13906 "through multiple VS inputs, each consuming a different subset of the "
13907 "components.");
Chris Forbesbc290ce2016-07-06 12:01:49 +120013908 m_errorMonitor->ExpectSuccess();
13909
13910 ASSERT_NO_FATAL_FAILURE(InitState());
13911 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13912
13913 VkVertexInputBindingDescription input_binding;
13914 memset(&input_binding, 0, sizeof(input_binding));
13915
13916 VkVertexInputAttributeDescription input_attribs[3];
13917 memset(input_attribs, 0, sizeof(input_attribs));
13918
13919 for (int i = 0; i < 3; i++) {
13920 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
13921 input_attribs[i].location = i;
13922 }
13923
13924 char const *vsSource =
13925 "#version 450\n"
13926 "\n"
13927 "layout(location=0) in vec4 x;\n"
13928 "layout(location=1) in vec3 y1;\n"
13929 "layout(location=1, component=3) in float y2;\n"
13930 "layout(location=2) in vec4 z;\n"
13931 "out gl_PerVertex {\n"
13932 " vec4 gl_Position;\n"
13933 "};\n"
13934 "void main(){\n"
13935 " gl_Position = x + vec4(y1, y2) + z;\n"
13936 "}\n";
13937 char const *fsSource =
13938 "#version 450\n"
13939 "\n"
13940 "layout(location=0) out vec4 color;\n"
13941 "void main(){\n"
13942 " color = vec4(1);\n"
13943 "}\n";
13944
13945 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13946 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13947
13948 VkPipelineObj pipe(m_device);
13949 pipe.AddColorAttachment();
13950 pipe.AddShader(&vs);
13951 pipe.AddShader(&fs);
13952
13953 pipe.AddVertexInputBindings(&input_binding, 1);
13954 pipe.AddVertexInputAttribs(input_attribs, 3);
13955
13956 VkDescriptorSetObj descriptorSet(m_device);
13957 descriptorSet.AppendDummy();
13958 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13959
13960 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13961
13962 m_errorMonitor->VerifyNotFound();
13963}
13964
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013965TEST_F(VkLayerTest, CreatePipelineSimplePositive)
13966{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013967 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013968
13969 ASSERT_NO_FATAL_FAILURE(InitState());
13970 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13971
13972 char const *vsSource =
13973 "#version 450\n"
13974 "out gl_PerVertex {\n"
13975 " vec4 gl_Position;\n"
13976 "};\n"
13977 "void main(){\n"
13978 " gl_Position = vec4(0);\n"
13979 "}\n";
13980 char const *fsSource =
13981 "#version 450\n"
13982 "\n"
13983 "layout(location=0) out vec4 color;\n"
13984 "void main(){\n"
13985 " color = vec4(1);\n"
13986 "}\n";
13987
13988 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13989 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13990
13991 VkPipelineObj pipe(m_device);
13992 pipe.AddColorAttachment();
13993 pipe.AddShader(&vs);
13994 pipe.AddShader(&fs);
13995
13996 VkDescriptorSetObj descriptorSet(m_device);
13997 descriptorSet.AppendDummy();
13998 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13999
14000 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14001
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014002 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014003}
14004
Chris Forbes912c9192016-04-05 17:50:35 +120014005TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
14006{
Chris Forbes1cc79542016-07-20 11:13:44 +120014007 TEST_DESCRIPTION("Test that pipeline validation accepts the relaxed type matching rules "
14008 "set out in 14.1.3: fundamental type must match, and producer side must "
14009 "have at least as many components");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014010 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +120014011
14012 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
14013
14014 ASSERT_NO_FATAL_FAILURE(InitState());
14015 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14016
14017 char const *vsSource =
14018 "#version 450\n"
14019 "out gl_PerVertex {\n"
14020 " vec4 gl_Position;\n"
14021 "};\n"
14022 "layout(location=0) out vec3 x;\n"
14023 "layout(location=1) out ivec3 y;\n"
14024 "layout(location=2) out vec3 z;\n"
14025 "void main(){\n"
14026 " gl_Position = vec4(0);\n"
14027 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
14028 "}\n";
14029 char const *fsSource =
14030 "#version 450\n"
14031 "\n"
14032 "layout(location=0) out vec4 color;\n"
14033 "layout(location=0) in float x;\n"
14034 "layout(location=1) flat in int y;\n"
14035 "layout(location=2) in vec2 z;\n"
14036 "void main(){\n"
14037 " color = vec4(1 + x + y + z.x);\n"
14038 "}\n";
14039
14040 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14041 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14042
14043 VkPipelineObj pipe(m_device);
14044 pipe.AddColorAttachment();
14045 pipe.AddShader(&vs);
14046 pipe.AddShader(&fs);
14047
14048 VkDescriptorSetObj descriptorSet(m_device);
14049 descriptorSet.AppendDummy();
14050 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14051
Mike Stroyan255e9582016-06-24 09:49:32 -060014052 VkResult err = VK_SUCCESS;
14053 err =
14054 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14055 ASSERT_VK_SUCCESS(err);
14056
Chris Forbes912c9192016-04-05 17:50:35 +120014057
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014058 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +120014059}
14060
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014061TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
14062{
Chris Forbes1cc79542016-07-20 11:13:44 +120014063 TEST_DESCRIPTION("Test that pipeline validation accepts per-vertex variables "
14064 "passed between the TCS and TES stages");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014065 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014066
14067 ASSERT_NO_FATAL_FAILURE(InitState());
14068 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14069
Chris Forbesc1e852d2016-04-04 19:26:42 +120014070 if (!m_device->phy().features().tessellationShader) {
14071 printf("Device does not support tessellation shaders; skipped.\n");
14072 return;
14073 }
14074
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014075 char const *vsSource =
14076 "#version 450\n"
14077 "void main(){}\n";
14078 char const *tcsSource =
14079 "#version 450\n"
14080 "layout(location=0) out int x[];\n"
14081 "layout(vertices=3) out;\n"
14082 "void main(){\n"
14083 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14084 " gl_TessLevelInner[0] = 1;\n"
14085 " x[gl_InvocationID] = gl_InvocationID;\n"
14086 "}\n";
14087 char const *tesSource =
14088 "#version 450\n"
14089 "layout(triangles, equal_spacing, cw) in;\n"
14090 "layout(location=0) in int x[];\n"
14091 "out gl_PerVertex { vec4 gl_Position; };\n"
14092 "void main(){\n"
14093 " gl_Position.xyz = gl_TessCoord;\n"
14094 " gl_Position.w = x[0] + x[1] + x[2];\n"
14095 "}\n";
14096 char const *fsSource =
14097 "#version 450\n"
14098 "layout(location=0) out vec4 color;\n"
14099 "void main(){\n"
14100 " color = vec4(1);\n"
14101 "}\n";
14102
14103 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14104 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14105 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14106 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14107
14108 VkPipelineInputAssemblyStateCreateInfo iasci{
14109 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
14110 nullptr,
14111 0,
14112 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
14113 VK_FALSE};
14114
Chris Forbesb4cacb62016-04-04 19:15:00 +120014115 VkPipelineTessellationStateCreateInfo tsci{
14116 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
14117 nullptr,
14118 0,
14119 3};
14120
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014121 VkPipelineObj pipe(m_device);
14122 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +120014123 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014124 pipe.AddColorAttachment();
14125 pipe.AddShader(&vs);
14126 pipe.AddShader(&tcs);
14127 pipe.AddShader(&tes);
14128 pipe.AddShader(&fs);
14129
14130 VkDescriptorSetObj descriptorSet(m_device);
14131 descriptorSet.AppendDummy();
14132 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14133
14134 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14135
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014136 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014137}
14138
Chris Forbesa0ab8152016-04-20 13:34:27 +120014139TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
14140{
Chris Forbes1cc79542016-07-20 11:13:44 +120014141 TEST_DESCRIPTION("Test that pipeline validation accepts a user-defined "
14142 "interface block passed into the geometry shader. This "
14143 "is interesting because the 'extra' array level is not "
14144 "present on the member type, but on the block instance.");
Chris Forbesa0ab8152016-04-20 13:34:27 +120014145 m_errorMonitor->ExpectSuccess();
14146
14147 ASSERT_NO_FATAL_FAILURE(InitState());
14148 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14149
14150 if (!m_device->phy().features().geometryShader) {
14151 printf("Device does not support geometry shaders; skipped.\n");
14152 return;
14153 }
14154
14155 char const *vsSource =
14156 "#version 450\n"
14157 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
14158 "void main(){\n"
14159 " vs_out.x = vec4(1);\n"
14160 "}\n";
14161 char const *gsSource =
14162 "#version 450\n"
14163 "layout(triangles) in;\n"
14164 "layout(triangle_strip, max_vertices=3) out;\n"
14165 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
14166 "out gl_PerVertex { vec4 gl_Position; };\n"
14167 "void main() {\n"
14168 " gl_Position = gs_in[0].x;\n"
14169 " EmitVertex();\n"
14170 "}\n";
14171 char const *fsSource =
14172 "#version 450\n"
14173 "layout(location=0) out vec4 color;\n"
14174 "void main(){\n"
14175 " color = vec4(1);\n"
14176 "}\n";
14177
14178 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14179 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
14180 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14181
14182 VkPipelineObj pipe(m_device);
14183 pipe.AddColorAttachment();
14184 pipe.AddShader(&vs);
14185 pipe.AddShader(&gs);
14186 pipe.AddShader(&fs);
14187
14188 VkDescriptorSetObj descriptorSet(m_device);
14189 descriptorSet.AppendDummy();
14190 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14191
14192 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14193
14194 m_errorMonitor->VerifyNotFound();
14195}
14196
Chris Forbesa0193bc2016-04-04 19:19:47 +120014197TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
14198{
Chris Forbes1cc79542016-07-20 11:13:44 +120014199 TEST_DESCRIPTION("Test that an error is produced for a variable output from "
14200 "the TCS without the patch decoration, but consumed in the TES "
14201 "with the decoration.");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014202 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14203 "is per-vertex in tessellation control shader stage "
14204 "but per-patch in tessellation evaluation shader stage");
14205
14206 ASSERT_NO_FATAL_FAILURE(InitState());
14207 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14208
Chris Forbesc1e852d2016-04-04 19:26:42 +120014209 if (!m_device->phy().features().tessellationShader) {
14210 printf("Device does not support tessellation shaders; skipped.\n");
14211 return;
14212 }
14213
Chris Forbesa0193bc2016-04-04 19:19:47 +120014214 char const *vsSource =
14215 "#version 450\n"
14216 "void main(){}\n";
14217 char const *tcsSource =
14218 "#version 450\n"
14219 "layout(location=0) out int x[];\n"
14220 "layout(vertices=3) out;\n"
14221 "void main(){\n"
14222 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14223 " gl_TessLevelInner[0] = 1;\n"
14224 " x[gl_InvocationID] = gl_InvocationID;\n"
14225 "}\n";
14226 char const *tesSource =
14227 "#version 450\n"
14228 "layout(triangles, equal_spacing, cw) in;\n"
14229 "layout(location=0) patch in int x;\n"
14230 "out gl_PerVertex { vec4 gl_Position; };\n"
14231 "void main(){\n"
14232 " gl_Position.xyz = gl_TessCoord;\n"
14233 " gl_Position.w = x;\n"
14234 "}\n";
14235 char const *fsSource =
14236 "#version 450\n"
14237 "layout(location=0) out vec4 color;\n"
14238 "void main(){\n"
14239 " color = vec4(1);\n"
14240 "}\n";
14241
14242 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14243 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14244 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14245 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14246
14247 VkPipelineInputAssemblyStateCreateInfo iasci{
14248 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
14249 nullptr,
14250 0,
14251 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
14252 VK_FALSE};
14253
14254 VkPipelineTessellationStateCreateInfo tsci{
14255 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
14256 nullptr,
14257 0,
14258 3};
14259
14260 VkPipelineObj pipe(m_device);
14261 pipe.SetInputAssembly(&iasci);
14262 pipe.SetTessellation(&tsci);
14263 pipe.AddColorAttachment();
14264 pipe.AddShader(&vs);
14265 pipe.AddShader(&tcs);
14266 pipe.AddShader(&tes);
14267 pipe.AddShader(&fs);
14268
14269 VkDescriptorSetObj descriptorSet(m_device);
14270 descriptorSet.AppendDummy();
14271 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14272
14273 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14274
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014275 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014276}
14277
Karl Schultz6addd812016-02-02 17:17:23 -070014278TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014279 TEST_DESCRIPTION("Test that an error is produced for a vertex attribute setup where multiple "
14280 "bindings provide the same location");
Karl Schultz6addd812016-02-02 17:17:23 -070014281 m_errorMonitor->SetDesiredFailureMsg(
14282 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014283 "Duplicate vertex input binding descriptions for binding 0");
14284
Chris Forbes280ba2c2015-06-12 11:16:41 +120014285 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014286 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014287
14288 /* Two binding descriptions for binding 0 */
14289 VkVertexInputBindingDescription input_bindings[2];
14290 memset(input_bindings, 0, sizeof(input_bindings));
14291
14292 VkVertexInputAttributeDescription input_attrib;
14293 memset(&input_attrib, 0, sizeof(input_attrib));
14294 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14295
14296 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014297 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120014298 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070014299 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070014300 "out gl_PerVertex {\n"
14301 " vec4 gl_Position;\n"
14302 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120014303 "void main(){\n"
14304 " gl_Position = vec4(x);\n"
14305 "}\n";
14306 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014307 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120014308 "\n"
14309 "layout(location=0) out vec4 color;\n"
14310 "void main(){\n"
14311 " color = vec4(1);\n"
14312 "}\n";
14313
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014314 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14315 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014316
14317 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014318 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014319 pipe.AddShader(&vs);
14320 pipe.AddShader(&fs);
14321
14322 pipe.AddVertexInputBindings(input_bindings, 2);
14323 pipe.AddVertexInputAttribs(&input_attrib, 1);
14324
Chris Forbes280ba2c2015-06-12 11:16:41 +120014325 VkDescriptorSetObj descriptorSet(m_device);
14326 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014327 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014328
Tony Barbour5781e8f2015-08-04 16:23:11 -060014329 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014330
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014331 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014332}
Chris Forbes8f68b562015-05-25 11:13:32 +120014333
Chris Forbes35efec72016-04-21 14:32:08 +120014334TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014335 TEST_DESCRIPTION("Test that pipeline validation accepts basic use of 64bit vertex "
14336 "attributes. This is interesting because they consume multiple "
14337 "locations.");
Chris Forbes35efec72016-04-21 14:32:08 +120014338 m_errorMonitor->ExpectSuccess();
14339
14340 ASSERT_NO_FATAL_FAILURE(InitState());
14341 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14342
Chris Forbes91cf3a82016-06-28 17:51:35 +120014343 if (!m_device->phy().features().shaderFloat64) {
Chris Forbes35efec72016-04-21 14:32:08 +120014344 printf("Device does not support 64bit vertex attributes; skipped.\n");
14345 return;
14346 }
14347
14348 VkVertexInputBindingDescription input_bindings[1];
14349 memset(input_bindings, 0, sizeof(input_bindings));
14350
14351 VkVertexInputAttributeDescription input_attribs[4];
14352 memset(input_attribs, 0, sizeof(input_attribs));
14353 input_attribs[0].location = 0;
14354 input_attribs[0].offset = 0;
14355 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
14356 input_attribs[1].location = 2;
14357 input_attribs[1].offset = 32;
14358 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
14359 input_attribs[2].location = 4;
14360 input_attribs[2].offset = 64;
14361 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
14362 input_attribs[3].location = 6;
14363 input_attribs[3].offset = 96;
14364 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
14365
14366 char const *vsSource =
14367 "#version 450\n"
14368 "\n"
14369 "layout(location=0) in dmat4 x;\n"
14370 "out gl_PerVertex {\n"
14371 " vec4 gl_Position;\n"
14372 "};\n"
14373 "void main(){\n"
14374 " gl_Position = vec4(x[0][0]);\n"
14375 "}\n";
14376 char const *fsSource =
14377 "#version 450\n"
14378 "\n"
14379 "layout(location=0) out vec4 color;\n"
14380 "void main(){\n"
14381 " color = vec4(1);\n"
14382 "}\n";
14383
14384 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14385 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14386
14387 VkPipelineObj pipe(m_device);
14388 pipe.AddColorAttachment();
14389 pipe.AddShader(&vs);
14390 pipe.AddShader(&fs);
14391
14392 pipe.AddVertexInputBindings(input_bindings, 1);
14393 pipe.AddVertexInputAttribs(input_attribs, 4);
14394
14395 VkDescriptorSetObj descriptorSet(m_device);
14396 descriptorSet.AppendDummy();
14397 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14398
14399 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14400
14401 m_errorMonitor->VerifyNotFound();
14402}
14403
Karl Schultz6addd812016-02-02 17:17:23 -070014404TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014405 TEST_DESCRIPTION("Test that an error is produced for a FS which does not "
14406 "provide an output for one of the pipeline's color attachments");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014407 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014408 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014409
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014410 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014411
14412 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014413 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014414 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014415 "out gl_PerVertex {\n"
14416 " vec4 gl_Position;\n"
14417 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014418 "void main(){\n"
14419 " gl_Position = vec4(1);\n"
14420 "}\n";
14421 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014422 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014423 "\n"
14424 "void main(){\n"
14425 "}\n";
14426
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014427 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14428 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014429
14430 VkPipelineObj pipe(m_device);
14431 pipe.AddShader(&vs);
14432 pipe.AddShader(&fs);
14433
Chia-I Wu08accc62015-07-07 11:50:03 +080014434 /* set up CB 0, not written */
14435 pipe.AddColorAttachment();
14436 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014437
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014438 VkDescriptorSetObj descriptorSet(m_device);
14439 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014440 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014441
Tony Barbour5781e8f2015-08-04 16:23:11 -060014442 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014443
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014444 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014445}
14446
Karl Schultz6addd812016-02-02 17:17:23 -070014447TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014448 TEST_DESCRIPTION("Test that a warning is produced for a FS which provides a spurious "
14449 "output with no matching attachment");
Karl Schultz6addd812016-02-02 17:17:23 -070014450 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070014451 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014452 "FS writes to output location 1 with no matching attachment");
14453
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014454 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014455
14456 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014457 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014458 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014459 "out gl_PerVertex {\n"
14460 " vec4 gl_Position;\n"
14461 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014462 "void main(){\n"
14463 " gl_Position = vec4(1);\n"
14464 "}\n";
14465 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014466 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014467 "\n"
14468 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -070014469 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014470 "void main(){\n"
14471 " x = vec4(1);\n"
14472 " y = vec4(1);\n"
14473 "}\n";
14474
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014475 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14476 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014477
14478 VkPipelineObj pipe(m_device);
14479 pipe.AddShader(&vs);
14480 pipe.AddShader(&fs);
14481
Chia-I Wu08accc62015-07-07 11:50:03 +080014482 /* set up CB 0, not written */
14483 pipe.AddColorAttachment();
14484 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014485 /* FS writes CB 1, but we don't configure it */
14486
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014487 VkDescriptorSetObj descriptorSet(m_device);
14488 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014489 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014490
Tony Barbour5781e8f2015-08-04 16:23:11 -060014491 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014492
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014493 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014494}
14495
Karl Schultz6addd812016-02-02 17:17:23 -070014496TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014497 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the fundamental "
14498 "type of an FS output variable, and the format of the corresponding attachment");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014499 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014500 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014501
Chris Forbesa36d69e2015-05-25 11:13:44 +120014502 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014503
14504 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014505 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120014506 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014507 "out gl_PerVertex {\n"
14508 " vec4 gl_Position;\n"
14509 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120014510 "void main(){\n"
14511 " gl_Position = vec4(1);\n"
14512 "}\n";
14513 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014514 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120014515 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070014516 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +120014517 "void main(){\n"
14518 " x = ivec4(1);\n"
14519 "}\n";
14520
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014521 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14522 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014523
14524 VkPipelineObj pipe(m_device);
14525 pipe.AddShader(&vs);
14526 pipe.AddShader(&fs);
14527
Chia-I Wu08accc62015-07-07 11:50:03 +080014528 /* set up CB 0; type is UNORM by default */
14529 pipe.AddColorAttachment();
14530 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014531
Chris Forbesa36d69e2015-05-25 11:13:44 +120014532 VkDescriptorSetObj descriptorSet(m_device);
14533 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014534 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014535
Tony Barbour5781e8f2015-08-04 16:23:11 -060014536 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014537
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014538 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120014539}
Chris Forbes7b1b8932015-06-05 14:43:36 +120014540
Karl Schultz6addd812016-02-02 17:17:23 -070014541TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014542 TEST_DESCRIPTION("Test that an error is produced for a shader consuming a uniform "
14543 "block which has no corresponding binding in the pipeline layout");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014544 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014545 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014546
Chris Forbes556c76c2015-08-14 12:04:59 +120014547 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120014548
14549 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014550 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120014551 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014552 "out gl_PerVertex {\n"
14553 " vec4 gl_Position;\n"
14554 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120014555 "void main(){\n"
14556 " gl_Position = vec4(1);\n"
14557 "}\n";
14558 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014559 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120014560 "\n"
14561 "layout(location=0) out vec4 x;\n"
14562 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
14563 "void main(){\n"
14564 " x = vec4(bar.y);\n"
14565 "}\n";
14566
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014567 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14568 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120014569
Chris Forbes556c76c2015-08-14 12:04:59 +120014570 VkPipelineObj pipe(m_device);
14571 pipe.AddShader(&vs);
14572 pipe.AddShader(&fs);
14573
14574 /* set up CB 0; type is UNORM by default */
14575 pipe.AddColorAttachment();
14576 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14577
14578 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014579 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120014580
14581 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14582
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014583 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120014584}
14585
Chris Forbes5c59e902016-02-26 16:56:09 +130014586TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014587 TEST_DESCRIPTION("Test that an error is produced for a shader consuming push constants "
14588 "which are not provided in the pipeline layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130014589 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14590 "not declared in layout");
14591
14592 ASSERT_NO_FATAL_FAILURE(InitState());
14593
14594 char const *vsSource =
14595 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130014596 "\n"
14597 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14598 "out gl_PerVertex {\n"
14599 " vec4 gl_Position;\n"
14600 "};\n"
14601 "void main(){\n"
14602 " gl_Position = vec4(consts.x);\n"
14603 "}\n";
14604 char const *fsSource =
14605 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130014606 "\n"
14607 "layout(location=0) out vec4 x;\n"
14608 "void main(){\n"
14609 " x = vec4(1);\n"
14610 "}\n";
14611
14612 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14613 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14614
14615 VkPipelineObj pipe(m_device);
14616 pipe.AddShader(&vs);
14617 pipe.AddShader(&fs);
14618
14619 /* set up CB 0; type is UNORM by default */
14620 pipe.AddColorAttachment();
14621 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14622
14623 VkDescriptorSetObj descriptorSet(m_device);
14624 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14625
14626 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14627
14628 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014629 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130014630}
14631
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014632TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014633 TEST_DESCRIPTION("Test that an error is produced for a compute pipeline consuming a "
14634 "descriptor which is not provided in the pipeline layout");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014635 m_errorMonitor->SetDesiredFailureMsg(
14636 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14637 "Shader uses descriptor slot 0.0");
14638
14639 ASSERT_NO_FATAL_FAILURE(InitState());
14640
14641 char const *csSource =
14642 "#version 450\n"
14643 "\n"
14644 "layout(local_size_x=1) in;\n"
14645 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14646 "void main(){\n"
14647 " x = vec4(1);\n"
14648 "}\n";
14649
14650 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14651
14652 VkDescriptorSetObj descriptorSet(m_device);
14653 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14654
14655 VkComputePipelineCreateInfo cpci = {
14656 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14657 nullptr, 0, {
14658 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14659 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14660 cs.handle(), "main", nullptr
14661 },
14662 descriptorSet.GetPipelineLayout(),
14663 VK_NULL_HANDLE, -1
14664 };
14665
14666 VkPipeline pipe;
14667 VkResult err = vkCreateComputePipelines(
14668 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14669
14670 m_errorMonitor->VerifyFound();
14671
14672 if (err == VK_SUCCESS) {
14673 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14674 }
14675}
14676
14677TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014678 TEST_DESCRIPTION("Test that pipeline validation accepts a compute pipeline which declares a "
14679 "descriptor-backed resource which is not provided, but the shader does not "
14680 "statically use it. This is interesting because it requires compute pipelines "
14681 "to have a proper descriptor use walk, which they didn't for some time.");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014682 m_errorMonitor->ExpectSuccess();
14683
14684 ASSERT_NO_FATAL_FAILURE(InitState());
14685
14686 char const *csSource =
14687 "#version 450\n"
14688 "\n"
14689 "layout(local_size_x=1) in;\n"
14690 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14691 "void main(){\n"
14692 " // x is not used.\n"
14693 "}\n";
14694
14695 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14696
14697 VkDescriptorSetObj descriptorSet(m_device);
14698 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14699
14700 VkComputePipelineCreateInfo cpci = {
14701 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14702 nullptr, 0, {
14703 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14704 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14705 cs.handle(), "main", nullptr
14706 },
14707 descriptorSet.GetPipelineLayout(),
14708 VK_NULL_HANDLE, -1
14709 };
14710
14711 VkPipeline pipe;
14712 VkResult err = vkCreateComputePipelines(
14713 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14714
14715 m_errorMonitor->VerifyNotFound();
14716
14717 if (err == VK_SUCCESS) {
14718 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14719 }
14720}
14721
Chris Forbes22a9b092016-07-19 14:34:05 +120014722TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014723 TEST_DESCRIPTION("Test that an error is produced for a pipeline consuming a "
14724 "descriptor-backed resource of a mismatched type");
Chris Forbes22a9b092016-07-19 14:34:05 +120014725 m_errorMonitor->SetDesiredFailureMsg(
14726 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14727 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
14728
14729 ASSERT_NO_FATAL_FAILURE(InitState());
14730
14731 VkDescriptorSetLayoutBinding binding = {
14732 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14733 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14734 };
14735 VkDescriptorSetLayoutCreateInfo dslci = {
14736 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14737 0, 1, &binding
14738 };
14739 VkDescriptorSetLayout dsl;
14740 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14741 nullptr, &dsl);
14742 ASSERT_VK_SUCCESS(err);
14743
14744 VkPipelineLayoutCreateInfo plci = {
14745 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14746 0, 1, &dsl, 0, nullptr
14747 };
14748 VkPipelineLayout pl;
14749 err = vkCreatePipelineLayout(m_device->device(), &plci,
14750 nullptr, &pl);
14751 ASSERT_VK_SUCCESS(err);
14752
14753 char const *csSource =
14754 "#version 450\n"
14755 "\n"
14756 "layout(local_size_x=1) in;\n"
14757 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14758 "void main() {\n"
14759 " x.x = 1.0f;\n"
14760 "}\n";
14761 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14762
14763 VkComputePipelineCreateInfo cpci = {
14764 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14765 0, {
14766 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14767 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14768 cs.handle(), "main", nullptr
14769 },
14770 pl, VK_NULL_HANDLE, -1
14771 };
14772
14773 VkPipeline pipe;
14774 err = vkCreateComputePipelines(
14775 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14776
14777 m_errorMonitor->VerifyFound();
14778
14779 if (err == VK_SUCCESS) {
14780 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14781 }
14782
14783 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14784 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14785}
14786
Chris Forbese10a51f2016-07-19 14:42:51 +120014787TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014788 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
14789 "sampler portion of a combined image + sampler");
Chris Forbese10a51f2016-07-19 14:42:51 +120014790 m_errorMonitor->ExpectSuccess();
14791
14792 ASSERT_NO_FATAL_FAILURE(InitState());
14793
14794 VkDescriptorSetLayoutBinding bindings[] = {
14795 {
14796 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14797 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14798 },
14799 {
14800 1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
14801 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14802 },
14803 {
14804 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
14805 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14806 },
14807 };
14808 VkDescriptorSetLayoutCreateInfo dslci = {
14809 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14810 0, 3, bindings
14811 };
14812 VkDescriptorSetLayout dsl;
14813 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14814 nullptr, &dsl);
14815 ASSERT_VK_SUCCESS(err);
14816
14817 VkPipelineLayoutCreateInfo plci = {
14818 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14819 0, 1, &dsl, 0, nullptr
14820 };
14821 VkPipelineLayout pl;
14822 err = vkCreatePipelineLayout(m_device->device(), &plci,
14823 nullptr, &pl);
14824 ASSERT_VK_SUCCESS(err);
14825
14826 char const *csSource =
14827 "#version 450\n"
14828 "\n"
14829 "layout(local_size_x=1) in;\n"
14830 "layout(set=0, binding=0) uniform sampler s;\n"
14831 "layout(set=0, binding=1) uniform texture2D t;\n"
14832 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
14833 "void main() {\n"
14834 " x = texture(sampler2D(t, s), vec2(0));\n"
14835 "}\n";
14836 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14837
14838 VkComputePipelineCreateInfo cpci = {
14839 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14840 0, {
14841 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14842 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14843 cs.handle(), "main", nullptr
14844 },
14845 pl, VK_NULL_HANDLE, -1
14846 };
14847
14848 VkPipeline pipe;
14849 err = vkCreateComputePipelines(
14850 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14851
14852 m_errorMonitor->VerifyNotFound();
14853
14854 if (err == VK_SUCCESS) {
14855 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14856 }
14857
14858 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14859 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14860}
14861
Chris Forbes91c3b2a2016-07-19 14:46:38 +120014862TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014863 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
14864 "image portion of a combined image + sampler");
Chris Forbes91c3b2a2016-07-19 14:46:38 +120014865 m_errorMonitor->ExpectSuccess();
14866
14867 ASSERT_NO_FATAL_FAILURE(InitState());
14868
14869 VkDescriptorSetLayoutBinding bindings[] = {
14870 {
14871 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14872 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14873 },
14874 {
14875 1, VK_DESCRIPTOR_TYPE_SAMPLER,
14876 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14877 },
14878 {
14879 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
14880 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14881 },
14882 };
14883 VkDescriptorSetLayoutCreateInfo dslci = {
14884 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14885 0, 3, bindings
14886 };
14887 VkDescriptorSetLayout dsl;
14888 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14889 nullptr, &dsl);
14890 ASSERT_VK_SUCCESS(err);
14891
14892 VkPipelineLayoutCreateInfo plci = {
14893 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14894 0, 1, &dsl, 0, nullptr
14895 };
14896 VkPipelineLayout pl;
14897 err = vkCreatePipelineLayout(m_device->device(), &plci,
14898 nullptr, &pl);
14899 ASSERT_VK_SUCCESS(err);
14900
14901 char const *csSource =
14902 "#version 450\n"
14903 "\n"
14904 "layout(local_size_x=1) in;\n"
14905 "layout(set=0, binding=0) uniform texture2D t;\n"
14906 "layout(set=0, binding=1) uniform sampler s;\n"
14907 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
14908 "void main() {\n"
14909 " x = texture(sampler2D(t, s), vec2(0));\n"
14910 "}\n";
14911 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14912
14913 VkComputePipelineCreateInfo cpci = {
14914 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14915 0, {
14916 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14917 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14918 cs.handle(), "main", nullptr
14919 },
14920 pl, VK_NULL_HANDLE, -1
14921 };
14922
14923 VkPipeline pipe;
14924 err = vkCreateComputePipelines(
14925 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14926
14927 m_errorMonitor->VerifyNotFound();
14928
14929 if (err == VK_SUCCESS) {
14930 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14931 }
14932
14933 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14934 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14935}
14936
Chris Forbes6a4991a2016-07-19 15:07:32 +120014937TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014938 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming "
14939 "both the sampler and the image of a combined image+sampler "
14940 "but via separate variables");
Chris Forbes6a4991a2016-07-19 15:07:32 +120014941 m_errorMonitor->ExpectSuccess();
14942
14943 ASSERT_NO_FATAL_FAILURE(InitState());
14944
14945 VkDescriptorSetLayoutBinding bindings[] = {
14946 {
14947 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14948 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14949 },
14950 {
14951 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
14952 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14953 },
14954 };
14955 VkDescriptorSetLayoutCreateInfo dslci = {
14956 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14957 0, 2, bindings
14958 };
14959 VkDescriptorSetLayout dsl;
14960 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14961 nullptr, &dsl);
14962 ASSERT_VK_SUCCESS(err);
14963
14964 VkPipelineLayoutCreateInfo plci = {
14965 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14966 0, 1, &dsl, 0, nullptr
14967 };
14968 VkPipelineLayout pl;
14969 err = vkCreatePipelineLayout(m_device->device(), &plci,
14970 nullptr, &pl);
14971 ASSERT_VK_SUCCESS(err);
14972
14973 char const *csSource =
14974 "#version 450\n"
14975 "\n"
14976 "layout(local_size_x=1) in;\n"
14977 "layout(set=0, binding=0) uniform texture2D t;\n"
14978 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
14979 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
14980 "void main() {\n"
14981 " x = texture(sampler2D(t, s), vec2(0));\n"
14982 "}\n";
14983 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14984
14985 VkComputePipelineCreateInfo cpci = {
14986 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14987 0, {
14988 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14989 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14990 cs.handle(), "main", nullptr
14991 },
14992 pl, VK_NULL_HANDLE, -1
14993 };
14994
14995 VkPipeline pipe;
14996 err = vkCreateComputePipelines(
14997 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14998
14999 m_errorMonitor->VerifyNotFound();
15000
15001 if (err == VK_SUCCESS) {
15002 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15003 }
15004
15005 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15006 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15007}
15008
Chris Forbes50020592016-07-27 13:52:41 +120015009TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
15010 TEST_DESCRIPTION("Test that an error is produced when an image view type "
15011 "does not match the dimensionality declared in the shader");
15012
15013 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15014 "requires an image view of type VK_IMAGE_VIEW_TYPE_3D");
15015
15016 ASSERT_NO_FATAL_FAILURE(InitState());
15017 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15018
15019 char const *vsSource =
15020 "#version 450\n"
15021 "\n"
15022 "out gl_PerVertex { vec4 gl_Position; };\n"
15023 "void main() { gl_Position = vec4(0); }\n";
15024 char const *fsSource =
15025 "#version 450\n"
15026 "\n"
15027 "layout(set=0, binding=0) uniform sampler3D s;\n"
15028 "layout(location=0) out vec4 color;\n"
15029 "void main() {\n"
15030 " color = texture(s, vec3(0));\n"
15031 "}\n";
15032 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15033 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15034
15035 VkPipelineObj pipe(m_device);
15036 pipe.AddShader(&vs);
15037 pipe.AddShader(&fs);
15038 pipe.AddColorAttachment();
15039
15040 VkTextureObj texture(m_device, nullptr);
15041 VkSamplerObj sampler(m_device);
15042
15043 VkDescriptorSetObj descriptorSet(m_device);
15044 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15045 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15046
15047 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15048 ASSERT_VK_SUCCESS(err);
15049
15050 BeginCommandBuffer();
15051
15052 m_commandBuffer->BindPipeline(pipe);
15053 m_commandBuffer->BindDescriptorSet(descriptorSet);
15054
15055 VkViewport viewport = { 0, 0, 16, 16, 0, 1 };
15056 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
15057 VkRect2D scissor = { { 0, 0 }, { 16, 16 } };
15058 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15059
15060 // error produced here.
15061 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15062
15063 m_errorMonitor->VerifyFound();
15064
15065 EndCommandBuffer();
15066}
15067
Chris Forbes5533bfc2016-07-27 14:12:34 +120015068TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
15069 TEST_DESCRIPTION("Test that an error is produced when a multisampled images "
15070 "are consumed via singlesample images types in the shader, or vice versa.");
15071
15072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15073 "requires bound image to have multiple samples");
15074
15075 ASSERT_NO_FATAL_FAILURE(InitState());
15076 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15077
15078 char const *vsSource =
15079 "#version 450\n"
15080 "\n"
15081 "out gl_PerVertex { vec4 gl_Position; };\n"
15082 "void main() { gl_Position = vec4(0); }\n";
15083 char const *fsSource =
15084 "#version 450\n"
15085 "\n"
15086 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15087 "layout(location=0) out vec4 color;\n"
15088 "void main() {\n"
15089 " color = texelFetch(s, ivec2(0), 0);\n"
15090 "}\n";
15091 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15092 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15093
15094 VkPipelineObj pipe(m_device);
15095 pipe.AddShader(&vs);
15096 pipe.AddShader(&fs);
15097 pipe.AddColorAttachment();
15098
15099 VkTextureObj texture(m_device, nullptr);
15100 VkSamplerObj sampler(m_device);
15101
15102 VkDescriptorSetObj descriptorSet(m_device);
15103 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15104 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15105
15106 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15107 ASSERT_VK_SUCCESS(err);
15108
15109 BeginCommandBuffer();
15110
15111 m_commandBuffer->BindPipeline(pipe);
15112 m_commandBuffer->BindDescriptorSet(descriptorSet);
15113
15114 VkViewport viewport = { 0, 0, 16, 16, 0, 1 };
15115 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
15116 VkRect2D scissor = { { 0, 0 }, { 16, 16 } };
15117 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15118
15119 // error produced here.
15120 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15121
15122 m_errorMonitor->VerifyFound();
15123
15124 EndCommandBuffer();
15125}
15126
Mark Lobodzinski209b5292015-09-17 09:44:05 -060015127#endif // SHADER_CHECKER_TESTS
15128
15129#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060015130TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -070015131 m_errorMonitor->SetDesiredFailureMsg(
15132 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015133 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015134
15135 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015136
15137 // Create an image
15138 VkImage image;
15139
Karl Schultz6addd812016-02-02 17:17:23 -070015140 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15141 const int32_t tex_width = 32;
15142 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015143
15144 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015145 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15146 image_create_info.pNext = NULL;
15147 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15148 image_create_info.format = tex_format;
15149 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015150 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070015151 image_create_info.extent.depth = 1;
15152 image_create_info.mipLevels = 1;
15153 image_create_info.arrayLayers = 1;
15154 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15155 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15156 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15157 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015158
15159 // Introduce error by sending down a bogus width extent
15160 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080015161 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015162
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015163 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015164}
15165
Mark Youngc48c4c12016-04-11 14:26:49 -060015166TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
15167 m_errorMonitor->SetDesiredFailureMsg(
15168 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15169 "CreateImage extents is 0 for at least one required dimension");
15170
15171 ASSERT_NO_FATAL_FAILURE(InitState());
15172
15173 // Create an image
15174 VkImage image;
15175
15176 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15177 const int32_t tex_width = 32;
15178 const int32_t tex_height = 32;
15179
15180 VkImageCreateInfo image_create_info = {};
15181 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15182 image_create_info.pNext = NULL;
15183 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15184 image_create_info.format = tex_format;
15185 image_create_info.extent.width = tex_width;
15186 image_create_info.extent.height = tex_height;
15187 image_create_info.extent.depth = 1;
15188 image_create_info.mipLevels = 1;
15189 image_create_info.arrayLayers = 1;
15190 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15191 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15192 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15193 image_create_info.flags = 0;
15194
15195 // Introduce error by sending down a bogus width extent
15196 image_create_info.extent.width = 0;
15197 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15198
15199 m_errorMonitor->VerifyFound();
15200}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060015201#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120015202
Tobin Ehliscde08892015-09-22 10:11:37 -060015203#if IMAGE_TESTS
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015204TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
15205 TEST_DESCRIPTION("Create a render pass with an attachment description "
15206 "format set to VK_FORMAT_UNDEFINED");
15207
15208 ASSERT_NO_FATAL_FAILURE(InitState());
15209 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15210
15211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15212 "format is VK_FORMAT_UNDEFINED");
15213
15214 VkAttachmentReference color_attach = {};
15215 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15216 color_attach.attachment = 0;
15217 VkSubpassDescription subpass = {};
15218 subpass.colorAttachmentCount = 1;
15219 subpass.pColorAttachments = &color_attach;
15220
15221 VkRenderPassCreateInfo rpci = {};
15222 rpci.subpassCount = 1;
15223 rpci.pSubpasses = &subpass;
15224 rpci.attachmentCount = 1;
15225 VkAttachmentDescription attach_desc = {};
15226 attach_desc.format = VK_FORMAT_UNDEFINED;
15227 rpci.pAttachments = &attach_desc;
15228 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15229 VkRenderPass rp;
15230 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15231
15232 m_errorMonitor->VerifyFound();
15233
15234 if (result == VK_SUCCESS) {
15235 vkDestroyRenderPass(m_device->device(), rp, NULL);
15236 }
15237}
15238
Karl Schultz6addd812016-02-02 17:17:23 -070015239TEST_F(VkLayerTest, InvalidImageView) {
15240 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060015241
Karl Schultz6addd812016-02-02 17:17:23 -070015242 m_errorMonitor->SetDesiredFailureMsg(
15243 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015244 "vkCreateImageView called with baseMipLevel 10 ");
15245
Tobin Ehliscde08892015-09-22 10:11:37 -060015246 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060015247
Mike Stroyana3082432015-09-25 13:39:21 -060015248 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015249 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060015250
Karl Schultz6addd812016-02-02 17:17:23 -070015251 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15252 const int32_t tex_width = 32;
15253 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015254
15255 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015256 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15257 image_create_info.pNext = NULL;
15258 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15259 image_create_info.format = tex_format;
15260 image_create_info.extent.width = tex_width;
15261 image_create_info.extent.height = tex_height;
15262 image_create_info.extent.depth = 1;
15263 image_create_info.mipLevels = 1;
15264 image_create_info.arrayLayers = 1;
15265 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15266 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15267 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15268 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015269
Chia-I Wuf7458c52015-10-26 21:10:41 +080015270 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015271 ASSERT_VK_SUCCESS(err);
15272
15273 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015274 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15275 image_view_create_info.image = image;
15276 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15277 image_view_create_info.format = tex_format;
15278 image_view_create_info.subresourceRange.layerCount = 1;
15279 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
15280 image_view_create_info.subresourceRange.levelCount = 1;
15281 image_view_create_info.subresourceRange.aspectMask =
15282 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015283
15284 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070015285 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
15286 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060015287
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015288 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060015289 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015290}
Mike Stroyana3082432015-09-25 13:39:21 -060015291
Mark Youngd339ba32016-05-30 13:28:35 -060015292TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15293 VkResult err;
15294
15295 m_errorMonitor->SetDesiredFailureMsg(
15296 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -060015297 "used without first calling vkBindImageMemory");
Mark Youngd339ba32016-05-30 13:28:35 -060015298
15299 ASSERT_NO_FATAL_FAILURE(InitState());
15300
15301 // Create an image and try to create a view with no memory backing the image
15302 VkImage image;
15303
15304 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15305 const int32_t tex_width = 32;
15306 const int32_t tex_height = 32;
15307
15308 VkImageCreateInfo image_create_info = {};
15309 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15310 image_create_info.pNext = NULL;
15311 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15312 image_create_info.format = tex_format;
15313 image_create_info.extent.width = tex_width;
15314 image_create_info.extent.height = tex_height;
15315 image_create_info.extent.depth = 1;
15316 image_create_info.mipLevels = 1;
15317 image_create_info.arrayLayers = 1;
15318 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15319 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15320 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15321 image_create_info.flags = 0;
15322
15323 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15324 ASSERT_VK_SUCCESS(err);
15325
15326 VkImageViewCreateInfo image_view_create_info = {};
15327 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15328 image_view_create_info.image = image;
15329 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15330 image_view_create_info.format = tex_format;
15331 image_view_create_info.subresourceRange.layerCount = 1;
15332 image_view_create_info.subresourceRange.baseMipLevel = 0;
15333 image_view_create_info.subresourceRange.levelCount = 1;
15334 image_view_create_info.subresourceRange.aspectMask =
15335 VK_IMAGE_ASPECT_COLOR_BIT;
15336
15337 VkImageView view;
15338 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
15339 &view);
15340
15341 m_errorMonitor->VerifyFound();
15342 vkDestroyImage(m_device->device(), image, NULL);
15343 // If last error is success, it still created the view, so delete it.
15344 if (err == VK_SUCCESS) {
15345 vkDestroyImageView(m_device->device(), view, NULL);
15346 }
15347
15348}
15349
Karl Schultz6addd812016-02-02 17:17:23 -070015350TEST_F(VkLayerTest, InvalidImageViewAspect) {
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015351 TEST_DESCRIPTION(
15352 "Create an image and try to create a view with an invalid aspectMask");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070015353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070015354 "vkCreateImageView: Color image "
15355 "formats must have ONLY the "
15356 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015357
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015358 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015359
Karl Schultz6addd812016-02-02 17:17:23 -070015360 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015361 VkImageObj image(m_device);
15362 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT,
15363 VK_IMAGE_TILING_LINEAR, 0);
15364 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015365
15366 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015367 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015368 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015369 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15370 image_view_create_info.format = tex_format;
15371 image_view_create_info.subresourceRange.baseMipLevel = 0;
15372 image_view_create_info.subresourceRange.levelCount = 1;
15373 // Cause an error by setting an invalid image aspect
15374 image_view_create_info.subresourceRange.aspectMask =
15375 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015376
15377 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015378 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015379
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015380 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015381}
15382
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015383TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015384 VkResult err;
15385 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015386
Karl Schultz6addd812016-02-02 17:17:23 -070015387 m_errorMonitor->SetDesiredFailureMsg(
15388 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015389 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015390
Mike Stroyana3082432015-09-25 13:39:21 -060015391 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015392
15393 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015394 VkImage srcImage;
15395 VkImage dstImage;
15396 VkDeviceMemory srcMem;
15397 VkDeviceMemory destMem;
15398 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015399
15400 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015401 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15402 image_create_info.pNext = NULL;
15403 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15404 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15405 image_create_info.extent.width = 32;
15406 image_create_info.extent.height = 32;
15407 image_create_info.extent.depth = 1;
15408 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015409 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015410 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15411 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15412 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15413 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015414
Karl Schultz6addd812016-02-02 17:17:23 -070015415 err =
15416 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015417 ASSERT_VK_SUCCESS(err);
15418
Karl Schultz6addd812016-02-02 17:17:23 -070015419 err =
15420 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015421 ASSERT_VK_SUCCESS(err);
15422
15423 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015424 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015425 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15426 memAlloc.pNext = NULL;
15427 memAlloc.allocationSize = 0;
15428 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015429
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015430 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015431 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015432 pass =
15433 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015434 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015435 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015436 ASSERT_VK_SUCCESS(err);
15437
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015438 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015439 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015440 pass =
15441 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015442 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015443 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015444 ASSERT_VK_SUCCESS(err);
15445
15446 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15447 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015448 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015449 ASSERT_VK_SUCCESS(err);
15450
15451 BeginCommandBuffer();
15452 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015453 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015454 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015455 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015456 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015457 copyRegion.srcOffset.x = 0;
15458 copyRegion.srcOffset.y = 0;
15459 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015460 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015461 copyRegion.dstSubresource.mipLevel = 0;
15462 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015463 // Introduce failure by forcing the dst layerCount to differ from src
15464 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015465 copyRegion.dstOffset.x = 0;
15466 copyRegion.dstOffset.y = 0;
15467 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015468 copyRegion.extent.width = 1;
15469 copyRegion.extent.height = 1;
15470 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015471 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15472 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015473 EndCommandBuffer();
15474
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015475 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015476
Chia-I Wuf7458c52015-10-26 21:10:41 +080015477 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015478 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015479 vkFreeMemory(m_device->device(), srcMem, NULL);
15480 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015481}
15482
Tony Barbourd6673642016-05-05 14:46:39 -060015483TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
15484
15485 TEST_DESCRIPTION("Creating images with unsuported formats ");
15486
15487 ASSERT_NO_FATAL_FAILURE(InitState());
15488 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15489 VkImageObj image(m_device);
15490 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
15491 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
15492 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15493 VK_IMAGE_TILING_OPTIMAL, 0);
15494 ASSERT_TRUE(image.initialized());
15495
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015496 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
15497 VkImageCreateInfo image_create_info;
15498 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15499 image_create_info.pNext = NULL;
15500 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15501 image_create_info.format = VK_FORMAT_UNDEFINED;
15502 image_create_info.extent.width = 32;
15503 image_create_info.extent.height = 32;
15504 image_create_info.extent.depth = 1;
15505 image_create_info.mipLevels = 1;
15506 image_create_info.arrayLayers = 1;
15507 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15508 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15509 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15510 image_create_info.flags = 0;
15511
15512 m_errorMonitor->SetDesiredFailureMsg(
15513 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15514 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
15515
15516 VkImage localImage;
15517 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
15518 m_errorMonitor->VerifyFound();
15519
Tony Barbourd6673642016-05-05 14:46:39 -060015520 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015521 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060015522 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15523 VkFormat format = static_cast<VkFormat>(f);
15524 VkFormatProperties fProps = m_device->format_properties(format);
15525 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
15526 fProps.optimalTilingFeatures == 0) {
15527 unsupported = format;
15528 break;
15529 }
15530 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015531
Tony Barbourd6673642016-05-05 14:46:39 -060015532 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015533 image_create_info.format = unsupported;
Tony Barbourd6673642016-05-05 14:46:39 -060015534 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015535 "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015536
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015537 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060015538 m_errorMonitor->VerifyFound();
15539 }
15540}
15541
15542TEST_F(VkLayerTest, ImageLayerViewTests) {
15543 VkResult ret;
15544 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15545
15546 ASSERT_NO_FATAL_FAILURE(InitState());
15547
15548 VkImageObj image(m_device);
15549 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
15550 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
15551 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15552 VK_IMAGE_TILING_OPTIMAL, 0);
15553 ASSERT_TRUE(image.initialized());
15554
15555 VkImageView imgView;
15556 VkImageViewCreateInfo imgViewInfo = {};
15557 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15558 imgViewInfo.image = image.handle();
15559 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
15560 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15561 imgViewInfo.subresourceRange.layerCount = 1;
15562 imgViewInfo.subresourceRange.baseMipLevel = 0;
15563 imgViewInfo.subresourceRange.levelCount = 1;
15564 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15565
15566 m_errorMonitor->SetDesiredFailureMsg(
15567 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15568 "vkCreateImageView called with baseMipLevel");
15569 // View can't have baseMipLevel >= image's mipLevels - Expect
15570 // VIEW_CREATE_ERROR
15571 imgViewInfo.subresourceRange.baseMipLevel = 1;
15572 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15573 m_errorMonitor->VerifyFound();
15574 imgViewInfo.subresourceRange.baseMipLevel = 0;
15575
15576 m_errorMonitor->SetDesiredFailureMsg(
15577 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15578 "vkCreateImageView called with baseArrayLayer");
15579 // View can't have baseArrayLayer >= image's arraySize - Expect
15580 // VIEW_CREATE_ERROR
15581 imgViewInfo.subresourceRange.baseArrayLayer = 1;
15582 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15583 m_errorMonitor->VerifyFound();
15584 imgViewInfo.subresourceRange.baseArrayLayer = 0;
15585
15586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15587 "vkCreateImageView called with 0 in "
15588 "pCreateInfo->subresourceRange."
15589 "levelCount");
15590 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
15591 imgViewInfo.subresourceRange.levelCount = 0;
15592 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15593 m_errorMonitor->VerifyFound();
15594 imgViewInfo.subresourceRange.levelCount = 1;
15595
15596 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15597 "vkCreateImageView called with 0 in "
15598 "pCreateInfo->subresourceRange."
15599 "layerCount");
15600 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
15601 imgViewInfo.subresourceRange.layerCount = 0;
15602 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15603 m_errorMonitor->VerifyFound();
15604 imgViewInfo.subresourceRange.layerCount = 1;
15605
15606 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15607 "but both must be color formats");
15608 // Can't use depth format for view into color image - Expect INVALID_FORMAT
15609 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
15610 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15611 m_errorMonitor->VerifyFound();
15612 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15613
15614 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15615 "Formats MUST be IDENTICAL unless "
15616 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
15617 "was set on image creation.");
15618 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
15619 // VIEW_CREATE_ERROR
15620 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
15621 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15622 m_errorMonitor->VerifyFound();
15623 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15624
15625 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15626 "can support ImageViews with "
15627 "differing formats but they must be "
15628 "in the same compatibility class.");
15629 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
15630 // VIEW_CREATE_ERROR
15631 VkImageCreateInfo mutImgInfo = image.create_info();
15632 VkImage mutImage;
15633 mutImgInfo.format = VK_FORMAT_R8_UINT;
15634 assert(
15635 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
15636 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
15637 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
15638 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15639 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
15640 ASSERT_VK_SUCCESS(ret);
15641 imgViewInfo.image = mutImage;
15642 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15643 m_errorMonitor->VerifyFound();
15644 imgViewInfo.image = image.handle();
15645 vkDestroyImage(m_device->handle(), mutImage, NULL);
15646}
15647
15648TEST_F(VkLayerTest, MiscImageLayerTests) {
15649
15650 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
15651
15652 ASSERT_NO_FATAL_FAILURE(InitState());
15653
15654 VkImageObj image(m_device);
15655 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
15656 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
15657 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15658 VK_IMAGE_TILING_OPTIMAL, 0);
15659 ASSERT_TRUE(image.initialized());
15660
15661 m_errorMonitor->SetDesiredFailureMsg(
15662 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15663 "number of layers in image subresource is zero");
15664 vk_testing::Buffer buffer;
15665 VkMemoryPropertyFlags reqs = 0;
15666 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
15667 VkBufferImageCopy region = {};
15668 region.bufferRowLength = 128;
15669 region.bufferImageHeight = 128;
15670 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15671 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
15672 region.imageSubresource.layerCount = 0;
15673 region.imageExtent.height = 4;
15674 region.imageExtent.width = 4;
15675 region.imageExtent.depth = 1;
15676 m_commandBuffer->BeginCommandBuffer();
15677 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
15678 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
15679 1, &region);
15680 m_errorMonitor->VerifyFound();
15681 region.imageSubresource.layerCount = 1;
15682
15683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15684 "aspectMasks for each region must "
15685 "specify only COLOR or DEPTH or "
15686 "STENCIL");
15687 // Expect MISMATCHED_IMAGE_ASPECT
15688 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
15689 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
15690 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
15691 1, &region);
15692 m_errorMonitor->VerifyFound();
15693 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15694
15695 m_errorMonitor->SetDesiredFailureMsg(
15696 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15697 "If the format of srcImage is a depth, stencil, depth stencil or "
15698 "integer-based format then filter must be VK_FILTER_NEAREST");
15699 // Expect INVALID_FILTER
15700 VkImageObj intImage1(m_device);
15701 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
15702 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
15703 0);
15704 VkImageObj intImage2(m_device);
15705 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
15706 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
15707 0);
15708 VkImageBlit blitRegion = {};
15709 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15710 blitRegion.srcSubresource.baseArrayLayer = 0;
15711 blitRegion.srcSubresource.layerCount = 1;
15712 blitRegion.srcSubresource.mipLevel = 0;
15713 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15714 blitRegion.dstSubresource.baseArrayLayer = 0;
15715 blitRegion.dstSubresource.layerCount = 1;
15716 blitRegion.dstSubresource.mipLevel = 0;
15717
15718 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
15719 intImage1.layout(), intImage2.handle(), intImage2.layout(),
15720 16, &blitRegion, VK_FILTER_LINEAR);
15721 m_errorMonitor->VerifyFound();
15722
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060015723 // Look for NULL-blit warning
15724 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
15725 "Offsets specify a zero-volume area.");
15726 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
15727 intImage1.layout(), intImage2.handle(), intImage2.layout(),
15728 1, &blitRegion, VK_FILTER_LINEAR);
15729 m_errorMonitor->VerifyFound();
15730
Tony Barbourd6673642016-05-05 14:46:39 -060015731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15732 "called with 0 in ppMemoryBarriers");
15733 VkImageMemoryBarrier img_barrier;
15734 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
15735 img_barrier.pNext = NULL;
15736 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
15737 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
15738 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15739 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15740 img_barrier.image = image.handle();
15741 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
15742 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
15743 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15744 img_barrier.subresourceRange.baseArrayLayer = 0;
15745 img_barrier.subresourceRange.baseMipLevel = 0;
15746 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
15747 img_barrier.subresourceRange.layerCount = 0;
15748 img_barrier.subresourceRange.levelCount = 1;
15749 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
15750 VK_PIPELINE_STAGE_HOST_BIT,
15751 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
15752 nullptr, 1, &img_barrier);
15753 m_errorMonitor->VerifyFound();
15754 img_barrier.subresourceRange.layerCount = 1;
15755}
15756
15757TEST_F(VkLayerTest, ImageFormatLimits) {
15758
15759 TEST_DESCRIPTION("Exceed the limits of image format ");
15760
Tony Barbour6514a6b2016-08-12 09:37:19 -060015761 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourd6673642016-05-05 14:46:39 -060015762 m_errorMonitor->SetDesiredFailureMsg(
15763 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15764 "CreateImage extents exceed allowable limits for format");
15765 VkImageCreateInfo image_create_info = {};
15766 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15767 image_create_info.pNext = NULL;
15768 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15769 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15770 image_create_info.extent.width = 32;
15771 image_create_info.extent.height = 32;
15772 image_create_info.extent.depth = 1;
15773 image_create_info.mipLevels = 1;
15774 image_create_info.arrayLayers = 1;
15775 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15776 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15777 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15778 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
15779 image_create_info.flags = 0;
15780
15781 VkImage nullImg;
15782 VkImageFormatProperties imgFmtProps;
15783 vkGetPhysicalDeviceImageFormatProperties(
15784 gpu(), image_create_info.format, image_create_info.imageType,
15785 image_create_info.tiling, image_create_info.usage,
15786 image_create_info.flags, &imgFmtProps);
15787 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
15788 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15789 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15790 m_errorMonitor->VerifyFound();
15791 image_create_info.extent.depth = 1;
15792
15793 m_errorMonitor->SetDesiredFailureMsg(
15794 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15795 "exceeds allowable maximum supported by format of");
15796 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
15797 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15798 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15799 m_errorMonitor->VerifyFound();
15800 image_create_info.mipLevels = 1;
15801
15802 m_errorMonitor->SetDesiredFailureMsg(
15803 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15804 "exceeds allowable maximum supported by format of");
15805 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
15806 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15807 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15808 m_errorMonitor->VerifyFound();
15809 image_create_info.arrayLayers = 1;
15810
15811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15812 "is not supported by format");
15813 int samples = imgFmtProps.sampleCounts >> 1;
15814 image_create_info.samples = (VkSampleCountFlagBits)samples;
15815 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15816 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15817 m_errorMonitor->VerifyFound();
15818 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15819
15820 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15821 "pCreateInfo->initialLayout, must be "
15822 "VK_IMAGE_LAYOUT_UNDEFINED or "
15823 "VK_IMAGE_LAYOUT_PREINITIALIZED");
15824 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15825 // Expect INVALID_LAYOUT
15826 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15827 m_errorMonitor->VerifyFound();
15828 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
15829}
15830
Karl Schultz6addd812016-02-02 17:17:23 -070015831TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060015832 VkResult err;
15833 bool pass;
15834
15835 // Create color images with different format sizes and try to copy between them
15836 m_errorMonitor->SetDesiredFailureMsg(
15837 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15838 "vkCmdCopyImage called with unmatched source and dest image format sizes");
15839
15840 ASSERT_NO_FATAL_FAILURE(InitState());
15841
15842 // Create two images of different types and try to copy between them
15843 VkImage srcImage;
15844 VkImage dstImage;
15845 VkDeviceMemory srcMem;
15846 VkDeviceMemory destMem;
15847 VkMemoryRequirements memReqs;
15848
15849 VkImageCreateInfo image_create_info = {};
15850 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15851 image_create_info.pNext = NULL;
15852 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15853 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15854 image_create_info.extent.width = 32;
15855 image_create_info.extent.height = 32;
15856 image_create_info.extent.depth = 1;
15857 image_create_info.mipLevels = 1;
15858 image_create_info.arrayLayers = 1;
15859 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15860 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15861 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15862 image_create_info.flags = 0;
15863
15864 err =
15865 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
15866 ASSERT_VK_SUCCESS(err);
15867
15868 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15869 // Introduce failure by creating second image with a different-sized format.
15870 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
15871
15872 err =
15873 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
15874 ASSERT_VK_SUCCESS(err);
15875
15876 // Allocate memory
15877 VkMemoryAllocateInfo memAlloc = {};
15878 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15879 memAlloc.pNext = NULL;
15880 memAlloc.allocationSize = 0;
15881 memAlloc.memoryTypeIndex = 0;
15882
15883 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
15884 memAlloc.allocationSize = memReqs.size;
15885 pass =
15886 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
15887 ASSERT_TRUE(pass);
15888 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
15889 ASSERT_VK_SUCCESS(err);
15890
15891 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
15892 memAlloc.allocationSize = memReqs.size;
15893 pass =
15894 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
15895 ASSERT_TRUE(pass);
15896 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
15897 ASSERT_VK_SUCCESS(err);
15898
15899 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15900 ASSERT_VK_SUCCESS(err);
15901 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
15902 ASSERT_VK_SUCCESS(err);
15903
15904 BeginCommandBuffer();
15905 VkImageCopy copyRegion;
15906 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15907 copyRegion.srcSubresource.mipLevel = 0;
15908 copyRegion.srcSubresource.baseArrayLayer = 0;
15909 copyRegion.srcSubresource.layerCount = 0;
15910 copyRegion.srcOffset.x = 0;
15911 copyRegion.srcOffset.y = 0;
15912 copyRegion.srcOffset.z = 0;
15913 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15914 copyRegion.dstSubresource.mipLevel = 0;
15915 copyRegion.dstSubresource.baseArrayLayer = 0;
15916 copyRegion.dstSubresource.layerCount = 0;
15917 copyRegion.dstOffset.x = 0;
15918 copyRegion.dstOffset.y = 0;
15919 copyRegion.dstOffset.z = 0;
15920 copyRegion.extent.width = 1;
15921 copyRegion.extent.height = 1;
15922 copyRegion.extent.depth = 1;
15923 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15924 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
15925 EndCommandBuffer();
15926
15927 m_errorMonitor->VerifyFound();
15928
15929 vkDestroyImage(m_device->device(), srcImage, NULL);
15930 vkDestroyImage(m_device->device(), dstImage, NULL);
15931 vkFreeMemory(m_device->device(), srcMem, NULL);
15932 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015933}
15934
Karl Schultz6addd812016-02-02 17:17:23 -070015935TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
15936 VkResult err;
15937 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015938
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015939 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015940 m_errorMonitor->SetDesiredFailureMsg(
15941 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015942 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015943
Mike Stroyana3082432015-09-25 13:39:21 -060015944 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015945
15946 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015947 VkImage srcImage;
15948 VkImage dstImage;
15949 VkDeviceMemory srcMem;
15950 VkDeviceMemory destMem;
15951 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015952
15953 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015954 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15955 image_create_info.pNext = NULL;
15956 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15957 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15958 image_create_info.extent.width = 32;
15959 image_create_info.extent.height = 32;
15960 image_create_info.extent.depth = 1;
15961 image_create_info.mipLevels = 1;
15962 image_create_info.arrayLayers = 1;
15963 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15964 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15965 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15966 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015967
Karl Schultz6addd812016-02-02 17:17:23 -070015968 err =
15969 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015970 ASSERT_VK_SUCCESS(err);
15971
Karl Schultzbdb75952016-04-19 11:36:49 -060015972 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15973
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015974 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070015975 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015976 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
15977 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015978
Karl Schultz6addd812016-02-02 17:17:23 -070015979 err =
15980 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015981 ASSERT_VK_SUCCESS(err);
15982
15983 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015984 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015985 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15986 memAlloc.pNext = NULL;
15987 memAlloc.allocationSize = 0;
15988 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015989
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015990 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015991 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015992 pass =
15993 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015994 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015995 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015996 ASSERT_VK_SUCCESS(err);
15997
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015998 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015999 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016000 pass =
16001 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016002 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016003 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016004 ASSERT_VK_SUCCESS(err);
16005
16006 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16007 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016008 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016009 ASSERT_VK_SUCCESS(err);
16010
16011 BeginCommandBuffer();
16012 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016013 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016014 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016015 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016016 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016017 copyRegion.srcOffset.x = 0;
16018 copyRegion.srcOffset.y = 0;
16019 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016020 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016021 copyRegion.dstSubresource.mipLevel = 0;
16022 copyRegion.dstSubresource.baseArrayLayer = 0;
16023 copyRegion.dstSubresource.layerCount = 0;
16024 copyRegion.dstOffset.x = 0;
16025 copyRegion.dstOffset.y = 0;
16026 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016027 copyRegion.extent.width = 1;
16028 copyRegion.extent.height = 1;
16029 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016030 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16031 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016032 EndCommandBuffer();
16033
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016034 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016035
Chia-I Wuf7458c52015-10-26 21:10:41 +080016036 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016037 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016038 vkFreeMemory(m_device->device(), srcMem, NULL);
16039 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016040}
16041
Karl Schultz6addd812016-02-02 17:17:23 -070016042TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
16043 VkResult err;
16044 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016045
Karl Schultz6addd812016-02-02 17:17:23 -070016046 m_errorMonitor->SetDesiredFailureMsg(
16047 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016048 "vkCmdResolveImage called with source sample count less than 2.");
16049
Mike Stroyana3082432015-09-25 13:39:21 -060016050 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016051
16052 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070016053 VkImage srcImage;
16054 VkImage dstImage;
16055 VkDeviceMemory srcMem;
16056 VkDeviceMemory destMem;
16057 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016058
16059 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016060 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16061 image_create_info.pNext = NULL;
16062 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16063 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16064 image_create_info.extent.width = 32;
16065 image_create_info.extent.height = 1;
16066 image_create_info.extent.depth = 1;
16067 image_create_info.mipLevels = 1;
16068 image_create_info.arrayLayers = 1;
16069 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16070 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16071 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16072 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016073
Karl Schultz6addd812016-02-02 17:17:23 -070016074 err =
16075 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016076 ASSERT_VK_SUCCESS(err);
16077
Karl Schultz6addd812016-02-02 17:17:23 -070016078 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016079
Karl Schultz6addd812016-02-02 17:17:23 -070016080 err =
16081 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016082 ASSERT_VK_SUCCESS(err);
16083
16084 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016085 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016086 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16087 memAlloc.pNext = NULL;
16088 memAlloc.allocationSize = 0;
16089 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016090
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016091 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016092 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016093 pass =
16094 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016095 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016096 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016097 ASSERT_VK_SUCCESS(err);
16098
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016099 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016100 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016101 pass =
16102 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016103 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016104 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016105 ASSERT_VK_SUCCESS(err);
16106
16107 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16108 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016109 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016110 ASSERT_VK_SUCCESS(err);
16111
16112 BeginCommandBuffer();
16113 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016114 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16115 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016116 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016117 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016118 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016119 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016120 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016121 resolveRegion.srcOffset.x = 0;
16122 resolveRegion.srcOffset.y = 0;
16123 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016124 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016125 resolveRegion.dstSubresource.mipLevel = 0;
16126 resolveRegion.dstSubresource.baseArrayLayer = 0;
16127 resolveRegion.dstSubresource.layerCount = 0;
16128 resolveRegion.dstOffset.x = 0;
16129 resolveRegion.dstOffset.y = 0;
16130 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016131 resolveRegion.extent.width = 1;
16132 resolveRegion.extent.height = 1;
16133 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016134 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16135 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016136 EndCommandBuffer();
16137
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016138 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016139
Chia-I Wuf7458c52015-10-26 21:10:41 +080016140 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016141 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016142 vkFreeMemory(m_device->device(), srcMem, NULL);
16143 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016144}
16145
Karl Schultz6addd812016-02-02 17:17:23 -070016146TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
16147 VkResult err;
16148 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016149
Karl Schultz6addd812016-02-02 17:17:23 -070016150 m_errorMonitor->SetDesiredFailureMsg(
16151 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016152 "vkCmdResolveImage called with dest sample count greater than 1.");
16153
Mike Stroyana3082432015-09-25 13:39:21 -060016154 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016155
Chris Forbesa7530692016-05-08 12:35:39 +120016156 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070016157 VkImage srcImage;
16158 VkImage dstImage;
16159 VkDeviceMemory srcMem;
16160 VkDeviceMemory destMem;
16161 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016162
16163 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016164 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16165 image_create_info.pNext = NULL;
16166 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16167 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16168 image_create_info.extent.width = 32;
16169 image_create_info.extent.height = 1;
16170 image_create_info.extent.depth = 1;
16171 image_create_info.mipLevels = 1;
16172 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120016173 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016174 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16175 // Note: Some implementations expect color attachment usage for any
16176 // multisample surface
16177 image_create_info.usage =
16178 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16179 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016180
Karl Schultz6addd812016-02-02 17:17:23 -070016181 err =
16182 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016183 ASSERT_VK_SUCCESS(err);
16184
Karl Schultz6addd812016-02-02 17:17:23 -070016185 // Note: Some implementations expect color attachment usage for any
16186 // multisample surface
16187 image_create_info.usage =
16188 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016189
Karl Schultz6addd812016-02-02 17:17:23 -070016190 err =
16191 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016192 ASSERT_VK_SUCCESS(err);
16193
16194 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016195 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016196 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16197 memAlloc.pNext = NULL;
16198 memAlloc.allocationSize = 0;
16199 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016200
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016201 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016202 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016203 pass =
16204 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016205 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016206 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016207 ASSERT_VK_SUCCESS(err);
16208
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016209 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016210 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016211 pass =
16212 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016213 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016214 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016215 ASSERT_VK_SUCCESS(err);
16216
16217 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16218 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016219 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016220 ASSERT_VK_SUCCESS(err);
16221
16222 BeginCommandBuffer();
16223 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016224 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16225 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016226 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016227 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016228 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016229 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016230 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016231 resolveRegion.srcOffset.x = 0;
16232 resolveRegion.srcOffset.y = 0;
16233 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016234 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016235 resolveRegion.dstSubresource.mipLevel = 0;
16236 resolveRegion.dstSubresource.baseArrayLayer = 0;
16237 resolveRegion.dstSubresource.layerCount = 0;
16238 resolveRegion.dstOffset.x = 0;
16239 resolveRegion.dstOffset.y = 0;
16240 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016241 resolveRegion.extent.width = 1;
16242 resolveRegion.extent.height = 1;
16243 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016244 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16245 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016246 EndCommandBuffer();
16247
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016248 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016249
Chia-I Wuf7458c52015-10-26 21:10:41 +080016250 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016251 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016252 vkFreeMemory(m_device->device(), srcMem, NULL);
16253 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016254}
16255
Karl Schultz6addd812016-02-02 17:17:23 -070016256TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
16257 VkResult err;
16258 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016259
Karl Schultz6addd812016-02-02 17:17:23 -070016260 m_errorMonitor->SetDesiredFailureMsg(
16261 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016262 "vkCmdResolveImage called with unmatched source and dest formats.");
16263
Mike Stroyana3082432015-09-25 13:39:21 -060016264 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016265
16266 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016267 VkImage srcImage;
16268 VkImage dstImage;
16269 VkDeviceMemory srcMem;
16270 VkDeviceMemory destMem;
16271 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016272
16273 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016274 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16275 image_create_info.pNext = NULL;
16276 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16277 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16278 image_create_info.extent.width = 32;
16279 image_create_info.extent.height = 1;
16280 image_create_info.extent.depth = 1;
16281 image_create_info.mipLevels = 1;
16282 image_create_info.arrayLayers = 1;
16283 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
16284 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16285 // Note: Some implementations expect color attachment usage for any
16286 // multisample surface
16287 image_create_info.usage =
16288 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16289 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016290
Karl Schultz6addd812016-02-02 17:17:23 -070016291 err =
16292 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016293 ASSERT_VK_SUCCESS(err);
16294
Karl Schultz6addd812016-02-02 17:17:23 -070016295 // Set format to something other than source image
16296 image_create_info.format = VK_FORMAT_R32_SFLOAT;
16297 // Note: Some implementations expect color attachment usage for any
16298 // multisample surface
16299 image_create_info.usage =
16300 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16301 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016302
Karl Schultz6addd812016-02-02 17:17:23 -070016303 err =
16304 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016305 ASSERT_VK_SUCCESS(err);
16306
16307 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016308 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016309 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16310 memAlloc.pNext = NULL;
16311 memAlloc.allocationSize = 0;
16312 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016313
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016314 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016315 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016316 pass =
16317 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016318 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016319 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016320 ASSERT_VK_SUCCESS(err);
16321
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016322 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016323 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016324 pass =
16325 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016326 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016327 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016328 ASSERT_VK_SUCCESS(err);
16329
16330 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16331 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016332 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016333 ASSERT_VK_SUCCESS(err);
16334
16335 BeginCommandBuffer();
16336 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016337 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16338 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016339 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016340 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016341 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016342 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016343 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016344 resolveRegion.srcOffset.x = 0;
16345 resolveRegion.srcOffset.y = 0;
16346 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016347 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016348 resolveRegion.dstSubresource.mipLevel = 0;
16349 resolveRegion.dstSubresource.baseArrayLayer = 0;
16350 resolveRegion.dstSubresource.layerCount = 0;
16351 resolveRegion.dstOffset.x = 0;
16352 resolveRegion.dstOffset.y = 0;
16353 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016354 resolveRegion.extent.width = 1;
16355 resolveRegion.extent.height = 1;
16356 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016357 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16358 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016359 EndCommandBuffer();
16360
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016361 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016362
Chia-I Wuf7458c52015-10-26 21:10:41 +080016363 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016364 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016365 vkFreeMemory(m_device->device(), srcMem, NULL);
16366 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016367}
16368
Karl Schultz6addd812016-02-02 17:17:23 -070016369TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
16370 VkResult err;
16371 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016372
Karl Schultz6addd812016-02-02 17:17:23 -070016373 m_errorMonitor->SetDesiredFailureMsg(
16374 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016375 "vkCmdResolveImage called with unmatched source and dest image types.");
16376
Mike Stroyana3082432015-09-25 13:39:21 -060016377 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016378
16379 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016380 VkImage srcImage;
16381 VkImage dstImage;
16382 VkDeviceMemory srcMem;
16383 VkDeviceMemory destMem;
16384 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016385
16386 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016387 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16388 image_create_info.pNext = NULL;
16389 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16390 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16391 image_create_info.extent.width = 32;
16392 image_create_info.extent.height = 1;
16393 image_create_info.extent.depth = 1;
16394 image_create_info.mipLevels = 1;
16395 image_create_info.arrayLayers = 1;
16396 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
16397 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16398 // Note: Some implementations expect color attachment usage for any
16399 // multisample surface
16400 image_create_info.usage =
16401 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16402 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016403
Karl Schultz6addd812016-02-02 17:17:23 -070016404 err =
16405 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016406 ASSERT_VK_SUCCESS(err);
16407
Karl Schultz6addd812016-02-02 17:17:23 -070016408 image_create_info.imageType = VK_IMAGE_TYPE_1D;
16409 // Note: Some implementations expect color attachment usage for any
16410 // multisample surface
16411 image_create_info.usage =
16412 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16413 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016414
Karl Schultz6addd812016-02-02 17:17:23 -070016415 err =
16416 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016417 ASSERT_VK_SUCCESS(err);
16418
16419 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016420 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016421 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16422 memAlloc.pNext = NULL;
16423 memAlloc.allocationSize = 0;
16424 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016425
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016426 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016427 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016428 pass =
16429 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016430 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016431 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016432 ASSERT_VK_SUCCESS(err);
16433
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016434 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016435 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016436 pass =
16437 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016438 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016439 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016440 ASSERT_VK_SUCCESS(err);
16441
16442 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16443 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016444 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016445 ASSERT_VK_SUCCESS(err);
16446
16447 BeginCommandBuffer();
16448 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016449 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16450 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016451 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016452 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016453 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016454 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016455 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016456 resolveRegion.srcOffset.x = 0;
16457 resolveRegion.srcOffset.y = 0;
16458 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016459 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016460 resolveRegion.dstSubresource.mipLevel = 0;
16461 resolveRegion.dstSubresource.baseArrayLayer = 0;
16462 resolveRegion.dstSubresource.layerCount = 0;
16463 resolveRegion.dstOffset.x = 0;
16464 resolveRegion.dstOffset.y = 0;
16465 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016466 resolveRegion.extent.width = 1;
16467 resolveRegion.extent.height = 1;
16468 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016469 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16470 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016471 EndCommandBuffer();
16472
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016473 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016474
Chia-I Wuf7458c52015-10-26 21:10:41 +080016475 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016476 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016477 vkFreeMemory(m_device->device(), srcMem, NULL);
16478 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016479}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016480
Karl Schultz6addd812016-02-02 17:17:23 -070016481TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016482 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070016483 // to using a DS format, then cause it to hit error due to COLOR_BIT not
16484 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016485 // The image format check comes 2nd in validation so we trigger it first,
16486 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070016487 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016488
Karl Schultz6addd812016-02-02 17:17:23 -070016489 m_errorMonitor->SetDesiredFailureMsg(
16490 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016491 "Combination depth/stencil image formats can have only the ");
16492
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016493 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016494
Chia-I Wu1b99bb22015-10-27 19:25:11 +080016495 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016496 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16497 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016498
16499 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016500 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16501 ds_pool_ci.pNext = NULL;
16502 ds_pool_ci.maxSets = 1;
16503 ds_pool_ci.poolSizeCount = 1;
16504 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016505
16506 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070016507 err =
16508 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016509 ASSERT_VK_SUCCESS(err);
16510
16511 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016512 dsl_binding.binding = 0;
16513 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16514 dsl_binding.descriptorCount = 1;
16515 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16516 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016517
16518 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016519 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16520 ds_layout_ci.pNext = NULL;
16521 ds_layout_ci.bindingCount = 1;
16522 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016523 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070016524 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
16525 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016526 ASSERT_VK_SUCCESS(err);
16527
16528 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016529 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080016530 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070016531 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016532 alloc_info.descriptorPool = ds_pool;
16533 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070016534 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
16535 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016536 ASSERT_VK_SUCCESS(err);
16537
Karl Schultz6addd812016-02-02 17:17:23 -070016538 VkImage image_bad;
16539 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016540 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060016541 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016542 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070016543 const int32_t tex_width = 32;
16544 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016545
16546 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016547 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16548 image_create_info.pNext = NULL;
16549 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16550 image_create_info.format = tex_format_bad;
16551 image_create_info.extent.width = tex_width;
16552 image_create_info.extent.height = tex_height;
16553 image_create_info.extent.depth = 1;
16554 image_create_info.mipLevels = 1;
16555 image_create_info.arrayLayers = 1;
16556 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16557 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16558 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
16559 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
16560 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016561
Karl Schultz6addd812016-02-02 17:17:23 -070016562 err =
16563 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016564 ASSERT_VK_SUCCESS(err);
16565 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070016566 image_create_info.usage =
16567 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16568 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
16569 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016570 ASSERT_VK_SUCCESS(err);
16571
16572 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016573 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16574 image_view_create_info.image = image_bad;
16575 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16576 image_view_create_info.format = tex_format_bad;
16577 image_view_create_info.subresourceRange.baseArrayLayer = 0;
16578 image_view_create_info.subresourceRange.baseMipLevel = 0;
16579 image_view_create_info.subresourceRange.layerCount = 1;
16580 image_view_create_info.subresourceRange.levelCount = 1;
16581 image_view_create_info.subresourceRange.aspectMask =
16582 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016583
16584 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070016585 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
16586 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016587
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016588 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016589
Chia-I Wuf7458c52015-10-26 21:10:41 +080016590 vkDestroyImage(m_device->device(), image_bad, NULL);
16591 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016592 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16593 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016594}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016595
16596TEST_F(VkLayerTest, ClearImageErrors) {
16597 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
16598 "ClearDepthStencilImage with a color image.");
16599
16600 ASSERT_NO_FATAL_FAILURE(InitState());
16601 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16602
16603 // Renderpass is started here so end it as Clear cmds can't be in renderpass
16604 BeginCommandBuffer();
16605 m_commandBuffer->EndRenderPass();
16606
16607 // Color image
16608 VkClearColorValue clear_color;
16609 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
16610 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
16611 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
16612 const int32_t img_width = 32;
16613 const int32_t img_height = 32;
16614 VkImageCreateInfo image_create_info = {};
16615 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16616 image_create_info.pNext = NULL;
16617 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16618 image_create_info.format = color_format;
16619 image_create_info.extent.width = img_width;
16620 image_create_info.extent.height = img_height;
16621 image_create_info.extent.depth = 1;
16622 image_create_info.mipLevels = 1;
16623 image_create_info.arrayLayers = 1;
16624 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16625 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16626 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16627
16628 vk_testing::Image color_image;
16629 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info,
16630 reqs);
16631
16632 const VkImageSubresourceRange color_range =
16633 vk_testing::Image::subresource_range(image_create_info,
16634 VK_IMAGE_ASPECT_COLOR_BIT);
16635
16636 // Depth/Stencil image
16637 VkClearDepthStencilValue clear_value = {0};
16638 reqs = 0; // don't need HOST_VISIBLE DS image
16639 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
16640 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
16641 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
16642 ds_image_create_info.extent.width = 64;
16643 ds_image_create_info.extent.height = 64;
16644 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16645 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
16646
16647 vk_testing::Image ds_image;
16648 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info,
16649 reqs);
16650
16651 const VkImageSubresourceRange ds_range =
16652 vk_testing::Image::subresource_range(ds_image_create_info,
16653 VK_IMAGE_ASPECT_DEPTH_BIT);
16654
16655 m_errorMonitor->SetDesiredFailureMsg(
16656 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16657 "vkCmdClearColorImage called with depth/stencil image.");
16658
16659 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
16660 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
16661 &color_range);
16662
16663 m_errorMonitor->VerifyFound();
16664
Tony Barbour26434b92016-06-02 09:43:50 -060016665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16666 "vkCmdClearColorImage called with "
16667 "image created without "
16668 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
16669
16670 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
16671 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
16672 &color_range);
16673
16674 m_errorMonitor->VerifyFound();
16675
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016676 // Call CmdClearDepthStencilImage with color image
16677 m_errorMonitor->SetDesiredFailureMsg(
16678 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16679 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
16680
16681 vkCmdClearDepthStencilImage(
16682 m_commandBuffer->GetBufferHandle(), color_image.handle(),
16683 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
16684 &ds_range);
16685
16686 m_errorMonitor->VerifyFound();
16687}
Tobin Ehliscde08892015-09-22 10:11:37 -060016688#endif // IMAGE_TESTS
16689
Cody Northrop1242dfd2016-07-13 17:24:59 -060016690#if defined(ANDROID) && defined(VALIDATION_APK)
16691static bool initialized = false;
16692static bool active = false;
16693
16694// Convert Intents to argv
16695// Ported from Hologram sample, only difference is flexible key
16696std::vector<std::string> get_args(android_app &app, const char* intent_extra_data_key)
16697{
16698 std::vector<std::string> args;
16699 JavaVM &vm = *app.activity->vm;
16700 JNIEnv *p_env;
16701 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK)
16702 return args;
16703
16704 JNIEnv &env = *p_env;
16705 jobject activity = app.activity->clazz;
16706 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity),
16707 "getIntent", "()Landroid/content/Intent;");
16708 jobject intent = env.CallObjectMethod(activity, get_intent_method);
16709 jmethodID get_string_extra_method = env.GetMethodID(env.GetObjectClass(intent),
16710 "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
16711 jvalue get_string_extra_args;
16712 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
16713 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent,
16714 get_string_extra_method, &get_string_extra_args));
16715
16716 std::string args_str;
16717 if (extra_str) {
16718 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
16719 args_str = extra_utf;
16720 env.ReleaseStringUTFChars(extra_str, extra_utf);
16721 env.DeleteLocalRef(extra_str);
16722 }
16723
16724 env.DeleteLocalRef(get_string_extra_args.l);
16725 env.DeleteLocalRef(intent);
16726 vm.DetachCurrentThread();
16727
16728 // split args_str
16729 std::stringstream ss(args_str);
16730 std::string arg;
16731 while (std::getline(ss, arg, ' ')) {
16732 if (!arg.empty())
16733 args.push_back(arg);
16734 }
16735
16736 return args;
16737}
16738
16739
16740static int32_t processInput(struct android_app* app, AInputEvent* event) {
16741 return 0;
16742}
16743
16744static void processCommand(struct android_app* app, int32_t cmd) {
16745 switch(cmd) {
16746 case APP_CMD_INIT_WINDOW: {
16747 if (app->window) {
16748 initialized = true;
16749 }
16750 break;
16751 }
16752 case APP_CMD_GAINED_FOCUS: {
16753 active = true;
16754 break;
16755 }
16756 case APP_CMD_LOST_FOCUS: {
16757 active = false;
16758 break;
16759 }
16760 }
16761}
16762
16763void android_main(struct android_app *app)
16764{
16765 app_dummy();
16766
16767 const char* appTag = "VulkanLayerValidationTests";
16768
16769 int vulkanSupport = InitVulkan();
16770 if (vulkanSupport == 0) {
16771 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
16772 return;
16773 }
16774
16775 app->onAppCmd = processCommand;
16776 app->onInputEvent = processInput;
16777
16778 while(1) {
16779 int events;
16780 struct android_poll_source* source;
16781 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void**)&source) >= 0) {
16782 if (source) {
16783 source->process(app, source);
16784 }
16785
16786 if (app->destroyRequested != 0) {
16787 VkTestFramework::Finish();
16788 return;
16789 }
16790 }
16791
16792 if (initialized && active) {
16793 // Use the following key to send arguments to gtest, i.e.
16794 // --es args "--gtest_filter=-VkLayerTest.foo"
16795 const char key[] = "args";
16796 std::vector<std::string> args = get_args(*app, key);
16797
16798 std::string filter = "";
16799 if (args.size() > 0) {
16800 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
16801 filter += args[0];
16802 } else {
16803 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
16804 }
16805
16806 int argc = 2;
16807 char *argv[] = { (char*)"foo", (char*)filter.c_str() };
16808 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
16809
16810 // Route output to files until we can override the gtest output
16811 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
16812 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
16813
16814 ::testing::InitGoogleTest(&argc, argv);
16815 VkTestFramework::InitArgs(&argc, argv);
16816 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
16817
16818 int result = RUN_ALL_TESTS();
16819
16820 if (result != 0) {
16821 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
16822 } else {
16823 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
16824 }
16825
16826 VkTestFramework::Finish();
16827
16828 fclose(stdout);
16829 fclose(stderr);
16830
16831 ANativeActivity_finish(app->activity);
16832
16833 return;
16834 }
16835 }
16836}
16837#endif
16838
Tony Barbour300a6082015-04-07 13:44:53 -060016839int main(int argc, char **argv) {
16840 int result;
16841
Cody Northrop8e54a402016-03-08 22:25:52 -070016842#ifdef ANDROID
16843 int vulkanSupport = InitVulkan();
16844 if (vulkanSupport == 0)
16845 return 1;
16846#endif
16847
Tony Barbour300a6082015-04-07 13:44:53 -060016848 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060016849 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060016850
16851 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
16852
16853 result = RUN_ALL_TESTS();
16854
Tony Barbour6918cd52015-04-09 12:58:51 -060016855 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060016856 return result;
16857}