blob: f2f3abc34a19d3f287ffe32ef37f94e65099385c [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
Mark Lobodzinski1f515922016-08-16 10:03:30 -06002200TEST_F(VkLayerTest, NonCoherentMemoryMapping) {
2201
2202 TEST_DESCRIPTION("Ensure that validations handling of non-coherent memory "
2203 "mapping while using VK_WHOLE_SIZE does not cause access "
2204 "violations");
2205 VkResult err;
2206 uint8_t *pData;
2207 ASSERT_NO_FATAL_FAILURE(InitState());
2208
2209 VkDeviceMemory mem;
2210 VkMemoryRequirements mem_reqs;
2211 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
2212 VkMemoryAllocateInfo alloc_info = {};
2213 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2214 alloc_info.pNext = NULL;
2215 alloc_info.memoryTypeIndex = 0;
2216
2217 static const VkDeviceSize allocation_size = 0x1000;
2218 alloc_info.allocationSize = allocation_size;
2219
2220 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
2221 bool pass =
2222 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2223 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
2224 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
2225 if (!pass) {
2226 pass = m_device->phy().set_memory_type(
2227 mem_reqs.memoryTypeBits, &alloc_info,
2228 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
2229 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
2230 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
2231 if (!pass) {
2232 pass = m_device->phy().set_memory_type(
2233 mem_reqs.memoryTypeBits, &alloc_info,
2234 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
2235 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
2236 VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
2237 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
2238 if (!pass) {
2239 return;
2240 }
2241 }
2242 }
2243
2244 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2245 ASSERT_VK_SUCCESS(err);
2246
2247 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire
2248 // mapped range
2249 m_errorMonitor->ExpectSuccess();
2250 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
2251 (void **)&pData);
2252 ASSERT_VK_SUCCESS(err);
2253 VkMappedMemoryRange mmr = {};
2254 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
2255 mmr.memory = mem;
2256 mmr.offset = 0;
2257 mmr.size = VK_WHOLE_SIZE;
2258 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2259 ASSERT_VK_SUCCESS(err);
2260 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
2261 ASSERT_VK_SUCCESS(err);
2262 m_errorMonitor->VerifyNotFound();
2263 vkUnmapMemory(m_device->device(), mem);
2264
2265 // Map/Flush/Invalidate using WHOLE_SIZE and a prime offset and entire
2266 // mapped range
2267 m_errorMonitor->ExpectSuccess();
2268 err = vkMapMemory(m_device->device(), mem, 13, VK_WHOLE_SIZE, 0,
2269 (void **)&pData);
2270 ASSERT_VK_SUCCESS(err);
2271 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
2272 mmr.memory = mem;
2273 mmr.offset = 13;
2274 mmr.size = VK_WHOLE_SIZE;
2275 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2276 ASSERT_VK_SUCCESS(err);
2277 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
2278 ASSERT_VK_SUCCESS(err);
2279 m_errorMonitor->VerifyNotFound();
2280 vkUnmapMemory(m_device->device(), mem);
2281
2282 // Map with prime offset and size
2283 // Flush/Invalidate subrange of mapped area with prime offset and size
2284 m_errorMonitor->ExpectSuccess();
2285 err = vkMapMemory(m_device->device(), mem, allocation_size - 137, 109, 0,
2286 (void **)&pData);
2287 ASSERT_VK_SUCCESS(err);
2288 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
2289 mmr.memory = mem;
2290 mmr.offset = allocation_size - 107;
2291 mmr.size = 61;
2292 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2293 ASSERT_VK_SUCCESS(err);
2294 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
2295 ASSERT_VK_SUCCESS(err);
2296 m_errorMonitor->VerifyNotFound();
2297 vkUnmapMemory(m_device->device(), mem);
2298
2299 vkFreeMemory(m_device->device(), mem, NULL);
2300}
2301
Ian Elliott1c32c772016-04-28 14:47:13 -06002302TEST_F(VkLayerTest, EnableWsiBeforeUse) {
2303 VkResult err;
2304 bool pass;
2305
Ian Elliott489eec02016-05-05 14:12:44 -06002306// FIXME: After we turn on this code for non-Linux platforms, uncomment the
2307// following declaration (which is temporarily being moved below):
2308// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002309 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2310 VkSwapchainCreateInfoKHR swapchain_create_info = {};
2311 uint32_t swapchain_image_count = 0;
2312// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2313 uint32_t image_index = 0;
2314// VkPresentInfoKHR present_info = {};
2315
2316 ASSERT_NO_FATAL_FAILURE(InitState());
2317
Ian Elliott3f06ce52016-04-29 14:46:21 -06002318#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
2319#if defined(VK_USE_PLATFORM_ANDROID_KHR)
2320 // Use the functions from the VK_KHR_android_surface extension without
2321 // enabling that extension:
2322
2323 // Create a surface:
2324 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002325 m_errorMonitor->SetDesiredFailureMsg(
2326 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2327 "extension was not enabled for this");
2328 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
2329 &surface);
2330 pass = (err != VK_SUCCESS);
2331 ASSERT_TRUE(pass);
2332 m_errorMonitor->VerifyFound();
2333#endif // VK_USE_PLATFORM_ANDROID_KHR
2334
2335
2336#if defined(VK_USE_PLATFORM_MIR_KHR)
2337 // Use the functions from the VK_KHR_mir_surface extension without enabling
2338 // that extension:
2339
2340 // Create a surface:
2341 VkMirSurfaceCreateInfoKHR mir_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002342 m_errorMonitor->SetDesiredFailureMsg(
2343 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2344 "extension was not enabled for this");
2345 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
2346 pass = (err != VK_SUCCESS);
2347 ASSERT_TRUE(pass);
2348 m_errorMonitor->VerifyFound();
2349
2350 // Tell whether an mir_connection supports presentation:
2351 MirConnection *mir_connection = NULL;
2352 m_errorMonitor->SetDesiredFailureMsg(
2353 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2354 "extension was not enabled for this");
2355 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
2356 visual_id);
2357 m_errorMonitor->VerifyFound();
2358#endif // VK_USE_PLATFORM_MIR_KHR
2359
2360
2361#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
2362 // Use the functions from the VK_KHR_wayland_surface extension without
2363 // enabling that extension:
2364
2365 // Create a surface:
2366 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002367 m_errorMonitor->SetDesiredFailureMsg(
2368 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2369 "extension was not enabled for this");
2370 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
2371 &surface);
2372 pass = (err != VK_SUCCESS);
2373 ASSERT_TRUE(pass);
2374 m_errorMonitor->VerifyFound();
2375
2376 // Tell whether an wayland_display supports presentation:
2377 struct wl_display wayland_display = {};
2378 m_errorMonitor->SetDesiredFailureMsg(
2379 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2380 "extension was not enabled for this");
2381 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
2382 &wayland_display);
2383 m_errorMonitor->VerifyFound();
2384#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06002385#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06002386
2387
2388#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002389// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2390// TO NON-LINUX PLATFORMS:
2391VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06002392 // Use the functions from the VK_KHR_win32_surface extension without
2393 // enabling that extension:
2394
2395 // Create a surface:
2396 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002397 m_errorMonitor->SetDesiredFailureMsg(
2398 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2399 "extension was not enabled for this");
2400 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
2401 &surface);
2402 pass = (err != VK_SUCCESS);
2403 ASSERT_TRUE(pass);
2404 m_errorMonitor->VerifyFound();
2405
2406 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002407 m_errorMonitor->SetDesiredFailureMsg(
2408 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2409 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06002410 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002411 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002412// Set this (for now, until all platforms are supported and tested):
2413#define NEED_TO_TEST_THIS_ON_PLATFORM
2414#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06002415
2416
Ian Elliott1c32c772016-04-28 14:47:13 -06002417#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002418// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2419// TO NON-LINUX PLATFORMS:
2420VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002421 // Use the functions from the VK_KHR_xcb_surface extension without enabling
2422 // that extension:
2423
2424 // Create a surface:
2425 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06002426 m_errorMonitor->SetDesiredFailureMsg(
2427 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2428 "extension was not enabled for this");
2429 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2430 pass = (err != VK_SUCCESS);
2431 ASSERT_TRUE(pass);
2432 m_errorMonitor->VerifyFound();
2433
2434 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002435 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002436 xcb_visualid_t visual_id = 0;
2437 m_errorMonitor->SetDesiredFailureMsg(
2438 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2439 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06002440 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -06002441 visual_id);
2442 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002443// Set this (for now, until all platforms are supported and tested):
2444#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002445#endif // VK_USE_PLATFORM_XCB_KHR
2446
2447
Ian Elliott12630812016-04-29 14:35:43 -06002448#if defined(VK_USE_PLATFORM_XLIB_KHR)
2449 // Use the functions from the VK_KHR_xlib_surface extension without enabling
2450 // that extension:
2451
2452 // Create a surface:
2453 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
Ian Elliott12630812016-04-29 14:35:43 -06002454 m_errorMonitor->SetDesiredFailureMsg(
2455 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2456 "extension was not enabled for this");
2457 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
2458 pass = (err != VK_SUCCESS);
2459 ASSERT_TRUE(pass);
2460 m_errorMonitor->VerifyFound();
2461
2462 // Tell whether an Xlib VisualID supports presentation:
2463 Display *dpy = NULL;
2464 VisualID visual = 0;
2465 m_errorMonitor->SetDesiredFailureMsg(
2466 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2467 "extension was not enabled for this");
2468 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
2469 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002470// Set this (for now, until all platforms are supported and tested):
2471#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06002472#endif // VK_USE_PLATFORM_XLIB_KHR
2473
2474
Ian Elliott1c32c772016-04-28 14:47:13 -06002475 // Use the functions from the VK_KHR_surface extension without enabling
2476 // that extension:
2477
Ian Elliott489eec02016-05-05 14:12:44 -06002478#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002479 // Destroy a surface:
2480 m_errorMonitor->SetDesiredFailureMsg(
2481 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2482 "extension was not enabled for this");
2483 vkDestroySurfaceKHR(instance(), surface, NULL);
2484 m_errorMonitor->VerifyFound();
2485
2486 // Check if surface supports presentation:
2487 VkBool32 supported = false;
2488 m_errorMonitor->SetDesiredFailureMsg(
2489 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2490 "extension was not enabled for this");
2491 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2492 pass = (err != VK_SUCCESS);
2493 ASSERT_TRUE(pass);
2494 m_errorMonitor->VerifyFound();
2495
2496 // Check surface capabilities:
2497 VkSurfaceCapabilitiesKHR capabilities = {};
2498 m_errorMonitor->SetDesiredFailureMsg(
2499 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2500 "extension was not enabled for this");
2501 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2502 &capabilities);
2503 pass = (err != VK_SUCCESS);
2504 ASSERT_TRUE(pass);
2505 m_errorMonitor->VerifyFound();
2506
2507 // Check surface formats:
2508 uint32_t format_count = 0;
2509 VkSurfaceFormatKHR *formats = NULL;
2510 m_errorMonitor->SetDesiredFailureMsg(
2511 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2512 "extension was not enabled for this");
2513 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2514 &format_count, formats);
2515 pass = (err != VK_SUCCESS);
2516 ASSERT_TRUE(pass);
2517 m_errorMonitor->VerifyFound();
2518
2519 // Check surface present modes:
2520 uint32_t present_mode_count = 0;
2521 VkSurfaceFormatKHR *present_modes = NULL;
2522 m_errorMonitor->SetDesiredFailureMsg(
2523 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2524 "extension was not enabled for this");
2525 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2526 &present_mode_count, present_modes);
2527 pass = (err != VK_SUCCESS);
2528 ASSERT_TRUE(pass);
2529 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002530#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002531
2532
2533 // Use the functions from the VK_KHR_swapchain extension without enabling
2534 // that extension:
2535
2536 // Create a swapchain:
2537 m_errorMonitor->SetDesiredFailureMsg(
2538 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2539 "extension was not enabled for this");
2540 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2541 swapchain_create_info.pNext = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002542 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
2543 NULL, &swapchain);
2544 pass = (err != VK_SUCCESS);
2545 ASSERT_TRUE(pass);
2546 m_errorMonitor->VerifyFound();
2547
2548 // Get the images from the swapchain:
2549 m_errorMonitor->SetDesiredFailureMsg(
2550 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2551 "extension was not enabled for this");
2552 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
2553 &swapchain_image_count, NULL);
2554 pass = (err != VK_SUCCESS);
2555 ASSERT_TRUE(pass);
2556 m_errorMonitor->VerifyFound();
2557
2558 // Try to acquire an image:
2559 m_errorMonitor->SetDesiredFailureMsg(
2560 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2561 "extension was not enabled for this");
2562 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
2563 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
2564 pass = (err != VK_SUCCESS);
2565 ASSERT_TRUE(pass);
2566 m_errorMonitor->VerifyFound();
2567
2568 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002569 //
2570 // NOTE: Currently can't test this because a real swapchain is needed (as
2571 // opposed to the fake one we created) in order for the layer to lookup the
2572 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06002573
2574 // Destroy the swapchain:
2575 m_errorMonitor->SetDesiredFailureMsg(
2576 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2577 "extension was not enabled for this");
2578 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
2579 m_errorMonitor->VerifyFound();
2580}
2581
Ian Elliott2c1daf52016-05-12 09:41:46 -06002582TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
Ian Elliott2c1daf52016-05-12 09:41:46 -06002583
Dustin Graves6c6d8982016-05-17 10:09:21 -06002584#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott2c1daf52016-05-12 09:41:46 -06002585 VkSurfaceKHR surface = VK_NULL_HANDLE;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002586
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002587 VkResult err;
2588 bool pass;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002589 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2590 VkSwapchainCreateInfoKHR swapchain_create_info = {};
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002591 // uint32_t swapchain_image_count = 0;
2592 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2593 // uint32_t image_index = 0;
2594 // VkPresentInfoKHR present_info = {};
Ian Elliott2c1daf52016-05-12 09:41:46 -06002595
2596 ASSERT_NO_FATAL_FAILURE(InitState());
2597
2598 // Use the create function from one of the VK_KHR_*_surface extension in
2599 // order to create a surface, testing all known errors in the process,
2600 // before successfully creating a surface:
2601 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002602 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002603 "required parameter pCreateInfo specified as NULL");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002604 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
2605 pass = (err != VK_SUCCESS);
2606 ASSERT_TRUE(pass);
2607 m_errorMonitor->VerifyFound();
2608
2609 // Next, try to create a surface with the wrong
2610 // VkXcbSurfaceCreateInfoKHR::sType:
2611 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
2612 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002614 "parameter pCreateInfo->sType must be");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002615 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2616 pass = (err != VK_SUCCESS);
2617 ASSERT_TRUE(pass);
2618 m_errorMonitor->VerifyFound();
2619
Ian Elliott2c1daf52016-05-12 09:41:46 -06002620 // Create a native window, and then correctly create a surface:
2621 xcb_connection_t *connection;
2622 xcb_screen_t *screen;
2623 xcb_window_t xcb_window;
2624 xcb_intern_atom_reply_t *atom_wm_delete_window;
2625
2626 const xcb_setup_t *setup;
2627 xcb_screen_iterator_t iter;
2628 int scr;
2629 uint32_t value_mask, value_list[32];
2630 int width = 1;
2631 int height = 1;
2632
2633 connection = xcb_connect(NULL, &scr);
2634 ASSERT_TRUE(connection != NULL);
2635 setup = xcb_get_setup(connection);
2636 iter = xcb_setup_roots_iterator(setup);
2637 while (scr-- > 0)
2638 xcb_screen_next(&iter);
2639 screen = iter.data;
2640
2641 xcb_window = xcb_generate_id(connection);
2642
2643 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
2644 value_list[0] = screen->black_pixel;
2645 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE |
2646 XCB_EVENT_MASK_STRUCTURE_NOTIFY;
2647
2648 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window,
2649 screen->root, 0, 0, width, height, 0,
2650 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual,
2651 value_mask, value_list);
2652
2653 /* Magic code that will send notification when window is destroyed */
2654 xcb_intern_atom_cookie_t cookie =
2655 xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
2656 xcb_intern_atom_reply_t *reply =
2657 xcb_intern_atom_reply(connection, cookie, 0);
2658
2659 xcb_intern_atom_cookie_t cookie2 =
2660 xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002661 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002662 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window,
2663 (*reply).atom, 4, 32, 1,
2664 &(*atom_wm_delete_window).atom);
2665 free(reply);
2666
2667 xcb_map_window(connection, xcb_window);
2668
2669 // Force the x/y coordinates to 100,100 results are identical in consecutive
2670 // runs
2671 const uint32_t coords[] = {100, 100};
2672 xcb_configure_window(connection, xcb_window,
2673 XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
2674
Ian Elliott2c1daf52016-05-12 09:41:46 -06002675 // Finally, try to correctly create a surface:
2676 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
2677 xcb_create_info.pNext = NULL;
2678 xcb_create_info.flags = 0;
2679 xcb_create_info.connection = connection;
2680 xcb_create_info.window = xcb_window;
2681 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2682 pass = (err == VK_SUCCESS);
2683 ASSERT_TRUE(pass);
2684
Ian Elliott2c1daf52016-05-12 09:41:46 -06002685 // Check if surface supports presentation:
2686
2687 // 1st, do so without having queried the queue families:
2688 VkBool32 supported = false;
2689 // TODO: Get the following error to come out:
2690 m_errorMonitor->SetDesiredFailureMsg(
2691 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2692 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
2693 "function");
2694 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2695 pass = (err != VK_SUCCESS);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002696 // ASSERT_TRUE(pass);
2697 // m_errorMonitor->VerifyFound();
Ian Elliott2c1daf52016-05-12 09:41:46 -06002698
2699 // Next, query a queue family index that's too large:
2700 m_errorMonitor->SetDesiredFailureMsg(
2701 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2702 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002703 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface,
2704 &supported);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002705 pass = (err != VK_SUCCESS);
2706 ASSERT_TRUE(pass);
2707 m_errorMonitor->VerifyFound();
2708
2709 // Finally, do so correctly:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002710 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2711 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002712 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2713 pass = (err == VK_SUCCESS);
2714 ASSERT_TRUE(pass);
2715
Ian Elliott2c1daf52016-05-12 09:41:46 -06002716 // Before proceeding, try to create a swapchain without having called
2717 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
2718 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2719 swapchain_create_info.pNext = NULL;
2720 swapchain_create_info.flags = 0;
2721 m_errorMonitor->SetDesiredFailureMsg(
2722 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2723 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002724 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2725 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002726 pass = (err != VK_SUCCESS);
2727 ASSERT_TRUE(pass);
2728 m_errorMonitor->VerifyFound();
2729
Ian Elliott2c1daf52016-05-12 09:41:46 -06002730 // Get the surface capabilities:
2731 VkSurfaceCapabilitiesKHR surface_capabilities;
2732
2733 // Do so correctly (only error logged by this entrypoint is if the
2734 // extension isn't enabled):
2735 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2736 &surface_capabilities);
2737 pass = (err == VK_SUCCESS);
2738 ASSERT_TRUE(pass);
2739
Ian Elliott2c1daf52016-05-12 09:41:46 -06002740 // Get the surface formats:
2741 uint32_t surface_format_count;
2742
2743 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002745 "required parameter pSurfaceFormatCount "
2746 "specified as NULL");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002747 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
2748 pass = (err == VK_SUCCESS);
2749 ASSERT_TRUE(pass);
2750 m_errorMonitor->VerifyFound();
2751
2752 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
2753 // correctly done a 1st try (to get the count):
2754 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski6a7e9332016-08-16 09:06:15 -06002755 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002756 "but no prior positive value has been seen for");
2757 surface_format_count = 0;
2758 vkGetPhysicalDeviceSurfaceFormatsKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002759 gpu(), surface, &surface_format_count,
2760 (VkSurfaceFormatKHR *)&surface_format_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002761 pass = (err == VK_SUCCESS);
2762 ASSERT_TRUE(pass);
2763 m_errorMonitor->VerifyFound();
2764
2765 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002766 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2767 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002768 pass = (err == VK_SUCCESS);
2769 ASSERT_TRUE(pass);
2770
2771 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002772 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(
2773 surface_format_count * sizeof(VkSurfaceFormatKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002774
2775 // Next, do a 2nd try with surface_format_count being set too high:
2776 surface_format_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2778 "that is greater than the value");
2779 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002780 surface_formats);
2781 pass = (err == VK_SUCCESS);
2782 ASSERT_TRUE(pass);
2783 m_errorMonitor->VerifyFound();
2784
2785 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002786 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2787 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002788 pass = (err == VK_SUCCESS);
2789 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002790 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002791 surface_formats);
2792 pass = (err == VK_SUCCESS);
2793 ASSERT_TRUE(pass);
2794
Ian Elliott2c1daf52016-05-12 09:41:46 -06002795 // Get the surface present modes:
2796 uint32_t surface_present_mode_count;
2797
2798 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002799 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002800 "required parameter pPresentModeCount "
2801 "specified as NULL");
2802
Ian Elliott2c1daf52016-05-12 09:41:46 -06002803 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
2804 pass = (err == VK_SUCCESS);
2805 ASSERT_TRUE(pass);
2806 m_errorMonitor->VerifyFound();
2807
2808 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
2809 // correctly done a 1st try (to get the count):
2810 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski6a7e9332016-08-16 09:06:15 -06002811 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002812 "but no prior positive value has been seen for");
2813 surface_present_mode_count = 0;
2814 vkGetPhysicalDeviceSurfacePresentModesKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002815 gpu(), surface, &surface_present_mode_count,
2816 (VkPresentModeKHR *)&surface_present_mode_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002817 pass = (err == VK_SUCCESS);
2818 ASSERT_TRUE(pass);
2819 m_errorMonitor->VerifyFound();
2820
2821 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002822 vkGetPhysicalDeviceSurfacePresentModesKHR(
2823 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002824 pass = (err == VK_SUCCESS);
2825 ASSERT_TRUE(pass);
2826
2827 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002828 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(
2829 surface_present_mode_count * sizeof(VkPresentModeKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002830
2831 // Next, do a 2nd try with surface_format_count being set too high:
2832 surface_present_mode_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002833 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2834 "that is greater than the value");
2835 vkGetPhysicalDeviceSurfacePresentModesKHR(
2836 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002837 pass = (err == VK_SUCCESS);
2838 ASSERT_TRUE(pass);
2839 m_errorMonitor->VerifyFound();
2840
2841 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002842 vkGetPhysicalDeviceSurfacePresentModesKHR(
2843 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002844 pass = (err == VK_SUCCESS);
2845 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002846 vkGetPhysicalDeviceSurfacePresentModesKHR(
2847 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002848 pass = (err == VK_SUCCESS);
2849 ASSERT_TRUE(pass);
2850
Ian Elliott2c1daf52016-05-12 09:41:46 -06002851 // Create a swapchain:
2852
2853 // First, try without a pointer to swapchain_create_info:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002855 "required parameter pCreateInfo "
2856 "specified as NULL");
2857
Ian Elliott2c1daf52016-05-12 09:41:46 -06002858 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
2859 pass = (err != VK_SUCCESS);
2860 ASSERT_TRUE(pass);
2861 m_errorMonitor->VerifyFound();
2862
2863 // Next, call with a non-NULL swapchain_create_info, that has the wrong
2864 // sType:
2865 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002866 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002867 "parameter pCreateInfo->sType must be");
2868
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002869 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2870 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002871 pass = (err != VK_SUCCESS);
2872 ASSERT_TRUE(pass);
2873 m_errorMonitor->VerifyFound();
2874
2875 // Next, call with a NULL swapchain pointer:
2876 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2877 swapchain_create_info.pNext = NULL;
2878 swapchain_create_info.flags = 0;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002880 "required parameter pSwapchain "
2881 "specified as NULL");
2882
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002883 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2884 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002885 pass = (err != VK_SUCCESS);
2886 ASSERT_TRUE(pass);
2887 m_errorMonitor->VerifyFound();
2888
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002889 // TODO: Enhance swapchain layer so that
2890 // swapchain_create_info.queueFamilyIndexCount is checked against something?
Ian Elliott2c1daf52016-05-12 09:41:46 -06002891
2892 // Next, call with a queue family index that's too large:
2893 uint32_t queueFamilyIndex[2] = {100000, 0};
2894 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2895 swapchain_create_info.queueFamilyIndexCount = 2;
2896 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
2897 m_errorMonitor->SetDesiredFailureMsg(
2898 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2899 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002900 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2901 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002902 pass = (err != VK_SUCCESS);
2903 ASSERT_TRUE(pass);
2904 m_errorMonitor->VerifyFound();
2905
2906 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
2907 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2908 swapchain_create_info.queueFamilyIndexCount = 1;
2909 m_errorMonitor->SetDesiredFailureMsg(
2910 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2911 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
2912 "pCreateInfo->pQueueFamilyIndices).");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002913 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2914 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002915 pass = (err != VK_SUCCESS);
2916 ASSERT_TRUE(pass);
2917 m_errorMonitor->VerifyFound();
2918
2919 // Next, call with an invalid imageSharingMode:
2920 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
2921 swapchain_create_info.queueFamilyIndexCount = 1;
2922 m_errorMonitor->SetDesiredFailureMsg(
2923 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2924 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002925 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2926 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002927 pass = (err != VK_SUCCESS);
2928 ASSERT_TRUE(pass);
2929 m_errorMonitor->VerifyFound();
2930 // Fix for the future:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002931 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2932 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002933 swapchain_create_info.queueFamilyIndexCount = 0;
2934 queueFamilyIndex[0] = 0;
2935 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
2936
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002937 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
Ian Elliott2c1daf52016-05-12 09:41:46 -06002938 // Get the images from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002939 // Acquire an image from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002940 // Present an image to a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002941 // Destroy the swapchain:
2942
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002943 // TODOs:
2944 //
2945 // - Try destroying the device without first destroying the swapchain
2946 //
2947 // - Try destroying the device without first destroying the surface
2948 //
2949 // - Try destroying the surface without first destroying the swapchain
Ian Elliott2c1daf52016-05-12 09:41:46 -06002950
2951 // Destroy the surface:
2952 vkDestroySurfaceKHR(instance(), surface, NULL);
2953
Ian Elliott2c1daf52016-05-12 09:41:46 -06002954 // Tear down the window:
2955 xcb_destroy_window(connection, xcb_window);
2956 xcb_disconnect(connection);
2957
2958#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002959 return;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002960#endif // VK_USE_PLATFORM_XCB_KHR
2961}
2962
Karl Schultz6addd812016-02-02 17:17:23 -07002963TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2964 VkResult err;
2965 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002966
Karl Schultz6addd812016-02-02 17:17:23 -07002967 m_errorMonitor->SetDesiredFailureMsg(
2968 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002969 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
2970
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002971 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002972
2973 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002974 VkImage image;
2975 VkDeviceMemory mem;
2976 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002977
Karl Schultz6addd812016-02-02 17:17:23 -07002978 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2979 const int32_t tex_width = 32;
2980 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002981
Tony Barboureb254902015-07-15 12:50:33 -06002982 VkImageCreateInfo image_create_info = {};
2983 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002984 image_create_info.pNext = NULL;
2985 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2986 image_create_info.format = tex_format;
2987 image_create_info.extent.width = tex_width;
2988 image_create_info.extent.height = tex_height;
2989 image_create_info.extent.depth = 1;
2990 image_create_info.mipLevels = 1;
2991 image_create_info.arrayLayers = 1;
2992 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2993 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2994 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2995 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002996
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002997 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002998 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002999 mem_alloc.pNext = NULL;
3000 mem_alloc.allocationSize = 0;
3001 // Introduce failure, do NOT set memProps to
3002 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
3003 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05003004
Chia-I Wuf7458c52015-10-26 21:10:41 +08003005 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05003006 ASSERT_VK_SUCCESS(err);
3007
Karl Schultz6addd812016-02-02 17:17:23 -07003008 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05003009
Mark Lobodzinski23065352015-05-29 09:32:35 -05003010 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05003011
Karl Schultz6addd812016-02-02 17:17:23 -07003012 pass =
3013 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
3014 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
3015 if (!pass) { // If we can't find any unmappable memory this test doesn't
3016 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08003017 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06003018 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06003019 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06003020
Mark Lobodzinski3780e142015-05-14 15:08:13 -05003021 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003022 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05003023 ASSERT_VK_SUCCESS(err);
3024
3025 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06003026 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05003027 ASSERT_VK_SUCCESS(err);
3028
3029 // Map memory as if to initialize the image
3030 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07003031 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
3032 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05003033
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003034 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003035
Chia-I Wuf7458c52015-10-26 21:10:41 +08003036 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06003037 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05003038}
3039
Karl Schultz6addd812016-02-02 17:17:23 -07003040TEST_F(VkLayerTest, RebindMemory) {
3041 VkResult err;
3042 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003043
Karl Schultz6addd812016-02-02 17:17:23 -07003044 m_errorMonitor->SetDesiredFailureMsg(
3045 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003046 "which has already been bound to mem object");
3047
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003048 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003049
3050 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07003051 VkImage image;
3052 VkDeviceMemory mem1;
3053 VkDeviceMemory mem2;
3054 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003055
Karl Schultz6addd812016-02-02 17:17:23 -07003056 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3057 const int32_t tex_width = 32;
3058 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003059
Tony Barboureb254902015-07-15 12:50:33 -06003060 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003061 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3062 image_create_info.pNext = NULL;
3063 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3064 image_create_info.format = tex_format;
3065 image_create_info.extent.width = tex_width;
3066 image_create_info.extent.height = tex_height;
3067 image_create_info.extent.depth = 1;
3068 image_create_info.mipLevels = 1;
3069 image_create_info.arrayLayers = 1;
3070 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3071 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3072 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3073 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003074
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003075 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003076 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3077 mem_alloc.pNext = NULL;
3078 mem_alloc.allocationSize = 0;
3079 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06003080
Karl Schultz6addd812016-02-02 17:17:23 -07003081 // Introduce failure, do NOT set memProps to
3082 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06003083 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003084 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003085 ASSERT_VK_SUCCESS(err);
3086
Karl Schultz6addd812016-02-02 17:17:23 -07003087 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003088
3089 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003090 pass =
3091 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003092 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003093
3094 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003095 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003096 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003097 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003098 ASSERT_VK_SUCCESS(err);
3099
3100 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06003101 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003102 ASSERT_VK_SUCCESS(err);
3103
Karl Schultz6addd812016-02-02 17:17:23 -07003104 // Introduce validation failure, try to bind a different memory object to
3105 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06003106 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003107
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003108 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003109
Chia-I Wuf7458c52015-10-26 21:10:41 +08003110 vkDestroyImage(m_device->device(), image, NULL);
3111 vkFreeMemory(m_device->device(), mem1, NULL);
3112 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003113}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05003114
Karl Schultz6addd812016-02-02 17:17:23 -07003115TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003116 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003117
Karl Schultz6addd812016-02-02 17:17:23 -07003118 m_errorMonitor->SetDesiredFailureMsg(
3119 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
3120 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06003121
3122 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06003123 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3124 fenceInfo.pNext = NULL;
3125 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06003126
Tony Barbour300a6082015-04-07 13:44:53 -06003127 ASSERT_NO_FATAL_FAILURE(InitState());
3128 ASSERT_NO_FATAL_FAILURE(InitViewport());
3129 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3130
Tony Barbourfe3351b2015-07-28 10:17:20 -06003131 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003132 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
3133 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06003134 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06003135
3136 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06003137
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003138 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08003139 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3140 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003141 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003142 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07003143 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003144 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003145 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08003146 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003147 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06003148
3149 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07003150 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06003151
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003152 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06003153}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003154// This is a positive test. We used to expect error in this case but spec now
3155// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07003156TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003157 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06003158 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06003159 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06003160 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3161 fenceInfo.pNext = NULL;
3162
Tony Barbour0b4d9562015-04-09 10:48:04 -06003163 ASSERT_NO_FATAL_FAILURE(InitState());
3164 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08003165 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003166 VkResult result = vkResetFences(m_device->device(), 1, fences);
3167 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06003168
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003169 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06003170}
Tobin Ehlis56ab9022016-08-17 17:59:31 -06003171#if 0 // A few devices have issues with this test so disabling for now
Chris Forbese70b7d32016-06-15 15:49:12 +12003172TEST_F(VkLayerTest, LongFenceChain)
3173{
3174 m_errorMonitor->ExpectSuccess();
3175
3176 ASSERT_NO_FATAL_FAILURE(InitState());
3177 VkResult err;
3178
3179 std::vector<VkFence> fences;
3180
3181 const int chainLength = 32768;
3182
3183 for (int i = 0; i < chainLength; i++) {
3184 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3185 VkFence fence;
3186 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3187 ASSERT_VK_SUCCESS(err);
3188
3189 fences.push_back(fence);
3190
3191 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3192 0, nullptr, 0, nullptr };
3193 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3194 ASSERT_VK_SUCCESS(err);
3195
3196 }
3197
3198 // BOOM, stack overflow.
3199 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
3200
3201 for (auto fence : fences)
3202 vkDestroyFence(m_device->device(), fence, nullptr);
3203
3204 m_errorMonitor->VerifyNotFound();
3205}
Tobin Ehlis56ab9022016-08-17 17:59:31 -06003206#endif
Chris Forbes18127d12016-06-08 16:52:28 +12003207TEST_F(VkLayerTest, CommandBufferSimultaneousUseSync)
3208{
3209 m_errorMonitor->ExpectSuccess();
3210
3211 ASSERT_NO_FATAL_FAILURE(InitState());
3212 VkResult err;
3213
3214 // Record (empty!) command buffer that can be submitted multiple times
3215 // simultaneously.
3216 VkCommandBufferBeginInfo cbbi = {
3217 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
3218 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr
3219 };
3220 m_commandBuffer->BeginCommandBuffer(&cbbi);
3221 m_commandBuffer->EndCommandBuffer();
3222
3223 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3224 VkFence fence;
3225 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3226 ASSERT_VK_SUCCESS(err);
3227
3228 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
3229 VkSemaphore s1, s2;
3230 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
3231 ASSERT_VK_SUCCESS(err);
3232 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
3233 ASSERT_VK_SUCCESS(err);
3234
3235 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
3236 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3237 1, &m_commandBuffer->handle(), 1, &s1 };
3238 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3239 ASSERT_VK_SUCCESS(err);
3240
3241 // Submit CB again, signaling s2.
3242 si.pSignalSemaphores = &s2;
3243 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
3244 ASSERT_VK_SUCCESS(err);
3245
3246 // Wait for fence.
3247 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3248 ASSERT_VK_SUCCESS(err);
3249
3250 // CB is still in flight from second submission, but semaphore s1 is no
3251 // longer in flight. delete it.
3252 vkDestroySemaphore(m_device->device(), s1, nullptr);
3253
3254 m_errorMonitor->VerifyNotFound();
3255
3256 // Force device idle and clean up remaining objects
3257 vkDeviceWaitIdle(m_device->device());
3258 vkDestroySemaphore(m_device->device(), s2, nullptr);
3259 vkDestroyFence(m_device->device(), fence, nullptr);
3260}
3261
Chris Forbes4e44c912016-06-16 10:20:00 +12003262TEST_F(VkLayerTest, FenceCreateSignaledWaitHandling)
3263{
3264 m_errorMonitor->ExpectSuccess();
3265
3266 ASSERT_NO_FATAL_FAILURE(InitState());
3267 VkResult err;
3268
3269 // A fence created signaled
3270 VkFenceCreateInfo fci1 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT };
3271 VkFence f1;
3272 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
3273 ASSERT_VK_SUCCESS(err);
3274
3275 // A fence created not
3276 VkFenceCreateInfo fci2 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3277 VkFence f2;
3278 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
3279 ASSERT_VK_SUCCESS(err);
3280
3281 // Submit the unsignaled fence
3282 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3283 0, nullptr, 0, nullptr };
3284 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
3285
3286 // Wait on both fences, with signaled first.
3287 VkFence fences[] = { f1, f2 };
3288 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
3289
3290 // Should have both retired!
3291 vkDestroyFence(m_device->device(), f1, nullptr);
3292 vkDestroyFence(m_device->device(), f2, nullptr);
3293
3294 m_errorMonitor->VerifyNotFound();
3295}
3296
Tobin Ehlis41376e12015-07-03 08:45:14 -06003297TEST_F(VkLayerTest, InvalidUsageBits)
3298{
Tony Barbourf92621a2016-05-02 14:28:12 -06003299 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003300 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06003301 "Initialize buffer with wrong usage then perform copy expecting errors "
3302 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003303 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003304 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06003305
3306 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06003307 VkImageObj image(m_device);
3308 // Initialize image with USAGE_INPUT_ATTACHMENT
Tobin Ehlis8b313c02016-05-25 15:01:52 -06003309 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003310 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
3311 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06003312
Tony Barbourf92621a2016-05-02 14:28:12 -06003313 VkImageView dsv;
3314 VkImageViewCreateInfo dsvci = {};
3315 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3316 dsvci.image = image.handle();
3317 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3318 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
3319 dsvci.subresourceRange.layerCount = 1;
3320 dsvci.subresourceRange.baseMipLevel = 0;
3321 dsvci.subresourceRange.levelCount = 1;
3322 dsvci.subresourceRange.aspectMask =
3323 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06003324
Tony Barbourf92621a2016-05-02 14:28:12 -06003325 // Create a view with depth / stencil aspect for image with different usage
3326 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003327
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003328 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06003329
3330 // Initialize buffer with TRANSFER_DST usage
3331 vk_testing::Buffer buffer;
3332 VkMemoryPropertyFlags reqs = 0;
3333 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3334 VkBufferImageCopy region = {};
3335 region.bufferRowLength = 128;
3336 region.bufferImageHeight = 128;
3337 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3338 region.imageSubresource.layerCount = 1;
3339 region.imageExtent.height = 16;
3340 region.imageExtent.width = 16;
3341 region.imageExtent.depth = 1;
3342
3343 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3344 "Invalid usage flag for buffer ");
3345 // Buffer usage not set to TRANSFER_SRC and image usage not set to
3346 // TRANSFER_DST
3347 BeginCommandBuffer();
3348 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3349 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3350 1, &region);
3351 m_errorMonitor->VerifyFound();
3352
3353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3354 "Invalid usage flag for image ");
3355 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3356 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3357 1, &region);
3358 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06003359}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003360#endif // MEM_TRACKER_TESTS
3361
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06003362#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003363
3364TEST_F(VkLayerTest, LeakAnObject) {
3365 VkResult err;
3366
3367 TEST_DESCRIPTION(
3368 "Create a fence and destroy its device without first destroying the fence.");
3369
3370 // Note that we have to create a new device since destroying the
3371 // framework's device causes Teardown() to fail and just calling Teardown
3372 // will destroy the errorMonitor.
3373
3374 m_errorMonitor->SetDesiredFailureMsg(
3375 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003376 "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003377
3378 ASSERT_NO_FATAL_FAILURE(InitState());
3379
3380 const std::vector<VkQueueFamilyProperties> queue_props =
3381 m_device->queue_props;
3382 std::vector<VkDeviceQueueCreateInfo> queue_info;
3383 queue_info.reserve(queue_props.size());
3384 std::vector<std::vector<float>> queue_priorities;
3385 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
3386 VkDeviceQueueCreateInfo qi = {};
3387 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
3388 qi.pNext = NULL;
3389 qi.queueFamilyIndex = i;
3390 qi.queueCount = queue_props[i].queueCount;
3391 queue_priorities.emplace_back(qi.queueCount, 0.0f);
3392 qi.pQueuePriorities = queue_priorities[i].data();
3393 queue_info.push_back(qi);
3394 }
3395
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003396 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003397
3398 // The sacrificial device object
3399 VkDevice testDevice;
3400 VkDeviceCreateInfo device_create_info = {};
3401 auto features = m_device->phy().features();
3402 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
3403 device_create_info.pNext = NULL;
3404 device_create_info.queueCreateInfoCount = queue_info.size();
3405 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06003406 device_create_info.enabledLayerCount = 0;
3407 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003408 device_create_info.pEnabledFeatures = &features;
3409 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
3410 ASSERT_VK_SUCCESS(err);
3411
3412 VkFence fence;
3413 VkFenceCreateInfo fence_create_info = {};
3414 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3415 fence_create_info.pNext = NULL;
3416 fence_create_info.flags = 0;
3417 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
3418 ASSERT_VK_SUCCESS(err);
3419
3420 // Induce failure by not calling vkDestroyFence
3421 vkDestroyDevice(testDevice, NULL);
3422 m_errorMonitor->VerifyFound();
3423}
3424
3425TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
3426
3427 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
3428 "attempt to delete them from another.");
3429
3430 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3431 "FreeCommandBuffers is attempting to free Command Buffer");
3432
3433 VkCommandPool command_pool_one;
3434 VkCommandPool command_pool_two;
3435
3436 VkCommandPoolCreateInfo pool_create_info{};
3437 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3438 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3439 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3440
3441 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3442 &command_pool_one);
3443
3444 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3445 &command_pool_two);
3446
3447 VkCommandBuffer command_buffer[9];
3448 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3449 command_buffer_allocate_info.sType =
3450 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3451 command_buffer_allocate_info.commandPool = command_pool_one;
3452 command_buffer_allocate_info.commandBufferCount = 9;
3453 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3454 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3455 command_buffer);
3456
3457 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
3458 &command_buffer[3]);
3459
3460 m_errorMonitor->VerifyFound();
3461
3462 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
3463 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
3464}
3465
3466TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
3467 VkResult err;
3468
3469 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
3470 "attempt to delete them from another.");
3471
3472 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3473 "FreeDescriptorSets is attempting to free descriptorSet");
3474
3475 ASSERT_NO_FATAL_FAILURE(InitState());
3476 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3477
3478 VkDescriptorPoolSize ds_type_count = {};
3479 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3480 ds_type_count.descriptorCount = 1;
3481
3482 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3483 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3484 ds_pool_ci.pNext = NULL;
3485 ds_pool_ci.flags = 0;
3486 ds_pool_ci.maxSets = 1;
3487 ds_pool_ci.poolSizeCount = 1;
3488 ds_pool_ci.pPoolSizes = &ds_type_count;
3489
3490 VkDescriptorPool ds_pool_one;
3491 err =
3492 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
3493 ASSERT_VK_SUCCESS(err);
3494
3495 // Create a second descriptor pool
3496 VkDescriptorPool ds_pool_two;
3497 err =
3498 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
3499 ASSERT_VK_SUCCESS(err);
3500
3501 VkDescriptorSetLayoutBinding dsl_binding = {};
3502 dsl_binding.binding = 0;
3503 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3504 dsl_binding.descriptorCount = 1;
3505 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3506 dsl_binding.pImmutableSamplers = NULL;
3507
3508 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3509 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3510 ds_layout_ci.pNext = NULL;
3511 ds_layout_ci.bindingCount = 1;
3512 ds_layout_ci.pBindings = &dsl_binding;
3513
3514 VkDescriptorSetLayout ds_layout;
3515 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3516 &ds_layout);
3517 ASSERT_VK_SUCCESS(err);
3518
3519 VkDescriptorSet descriptorSet;
3520 VkDescriptorSetAllocateInfo alloc_info = {};
3521 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3522 alloc_info.descriptorSetCount = 1;
3523 alloc_info.descriptorPool = ds_pool_one;
3524 alloc_info.pSetLayouts = &ds_layout;
3525 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3526 &descriptorSet);
3527 ASSERT_VK_SUCCESS(err);
3528
3529 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
3530
3531 m_errorMonitor->VerifyFound();
3532
3533 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3534 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
3535 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
3536}
3537
3538TEST_F(VkLayerTest, CreateUnknownObject) {
3539 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003540 "Invalid Image Object ");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003541
3542 TEST_DESCRIPTION(
3543 "Pass an invalid image object handle into a Vulkan API call.");
3544
3545 ASSERT_NO_FATAL_FAILURE(InitState());
3546
3547 // Pass bogus handle into GetImageMemoryRequirements
3548 VkMemoryRequirements mem_reqs;
3549 uint64_t fakeImageHandle = 0xCADECADE;
3550 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
3551
3552 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
3553
3554 m_errorMonitor->VerifyFound();
3555}
3556
Karl Schultz6addd812016-02-02 17:17:23 -07003557TEST_F(VkLayerTest, PipelineNotBound) {
3558 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003559
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003560 TEST_DESCRIPTION(
3561 "Pass in an invalid pipeline object handle into a Vulkan API call.");
3562
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003563 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003564 "Invalid Pipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003565
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003566 ASSERT_NO_FATAL_FAILURE(InitState());
3567 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003568
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003569 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003570 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3571 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003572
3573 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003574 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3575 ds_pool_ci.pNext = NULL;
3576 ds_pool_ci.maxSets = 1;
3577 ds_pool_ci.poolSizeCount = 1;
3578 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003579
3580 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003581 err =
3582 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003583 ASSERT_VK_SUCCESS(err);
3584
3585 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003586 dsl_binding.binding = 0;
3587 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3588 dsl_binding.descriptorCount = 1;
3589 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3590 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003591
3592 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003593 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3594 ds_layout_ci.pNext = NULL;
3595 ds_layout_ci.bindingCount = 1;
3596 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003597
3598 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003599 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3600 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003601 ASSERT_VK_SUCCESS(err);
3602
3603 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003604 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003605 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003606 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003607 alloc_info.descriptorPool = ds_pool;
3608 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003609 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3610 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003611 ASSERT_VK_SUCCESS(err);
3612
3613 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003614 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3615 pipeline_layout_ci.pNext = NULL;
3616 pipeline_layout_ci.setLayoutCount = 1;
3617 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003618
3619 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003620 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3621 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003622 ASSERT_VK_SUCCESS(err);
3623
Mark Youngad779052016-01-06 14:26:04 -07003624 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003625
3626 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003627 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3628 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003629
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003630 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003631
Chia-I Wuf7458c52015-10-26 21:10:41 +08003632 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3633 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3634 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003635}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003636
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003637TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
3638 VkResult err;
3639
3640 TEST_DESCRIPTION("Test validation check for an invalid memory type index "
3641 "during bind[Buffer|Image]Memory time");
3642
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003643 ASSERT_NO_FATAL_FAILURE(InitState());
3644
3645 // Create an image, allocate memory, set a bad typeIndex and then try to
3646 // bind it
3647 VkImage image;
3648 VkDeviceMemory mem;
3649 VkMemoryRequirements mem_reqs;
3650 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3651 const int32_t tex_width = 32;
3652 const int32_t tex_height = 32;
3653
3654 VkImageCreateInfo image_create_info = {};
3655 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3656 image_create_info.pNext = NULL;
3657 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3658 image_create_info.format = tex_format;
3659 image_create_info.extent.width = tex_width;
3660 image_create_info.extent.height = tex_height;
3661 image_create_info.extent.depth = 1;
3662 image_create_info.mipLevels = 1;
3663 image_create_info.arrayLayers = 1;
3664 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3665 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3666 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3667 image_create_info.flags = 0;
3668
3669 VkMemoryAllocateInfo mem_alloc = {};
3670 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3671 mem_alloc.pNext = NULL;
3672 mem_alloc.allocationSize = 0;
3673 mem_alloc.memoryTypeIndex = 0;
3674
3675 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3676 ASSERT_VK_SUCCESS(err);
3677
3678 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
3679 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003680
3681 // Introduce Failure, select invalid TypeIndex
3682 VkPhysicalDeviceMemoryProperties memory_info;
3683
3684 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
3685 unsigned int i;
3686 for (i = 0; i < memory_info.memoryTypeCount; i++) {
3687 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
3688 mem_alloc.memoryTypeIndex = i;
3689 break;
3690 }
3691 }
3692 if (i >= memory_info.memoryTypeCount) {
3693 printf("No invalid memory type index could be found; skipped.\n");
3694 vkDestroyImage(m_device->device(), image, NULL);
3695 return;
3696 }
3697
3698 m_errorMonitor->SetDesiredFailureMsg(
3699 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3700 "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003701
3702 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3703 ASSERT_VK_SUCCESS(err);
3704
3705 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3706 (void)err;
3707
3708 m_errorMonitor->VerifyFound();
3709
3710 vkDestroyImage(m_device->device(), image, NULL);
3711 vkFreeMemory(m_device->device(), mem, NULL);
3712}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003713
Karl Schultz6addd812016-02-02 17:17:23 -07003714TEST_F(VkLayerTest, BindInvalidMemory) {
3715 VkResult err;
3716 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003717
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003719 "Invalid Device Memory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003720
Tobin Ehlisec598302015-09-15 15:02:17 -06003721 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003722
3723 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07003724 VkImage image;
3725 VkDeviceMemory mem;
3726 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003727
Karl Schultz6addd812016-02-02 17:17:23 -07003728 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3729 const int32_t tex_width = 32;
3730 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003731
3732 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003733 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3734 image_create_info.pNext = NULL;
3735 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3736 image_create_info.format = tex_format;
3737 image_create_info.extent.width = tex_width;
3738 image_create_info.extent.height = tex_height;
3739 image_create_info.extent.depth = 1;
3740 image_create_info.mipLevels = 1;
3741 image_create_info.arrayLayers = 1;
3742 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3743 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3744 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3745 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003746
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003747 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003748 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3749 mem_alloc.pNext = NULL;
3750 mem_alloc.allocationSize = 0;
3751 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003752
Chia-I Wuf7458c52015-10-26 21:10:41 +08003753 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003754 ASSERT_VK_SUCCESS(err);
3755
Karl Schultz6addd812016-02-02 17:17:23 -07003756 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003757
3758 mem_alloc.allocationSize = mem_reqs.size;
3759
Karl Schultz6addd812016-02-02 17:17:23 -07003760 pass =
3761 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003762 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003763
3764 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003765 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003766 ASSERT_VK_SUCCESS(err);
3767
3768 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003769 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003770
3771 // Try to bind free memory that has been freed
3772 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3773 // This may very well return an error.
3774 (void)err;
3775
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003776 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003777
Chia-I Wuf7458c52015-10-26 21:10:41 +08003778 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003779}
3780
Karl Schultz6addd812016-02-02 17:17:23 -07003781TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
3782 VkResult err;
3783 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003784
Karl Schultz6addd812016-02-02 17:17:23 -07003785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003786 "Invalid Image Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003787
Tobin Ehlisec598302015-09-15 15:02:17 -06003788 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003789
Karl Schultz6addd812016-02-02 17:17:23 -07003790 // Create an image object, allocate memory, destroy the object and then try
3791 // to bind it
3792 VkImage image;
3793 VkDeviceMemory mem;
3794 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003795
Karl Schultz6addd812016-02-02 17:17:23 -07003796 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3797 const int32_t tex_width = 32;
3798 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003799
3800 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003801 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3802 image_create_info.pNext = NULL;
3803 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3804 image_create_info.format = tex_format;
3805 image_create_info.extent.width = tex_width;
3806 image_create_info.extent.height = tex_height;
3807 image_create_info.extent.depth = 1;
3808 image_create_info.mipLevels = 1;
3809 image_create_info.arrayLayers = 1;
3810 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3811 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3812 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3813 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003814
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003815 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003816 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3817 mem_alloc.pNext = NULL;
3818 mem_alloc.allocationSize = 0;
3819 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003820
Chia-I Wuf7458c52015-10-26 21:10:41 +08003821 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003822 ASSERT_VK_SUCCESS(err);
3823
Karl Schultz6addd812016-02-02 17:17:23 -07003824 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003825
3826 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003827 pass =
3828 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003829 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003830
3831 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003832 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003833 ASSERT_VK_SUCCESS(err);
3834
3835 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003836 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003837 ASSERT_VK_SUCCESS(err);
3838
3839 // Now Try to bind memory to this destroyed object
3840 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3841 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003842 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003843
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003844 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003845
Chia-I Wuf7458c52015-10-26 21:10:41 +08003846 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003847}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003848
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003849#endif // OBJ_TRACKER_TESTS
3850
Tobin Ehlis0788f522015-05-26 16:11:58 -06003851#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06003852
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003853TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003854 TEST_DESCRIPTION("Submit command buffer created using one queue family and "
3855 "attempt to submit them on a queue created in a different "
3856 "queue family.");
3857
3858 // This test is meaningless unless we have multiple queue families
3859 auto queue_family_properties = m_device->phy().queue_properties();
3860 if (queue_family_properties.size() < 2) {
3861 return;
3862 }
3863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3864 " is being submitted on queue ");
3865 // Get safe index of another queue family
3866 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
3867 ASSERT_NO_FATAL_FAILURE(InitState());
3868 // Create a second queue using a different queue family
3869 VkQueue other_queue;
3870 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3871
3872 // Record an empty cmd buffer
3873 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3874 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3875 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3876 vkEndCommandBuffer(m_commandBuffer->handle());
3877
3878 // And submit on the wrong queue
3879 VkSubmitInfo submit_info = {};
3880 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3881 submit_info.commandBufferCount = 1;
3882 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003883 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003884
3885 m_errorMonitor->VerifyFound();
3886
3887}
3888
Chris Forbes48a53902016-06-30 11:46:27 +12003889TEST_F(VkLayerTest, RenderPassInitialLayoutUndefined) {
3890 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass with an attachment's "
3891 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
3892 "the command buffer has prior knowledge of that "
3893 "attachment's layout.");
3894
3895 m_errorMonitor->ExpectSuccess();
3896
3897 ASSERT_NO_FATAL_FAILURE(InitState());
3898
3899 // A renderpass with one color attachment.
3900 VkAttachmentDescription attachment = {
3901 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3902 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3903 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3904 VK_IMAGE_LAYOUT_UNDEFINED,
3905 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3906 };
3907
3908 VkAttachmentReference att_ref = {
3909 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3910 };
3911
3912 VkSubpassDescription subpass = {
3913 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3914 1, &att_ref, nullptr, nullptr, 0, nullptr
3915 };
3916
3917 VkRenderPassCreateInfo rpci = {
3918 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3919 0, 1, &attachment, 1, &subpass, 0, nullptr
3920 };
3921
3922 VkRenderPass rp;
3923 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3924 ASSERT_VK_SUCCESS(err);
3925
3926 // A compatible framebuffer.
3927 VkImageObj image(m_device);
3928 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3929 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3930 VK_IMAGE_TILING_OPTIMAL, 0);
3931 ASSERT_TRUE(image.initialized());
3932
3933 VkImageViewCreateInfo ivci = {
3934 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3935 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3936 {
3937 VK_COMPONENT_SWIZZLE_IDENTITY,
3938 VK_COMPONENT_SWIZZLE_IDENTITY,
3939 VK_COMPONENT_SWIZZLE_IDENTITY,
3940 VK_COMPONENT_SWIZZLE_IDENTITY
3941 },
3942 {
3943 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3944 },
3945 };
3946 VkImageView view;
3947 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3948 ASSERT_VK_SUCCESS(err);
3949
3950 VkFramebufferCreateInfo fci = {
3951 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3952 0, rp, 1, &view,
3953 32, 32, 1
3954 };
3955 VkFramebuffer fb;
3956 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3957 ASSERT_VK_SUCCESS(err);
3958
3959 // Record a single command buffer which uses this renderpass twice. The
3960 // bug is triggered at the beginning of the second renderpass, when the
3961 // command buffer already has a layout recorded for the attachment.
3962 VkRenderPassBeginInfo rpbi = {
3963 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003964 rp, fb, { { 0, 0 } , { 32, 32 } },
Chris Forbes48a53902016-06-30 11:46:27 +12003965 0, nullptr
3966 };
3967 BeginCommandBuffer();
3968 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3969 VK_SUBPASS_CONTENTS_INLINE);
3970 vkCmdEndRenderPass(m_commandBuffer->handle());
3971 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3972 VK_SUBPASS_CONTENTS_INLINE);
3973
3974 m_errorMonitor->VerifyNotFound();
3975
3976 vkCmdEndRenderPass(m_commandBuffer->handle());
3977 EndCommandBuffer();
3978
3979 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3980 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3981 vkDestroyImageView(m_device->device(), view, nullptr);
3982}
3983
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06003984TEST_F(VkLayerTest, FramebufferBindingDestroyCommandPool) {
3985 TEST_DESCRIPTION("This test should pass. Create a Framebuffer and "
3986 "command buffer, bind them together, then destroy "
3987 "command pool and framebuffer and verify there are no "
3988 "errors.");
3989
3990 m_errorMonitor->ExpectSuccess();
3991
3992 ASSERT_NO_FATAL_FAILURE(InitState());
3993
3994 // A renderpass with one color attachment.
3995 VkAttachmentDescription attachment = {
3996 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3997 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3998 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3999 VK_IMAGE_LAYOUT_UNDEFINED,
4000 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4001 };
4002
4003 VkAttachmentReference att_ref = {
4004 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4005 };
4006
4007 VkSubpassDescription subpass = {
4008 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
4009 1, &att_ref, nullptr, nullptr, 0, nullptr
4010 };
4011
4012 VkRenderPassCreateInfo rpci = {
4013 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4014 0, 1, &attachment, 1, &subpass, 0, nullptr
4015 };
4016
4017 VkRenderPass rp;
4018 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4019 ASSERT_VK_SUCCESS(err);
4020
4021 // A compatible framebuffer.
4022 VkImageObj image(m_device);
4023 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
4024 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
4025 VK_IMAGE_TILING_OPTIMAL, 0);
4026 ASSERT_TRUE(image.initialized());
4027
4028 VkImageViewCreateInfo ivci = {
4029 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
4030 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
4031 {
4032 VK_COMPONENT_SWIZZLE_IDENTITY,
4033 VK_COMPONENT_SWIZZLE_IDENTITY,
4034 VK_COMPONENT_SWIZZLE_IDENTITY,
4035 VK_COMPONENT_SWIZZLE_IDENTITY
4036 },
4037 {
4038 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
4039 },
4040 };
4041 VkImageView view;
4042 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4043 ASSERT_VK_SUCCESS(err);
4044
4045 VkFramebufferCreateInfo fci = {
4046 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
4047 0, rp, 1, &view,
4048 32, 32, 1
4049 };
4050 VkFramebuffer fb;
4051 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4052 ASSERT_VK_SUCCESS(err);
4053
4054 // Explicitly create a command buffer to bind the FB to so that we can then
4055 // destroy the command pool in order to implicitly free command buffer
4056 VkCommandPool command_pool;
4057 VkCommandPoolCreateInfo pool_create_info{};
4058 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4059 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4060 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4061 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4062 &command_pool);
4063
4064 VkCommandBuffer command_buffer;
4065 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4066 command_buffer_allocate_info.sType =
4067 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4068 command_buffer_allocate_info.commandPool = command_pool;
4069 command_buffer_allocate_info.commandBufferCount = 1;
4070 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4071 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4072 &command_buffer);
4073
4074 // Begin our cmd buffer with renderpass using our framebuffer
4075 VkRenderPassBeginInfo rpbi = {
4076 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
4077 rp, fb, { { 0, 0 } , { 32, 32 } },
4078 0, nullptr
4079 };
4080 VkCommandBufferBeginInfo begin_info{};
4081 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4082 vkBeginCommandBuffer(command_buffer, &begin_info);
4083
4084 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
4085 vkCmdEndRenderPass(command_buffer);
4086 vkEndCommandBuffer(command_buffer);
Mark Lobodzinski7d10a822016-08-03 14:08:40 -06004087 vkDestroyImageView(m_device->device(), view, nullptr);
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06004088 // Destroy command pool to implicitly free command buffer
4089 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4090 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4091 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4092 m_errorMonitor->VerifyNotFound();
4093}
4094
Chris Forbes51bf7c92016-06-30 15:22:08 +12004095TEST_F(VkLayerTest, RenderPassSubpassZeroTransitionsApplied) {
4096 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass applies the layout "
4097 "transitions for the first subpass");
4098
4099 m_errorMonitor->ExpectSuccess();
4100
4101 ASSERT_NO_FATAL_FAILURE(InitState());
4102
4103 // A renderpass with one color attachment.
4104 VkAttachmentDescription attachment = {
4105 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
4106 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
4107 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4108 VK_IMAGE_LAYOUT_UNDEFINED,
4109 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4110 };
4111
4112 VkAttachmentReference att_ref = {
4113 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4114 };
4115
4116 VkSubpassDescription subpass = {
4117 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
4118 1, &att_ref, nullptr, nullptr, 0, nullptr
4119 };
4120
4121 VkSubpassDependency dep = {
Chris Forbescb4c7ad2016-07-06 10:28:18 +12004122 0, 0, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4123 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12004124 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4125 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4126 VK_DEPENDENCY_BY_REGION_BIT
4127 };
4128
4129 VkRenderPassCreateInfo rpci = {
4130 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4131 0, 1, &attachment, 1, &subpass, 1, &dep
4132 };
4133
4134 VkResult err;
4135 VkRenderPass rp;
4136 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4137 ASSERT_VK_SUCCESS(err);
4138
4139 // A compatible framebuffer.
4140 VkImageObj image(m_device);
4141 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
4142 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
4143 VK_IMAGE_TILING_OPTIMAL, 0);
4144 ASSERT_TRUE(image.initialized());
4145
4146 VkImageViewCreateInfo ivci = {
4147 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
4148 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
4149 {
4150 VK_COMPONENT_SWIZZLE_IDENTITY,
4151 VK_COMPONENT_SWIZZLE_IDENTITY,
4152 VK_COMPONENT_SWIZZLE_IDENTITY,
4153 VK_COMPONENT_SWIZZLE_IDENTITY
4154 },
4155 {
4156 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
4157 },
4158 };
4159 VkImageView view;
4160 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4161 ASSERT_VK_SUCCESS(err);
4162
4163 VkFramebufferCreateInfo fci = {
4164 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
4165 0, rp, 1, &view,
4166 32, 32, 1
4167 };
4168 VkFramebuffer fb;
4169 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4170 ASSERT_VK_SUCCESS(err);
4171
4172 // Record a single command buffer which issues a pipeline barrier w/
4173 // image memory barrier for the attachment. This detects the previously
4174 // missing tracking of the subpass layout by throwing a validation error
4175 // if it doesn't occur.
4176 VkRenderPassBeginInfo rpbi = {
4177 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06004178 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes51bf7c92016-06-30 15:22:08 +12004179 0, nullptr
4180 };
4181 BeginCommandBuffer();
4182 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
4183 VK_SUBPASS_CONTENTS_INLINE);
4184
4185 VkImageMemoryBarrier imb = {
4186 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, nullptr,
4187 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4188 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4189 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4190 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4191 VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
4192 image.handle(),
4193 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
4194 };
4195 vkCmdPipelineBarrier(m_commandBuffer->handle(),
Chris Forbescb4c7ad2016-07-06 10:28:18 +12004196 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4197 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12004198 VK_DEPENDENCY_BY_REGION_BIT,
4199 0, nullptr, 0, nullptr, 1, &imb);
4200
4201 vkCmdEndRenderPass(m_commandBuffer->handle());
4202 m_errorMonitor->VerifyNotFound();
4203 EndCommandBuffer();
4204
4205 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4206 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4207 vkDestroyImageView(m_device->device(), view, nullptr);
4208}
4209
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004210TEST_F(VkLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
4211 TEST_DESCRIPTION("Validate that when an imageView of a depth/stencil image "
4212 "is used as a depth/stencil framebuffer attachment, the "
4213 "aspectMask is ignored and both depth and stencil image "
4214 "subresources are used.");
4215
4216 VkFormatProperties format_properties;
4217 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT,
4218 &format_properties);
4219 if (!(format_properties.optimalTilingFeatures &
4220 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
4221 return;
4222 }
4223
4224 m_errorMonitor->ExpectSuccess();
4225
4226 ASSERT_NO_FATAL_FAILURE(InitState());
4227
4228 VkAttachmentDescription attachment = {
4229 0,
4230 VK_FORMAT_D32_SFLOAT_S8_UINT,
4231 VK_SAMPLE_COUNT_1_BIT,
4232 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4233 VK_ATTACHMENT_STORE_OP_STORE,
4234 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4235 VK_ATTACHMENT_STORE_OP_DONT_CARE,
4236 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4237 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
4238
4239 VkAttachmentReference att_ref = {
4240 0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
4241
4242 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4243 0, nullptr,
4244 0, nullptr,
4245 nullptr, &att_ref,
4246 0, nullptr};
4247
4248 VkSubpassDependency dep = {0,
4249 0,
4250 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4251 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4252 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4253 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4254 VK_DEPENDENCY_BY_REGION_BIT};
4255
4256 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
4257 nullptr,
4258 0,
4259 1,
4260 &attachment,
4261 1,
4262 &subpass,
4263 1,
4264 &dep};
4265
4266 VkResult err;
4267 VkRenderPass rp;
4268 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4269 ASSERT_VK_SUCCESS(err);
4270
4271 VkImageObj image(m_device);
4272 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
4273 0x26, // usage
4274 VK_IMAGE_TILING_OPTIMAL, 0);
4275 ASSERT_TRUE(image.initialized());
4276 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
4277
4278 VkImageViewCreateInfo ivci = {
4279 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4280 nullptr,
4281 0,
4282 image.handle(),
4283 VK_IMAGE_VIEW_TYPE_2D,
4284 VK_FORMAT_D32_SFLOAT_S8_UINT,
4285 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B,
4286 VK_COMPONENT_SWIZZLE_A},
4287 {0x2, 0, 1, 0, 1},
4288 };
4289 VkImageView view;
4290 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4291 ASSERT_VK_SUCCESS(err);
4292
4293 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
4294 nullptr,
4295 0,
4296 rp,
4297 1,
4298 &view,
4299 32,
4300 32,
4301 1};
4302 VkFramebuffer fb;
4303 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4304 ASSERT_VK_SUCCESS(err);
4305
4306 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
4307 nullptr,
4308 rp,
4309 fb,
4310 {{0, 0}, {32, 32}},
4311 0,
4312 nullptr};
4313 BeginCommandBuffer();
4314 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
4315 VK_SUBPASS_CONTENTS_INLINE);
4316
4317 VkImageMemoryBarrier imb = {};
4318 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4319 imb.pNext = nullptr;
4320 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4321 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4322 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4323 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4324 imb.srcQueueFamilyIndex = 0;
4325 imb.dstQueueFamilyIndex = 0;
4326 imb.image = image.handle();
4327 imb.subresourceRange.aspectMask = 0x6;
4328 imb.subresourceRange.baseMipLevel = 0;
4329 imb.subresourceRange.levelCount = 0x1;
4330 imb.subresourceRange.baseArrayLayer = 0;
4331 imb.subresourceRange.layerCount = 0x1;
4332
4333 vkCmdPipelineBarrier(m_commandBuffer->handle(),
4334 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4335 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4336 VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
4337 &imb);
4338
4339 vkCmdEndRenderPass(m_commandBuffer->handle());
4340 EndCommandBuffer();
4341 QueueCommandBuffer(false);
4342 m_errorMonitor->VerifyNotFound();
4343
4344 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4345 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4346 vkDestroyImageView(m_device->device(), view, nullptr);
4347}
Tony Barbourd5f7b822016-08-02 15:39:33 -06004348
Tony Barbour4e919972016-08-09 13:27:40 -06004349TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
4350 TEST_DESCRIPTION("Generate INVALID_RENDER_AREA error by beginning renderpass"
4351 "with extent outside of framebuffer");
4352 ASSERT_NO_FATAL_FAILURE(InitState());
4353 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4354
4355 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4356 "Cannot execute a render pass with renderArea "
4357 "not within the bound of the framebuffer.");
4358
4359 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
4360 m_renderPassBeginInfo.renderArea.extent.width = 257;
4361 m_renderPassBeginInfo.renderArea.extent.height = 257;
4362 BeginCommandBuffer();
4363 m_errorMonitor->VerifyFound();
4364}
4365
4366TEST_F(VkLayerTest, DisabledIndependentBlend) {
4367 TEST_DESCRIPTION("Generate INDEPENDENT_BLEND by disabling independent "
4368 "blend and then specifying different blend states for two "
4369 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06004370 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbour4e919972016-08-09 13:27:40 -06004371
Tony Barbour4cf5bd32016-08-12 14:53:58 -06004372 m_errorMonitor->SetDesiredFailureMsg(
Cody Northrop5703cc72016-08-19 09:57:10 -06004373 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4374 "Invalid Pipeline CreateInfo: If independent blend feature not "
4375 "enabled, all elements of pAttachments must be identical");
4376 VkPhysicalDeviceFeatures features = {};
4377 features.independentBlend = VK_FALSE;
4378 std::vector<const char *> extension_names;
4379 VkDeviceObj noib_device(0, gpu(), extension_names, &features);
Tony Barbour4e919972016-08-09 13:27:40 -06004380
Cody Northrop5703cc72016-08-19 09:57:10 -06004381 VkCommandPool cmd_pool;
4382 VkCommandPoolCreateInfo pool_create_info{};
4383 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4384 pool_create_info.queueFamilyIndex = noib_device.graphics_queue_node_index_;
4385 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Tony Barbour4e919972016-08-09 13:27:40 -06004386
Cody Northrop5703cc72016-08-19 09:57:10 -06004387 vkCreateCommandPool(noib_device.device(), &pool_create_info, nullptr,
4388 &cmd_pool);
4389 {
4390 // Need cmd_buffer's destructor to be called before calling DestroyCommandPool
4391 VkCommandBufferObj cmd_buffer(&noib_device, cmd_pool);
4392 VkDescriptorSetObj descriptorSet(&noib_device);
4393 descriptorSet.AppendDummy();
4394 descriptorSet.CreateVKDescriptorSet(&cmd_buffer);
Tony Barbour4e919972016-08-09 13:27:40 -06004395
Cody Northrop5703cc72016-08-19 09:57:10 -06004396 VkPipelineObj pipeline(&noib_device);
4397
4398 VkRenderpassObj renderpass(&noib_device);
4399
4400 VkShaderObj vs(&noib_device, bindStateVertShaderText,
4401 VK_SHADER_STAGE_VERTEX_BIT, this);
4402
4403 pipeline.AddShader(&vs);
4404
4405 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
4406 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
4407 att_state1.blendEnable = VK_TRUE;
4408 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
4409 att_state2.blendEnable = VK_FALSE;
4410 pipeline.AddColorAttachment(0, &att_state1);
4411 pipeline.AddColorAttachment(1, &att_state2);
4412 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(),
4413 renderpass.handle());
4414 m_errorMonitor->VerifyFound();
4415 }
4416 vkDestroyCommandPool(noib_device.device(), cmd_pool, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06004417}
4418
4419TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
4420 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
4421 "depth attachments in subpass");
4422
4423 m_errorMonitor->SetDesiredFailureMsg(
4424 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4425 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
4426
4427 // Create a renderPass with a single color attachment
4428 VkAttachmentReference attach = {};
4429 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4430 VkSubpassDescription subpass = {};
4431 VkRenderPassCreateInfo rpci = {};
4432 rpci.subpassCount = 1;
4433 rpci.pSubpasses = &subpass;
4434 rpci.attachmentCount = 1;
4435 VkAttachmentDescription attach_desc = {};
4436 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4437 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4438 rpci.pAttachments = &attach_desc;
4439 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4440 VkRenderPass rp;
4441 subpass.pDepthStencilAttachment = &attach;
4442 subpass.pColorAttachments = NULL;
4443 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4444 m_errorMonitor->VerifyFound();
4445}
4446
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004447TEST_F(VkLayerTest, RenderPassTransitionsAttachmentUnused) {
4448 TEST_DESCRIPTION("Ensure that layout transitions work correctly without "
4449 "errors, when an attachment reference is "
4450 "VK_ATTACHMENT_UNUSED");
4451
4452 m_errorMonitor->ExpectSuccess();
4453
4454 ASSERT_NO_FATAL_FAILURE(InitState());
4455
4456 // A renderpass with no attachments
4457 VkAttachmentReference att_ref = {
4458 VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4459 };
4460
4461 VkSubpassDescription subpass = {
4462 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
4463 1, &att_ref, nullptr, nullptr, 0, nullptr
4464 };
4465
4466 VkRenderPassCreateInfo rpci = {
4467 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4468 0, 0, nullptr, 1, &subpass, 0, nullptr
4469 };
4470
4471 VkRenderPass rp;
4472 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4473 ASSERT_VK_SUCCESS(err);
4474
4475 // A compatible framebuffer.
4476 VkFramebufferCreateInfo fci = {
4477 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
4478 0, rp, 0, nullptr,
4479 32, 32, 1
4480 };
4481 VkFramebuffer fb;
4482 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4483 ASSERT_VK_SUCCESS(err);
4484
4485 // Record a command buffer which just begins and ends the renderpass. The
4486 // bug manifests in BeginRenderPass.
4487 VkRenderPassBeginInfo rpbi = {
4488 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06004489 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004490 0, nullptr
4491 };
4492 BeginCommandBuffer();
4493 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
4494 VK_SUBPASS_CONTENTS_INLINE);
4495 vkCmdEndRenderPass(m_commandBuffer->handle());
4496 m_errorMonitor->VerifyNotFound();
4497 EndCommandBuffer();
4498
4499 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4500 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4501}
4502
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004503// This is a positive test. No errors are expected.
4504TEST_F(VkLayerTest, StencilLoadOp) {
4505 TEST_DESCRIPTION("Create a stencil-only attachment with a LOAD_OP set to "
4506 "CLEAR. stencil[Load|Store]Op used to be ignored.");
4507 VkResult result = VK_SUCCESS;
4508 VkImageFormatProperties formatProps;
4509 vkGetPhysicalDeviceImageFormatProperties(
4510 gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D,
4511 VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4512 VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
4513 0, &formatProps);
4514 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
4515 return;
4516 }
4517
4518 ASSERT_NO_FATAL_FAILURE(InitState());
4519 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
4520 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
4521 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4522 VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
4523 VkAttachmentDescription att = {};
4524 VkAttachmentReference ref = {};
4525 att.format = depth_stencil_fmt;
4526 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
4527 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
4528 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
4529 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
4530 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4531 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4532
4533 VkClearValue clear;
4534 clear.depthStencil.depth = 1.0;
4535 clear.depthStencil.stencil = 0;
4536 ref.attachment = 0;
4537 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4538
4539 VkSubpassDescription subpass = {};
4540 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
4541 subpass.flags = 0;
4542 subpass.inputAttachmentCount = 0;
4543 subpass.pInputAttachments = NULL;
4544 subpass.colorAttachmentCount = 0;
4545 subpass.pColorAttachments = NULL;
4546 subpass.pResolveAttachments = NULL;
4547 subpass.pDepthStencilAttachment = &ref;
4548 subpass.preserveAttachmentCount = 0;
4549 subpass.pPreserveAttachments = NULL;
4550
4551 VkRenderPass rp;
4552 VkRenderPassCreateInfo rp_info = {};
4553 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4554 rp_info.attachmentCount = 1;
4555 rp_info.pAttachments = &att;
4556 rp_info.subpassCount = 1;
4557 rp_info.pSubpasses = &subpass;
4558 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
4559 ASSERT_VK_SUCCESS(result);
4560
4561 VkImageView *depthView = m_depthStencil->BindInfo();
4562 VkFramebufferCreateInfo fb_info = {};
4563 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4564 fb_info.pNext = NULL;
4565 fb_info.renderPass = rp;
4566 fb_info.attachmentCount = 1;
4567 fb_info.pAttachments = depthView;
4568 fb_info.width = 100;
4569 fb_info.height = 100;
4570 fb_info.layers = 1;
4571 VkFramebuffer fb;
4572 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4573 ASSERT_VK_SUCCESS(result);
4574
4575
4576 VkRenderPassBeginInfo rpbinfo = {};
4577 rpbinfo.clearValueCount = 1;
4578 rpbinfo.pClearValues = &clear;
4579 rpbinfo.pNext = NULL;
4580 rpbinfo.renderPass = rp;
4581 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4582 rpbinfo.renderArea.extent.width = 100;
4583 rpbinfo.renderArea.extent.height = 100;
4584 rpbinfo.renderArea.offset.x = 0;
4585 rpbinfo.renderArea.offset.y = 0;
4586 rpbinfo.framebuffer = fb;
4587
4588 VkFence fence = {};
4589 VkFenceCreateInfo fence_ci = {};
4590 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4591 fence_ci.pNext = nullptr;
4592 fence_ci.flags = 0;
4593 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
4594 ASSERT_VK_SUCCESS(result);
4595
4596
4597 m_commandBuffer->BeginCommandBuffer();
4598 m_commandBuffer->BeginRenderPass(rpbinfo);
4599 m_commandBuffer->EndRenderPass();
4600 m_commandBuffer->EndCommandBuffer();
4601 m_commandBuffer->QueueCommandBuffer(fence);
4602
4603 VkImageObj destImage(m_device);
4604 destImage.init(100, 100, depth_stencil_fmt,
4605 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4606 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4607 VK_IMAGE_TILING_OPTIMAL, 0);
4608 VkImageMemoryBarrier barrier = {};
4609 VkImageSubresourceRange range;
4610 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4611 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4612 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4613 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT |
4614 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
4615 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4616 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
4617 barrier.image = m_depthStencil->handle();
4618 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4619 range.baseMipLevel = 0;
4620 range.levelCount = 1;
4621 range.baseArrayLayer = 0;
4622 range.layerCount = 1;
4623 barrier.subresourceRange = range;
4624 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
4625 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
4626 cmdbuf.BeginCommandBuffer();
4627 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4628 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4629 nullptr, 1, &barrier);
4630 barrier.srcAccessMask = 0;
4631 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4632 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
4633 barrier.image = destImage.handle();
4634 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4635 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4636 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4637 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4638 nullptr, 1, &barrier);
4639 VkImageCopy cregion;
4640 cregion.srcSubresource.aspectMask =
4641 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4642 cregion.srcSubresource.mipLevel = 0;
4643 cregion.srcSubresource.baseArrayLayer = 0;
4644 cregion.srcSubresource.layerCount = 1;
4645 cregion.srcOffset.x = 0;
4646 cregion.srcOffset.y = 0;
4647 cregion.srcOffset.z = 0;
4648 cregion.dstSubresource.aspectMask =
4649 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4650 cregion.dstSubresource.mipLevel = 0;
4651 cregion.dstSubresource.baseArrayLayer = 0;
4652 cregion.dstSubresource.layerCount = 1;
4653 cregion.dstOffset.x = 0;
4654 cregion.dstOffset.y = 0;
4655 cregion.dstOffset.z = 0;
4656 cregion.extent.width = 100;
4657 cregion.extent.height = 100;
4658 cregion.extent.depth = 1;
4659 cmdbuf.CopyImage(m_depthStencil->handle(),
4660 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
4661 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
4662 cmdbuf.EndCommandBuffer();
4663
4664 VkSubmitInfo submit_info;
4665 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4666 submit_info.pNext = NULL;
4667 submit_info.waitSemaphoreCount = 0;
4668 submit_info.pWaitSemaphores = NULL;
4669 submit_info.pWaitDstStageMask = NULL;
4670 submit_info.commandBufferCount = 1;
4671 submit_info.pCommandBuffers = &cmdbuf.handle();
4672 submit_info.signalSemaphoreCount = 0;
4673 submit_info.pSignalSemaphores = NULL;
4674
4675 m_errorMonitor->ExpectSuccess();
4676 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4677 m_errorMonitor->VerifyNotFound();
4678
Mark Lobodzinskid0440da2016-06-17 15:10:03 -06004679 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004680 vkDestroyFence(m_device->device(), fence, nullptr);
4681 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4682 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4683}
4684
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004685TEST_F(VkLayerTest, UnusedPreserveAttachment) {
4686 TEST_DESCRIPTION("Create a framebuffer where a subpass has a preserve "
4687 "attachment reference of VK_ATTACHMENT_UNUSED");
4688
4689 ASSERT_NO_FATAL_FAILURE(InitState());
4690 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4691
4692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4693 "must not be VK_ATTACHMENT_UNUSED");
4694
4695 VkAttachmentReference color_attach = {};
4696 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4697 color_attach.attachment = 0;
4698 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
4699 VkSubpassDescription subpass = {};
4700 subpass.colorAttachmentCount = 1;
4701 subpass.pColorAttachments = &color_attach;
4702 subpass.preserveAttachmentCount = 1;
4703 subpass.pPreserveAttachments = &preserve_attachment;
4704
4705 VkRenderPassCreateInfo rpci = {};
4706 rpci.subpassCount = 1;
4707 rpci.pSubpasses = &subpass;
4708 rpci.attachmentCount = 1;
4709 VkAttachmentDescription attach_desc = {};
4710 attach_desc.format = VK_FORMAT_UNDEFINED;
4711 rpci.pAttachments = &attach_desc;
4712 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4713 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004714 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004715
4716 m_errorMonitor->VerifyFound();
4717
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004718 if (result == VK_SUCCESS) {
4719 vkDestroyRenderPass(m_device->device(), rp, NULL);
4720 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004721}
4722
Chris Forbesc5389742016-06-29 11:49:23 +12004723TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004724 TEST_DESCRIPTION("Ensure that CreateRenderPass produces a validation error "
4725 "when the source of a subpass multisample resolve "
4726 "does not have multiple samples.");
4727
Chris Forbesc5389742016-06-29 11:49:23 +12004728 ASSERT_NO_FATAL_FAILURE(InitState());
4729
4730 m_errorMonitor->SetDesiredFailureMsg(
4731 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbes6655bb32016-07-01 18:27:30 +12004732 "Subpass 0 requests multisample resolve from attachment 0 which has "
4733 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12004734
4735 VkAttachmentDescription attachments[] = {
4736 {
4737 0, VK_FORMAT_R8G8B8A8_UNORM,
4738 VK_SAMPLE_COUNT_1_BIT,
4739 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4740 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4741 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4742 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4743 },
4744 {
4745 0, VK_FORMAT_R8G8B8A8_UNORM,
4746 VK_SAMPLE_COUNT_1_BIT,
4747 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4748 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4749 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4750 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4751 },
4752 };
4753
4754 VkAttachmentReference color = {
4755 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4756 };
4757
4758 VkAttachmentReference resolve = {
4759 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4760 };
4761
4762 VkSubpassDescription subpass = {
4763 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4764 0, nullptr,
4765 1, &color,
4766 &resolve,
4767 nullptr,
4768 0, nullptr
4769 };
4770
4771 VkRenderPassCreateInfo rpci = {
4772 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4773 0, 2, attachments, 1, &subpass, 0, nullptr
4774 };
4775
4776 VkRenderPass rp;
4777 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4778
4779 m_errorMonitor->VerifyFound();
4780
4781 if (err == VK_SUCCESS)
4782 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4783}
4784
4785TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004786 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4787 "when a subpass multisample resolve operation is "
4788 "requested, and the destination of that resolve has "
4789 "multiple samples.");
4790
Chris Forbesc5389742016-06-29 11:49:23 +12004791 ASSERT_NO_FATAL_FAILURE(InitState());
4792
4793 m_errorMonitor->SetDesiredFailureMsg(
4794 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4795 "Subpass 0 requests multisample resolve into attachment 1, which "
4796 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
4797
4798 VkAttachmentDescription attachments[] = {
4799 {
4800 0, VK_FORMAT_R8G8B8A8_UNORM,
4801 VK_SAMPLE_COUNT_4_BIT,
4802 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4803 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4804 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4805 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4806 },
4807 {
4808 0, VK_FORMAT_R8G8B8A8_UNORM,
4809 VK_SAMPLE_COUNT_4_BIT,
4810 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4811 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4812 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4813 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4814 },
4815 };
4816
4817 VkAttachmentReference color = {
4818 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4819 };
4820
4821 VkAttachmentReference resolve = {
4822 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4823 };
4824
4825 VkSubpassDescription subpass = {
4826 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4827 0, nullptr,
4828 1, &color,
4829 &resolve,
4830 nullptr,
4831 0, nullptr
4832 };
4833
4834 VkRenderPassCreateInfo rpci = {
4835 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4836 0, 2, attachments, 1, &subpass, 0, nullptr
4837 };
4838
4839 VkRenderPass rp;
4840 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4841
4842 m_errorMonitor->VerifyFound();
4843
4844 if (err == VK_SUCCESS)
4845 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4846}
4847
Chris Forbes3f128ef2016-06-29 14:58:53 +12004848TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004849 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4850 "when the color and depth attachments used by a subpass "
4851 "have inconsistent sample counts");
4852
Chris Forbes3f128ef2016-06-29 14:58:53 +12004853 ASSERT_NO_FATAL_FAILURE(InitState());
4854
4855 m_errorMonitor->SetDesiredFailureMsg(
4856 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4857 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
4858
4859 VkAttachmentDescription attachments[] = {
4860 {
4861 0, VK_FORMAT_R8G8B8A8_UNORM,
4862 VK_SAMPLE_COUNT_1_BIT,
4863 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4864 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4865 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4866 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4867 },
4868 {
4869 0, VK_FORMAT_R8G8B8A8_UNORM,
4870 VK_SAMPLE_COUNT_4_BIT,
4871 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4872 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4873 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4874 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4875 },
4876 };
4877
4878 VkAttachmentReference color[] = {
4879 {
4880 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4881 },
4882 {
4883 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4884 },
4885 };
4886
4887 VkSubpassDescription subpass = {
4888 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4889 0, nullptr,
4890 2, color,
4891 nullptr,
4892 nullptr,
4893 0, nullptr
4894 };
4895
4896 VkRenderPassCreateInfo rpci = {
4897 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4898 0, 2, attachments, 1, &subpass, 0, nullptr
4899 };
4900
4901 VkRenderPass rp;
4902 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4903
4904 m_errorMonitor->VerifyFound();
4905
4906 if (err == VK_SUCCESS)
4907 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4908}
4909
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004910TEST_F(VkLayerTest, FramebufferCreateErrors) {
4911 TEST_DESCRIPTION("Hit errors when attempting to create a framebuffer :\n"
4912 " 1. Mismatch between fb & renderPass attachmentCount\n"
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004913 " 2. Use a color image as depthStencil attachment\n"
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004914 " 3. Mismatch fb & renderPass attachment formats\n"
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004915 " 4. Mismatch fb & renderPass attachment #samples\n"
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004916 " 5. FB attachment w/ non-1 mip-levels\n"
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004917 " 6. FB attachment where dimensions don't match\n"
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004918 " 7. FB attachment w/o identity swizzle\n"
4919 " 8. FB dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004920
4921 ASSERT_NO_FATAL_FAILURE(InitState());
4922 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4923
4924 m_errorMonitor->SetDesiredFailureMsg(
4925 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004926 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
4927 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004928
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004929 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004930 VkAttachmentReference attach = {};
4931 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4932 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004933 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004934 VkRenderPassCreateInfo rpci = {};
4935 rpci.subpassCount = 1;
4936 rpci.pSubpasses = &subpass;
4937 rpci.attachmentCount = 1;
4938 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004939 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004940 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004941 rpci.pAttachments = &attach_desc;
4942 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4943 VkRenderPass rp;
4944 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4945 ASSERT_VK_SUCCESS(err);
4946
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004947 VkImageView ivs[2];
4948 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
4949 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004950 VkFramebufferCreateInfo fb_info = {};
4951 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4952 fb_info.pNext = NULL;
4953 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004954 // Set mis-matching attachmentCount
4955 fb_info.attachmentCount = 2;
4956 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004957 fb_info.width = 100;
4958 fb_info.height = 100;
4959 fb_info.layers = 1;
4960
4961 VkFramebuffer fb;
4962 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4963
4964 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004965 if (err == VK_SUCCESS) {
4966 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4967 }
4968 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004969
4970 // Create a renderPass with a depth-stencil attachment created with
4971 // IMAGE_USAGE_COLOR_ATTACHMENT
4972 // Add our color attachment to pDepthStencilAttachment
4973 subpass.pDepthStencilAttachment = &attach;
4974 subpass.pColorAttachments = NULL;
4975 VkRenderPass rp_ds;
4976 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
4977 ASSERT_VK_SUCCESS(err);
4978 // Set correct attachment count, but attachment has COLOR usage bit set
4979 fb_info.attachmentCount = 1;
4980 fb_info.renderPass = rp_ds;
4981
4982 m_errorMonitor->SetDesiredFailureMsg(
4983 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4984 " conflicts with the image's IMAGE_USAGE flags ");
4985 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4986
4987 m_errorMonitor->VerifyFound();
4988 if (err == VK_SUCCESS) {
4989 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4990 }
4991 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004992
4993 // Create new renderpass with alternate attachment format from fb
4994 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
4995 subpass.pDepthStencilAttachment = NULL;
4996 subpass.pColorAttachments = &attach;
4997 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4998 ASSERT_VK_SUCCESS(err);
4999
5000 // Cause error due to mis-matched formats between rp & fb
5001 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
5002 fb_info.renderPass = rp;
5003 m_errorMonitor->SetDesiredFailureMsg(
5004 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5005 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
5006 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
5007
5008 m_errorMonitor->VerifyFound();
5009 if (err == VK_SUCCESS) {
5010 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5011 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06005012 vkDestroyRenderPass(m_device->device(), rp, NULL);
5013
5014 // Create new renderpass with alternate sample count from fb
5015 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5016 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
5017 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5018 ASSERT_VK_SUCCESS(err);
5019
5020 // Cause error due to mis-matched sample count between rp & fb
5021 fb_info.renderPass = rp;
5022 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5023 " has VK_SAMPLE_COUNT_1_BIT samples "
5024 "that do not match the "
5025 "VK_SAMPLE_COUNT_4_BIT ");
5026 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
5027
5028 m_errorMonitor->VerifyFound();
5029 if (err == VK_SUCCESS) {
5030 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5031 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06005032
5033 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06005034
5035 // Create a custom imageView with non-1 mip levels
5036 VkImageObj image(m_device);
5037 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
5038 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5039 ASSERT_TRUE(image.initialized());
5040
5041 VkImageView view;
5042 VkImageViewCreateInfo ivci = {};
5043 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5044 ivci.image = image.handle();
5045 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
5046 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
5047 ivci.subresourceRange.layerCount = 1;
5048 ivci.subresourceRange.baseMipLevel = 0;
5049 // Set level count 2 (only 1 is allowed for FB attachment)
5050 ivci.subresourceRange.levelCount = 2;
5051 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5052 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
5053 ASSERT_VK_SUCCESS(err);
5054 // Re-create renderpass to have matching sample count
5055 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5056 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5057 ASSERT_VK_SUCCESS(err);
5058
5059 fb_info.renderPass = rp;
5060 fb_info.pAttachments = &view;
5061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5062 " has mip levelCount of 2 but only ");
5063 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
5064
5065 m_errorMonitor->VerifyFound();
5066 if (err == VK_SUCCESS) {
5067 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5068 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06005069 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06005070 // Update view to original color buffer and grow FB dimensions too big
5071 fb_info.pAttachments = ivs;
5072 fb_info.height = 1024;
5073 fb_info.width = 1024;
5074 fb_info.layers = 2;
5075 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5076 " Attachment dimensions must be at "
5077 "least as large. ");
5078 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
5079
5080 m_errorMonitor->VerifyFound();
5081 if (err == VK_SUCCESS) {
5082 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5083 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06005084 // Create view attachment with non-identity swizzle
5085 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5086 ivci.image = image.handle();
5087 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
5088 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
5089 ivci.subresourceRange.layerCount = 1;
5090 ivci.subresourceRange.baseMipLevel = 0;
5091 ivci.subresourceRange.levelCount = 1;
5092 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5093 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
5094 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
5095 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
5096 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
5097 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
5098 ASSERT_VK_SUCCESS(err);
5099
5100 fb_info.pAttachments = &view;
5101 fb_info.height = 100;
5102 fb_info.width = 100;
5103 fb_info.layers = 1;
5104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5105 " has non-identy swizzle. All "
5106 "framebuffer attachments must have "
5107 "been created with the identity "
5108 "swizzle. ");
5109 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
5110
5111 m_errorMonitor->VerifyFound();
5112 if (err == VK_SUCCESS) {
5113 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5114 }
5115 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06005116 // Request fb that exceeds max dimensions
5117 // reset attachment to color attachment
5118 fb_info.pAttachments = ivs;
5119 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
5120 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
5121 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
5122 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5123 " Requested VkFramebufferCreateInfo "
5124 "dimensions exceed physical device "
5125 "limits. ");
5126 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
5127
5128 m_errorMonitor->VerifyFound();
5129 if (err == VK_SUCCESS) {
5130 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5131 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06005132
Tobin Ehlis6cfda642016-06-22 16:12:58 -06005133 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06005134}
5135
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005136// This is a positive test. No errors should be generated.
Michael Lentine860b0fe2016-05-20 10:14:00 -05005137TEST_F(VkLayerTest, WaitEventThenSet) {
5138 TEST_DESCRIPTION(
5139 "Wait on a event then set it after the wait has been submitted.");
5140
Michael Lentine860b0fe2016-05-20 10:14:00 -05005141 m_errorMonitor->ExpectSuccess();
5142
5143 VkEvent event;
5144 VkEventCreateInfo event_create_info{};
5145 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5146 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
5147
5148 VkCommandPool command_pool;
5149 VkCommandPoolCreateInfo pool_create_info{};
5150 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5151 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5152 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5153 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5154 &command_pool);
5155
5156 VkCommandBuffer command_buffer;
5157 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5158 command_buffer_allocate_info.sType =
5159 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5160 command_buffer_allocate_info.commandPool = command_pool;
5161 command_buffer_allocate_info.commandBufferCount = 1;
5162 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5163 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5164 &command_buffer);
5165
5166 VkQueue queue = VK_NULL_HANDLE;
5167 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06005168 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005169
5170 {
5171 VkCommandBufferBeginInfo begin_info{};
5172 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5173 vkBeginCommandBuffer(command_buffer, &begin_info);
5174
5175 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT,
5176 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
5177 nullptr, 0, nullptr);
5178 vkCmdResetEvent(command_buffer, event,
5179 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
5180 vkEndCommandBuffer(command_buffer);
5181 }
5182 {
5183 VkSubmitInfo submit_info{};
5184 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5185 submit_info.commandBufferCount = 1;
5186 submit_info.pCommandBuffers = &command_buffer;
5187 submit_info.signalSemaphoreCount = 0;
5188 submit_info.pSignalSemaphores = nullptr;
5189 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5190 }
5191 { vkSetEvent(m_device->device(), event); }
5192
5193 vkQueueWaitIdle(queue);
5194
5195 vkDestroyEvent(m_device->device(), event, nullptr);
5196 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5197 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5198
5199 m_errorMonitor->VerifyNotFound();
5200}
Michael Lentine5627e692016-05-20 17:45:02 -05005201// This is a positive test. No errors should be generated.
Michael Lentinef01fb382016-07-21 17:24:56 -05005202TEST_F(VkLayerTest, QueryAndCopySecondaryCommandBuffers) {
5203 TEST_DESCRIPTION(
5204 "Issue a query on a secondary command buffery and copy it on a primary.");
5205
5206 if ((m_device->queue_props.empty()) ||
5207 (m_device->queue_props[0].queueCount < 2))
5208 return;
5209
5210 m_errorMonitor->ExpectSuccess();
5211
5212 VkQueryPool query_pool;
5213 VkQueryPoolCreateInfo query_pool_create_info{};
5214 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5215 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
5216 query_pool_create_info.queryCount = 1;
5217 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
5218 &query_pool);
5219
5220 VkCommandPool command_pool;
5221 VkCommandPoolCreateInfo pool_create_info{};
5222 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5223 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5224 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5225 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5226 &command_pool);
5227
5228 VkCommandBuffer command_buffer;
5229 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5230 command_buffer_allocate_info.sType =
5231 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5232 command_buffer_allocate_info.commandPool = command_pool;
5233 command_buffer_allocate_info.commandBufferCount = 1;
5234 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5235 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5236 &command_buffer);
5237
5238 VkCommandBuffer secondary_command_buffer;
5239 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5240 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5241 &secondary_command_buffer);
5242
5243 VkQueue queue = VK_NULL_HANDLE;
5244 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5245 1, &queue);
5246
5247 uint32_t qfi = 0;
5248 VkBufferCreateInfo buff_create_info = {};
5249 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5250 buff_create_info.size = 1024;
5251 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
5252 buff_create_info.queueFamilyIndexCount = 1;
5253 buff_create_info.pQueueFamilyIndices = &qfi;
5254
5255 VkResult err;
5256 VkBuffer buffer;
5257 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
5258 ASSERT_VK_SUCCESS(err);
5259 VkMemoryAllocateInfo mem_alloc = {};
5260 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5261 mem_alloc.pNext = NULL;
5262 mem_alloc.allocationSize = 1024;
5263 mem_alloc.memoryTypeIndex = 0;
5264
5265 VkMemoryRequirements memReqs;
5266 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
5267 bool pass =
5268 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
5269 if (!pass) {
5270 vkDestroyBuffer(m_device->device(), buffer, NULL);
5271 return;
5272 }
5273
5274 VkDeviceMemory mem;
5275 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5276 ASSERT_VK_SUCCESS(err);
5277 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5278 ASSERT_VK_SUCCESS(err);
5279
5280 VkCommandBufferInheritanceInfo hinfo = {};
5281 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
5282 hinfo.renderPass = VK_NULL_HANDLE;
5283 hinfo.subpass = 0;
5284 hinfo.framebuffer = VK_NULL_HANDLE;
5285 hinfo.occlusionQueryEnable = VK_FALSE;
5286 hinfo.queryFlags = 0;
5287 hinfo.pipelineStatistics = 0;
5288
5289 {
5290 VkCommandBufferBeginInfo begin_info{};
5291 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5292 begin_info.pInheritanceInfo = &hinfo;
5293 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
5294
5295 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
5296 vkCmdWriteTimestamp(secondary_command_buffer,
5297 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
5298
5299 vkEndCommandBuffer(secondary_command_buffer);
5300
5301 begin_info.pInheritanceInfo = nullptr;
5302 vkBeginCommandBuffer(command_buffer, &begin_info);
5303
5304 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
5305 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer,
5306 0, 0, 0);
5307
5308 vkEndCommandBuffer(command_buffer);
5309 }
5310 {
5311 VkSubmitInfo submit_info{};
5312 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5313 submit_info.commandBufferCount = 1;
5314 submit_info.pCommandBuffers = &command_buffer;
5315 submit_info.signalSemaphoreCount = 0;
5316 submit_info.pSignalSemaphores = nullptr;
5317 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5318 }
5319
5320 vkQueueWaitIdle(queue);
5321
5322 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
5323 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5324 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
5325 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5326 vkDestroyBuffer(m_device->device(), buffer, NULL);
5327 vkFreeMemory(m_device->device(), mem, NULL);
5328
5329 m_errorMonitor->VerifyNotFound();
5330}
5331
5332// This is a positive test. No errors should be generated.
Michael Lentine5627e692016-05-20 17:45:02 -05005333TEST_F(VkLayerTest, QueryAndCopyMultipleCommandBuffers) {
5334 TEST_DESCRIPTION(
5335 "Issue a query and copy from it on a second command buffer.");
5336
5337 if ((m_device->queue_props.empty()) ||
5338 (m_device->queue_props[0].queueCount < 2))
5339 return;
5340
5341 m_errorMonitor->ExpectSuccess();
5342
5343 VkQueryPool query_pool;
5344 VkQueryPoolCreateInfo query_pool_create_info{};
5345 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5346 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
5347 query_pool_create_info.queryCount = 1;
5348 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
5349 &query_pool);
5350
5351 VkCommandPool command_pool;
5352 VkCommandPoolCreateInfo pool_create_info{};
5353 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5354 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5355 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5356 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5357 &command_pool);
5358
5359 VkCommandBuffer command_buffer[2];
5360 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5361 command_buffer_allocate_info.sType =
5362 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5363 command_buffer_allocate_info.commandPool = command_pool;
5364 command_buffer_allocate_info.commandBufferCount = 2;
5365 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5366 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5367 command_buffer);
5368
5369 VkQueue queue = VK_NULL_HANDLE;
5370 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5371 1, &queue);
5372
5373 uint32_t qfi = 0;
5374 VkBufferCreateInfo buff_create_info = {};
5375 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5376 buff_create_info.size = 1024;
5377 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
5378 buff_create_info.queueFamilyIndexCount = 1;
5379 buff_create_info.pQueueFamilyIndices = &qfi;
5380
5381 VkResult err;
5382 VkBuffer buffer;
5383 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
5384 ASSERT_VK_SUCCESS(err);
5385 VkMemoryAllocateInfo mem_alloc = {};
5386 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5387 mem_alloc.pNext = NULL;
5388 mem_alloc.allocationSize = 1024;
5389 mem_alloc.memoryTypeIndex = 0;
5390
5391 VkMemoryRequirements memReqs;
5392 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
5393 bool pass =
5394 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
5395 if (!pass) {
5396 vkDestroyBuffer(m_device->device(), buffer, NULL);
5397 return;
5398 }
5399
5400 VkDeviceMemory mem;
5401 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5402 ASSERT_VK_SUCCESS(err);
5403 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5404 ASSERT_VK_SUCCESS(err);
5405
5406 {
5407 VkCommandBufferBeginInfo begin_info{};
5408 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5409 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5410
5411 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
5412 vkCmdWriteTimestamp(command_buffer[0],
5413 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
5414
5415 vkEndCommandBuffer(command_buffer[0]);
5416
5417 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5418
5419 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer,
5420 0, 0, 0);
5421
5422 vkEndCommandBuffer(command_buffer[1]);
5423 }
5424 {
5425 VkSubmitInfo submit_info{};
5426 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5427 submit_info.commandBufferCount = 2;
5428 submit_info.pCommandBuffers = command_buffer;
5429 submit_info.signalSemaphoreCount = 0;
5430 submit_info.pSignalSemaphores = nullptr;
5431 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5432 }
5433
5434 vkQueueWaitIdle(queue);
5435
5436 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
5437 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
5438 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06005439 vkDestroyBuffer(m_device->device(), buffer, NULL);
5440 vkFreeMemory(m_device->device(), mem, NULL);
Michael Lentine5627e692016-05-20 17:45:02 -05005441
5442 m_errorMonitor->VerifyNotFound();
5443}
Michael Lentine860b0fe2016-05-20 10:14:00 -05005444
5445TEST_F(VkLayerTest, ResetEventThenSet) {
5446 TEST_DESCRIPTION(
5447 "Reset an event then set it after the reset has been submitted.");
5448
Michael Lentine860b0fe2016-05-20 10:14:00 -05005449 m_errorMonitor->ExpectSuccess();
5450
5451 VkEvent event;
5452 VkEventCreateInfo event_create_info{};
5453 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5454 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
5455
5456 VkCommandPool command_pool;
5457 VkCommandPoolCreateInfo pool_create_info{};
5458 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5459 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5460 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5461 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5462 &command_pool);
5463
5464 VkCommandBuffer command_buffer;
5465 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5466 command_buffer_allocate_info.sType =
5467 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5468 command_buffer_allocate_info.commandPool = command_pool;
5469 command_buffer_allocate_info.commandBufferCount = 1;
5470 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5471 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5472 &command_buffer);
5473
5474 VkQueue queue = VK_NULL_HANDLE;
5475 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06005476 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005477
5478 {
5479 VkCommandBufferBeginInfo begin_info{};
5480 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5481 vkBeginCommandBuffer(command_buffer, &begin_info);
5482
5483 vkCmdResetEvent(command_buffer, event,
5484 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
5485 vkCmdWaitEvents(command_buffer, 1, &event,
5486 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5487 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
5488 nullptr, 0, nullptr);
5489 vkEndCommandBuffer(command_buffer);
5490 }
5491 {
5492 VkSubmitInfo submit_info{};
5493 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5494 submit_info.commandBufferCount = 1;
5495 submit_info.pCommandBuffers = &command_buffer;
5496 submit_info.signalSemaphoreCount = 0;
5497 submit_info.pSignalSemaphores = nullptr;
5498 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5499 }
5500 {
Cody Northrop32517e02016-08-19 09:57:31 -06005501 m_errorMonitor->SetDesiredFailureMsg(
5502 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkSetEvent() on event "
5503 "0x1 that is already in use by a "
5504 "command buffer.");
Michael Lentine860b0fe2016-05-20 10:14:00 -05005505 vkSetEvent(m_device->device(), event);
5506 m_errorMonitor->VerifyFound();
5507 }
5508
5509 vkQueueWaitIdle(queue);
5510
5511 vkDestroyEvent(m_device->device(), event, nullptr);
5512 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5513 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5514}
5515
5516// This is a positive test. No errors should be generated.
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005517TEST_F(VkLayerTest, TwoFencesThreeFrames) {
5518 TEST_DESCRIPTION("Two command buffers with two separate fences are each "
5519 "run through a Submit & WaitForFences cycle 3 times. This "
5520 "previously revealed a bug so running this positive test "
5521 "to prevent a regression.");
5522 m_errorMonitor->ExpectSuccess();
5523
5524 ASSERT_NO_FATAL_FAILURE(InitState());
5525 VkQueue queue = VK_NULL_HANDLE;
5526 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5527 0, &queue);
5528
5529 static const uint32_t NUM_OBJECTS = 2;
5530 static const uint32_t NUM_FRAMES = 3;
5531 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
5532 VkFence fences[NUM_OBJECTS] = {};
5533
5534 VkCommandPool cmd_pool;
5535 VkCommandPoolCreateInfo cmd_pool_ci = {};
5536 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5537 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
5538 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5539 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci,
5540 nullptr, &cmd_pool);
5541 ASSERT_VK_SUCCESS(err);
5542
5543 VkCommandBufferAllocateInfo cmd_buf_info = {};
5544 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5545 cmd_buf_info.commandPool = cmd_pool;
5546 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5547 cmd_buf_info.commandBufferCount = 1;
5548
5549 VkFenceCreateInfo fence_ci = {};
5550 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5551 fence_ci.pNext = nullptr;
5552 fence_ci.flags = 0;
5553
5554 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
5555 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info,
5556 &cmd_buffers[i]);
5557 ASSERT_VK_SUCCESS(err);
5558 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
5559 ASSERT_VK_SUCCESS(err);
5560 }
5561
5562 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
Tobin Ehlisf9025162016-05-26 06:55:21 -06005563 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
5564 // Create empty cmd buffer
5565 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
5566 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005567
Tobin Ehlisf9025162016-05-26 06:55:21 -06005568 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
5569 ASSERT_VK_SUCCESS(err);
5570 err = vkEndCommandBuffer(cmd_buffers[obj]);
5571 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005572
Tobin Ehlisf9025162016-05-26 06:55:21 -06005573 VkSubmitInfo submit_info = {};
5574 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5575 submit_info.commandBufferCount = 1;
5576 submit_info.pCommandBuffers = &cmd_buffers[obj];
5577 // Submit cmd buffer and wait for fence
5578 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
5579 ASSERT_VK_SUCCESS(err);
5580 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE,
5581 UINT64_MAX);
5582 ASSERT_VK_SUCCESS(err);
5583 err = vkResetFences(m_device->device(), 1, &fences[obj]);
5584 ASSERT_VK_SUCCESS(err);
5585 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005586 }
5587 m_errorMonitor->VerifyNotFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06005588 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
5589 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
5590 vkDestroyFence(m_device->device(), fences[i], nullptr);
5591 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005592}
5593// This is a positive test. No errors should be generated.
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005594TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
5595
5596 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5597 "submitted on separate queues followed by a QueueWaitIdle.");
5598
Dustin Graves48458142016-04-29 16:11:55 -06005599 if ((m_device->queue_props.empty()) ||
5600 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005601 return;
5602
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005603 m_errorMonitor->ExpectSuccess();
5604
5605 VkSemaphore semaphore;
5606 VkSemaphoreCreateInfo semaphore_create_info{};
5607 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5608 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5609 &semaphore);
5610
5611 VkCommandPool command_pool;
5612 VkCommandPoolCreateInfo pool_create_info{};
5613 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5614 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5615 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5616 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5617 &command_pool);
5618
5619 VkCommandBuffer command_buffer[2];
5620 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5621 command_buffer_allocate_info.sType =
5622 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5623 command_buffer_allocate_info.commandPool = command_pool;
5624 command_buffer_allocate_info.commandBufferCount = 2;
5625 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5626 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5627 command_buffer);
5628
5629 VkQueue queue = VK_NULL_HANDLE;
5630 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5631 1, &queue);
5632
5633 {
5634 VkCommandBufferBeginInfo begin_info{};
5635 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5636 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5637
5638 vkCmdPipelineBarrier(command_buffer[0],
5639 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5640 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5641 0, nullptr, 0, nullptr);
5642
5643 VkViewport viewport{};
5644 viewport.maxDepth = 1.0f;
5645 viewport.minDepth = 0.0f;
5646 viewport.width = 512;
5647 viewport.height = 512;
5648 viewport.x = 0;
5649 viewport.y = 0;
5650 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5651 vkEndCommandBuffer(command_buffer[0]);
5652 }
5653 {
5654 VkCommandBufferBeginInfo begin_info{};
5655 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5656 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5657
5658 VkViewport viewport{};
5659 viewport.maxDepth = 1.0f;
5660 viewport.minDepth = 0.0f;
5661 viewport.width = 512;
5662 viewport.height = 512;
5663 viewport.x = 0;
5664 viewport.y = 0;
5665 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5666 vkEndCommandBuffer(command_buffer[1]);
5667 }
5668 {
5669 VkSubmitInfo submit_info{};
5670 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5671 submit_info.commandBufferCount = 1;
5672 submit_info.pCommandBuffers = &command_buffer[0];
5673 submit_info.signalSemaphoreCount = 1;
5674 submit_info.pSignalSemaphores = &semaphore;
5675 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5676 }
5677 {
5678 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5679 VkSubmitInfo submit_info{};
5680 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5681 submit_info.commandBufferCount = 1;
5682 submit_info.pCommandBuffers = &command_buffer[1];
5683 submit_info.waitSemaphoreCount = 1;
5684 submit_info.pWaitSemaphores = &semaphore;
5685 submit_info.pWaitDstStageMask = flags;
5686 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5687 }
5688
5689 vkQueueWaitIdle(m_device->m_queue);
5690
5691 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5692 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5693 &command_buffer[0]);
5694 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5695
5696 m_errorMonitor->VerifyNotFound();
5697}
5698
5699// This is a positive test. No errors should be generated.
5700TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
5701
5702 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5703 "submitted on separate queues, the second having a fence"
5704 "followed by a QueueWaitIdle.");
5705
Dustin Graves48458142016-04-29 16:11:55 -06005706 if ((m_device->queue_props.empty()) ||
5707 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005708 return;
5709
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005710 m_errorMonitor->ExpectSuccess();
5711
5712 VkFence fence;
5713 VkFenceCreateInfo fence_create_info{};
5714 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5715 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5716
5717 VkSemaphore semaphore;
5718 VkSemaphoreCreateInfo semaphore_create_info{};
5719 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5720 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5721 &semaphore);
5722
5723 VkCommandPool command_pool;
5724 VkCommandPoolCreateInfo pool_create_info{};
5725 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5726 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5727 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5728 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5729 &command_pool);
5730
5731 VkCommandBuffer command_buffer[2];
5732 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5733 command_buffer_allocate_info.sType =
5734 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5735 command_buffer_allocate_info.commandPool = command_pool;
5736 command_buffer_allocate_info.commandBufferCount = 2;
5737 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5738 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5739 command_buffer);
5740
5741 VkQueue queue = VK_NULL_HANDLE;
5742 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5743 1, &queue);
5744
5745 {
5746 VkCommandBufferBeginInfo begin_info{};
5747 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5748 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5749
5750 vkCmdPipelineBarrier(command_buffer[0],
5751 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5752 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5753 0, nullptr, 0, nullptr);
5754
5755 VkViewport viewport{};
5756 viewport.maxDepth = 1.0f;
5757 viewport.minDepth = 0.0f;
5758 viewport.width = 512;
5759 viewport.height = 512;
5760 viewport.x = 0;
5761 viewport.y = 0;
5762 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5763 vkEndCommandBuffer(command_buffer[0]);
5764 }
5765 {
5766 VkCommandBufferBeginInfo begin_info{};
5767 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5768 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5769
5770 VkViewport viewport{};
5771 viewport.maxDepth = 1.0f;
5772 viewport.minDepth = 0.0f;
5773 viewport.width = 512;
5774 viewport.height = 512;
5775 viewport.x = 0;
5776 viewport.y = 0;
5777 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5778 vkEndCommandBuffer(command_buffer[1]);
5779 }
5780 {
5781 VkSubmitInfo submit_info{};
5782 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5783 submit_info.commandBufferCount = 1;
5784 submit_info.pCommandBuffers = &command_buffer[0];
5785 submit_info.signalSemaphoreCount = 1;
5786 submit_info.pSignalSemaphores = &semaphore;
5787 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5788 }
5789 {
5790 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5791 VkSubmitInfo submit_info{};
5792 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5793 submit_info.commandBufferCount = 1;
5794 submit_info.pCommandBuffers = &command_buffer[1];
5795 submit_info.waitSemaphoreCount = 1;
5796 submit_info.pWaitSemaphores = &semaphore;
5797 submit_info.pWaitDstStageMask = flags;
5798 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5799 }
5800
5801 vkQueueWaitIdle(m_device->m_queue);
5802
5803 vkDestroyFence(m_device->device(), fence, nullptr);
5804 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5805 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5806 &command_buffer[0]);
5807 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5808
5809 m_errorMonitor->VerifyNotFound();
5810}
5811
5812// This is a positive test. No errors should be generated.
5813TEST_F(VkLayerTest,
5814 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
5815
5816 TEST_DESCRIPTION(
5817 "Two command buffers, each in a separate QueueSubmit call "
5818 "submitted on separate queues, the second having a fence"
5819 "followed by two consecutive WaitForFences calls on the same fence.");
5820
Dustin Graves48458142016-04-29 16:11:55 -06005821 if ((m_device->queue_props.empty()) ||
5822 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005823 return;
5824
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005825 m_errorMonitor->ExpectSuccess();
5826
5827 VkFence fence;
5828 VkFenceCreateInfo fence_create_info{};
5829 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5830 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5831
5832 VkSemaphore semaphore;
5833 VkSemaphoreCreateInfo semaphore_create_info{};
5834 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5835 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5836 &semaphore);
5837
5838 VkCommandPool command_pool;
5839 VkCommandPoolCreateInfo pool_create_info{};
5840 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5841 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5842 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5843 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5844 &command_pool);
5845
5846 VkCommandBuffer command_buffer[2];
5847 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5848 command_buffer_allocate_info.sType =
5849 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5850 command_buffer_allocate_info.commandPool = command_pool;
5851 command_buffer_allocate_info.commandBufferCount = 2;
5852 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5853 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5854 command_buffer);
5855
5856 VkQueue queue = VK_NULL_HANDLE;
5857 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5858 1, &queue);
5859
5860 {
5861 VkCommandBufferBeginInfo begin_info{};
5862 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5863 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5864
5865 vkCmdPipelineBarrier(command_buffer[0],
5866 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5867 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5868 0, nullptr, 0, nullptr);
5869
5870 VkViewport viewport{};
5871 viewport.maxDepth = 1.0f;
5872 viewport.minDepth = 0.0f;
5873 viewport.width = 512;
5874 viewport.height = 512;
5875 viewport.x = 0;
5876 viewport.y = 0;
5877 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5878 vkEndCommandBuffer(command_buffer[0]);
5879 }
5880 {
5881 VkCommandBufferBeginInfo begin_info{};
5882 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5883 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5884
5885 VkViewport viewport{};
5886 viewport.maxDepth = 1.0f;
5887 viewport.minDepth = 0.0f;
5888 viewport.width = 512;
5889 viewport.height = 512;
5890 viewport.x = 0;
5891 viewport.y = 0;
5892 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5893 vkEndCommandBuffer(command_buffer[1]);
5894 }
5895 {
5896 VkSubmitInfo submit_info{};
5897 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5898 submit_info.commandBufferCount = 1;
5899 submit_info.pCommandBuffers = &command_buffer[0];
5900 submit_info.signalSemaphoreCount = 1;
5901 submit_info.pSignalSemaphores = &semaphore;
5902 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5903 }
5904 {
5905 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5906 VkSubmitInfo submit_info{};
5907 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5908 submit_info.commandBufferCount = 1;
5909 submit_info.pCommandBuffers = &command_buffer[1];
5910 submit_info.waitSemaphoreCount = 1;
5911 submit_info.pWaitSemaphores = &semaphore;
5912 submit_info.pWaitDstStageMask = flags;
5913 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5914 }
5915
5916 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5917 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5918
5919 vkDestroyFence(m_device->device(), fence, nullptr);
5920 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5921 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5922 &command_buffer[0]);
5923 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5924
5925 m_errorMonitor->VerifyNotFound();
5926}
5927
Chris Forbes0f8126b2016-06-20 17:48:22 +12005928TEST_F(VkLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
5929 if ((m_device->queue_props.empty()) ||
5930 (m_device->queue_props[0].queueCount < 2)) {
5931 printf("Test requires two queues, skipping\n");
5932 return;
5933 }
5934
5935 VkResult err;
5936
5937 m_errorMonitor->ExpectSuccess();
5938
5939 VkQueue q0 = m_device->m_queue;
5940 VkQueue q1 = nullptr;
5941 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
5942 ASSERT_NE(q1, nullptr);
5943
5944 // An (empty) command buffer. We must have work in the first submission --
5945 // the layer treats unfenced work differently from fenced work.
5946 VkCommandPoolCreateInfo cpci = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0 };
5947 VkCommandPool pool;
5948 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
5949 ASSERT_VK_SUCCESS(err);
5950 VkCommandBufferAllocateInfo cbai = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr,
5951 pool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1
5952 };
5953 VkCommandBuffer cb;
5954 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
5955 ASSERT_VK_SUCCESS(err);
5956 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
5957 0, nullptr
5958 };
5959 err = vkBeginCommandBuffer(cb, &cbbi);
5960 ASSERT_VK_SUCCESS(err);
5961 err = vkEndCommandBuffer(cb);
5962 ASSERT_VK_SUCCESS(err);
5963
5964 // A semaphore
5965 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
5966 VkSemaphore s;
5967 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
5968 ASSERT_VK_SUCCESS(err);
5969
5970 // First submission, to q0
5971 VkSubmitInfo s0 = {
5972 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5973 0, nullptr, nullptr,
5974 1, &cb,
5975 1, &s
5976 };
5977
5978 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
5979 ASSERT_VK_SUCCESS(err);
5980
5981 // Second submission, to q1, waiting on s
5982 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
5983 VkSubmitInfo s1 = {
5984 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5985 1, &s, &waitmask,
5986 0, nullptr,
5987 0, nullptr
5988 };
5989
5990 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
5991 ASSERT_VK_SUCCESS(err);
5992
5993 // Wait for q0 idle
5994 err = vkQueueWaitIdle(q0);
5995 ASSERT_VK_SUCCESS(err);
5996
5997 // Command buffer should have been completed (it was on q0); reset the pool.
5998 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
5999
6000 m_errorMonitor->VerifyNotFound();
6001
6002 // Force device completely idle and clean up resources
6003 vkDeviceWaitIdle(m_device->device());
6004 vkDestroyCommandPool(m_device->device(), pool, nullptr);
6005 vkDestroySemaphore(m_device->device(), s, nullptr);
6006}
Chris Forbes0f8126b2016-06-20 17:48:22 +12006007
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006008// This is a positive test. No errors should be generated.
6009TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
6010
6011 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
6012 "submitted on separate queues, the second having a fence, "
6013 "followed by a WaitForFences call.");
6014
Dustin Graves48458142016-04-29 16:11:55 -06006015 if ((m_device->queue_props.empty()) ||
6016 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06006017 return;
6018
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006019 m_errorMonitor->ExpectSuccess();
6020
6021 VkFence fence;
6022 VkFenceCreateInfo fence_create_info{};
6023 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6024 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6025
6026 VkSemaphore semaphore;
6027 VkSemaphoreCreateInfo semaphore_create_info{};
6028 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
6029 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
6030 &semaphore);
6031
6032 VkCommandPool command_pool;
6033 VkCommandPoolCreateInfo pool_create_info{};
6034 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6035 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6036 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6037 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6038 &command_pool);
6039
6040 VkCommandBuffer command_buffer[2];
6041 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6042 command_buffer_allocate_info.sType =
6043 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6044 command_buffer_allocate_info.commandPool = command_pool;
6045 command_buffer_allocate_info.commandBufferCount = 2;
6046 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6047 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6048 command_buffer);
6049
6050 VkQueue queue = VK_NULL_HANDLE;
6051 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
6052 1, &queue);
6053
6054
6055 {
6056 VkCommandBufferBeginInfo begin_info{};
6057 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6058 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6059
6060 vkCmdPipelineBarrier(command_buffer[0],
6061 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6062 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6063 0, nullptr, 0, nullptr);
6064
6065 VkViewport viewport{};
6066 viewport.maxDepth = 1.0f;
6067 viewport.minDepth = 0.0f;
6068 viewport.width = 512;
6069 viewport.height = 512;
6070 viewport.x = 0;
6071 viewport.y = 0;
6072 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6073 vkEndCommandBuffer(command_buffer[0]);
6074 }
6075 {
6076 VkCommandBufferBeginInfo begin_info{};
6077 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6078 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6079
6080 VkViewport viewport{};
6081 viewport.maxDepth = 1.0f;
6082 viewport.minDepth = 0.0f;
6083 viewport.width = 512;
6084 viewport.height = 512;
6085 viewport.x = 0;
6086 viewport.y = 0;
6087 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6088 vkEndCommandBuffer(command_buffer[1]);
6089 }
6090 {
6091 VkSubmitInfo submit_info{};
6092 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6093 submit_info.commandBufferCount = 1;
6094 submit_info.pCommandBuffers = &command_buffer[0];
6095 submit_info.signalSemaphoreCount = 1;
6096 submit_info.pSignalSemaphores = &semaphore;
6097 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
6098 }
6099 {
6100 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6101 VkSubmitInfo submit_info{};
6102 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6103 submit_info.commandBufferCount = 1;
6104 submit_info.pCommandBuffers = &command_buffer[1];
6105 submit_info.waitSemaphoreCount = 1;
6106 submit_info.pWaitSemaphores = &semaphore;
6107 submit_info.pWaitDstStageMask = flags;
6108 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
6109 }
6110
6111 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6112
6113 vkDestroyFence(m_device->device(), fence, nullptr);
6114 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
6115 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6116 &command_buffer[0]);
6117 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6118
6119 m_errorMonitor->VerifyNotFound();
6120}
6121
6122// This is a positive test. No errors should be generated.
6123TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
6124
6125 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
6126 "on the same queue, sharing a signal/wait semaphore, the "
6127 "second having a fence, "
6128 "followed by a WaitForFences call.");
6129
6130 m_errorMonitor->ExpectSuccess();
6131
6132 VkFence fence;
6133 VkFenceCreateInfo fence_create_info{};
6134 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6135 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6136
6137 VkSemaphore semaphore;
6138 VkSemaphoreCreateInfo semaphore_create_info{};
6139 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
6140 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
6141 &semaphore);
6142
6143 VkCommandPool command_pool;
6144 VkCommandPoolCreateInfo pool_create_info{};
6145 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6146 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6147 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6148 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6149 &command_pool);
6150
6151 VkCommandBuffer command_buffer[2];
6152 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6153 command_buffer_allocate_info.sType =
6154 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6155 command_buffer_allocate_info.commandPool = command_pool;
6156 command_buffer_allocate_info.commandBufferCount = 2;
6157 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6158 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6159 command_buffer);
6160
6161 {
6162 VkCommandBufferBeginInfo begin_info{};
6163 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6164 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6165
6166 vkCmdPipelineBarrier(command_buffer[0],
6167 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6168 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6169 0, nullptr, 0, nullptr);
6170
6171 VkViewport viewport{};
6172 viewport.maxDepth = 1.0f;
6173 viewport.minDepth = 0.0f;
6174 viewport.width = 512;
6175 viewport.height = 512;
6176 viewport.x = 0;
6177 viewport.y = 0;
6178 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6179 vkEndCommandBuffer(command_buffer[0]);
6180 }
6181 {
6182 VkCommandBufferBeginInfo begin_info{};
6183 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6184 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6185
6186 VkViewport viewport{};
6187 viewport.maxDepth = 1.0f;
6188 viewport.minDepth = 0.0f;
6189 viewport.width = 512;
6190 viewport.height = 512;
6191 viewport.x = 0;
6192 viewport.y = 0;
6193 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6194 vkEndCommandBuffer(command_buffer[1]);
6195 }
6196 {
6197 VkSubmitInfo submit_info{};
6198 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6199 submit_info.commandBufferCount = 1;
6200 submit_info.pCommandBuffers = &command_buffer[0];
6201 submit_info.signalSemaphoreCount = 1;
6202 submit_info.pSignalSemaphores = &semaphore;
6203 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6204 }
6205 {
6206 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6207 VkSubmitInfo submit_info{};
6208 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6209 submit_info.commandBufferCount = 1;
6210 submit_info.pCommandBuffers = &command_buffer[1];
6211 submit_info.waitSemaphoreCount = 1;
6212 submit_info.pWaitSemaphores = &semaphore;
6213 submit_info.pWaitDstStageMask = flags;
6214 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
6215 }
6216
6217 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6218
6219 vkDestroyFence(m_device->device(), fence, nullptr);
6220 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
6221 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6222 &command_buffer[0]);
6223 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6224
6225 m_errorMonitor->VerifyNotFound();
6226}
6227
6228// This is a positive test. No errors should be generated.
6229TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
6230
6231 TEST_DESCRIPTION(
6232 "Two command buffers, each in a separate QueueSubmit call "
6233 "on the same queue, no fences, followed by a third QueueSubmit with NO "
6234 "SubmitInfos but with a fence, followed by a WaitForFences call.");
6235
6236 m_errorMonitor->ExpectSuccess();
6237
6238 VkFence fence;
6239 VkFenceCreateInfo fence_create_info{};
6240 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6241 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6242
6243 VkCommandPool command_pool;
6244 VkCommandPoolCreateInfo pool_create_info{};
6245 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6246 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6247 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6248 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6249 &command_pool);
6250
6251 VkCommandBuffer command_buffer[2];
6252 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6253 command_buffer_allocate_info.sType =
6254 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6255 command_buffer_allocate_info.commandPool = command_pool;
6256 command_buffer_allocate_info.commandBufferCount = 2;
6257 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6258 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6259 command_buffer);
6260
6261 {
6262 VkCommandBufferBeginInfo begin_info{};
6263 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6264 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6265
6266 vkCmdPipelineBarrier(command_buffer[0],
6267 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6268 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6269 0, nullptr, 0, nullptr);
6270
6271 VkViewport viewport{};
6272 viewport.maxDepth = 1.0f;
6273 viewport.minDepth = 0.0f;
6274 viewport.width = 512;
6275 viewport.height = 512;
6276 viewport.x = 0;
6277 viewport.y = 0;
6278 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6279 vkEndCommandBuffer(command_buffer[0]);
6280 }
6281 {
6282 VkCommandBufferBeginInfo begin_info{};
6283 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6284 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6285
6286 VkViewport viewport{};
6287 viewport.maxDepth = 1.0f;
6288 viewport.minDepth = 0.0f;
6289 viewport.width = 512;
6290 viewport.height = 512;
6291 viewport.x = 0;
6292 viewport.y = 0;
6293 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6294 vkEndCommandBuffer(command_buffer[1]);
6295 }
6296 {
6297 VkSubmitInfo submit_info{};
6298 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6299 submit_info.commandBufferCount = 1;
6300 submit_info.pCommandBuffers = &command_buffer[0];
6301 submit_info.signalSemaphoreCount = 0;
6302 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
6303 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6304 }
6305 {
6306 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6307 VkSubmitInfo submit_info{};
6308 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6309 submit_info.commandBufferCount = 1;
6310 submit_info.pCommandBuffers = &command_buffer[1];
6311 submit_info.waitSemaphoreCount = 0;
6312 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
6313 submit_info.pWaitDstStageMask = flags;
6314 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6315 }
6316
6317 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
6318
Mike Stroyancd1c3e52016-06-21 09:20:01 -06006319 VkResult err =
6320 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6321 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006322
6323 vkDestroyFence(m_device->device(), fence, nullptr);
6324 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6325 &command_buffer[0]);
6326 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6327
6328 m_errorMonitor->VerifyNotFound();
6329}
6330
6331// This is a positive test. No errors should be generated.
6332TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
6333
6334 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
6335 "on the same queue, the second having a fence, followed "
6336 "by a WaitForFences call.");
6337
6338 m_errorMonitor->ExpectSuccess();
6339
6340 VkFence fence;
6341 VkFenceCreateInfo fence_create_info{};
6342 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6343 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6344
6345 VkCommandPool command_pool;
6346 VkCommandPoolCreateInfo pool_create_info{};
6347 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6348 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6349 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6350 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6351 &command_pool);
6352
6353 VkCommandBuffer command_buffer[2];
6354 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6355 command_buffer_allocate_info.sType =
6356 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6357 command_buffer_allocate_info.commandPool = command_pool;
6358 command_buffer_allocate_info.commandBufferCount = 2;
6359 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6360 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6361 command_buffer);
6362
6363 {
6364 VkCommandBufferBeginInfo begin_info{};
6365 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6366 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6367
6368 vkCmdPipelineBarrier(command_buffer[0],
6369 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6370 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6371 0, nullptr, 0, nullptr);
6372
6373 VkViewport viewport{};
6374 viewport.maxDepth = 1.0f;
6375 viewport.minDepth = 0.0f;
6376 viewport.width = 512;
6377 viewport.height = 512;
6378 viewport.x = 0;
6379 viewport.y = 0;
6380 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6381 vkEndCommandBuffer(command_buffer[0]);
6382 }
6383 {
6384 VkCommandBufferBeginInfo begin_info{};
6385 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6386 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6387
6388 VkViewport viewport{};
6389 viewport.maxDepth = 1.0f;
6390 viewport.minDepth = 0.0f;
6391 viewport.width = 512;
6392 viewport.height = 512;
6393 viewport.x = 0;
6394 viewport.y = 0;
6395 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6396 vkEndCommandBuffer(command_buffer[1]);
6397 }
6398 {
6399 VkSubmitInfo submit_info{};
6400 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6401 submit_info.commandBufferCount = 1;
6402 submit_info.pCommandBuffers = &command_buffer[0];
6403 submit_info.signalSemaphoreCount = 0;
6404 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
6405 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6406 }
6407 {
6408 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6409 VkSubmitInfo submit_info{};
6410 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6411 submit_info.commandBufferCount = 1;
6412 submit_info.pCommandBuffers = &command_buffer[1];
6413 submit_info.waitSemaphoreCount = 0;
6414 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
6415 submit_info.pWaitDstStageMask = flags;
6416 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
6417 }
6418
6419 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6420
6421 vkDestroyFence(m_device->device(), fence, nullptr);
6422 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6423 &command_buffer[0]);
6424 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6425
6426 m_errorMonitor->VerifyNotFound();
6427}
6428
6429// This is a positive test. No errors should be generated.
6430TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
6431
6432 TEST_DESCRIPTION(
6433 "Two command buffers each in a separate SubmitInfo sent in a single "
6434 "QueueSubmit call followed by a WaitForFences call.");
6435
6436 m_errorMonitor->ExpectSuccess();
6437
6438 VkFence fence;
6439 VkFenceCreateInfo fence_create_info{};
6440 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6441 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6442
6443 VkSemaphore semaphore;
6444 VkSemaphoreCreateInfo semaphore_create_info{};
6445 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
6446 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
6447 &semaphore);
6448
6449 VkCommandPool command_pool;
6450 VkCommandPoolCreateInfo pool_create_info{};
6451 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6452 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6453 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6454 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6455 &command_pool);
6456
6457 VkCommandBuffer command_buffer[2];
6458 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6459 command_buffer_allocate_info.sType =
6460 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6461 command_buffer_allocate_info.commandPool = command_pool;
6462 command_buffer_allocate_info.commandBufferCount = 2;
6463 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6464 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6465 command_buffer);
6466
6467 {
6468 VkCommandBufferBeginInfo begin_info{};
6469 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6470 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6471
6472 vkCmdPipelineBarrier(command_buffer[0],
6473 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6474 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6475 0, nullptr, 0, nullptr);
6476
6477 VkViewport viewport{};
6478 viewport.maxDepth = 1.0f;
6479 viewport.minDepth = 0.0f;
6480 viewport.width = 512;
6481 viewport.height = 512;
6482 viewport.x = 0;
6483 viewport.y = 0;
6484 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6485 vkEndCommandBuffer(command_buffer[0]);
6486 }
6487 {
6488 VkCommandBufferBeginInfo begin_info{};
6489 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6490 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6491
6492 VkViewport viewport{};
6493 viewport.maxDepth = 1.0f;
6494 viewport.minDepth = 0.0f;
6495 viewport.width = 512;
6496 viewport.height = 512;
6497 viewport.x = 0;
6498 viewport.y = 0;
6499 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6500 vkEndCommandBuffer(command_buffer[1]);
6501 }
6502 {
6503 VkSubmitInfo submit_info[2];
6504 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6505
6506 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6507 submit_info[0].pNext = NULL;
6508 submit_info[0].commandBufferCount = 1;
6509 submit_info[0].pCommandBuffers = &command_buffer[0];
6510 submit_info[0].signalSemaphoreCount = 1;
6511 submit_info[0].pSignalSemaphores = &semaphore;
6512 submit_info[0].waitSemaphoreCount = 0;
6513 submit_info[0].pWaitSemaphores = NULL;
6514 submit_info[0].pWaitDstStageMask = 0;
6515
6516 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6517 submit_info[1].pNext = NULL;
6518 submit_info[1].commandBufferCount = 1;
6519 submit_info[1].pCommandBuffers = &command_buffer[1];
6520 submit_info[1].waitSemaphoreCount = 1;
6521 submit_info[1].pWaitSemaphores = &semaphore;
6522 submit_info[1].pWaitDstStageMask = flags;
6523 submit_info[1].signalSemaphoreCount = 0;
6524 submit_info[1].pSignalSemaphores = NULL;
6525 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
6526 }
6527
6528 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6529
6530 vkDestroyFence(m_device->device(), fence, nullptr);
6531 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6532 &command_buffer[0]);
6533 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006534 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006535
6536 m_errorMonitor->VerifyNotFound();
6537}
6538
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006539TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006540 TEST_DESCRIPTION(
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006541 "Run a simple draw calls to validate failure when Depth Bias dynamic "
6542 "state is required but not correctly bound.");
6543
6544 // Dynamic depth bias
6545 m_errorMonitor->SetDesiredFailureMsg(
6546 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6547 "Dynamic depth bias state not set for this command buffer");
6548 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6549 BsoFailDepthBias);
6550 m_errorMonitor->VerifyFound();
6551}
6552
6553TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
6554 TEST_DESCRIPTION(
6555 "Run a simple draw calls to validate failure when Line Width dynamic "
6556 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006557
6558 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07006559 m_errorMonitor->SetDesiredFailureMsg(
6560 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006561 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006562 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6563 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006564 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006565}
6566
6567TEST_F(VkLayerTest, DynamicViewportNotBound) {
6568 TEST_DESCRIPTION(
6569 "Run a simple draw calls to validate failure when Viewport dynamic "
6570 "state is required but not correctly bound.");
6571
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006572 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07006573 m_errorMonitor->SetDesiredFailureMsg(
6574 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006575 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006576 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6577 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006578 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006579}
6580
6581TEST_F(VkLayerTest, DynamicScissorNotBound) {
6582 TEST_DESCRIPTION(
6583 "Run a simple draw calls to validate failure when Scissor dynamic "
6584 "state is required but not correctly bound.");
6585
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006586 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07006587 m_errorMonitor->SetDesiredFailureMsg(
6588 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006589 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006590 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6591 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006592 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006593}
6594
Cortd713fe82016-07-27 09:51:27 -07006595TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006596 TEST_DESCRIPTION(
Tobin Ehlis21c88352016-05-26 06:15:45 -06006597 "Run a simple draw calls to validate failure when Blend Constants "
6598 "dynamic state is required but not correctly bound.");
6599 // Dynamic blend constant state
6600 m_errorMonitor->SetDesiredFailureMsg(
6601 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6602 "Dynamic blend constants state not set for this command buffer");
6603 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6604 BsoFailBlend);
6605 m_errorMonitor->VerifyFound();
6606}
6607
6608TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
6609 TEST_DESCRIPTION(
6610 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006611 "state is required but not correctly bound.");
Tobin Ehlis21c88352016-05-26 06:15:45 -06006612 if (!m_device->phy().features().depthBounds) {
6613 printf("Device does not support depthBounds test; skipped.\n");
6614 return;
6615 }
6616 // Dynamic depth bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006617 m_errorMonitor->SetDesiredFailureMsg(
6618 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006619 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006620 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6621 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006622 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006623}
6624
6625TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
6626 TEST_DESCRIPTION(
6627 "Run a simple draw calls to validate failure when Stencil Read dynamic "
6628 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006629 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07006630 m_errorMonitor->SetDesiredFailureMsg(
6631 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006632 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006633 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6634 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006635 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006636}
6637
6638TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
6639 TEST_DESCRIPTION(
6640 "Run a simple draw calls to validate failure when Stencil Write dynamic"
6641 " state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006642 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07006643 m_errorMonitor->SetDesiredFailureMsg(
6644 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006645 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006646 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6647 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006648 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006649}
6650
6651TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
6652 TEST_DESCRIPTION(
6653 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
6654 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006655 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07006656 m_errorMonitor->SetDesiredFailureMsg(
6657 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006658 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006659 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6660 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006661 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06006662}
6663
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06006664TEST_F(VkLayerTest, IndexBufferNotBound) {
6665 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
6666 m_errorMonitor->SetDesiredFailureMsg(
6667 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6668 "Index buffer object not bound to this command buffer when Indexed ");
6669 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6670 BsoFailIndexBuffer);
6671 m_errorMonitor->VerifyFound();
6672}
6673
Karl Schultz6addd812016-02-02 17:17:23 -07006674TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Karl Schultz6addd812016-02-02 17:17:23 -07006675 m_errorMonitor->SetDesiredFailureMsg(
6676 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6677 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
6678 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006679
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006680 ASSERT_NO_FATAL_FAILURE(InitState());
6681 ASSERT_NO_FATAL_FAILURE(InitViewport());
6682 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6683
Karl Schultz6addd812016-02-02 17:17:23 -07006684 // We luck out b/c by default the framework creates CB w/ the
6685 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006686 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006687 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
6688 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006689 EndCommandBuffer();
6690
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006691 // Bypass framework since it does the waits automatically
6692 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006693 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08006694 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6695 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006696 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006697 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07006698 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006699 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006700 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08006701 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006702 submit_info.pSignalSemaphores = NULL;
6703
Chris Forbes40028e22016-06-13 09:59:34 +12006704 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07006705 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006706
Karl Schultz6addd812016-02-02 17:17:23 -07006707 // Cause validation error by re-submitting cmd buffer that should only be
6708 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12006709 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006710
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006711 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006712}
6713
Karl Schultz6addd812016-02-02 17:17:23 -07006714TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006715 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07006716 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006717
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006719 "Unable to allocate 1 descriptors of "
6720 "type "
6721 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006722
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006723 ASSERT_NO_FATAL_FAILURE(InitState());
6724 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006725
Karl Schultz6addd812016-02-02 17:17:23 -07006726 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
6727 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006728 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006729 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6730 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006731
6732 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006733 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6734 ds_pool_ci.pNext = NULL;
6735 ds_pool_ci.flags = 0;
6736 ds_pool_ci.maxSets = 1;
6737 ds_pool_ci.poolSizeCount = 1;
6738 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006739
6740 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006741 err =
6742 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006743 ASSERT_VK_SUCCESS(err);
6744
6745 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006746 dsl_binding.binding = 0;
6747 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6748 dsl_binding.descriptorCount = 1;
6749 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6750 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006751
6752 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006753 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6754 ds_layout_ci.pNext = NULL;
6755 ds_layout_ci.bindingCount = 1;
6756 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006757
6758 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006759 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6760 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006761 ASSERT_VK_SUCCESS(err);
6762
6763 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006764 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006765 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006766 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006767 alloc_info.descriptorPool = ds_pool;
6768 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006769 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6770 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006771
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006772 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006773
Chia-I Wuf7458c52015-10-26 21:10:41 +08006774 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6775 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006776}
6777
Karl Schultz6addd812016-02-02 17:17:23 -07006778TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
6779 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06006780
Karl Schultz6addd812016-02-02 17:17:23 -07006781 m_errorMonitor->SetDesiredFailureMsg(
6782 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6783 "It is invalid to call vkFreeDescriptorSets() with a pool created "
6784 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006785
Tobin Ehlise735c692015-10-08 13:13:50 -06006786 ASSERT_NO_FATAL_FAILURE(InitState());
6787 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06006788
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006789 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006790 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6791 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06006792
6793 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006794 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6795 ds_pool_ci.pNext = NULL;
6796 ds_pool_ci.maxSets = 1;
6797 ds_pool_ci.poolSizeCount = 1;
6798 ds_pool_ci.flags = 0;
6799 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
6800 // app can only call vkResetDescriptorPool on this pool.;
6801 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06006802
6803 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006804 err =
6805 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06006806 ASSERT_VK_SUCCESS(err);
6807
6808 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006809 dsl_binding.binding = 0;
6810 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6811 dsl_binding.descriptorCount = 1;
6812 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6813 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06006814
6815 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006816 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6817 ds_layout_ci.pNext = NULL;
6818 ds_layout_ci.bindingCount = 1;
6819 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06006820
6821 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006822 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6823 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06006824 ASSERT_VK_SUCCESS(err);
6825
6826 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006827 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006828 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006829 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006830 alloc_info.descriptorPool = ds_pool;
6831 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006832 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6833 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06006834 ASSERT_VK_SUCCESS(err);
6835
6836 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006837 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06006838
Chia-I Wuf7458c52015-10-26 21:10:41 +08006839 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6840 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06006841}
6842
Karl Schultz6addd812016-02-02 17:17:23 -07006843TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006844 // Attempt to clear Descriptor Pool with bad object.
6845 // ObjectTracker should catch this.
6846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006847 "Invalid Descriptor Pool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006848 uint64_t fake_pool_handle = 0xbaad6001;
6849 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
6850 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06006851 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006852}
6853
Karl Schultz6addd812016-02-02 17:17:23 -07006854TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006855 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
6856 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006857 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06006858 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006859
6860 uint64_t fake_set_handle = 0xbaad6001;
6861 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006862 VkResult err;
6863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006864 "Invalid Descriptor Set Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06006865
6866 ASSERT_NO_FATAL_FAILURE(InitState());
6867
6868 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
6869 layout_bindings[0].binding = 0;
6870 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6871 layout_bindings[0].descriptorCount = 1;
6872 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
6873 layout_bindings[0].pImmutableSamplers = NULL;
6874
6875 VkDescriptorSetLayout descriptor_set_layout;
6876 VkDescriptorSetLayoutCreateInfo dslci = {};
6877 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6878 dslci.pNext = NULL;
6879 dslci.bindingCount = 1;
6880 dslci.pBindings = layout_bindings;
6881 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006882 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006883
6884 VkPipelineLayout pipeline_layout;
6885 VkPipelineLayoutCreateInfo plci = {};
6886 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6887 plci.pNext = NULL;
6888 plci.setLayoutCount = 1;
6889 plci.pSetLayouts = &descriptor_set_layout;
6890 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006891 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006892
6893 BeginCommandBuffer();
6894 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006895 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06006896 m_errorMonitor->VerifyFound();
6897 EndCommandBuffer();
6898 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
6899 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006900}
6901
Karl Schultz6addd812016-02-02 17:17:23 -07006902TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006903 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
6904 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006905 uint64_t fake_layout_handle = 0xbaad6001;
6906 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006908 "Invalid Descriptor Set Layout Object 0xbaad6001");
Cody Northrop32517e02016-08-19 09:57:31 -06006909
Karl Schultzbdb75952016-04-19 11:36:49 -06006910 VkPipelineLayout pipeline_layout;
6911 VkPipelineLayoutCreateInfo plci = {};
6912 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6913 plci.pNext = NULL;
6914 plci.setLayoutCount = 1;
6915 plci.pSetLayouts = &bad_layout;
6916 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
6917
6918 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006919}
6920
Mark Muellerd4914412016-06-13 17:52:06 -06006921TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
6922 TEST_DESCRIPTION("This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
6923 "1) A uniform buffer update must have a valid buffer index."
6924 "2) When using an array of descriptors in a single WriteDescriptor,"
6925 " the descriptor types and stageflags must all be the same."
6926 "3) Immutable Sampler state must match across descriptors");
6927
6928 const char *invalid_BufferInfo_ErrorMessage =
6929 "vkUpdateDescriptorSets: if pDescriptorWrites[0].descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, "
6930 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or "
6931 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pDescriptorWrites[0].pBufferInfo must not be NULL";
6932 const char *stateFlag_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006933 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006934 const char *immutable_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006935 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006936
Mark Muellerd4914412016-06-13 17:52:06 -06006937 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_BufferInfo_ErrorMessage);
6938
6939 ASSERT_NO_FATAL_FAILURE(InitState());
6940 VkDescriptorPoolSize ds_type_count[4] = {};
6941 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6942 ds_type_count[0].descriptorCount = 1;
6943 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6944 ds_type_count[1].descriptorCount = 1;
6945 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6946 ds_type_count[2].descriptorCount = 1;
6947 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6948 ds_type_count[3].descriptorCount = 1;
6949
6950 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6951 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6952 ds_pool_ci.maxSets = 1;
6953 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
6954 ds_pool_ci.pPoolSizes = ds_type_count;
6955
6956 VkDescriptorPool ds_pool;
6957 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6958 ASSERT_VK_SUCCESS(err);
6959
Mark Muellerb9896722016-06-16 09:54:29 -06006960 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006961 layout_binding[0].binding = 0;
6962 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6963 layout_binding[0].descriptorCount = 1;
6964 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6965 layout_binding[0].pImmutableSamplers = NULL;
6966
6967 layout_binding[1].binding = 1;
6968 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6969 layout_binding[1].descriptorCount = 1;
6970 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6971 layout_binding[1].pImmutableSamplers = NULL;
6972
6973 VkSamplerCreateInfo sampler_ci = {};
6974 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6975 sampler_ci.pNext = NULL;
6976 sampler_ci.magFilter = VK_FILTER_NEAREST;
6977 sampler_ci.minFilter = VK_FILTER_NEAREST;
6978 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6979 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6980 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6981 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6982 sampler_ci.mipLodBias = 1.0;
6983 sampler_ci.anisotropyEnable = VK_FALSE;
6984 sampler_ci.maxAnisotropy = 1;
6985 sampler_ci.compareEnable = VK_FALSE;
6986 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6987 sampler_ci.minLod = 1.0;
6988 sampler_ci.maxLod = 1.0;
6989 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6990 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6991 VkSampler sampler;
6992
6993 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6994 ASSERT_VK_SUCCESS(err);
6995
6996 layout_binding[2].binding = 2;
6997 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6998 layout_binding[2].descriptorCount = 1;
6999 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
7000 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
7001
Mark Muellerd4914412016-06-13 17:52:06 -06007002 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7003 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7004 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
7005 ds_layout_ci.pBindings = layout_binding;
7006 VkDescriptorSetLayout ds_layout;
7007 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
7008 ASSERT_VK_SUCCESS(err);
7009
7010 VkDescriptorSetAllocateInfo alloc_info = {};
7011 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7012 alloc_info.descriptorSetCount = 1;
7013 alloc_info.descriptorPool = ds_pool;
7014 alloc_info.pSetLayouts = &ds_layout;
7015 VkDescriptorSet descriptorSet;
7016 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
7017 ASSERT_VK_SUCCESS(err);
7018
7019 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7020 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7021 pipeline_layout_ci.pNext = NULL;
7022 pipeline_layout_ci.setLayoutCount = 1;
7023 pipeline_layout_ci.pSetLayouts = &ds_layout;
7024
7025 VkPipelineLayout pipeline_layout;
7026 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
7027 ASSERT_VK_SUCCESS(err);
7028
Mark Mueller5c838ce2016-06-16 09:54:29 -06007029 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06007030 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7031 descriptor_write.dstSet = descriptorSet;
7032 descriptor_write.dstBinding = 0;
7033 descriptor_write.descriptorCount = 1;
7034 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7035
Mark Mueller5c838ce2016-06-16 09:54:29 -06007036 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06007037 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7038 m_errorMonitor->VerifyFound();
7039
7040 // Create a buffer to update the descriptor with
7041 uint32_t qfi = 0;
7042 VkBufferCreateInfo buffCI = {};
7043 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7044 buffCI.size = 1024;
7045 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7046 buffCI.queueFamilyIndexCount = 1;
7047 buffCI.pQueueFamilyIndices = &qfi;
7048
7049 VkBuffer dyub;
7050 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7051 ASSERT_VK_SUCCESS(err);
7052 VkDescriptorBufferInfo buffInfo = {};
7053 buffInfo.buffer = dyub;
7054 buffInfo.offset = 0;
7055 buffInfo.range = 1024;
7056
7057 descriptor_write.pBufferInfo = &buffInfo;
7058 descriptor_write.descriptorCount = 2;
7059
Mark Mueller5c838ce2016-06-16 09:54:29 -06007060 // 2) The stateFlags don't match between the first and second descriptor
Mark Muellerd4914412016-06-13 17:52:06 -06007061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, stateFlag_ErrorMessage);
7062 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7063 m_errorMonitor->VerifyFound();
7064
Mark Mueller5c838ce2016-06-16 09:54:29 -06007065 // 3) The second descriptor has a null_ptr pImmutableSamplers and
7066 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06007067 descriptor_write.dstBinding = 1;
7068 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06007069
7070
7071 // Make pImageInfo index non-null to avoid complaints of it missing
7072 VkDescriptorImageInfo imageInfo = {};
7073 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
7074 descriptor_write.pImageInfo = &imageInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06007075 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, immutable_ErrorMessage);
7076 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7077 m_errorMonitor->VerifyFound();
7078
Mark Muellerd4914412016-06-13 17:52:06 -06007079 vkDestroyBuffer(m_device->device(), dyub, NULL);
7080 vkDestroySampler(m_device->device(), sampler, NULL);
7081 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7082 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7083 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7084}
7085
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06007086TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
7087 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7088 "due to a buffer dependency being destroyed.");
7089 ASSERT_NO_FATAL_FAILURE(InitState());
7090
7091 VkImageObj image(m_device);
7092 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
7093 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
7094 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
7095 VK_IMAGE_TILING_OPTIMAL, 0);
7096 ASSERT_TRUE(image.initialized());
7097
7098 VkBuffer buffer;
7099 VkDeviceMemory mem;
7100 VkMemoryRequirements mem_reqs;
7101
7102 VkBufferCreateInfo buf_info = {};
7103 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7104 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7105 buf_info.size = 256;
7106 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7107 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
7108 ASSERT_VK_SUCCESS(err);
7109
7110 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
7111
7112 VkMemoryAllocateInfo alloc_info = {};
7113 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7114 alloc_info.allocationSize = 256;
7115 bool pass = false;
7116 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
7117 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
7118 if (!pass) {
7119 vkDestroyBuffer(m_device->device(), buffer, NULL);
7120 return;
7121 }
7122 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
7123 ASSERT_VK_SUCCESS(err);
7124
7125 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
7126 ASSERT_VK_SUCCESS(err);
7127
7128 VkBufferImageCopy region = {};
7129 region.bufferRowLength = 128;
7130 region.bufferImageHeight = 128;
7131 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7132
7133 region.imageSubresource.layerCount = 1;
7134 region.imageExtent.height = 4;
7135 region.imageExtent.width = 4;
7136 region.imageExtent.depth = 1;
7137 m_commandBuffer->BeginCommandBuffer();
7138 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
7139 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
7140 1, &region);
7141 m_commandBuffer->EndCommandBuffer();
7142
7143 m_errorMonitor->SetDesiredFailureMsg(
7144 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7145 " that is invalid because bound buffer ");
7146 // Destroy buffer dependency prior to submit to cause ERROR
7147 vkDestroyBuffer(m_device->device(), buffer, NULL);
7148
7149 VkSubmitInfo submit_info = {};
7150 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7151 submit_info.commandBufferCount = 1;
7152 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7153 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7154
7155 m_errorMonitor->VerifyFound();
7156 vkFreeMemory(m_device->handle(), mem, NULL);
7157}
7158
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007159TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
7160 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7161 "due to an image dependency being destroyed.");
7162 ASSERT_NO_FATAL_FAILURE(InitState());
7163
7164 VkImage image;
7165 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7166 VkImageCreateInfo image_create_info = {};
7167 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7168 image_create_info.pNext = NULL;
7169 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7170 image_create_info.format = tex_format;
7171 image_create_info.extent.width = 32;
7172 image_create_info.extent.height = 32;
7173 image_create_info.extent.depth = 1;
7174 image_create_info.mipLevels = 1;
7175 image_create_info.arrayLayers = 1;
7176 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7177 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7178 image_create_info.usage =
7179 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7180 image_create_info.flags = 0;
7181 VkResult err =
7182 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7183 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007184 // Have to bind memory to image before recording cmd in cmd buffer using it
7185 VkMemoryRequirements mem_reqs;
7186 VkDeviceMemory image_mem;
7187 bool pass;
7188 VkMemoryAllocateInfo mem_alloc = {};
7189 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7190 mem_alloc.pNext = NULL;
7191 mem_alloc.memoryTypeIndex = 0;
7192 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
7193 mem_alloc.allocationSize = mem_reqs.size;
7194 pass =
7195 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
7196 ASSERT_TRUE(pass);
7197 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
7198 ASSERT_VK_SUCCESS(err);
7199 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
7200 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007201
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007202 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06007203 VkClearColorValue ccv;
7204 ccv.float32[0] = 1.0f;
7205 ccv.float32[1] = 1.0f;
7206 ccv.float32[2] = 1.0f;
7207 ccv.float32[3] = 1.0f;
7208 VkImageSubresourceRange isr = {};
7209 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007210 isr.baseArrayLayer = 0;
7211 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06007212 isr.layerCount = 1;
7213 isr.levelCount = 1;
7214 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
7215 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007216 m_commandBuffer->EndCommandBuffer();
7217
7218 m_errorMonitor->SetDesiredFailureMsg(
7219 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
7220 // Destroy image dependency prior to submit to cause ERROR
7221 vkDestroyImage(m_device->device(), image, NULL);
7222
7223 VkSubmitInfo submit_info = {};
7224 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7225 submit_info.commandBufferCount = 1;
7226 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7227 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7228
7229 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007230 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007231}
7232
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007233TEST_F(VkLayerTest, ImageMemoryNotBound) {
7234 TEST_DESCRIPTION(
7235 "Attempt to draw with an image which has not had memory bound to it.");
7236 ASSERT_NO_FATAL_FAILURE(InitState());
7237
7238 VkImage image;
7239 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7240 VkImageCreateInfo image_create_info = {};
7241 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7242 image_create_info.pNext = NULL;
7243 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7244 image_create_info.format = tex_format;
7245 image_create_info.extent.width = 32;
7246 image_create_info.extent.height = 32;
7247 image_create_info.extent.depth = 1;
7248 image_create_info.mipLevels = 1;
7249 image_create_info.arrayLayers = 1;
7250 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7251 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7252 image_create_info.usage =
7253 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7254 image_create_info.flags = 0;
7255 VkResult err =
7256 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7257 ASSERT_VK_SUCCESS(err);
7258 // Have to bind memory to image before recording cmd in cmd buffer using it
7259 VkMemoryRequirements mem_reqs;
7260 VkDeviceMemory image_mem;
7261 bool pass;
7262 VkMemoryAllocateInfo mem_alloc = {};
7263 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7264 mem_alloc.pNext = NULL;
7265 mem_alloc.memoryTypeIndex = 0;
7266 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
7267 mem_alloc.allocationSize = mem_reqs.size;
7268 pass =
7269 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
7270 ASSERT_TRUE(pass);
7271 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
7272 ASSERT_VK_SUCCESS(err);
7273
7274 // Introduce error, do not call vkBindImageMemory(m_device->device(), image,
7275 // image_mem, 0);
7276 m_errorMonitor->SetDesiredFailureMsg(
7277 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7278 "used without first calling vkBindImageMemory");
7279
7280 m_commandBuffer->BeginCommandBuffer();
7281 VkClearColorValue ccv;
7282 ccv.float32[0] = 1.0f;
7283 ccv.float32[1] = 1.0f;
7284 ccv.float32[2] = 1.0f;
7285 ccv.float32[3] = 1.0f;
7286 VkImageSubresourceRange isr = {};
7287 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7288 isr.baseArrayLayer = 0;
7289 isr.baseMipLevel = 0;
7290 isr.layerCount = 1;
7291 isr.levelCount = 1;
7292 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
7293 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
7294 m_commandBuffer->EndCommandBuffer();
7295
7296 m_errorMonitor->VerifyFound();
7297 vkDestroyImage(m_device->device(), image, NULL);
7298 vkFreeMemory(m_device->device(), image_mem, nullptr);
7299}
7300
7301TEST_F(VkLayerTest, BufferMemoryNotBound) {
7302 TEST_DESCRIPTION(
7303 "Attempt to copy from a buffer which has not had memory bound to it.");
7304 ASSERT_NO_FATAL_FAILURE(InitState());
7305
7306 VkImageObj image(m_device);
7307 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
7308 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
7309 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
7310 VK_IMAGE_TILING_OPTIMAL, 0);
7311 ASSERT_TRUE(image.initialized());
7312
7313 VkBuffer buffer;
7314 VkDeviceMemory mem;
7315 VkMemoryRequirements mem_reqs;
7316
7317 VkBufferCreateInfo buf_info = {};
7318 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7319 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7320 buf_info.size = 256;
7321 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7322 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
7323 ASSERT_VK_SUCCESS(err);
7324
7325 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
7326
7327 VkMemoryAllocateInfo alloc_info = {};
7328 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7329 alloc_info.allocationSize = 256;
7330 bool pass = false;
7331 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
7332 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
7333 if (!pass) {
7334 vkDestroyBuffer(m_device->device(), buffer, NULL);
7335 return;
7336 }
7337 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
7338 ASSERT_VK_SUCCESS(err);
7339
7340 // Introduce failure by not calling vkBindBufferMemory(m_device->device(),
7341 // buffer, mem, 0);
7342 m_errorMonitor->SetDesiredFailureMsg(
7343 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7344 "used without first calling vkBindBufferMemory");
7345 VkBufferImageCopy region = {};
7346 region.bufferRowLength = 128;
7347 region.bufferImageHeight = 128;
7348 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7349
7350 region.imageSubresource.layerCount = 1;
7351 region.imageExtent.height = 4;
7352 region.imageExtent.width = 4;
7353 region.imageExtent.depth = 1;
7354 m_commandBuffer->BeginCommandBuffer();
7355 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
7356 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
7357 1, &region);
7358 m_commandBuffer->EndCommandBuffer();
7359
7360 m_errorMonitor->VerifyFound();
7361
7362 vkDestroyBuffer(m_device->device(), buffer, NULL);
7363 vkFreeMemory(m_device->handle(), mem, NULL);
7364}
7365
Tobin Ehlis85940f52016-07-07 16:57:21 -06007366TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
7367 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7368 "due to an event dependency being destroyed.");
7369 ASSERT_NO_FATAL_FAILURE(InitState());
7370
7371 VkEvent event;
7372 VkEventCreateInfo evci = {};
7373 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
7374 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
7375 ASSERT_VK_SUCCESS(result);
7376
7377 m_commandBuffer->BeginCommandBuffer();
7378 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event,
7379 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
7380 m_commandBuffer->EndCommandBuffer();
7381
7382 m_errorMonitor->SetDesiredFailureMsg(
7383 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
7384 // Destroy event dependency prior to submit to cause ERROR
7385 vkDestroyEvent(m_device->device(), event, NULL);
7386
7387 VkSubmitInfo submit_info = {};
7388 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7389 submit_info.commandBufferCount = 1;
7390 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7391 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7392
7393 m_errorMonitor->VerifyFound();
7394}
7395
Tobin Ehlisdbea7552016-07-08 14:33:31 -06007396TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
7397 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7398 "due to a query pool dependency being destroyed.");
7399 ASSERT_NO_FATAL_FAILURE(InitState());
7400
7401 VkQueryPool query_pool;
7402 VkQueryPoolCreateInfo qpci{};
7403 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
7404 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
7405 qpci.queryCount = 1;
7406 VkResult result =
7407 vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
7408 ASSERT_VK_SUCCESS(result);
7409
7410 m_commandBuffer->BeginCommandBuffer();
7411 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
7412 m_commandBuffer->EndCommandBuffer();
7413
7414 m_errorMonitor->SetDesiredFailureMsg(
7415 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7416 " that is invalid because bound query pool ");
7417 // Destroy query pool dependency prior to submit to cause ERROR
7418 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
7419
7420 VkSubmitInfo submit_info = {};
7421 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7422 submit_info.commandBufferCount = 1;
7423 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7424 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7425
7426 m_errorMonitor->VerifyFound();
7427}
7428
Tobin Ehlis24130d92016-07-08 15:50:53 -06007429TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
7430 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7431 "due to a pipeline dependency being destroyed.");
7432 ASSERT_NO_FATAL_FAILURE(InitState());
7433 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7434
7435 VkResult err;
7436
7437 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7438 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7439
7440 VkPipelineLayout pipeline_layout;
7441 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7442 &pipeline_layout);
7443 ASSERT_VK_SUCCESS(err);
7444
7445 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7446 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7447 vp_state_ci.viewportCount = 1;
7448 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06007449 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06007450 vp_state_ci.scissorCount = 1;
7451 VkRect2D scissors = {}; // Dummy scissors to point to
7452 vp_state_ci.pScissors = &scissors;
7453 // No dynamic state
7454 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
7455 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7456
7457 VkPipelineShaderStageCreateInfo shaderStages[2];
7458 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7459
7460 VkShaderObj vs(m_device, bindStateVertShaderText,
7461 VK_SHADER_STAGE_VERTEX_BIT, this);
7462 VkShaderObj fs(m_device, bindStateFragShaderText,
7463 VK_SHADER_STAGE_FRAGMENT_BIT,
7464 this); // We shouldn't need a fragment shader
7465 // but add it to be able to run on more devices
7466 shaderStages[0] = vs.GetStageCreateInfo();
7467 shaderStages[1] = fs.GetStageCreateInfo();
7468
7469 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7470 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7471
7472 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7473 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7474 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7475
7476 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7477 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7478
7479 VkPipelineColorBlendAttachmentState att = {};
7480 att.blendEnable = VK_FALSE;
7481 att.colorWriteMask = 0xf;
7482
7483 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7484 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7485 cb_ci.attachmentCount = 1;
7486 cb_ci.pAttachments = &att;
7487
7488 VkGraphicsPipelineCreateInfo gp_ci = {};
7489 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7490 gp_ci.stageCount = 2;
7491 gp_ci.pStages = shaderStages;
7492 gp_ci.pVertexInputState = &vi_ci;
7493 gp_ci.pInputAssemblyState = &ia_ci;
7494 gp_ci.pViewportState = &vp_state_ci;
7495 gp_ci.pRasterizationState = &rs_ci;
7496 gp_ci.pColorBlendState = &cb_ci;
7497 gp_ci.pDynamicState = &dyn_state_ci;
7498 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7499 gp_ci.layout = pipeline_layout;
7500 gp_ci.renderPass = renderPass();
7501
7502 VkPipelineCacheCreateInfo pc_ci = {};
7503 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7504
7505 VkPipeline pipeline;
7506 VkPipelineCache pipelineCache;
7507 err =
7508 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
7509 ASSERT_VK_SUCCESS(err);
7510
7511 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7512 &gp_ci, NULL, &pipeline);
7513 ASSERT_VK_SUCCESS(err);
7514
7515 m_commandBuffer->BeginCommandBuffer();
7516 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7517 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
7518 m_commandBuffer->EndCommandBuffer();
7519 // Now destroy pipeline in order to cause error when submitting
7520 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
7521
7522 m_errorMonitor->SetDesiredFailureMsg(
7523 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7524 " that is invalid because bound pipeline ");
7525
7526 VkSubmitInfo submit_info = {};
7527 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7528 submit_info.commandBufferCount = 1;
7529 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7530 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7531
7532 m_errorMonitor->VerifyFound();
7533 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7534 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7535}
7536
Karl Schultz6addd812016-02-02 17:17:23 -07007537TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06007538 // Attempt to bind an invalid Pipeline to a valid Command Buffer
7539 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007540 // Create a valid cmd buffer
7541 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06007542 uint64_t fake_pipeline_handle = 0xbaad6001;
7543 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06007544 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06007545 "Invalid Pipeline Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06007546 ASSERT_NO_FATAL_FAILURE(InitState());
7547 BeginCommandBuffer();
7548 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7549 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
7550 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06007551 // Now issue a draw call with no pipeline bound
7552 m_errorMonitor->SetDesiredFailureMsg(
7553 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7554 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tony Barbourdf4c0042016-06-01 15:55:43 -06007555
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06007556 BeginCommandBuffer();
7557 Draw(1, 0, 0, 0);
7558 m_errorMonitor->VerifyFound();
7559 // Finally same check once more but with Dispatch/Compute
7560 m_errorMonitor->SetDesiredFailureMsg(
7561 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7562 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06007563 BeginCommandBuffer();
7564 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
7565 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007566}
7567
Karl Schultz6addd812016-02-02 17:17:23 -07007568TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
7569 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
7570 // CommandBuffer
7571 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007572
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007573 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007574 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007575
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007576 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06007577 ASSERT_NO_FATAL_FAILURE(InitViewport());
7578 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007579 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007580 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7581 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007582
7583 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007584 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7585 ds_pool_ci.pNext = NULL;
7586 ds_pool_ci.maxSets = 1;
7587 ds_pool_ci.poolSizeCount = 1;
7588 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06007589
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007590 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007591 err =
7592 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007593 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007594
Tony Barboureb254902015-07-15 12:50:33 -06007595 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007596 dsl_binding.binding = 0;
7597 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7598 dsl_binding.descriptorCount = 1;
7599 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7600 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007601
Tony Barboureb254902015-07-15 12:50:33 -06007602 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007603 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7604 ds_layout_ci.pNext = NULL;
7605 ds_layout_ci.bindingCount = 1;
7606 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007607 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007608 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7609 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007610 ASSERT_VK_SUCCESS(err);
7611
7612 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007613 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007614 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007615 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007616 alloc_info.descriptorPool = ds_pool;
7617 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007618 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7619 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007620 ASSERT_VK_SUCCESS(err);
7621
Tony Barboureb254902015-07-15 12:50:33 -06007622 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007623 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7624 pipeline_layout_ci.pNext = NULL;
7625 pipeline_layout_ci.setLayoutCount = 1;
7626 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007627
7628 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007629 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7630 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007631 ASSERT_VK_SUCCESS(err);
7632
Karl Schultz6addd812016-02-02 17:17:23 -07007633 VkShaderObj vs(m_device, bindStateVertShaderText,
7634 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06007635 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07007636 // on more devices
7637 VkShaderObj fs(m_device, bindStateFragShaderText,
7638 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007639
Tony Barbourc95e4ac2015-08-04 17:05:26 -06007640 VkPipelineObj pipe(m_device);
7641 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007642 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06007643 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06007644 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06007645
7646 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007647 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7648 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7649 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7650 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7651 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007652
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007653 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007654
Chia-I Wuf7458c52015-10-26 21:10:41 +08007655 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7656 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7657 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007658}
7659
Karl Schultz6addd812016-02-02 17:17:23 -07007660TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007661 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07007662 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007663
Karl Schultz6addd812016-02-02 17:17:23 -07007664 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007665 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
7666 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007667
7668 ASSERT_NO_FATAL_FAILURE(InitState());
7669 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007670 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7671 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007672
7673 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007674 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7675 ds_pool_ci.pNext = NULL;
7676 ds_pool_ci.maxSets = 1;
7677 ds_pool_ci.poolSizeCount = 1;
7678 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007679
7680 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007681 err =
7682 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007683 ASSERT_VK_SUCCESS(err);
7684
7685 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007686 dsl_binding.binding = 0;
7687 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7688 dsl_binding.descriptorCount = 1;
7689 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7690 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007691
7692 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007693 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7694 ds_layout_ci.pNext = NULL;
7695 ds_layout_ci.bindingCount = 1;
7696 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007697 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007698 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7699 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007700 ASSERT_VK_SUCCESS(err);
7701
7702 VkDescriptorSet descriptorSet;
7703 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007704 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007705 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007706 alloc_info.descriptorPool = ds_pool;
7707 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007708 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7709 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007710 ASSERT_VK_SUCCESS(err);
7711
Karl Schultz6addd812016-02-02 17:17:23 -07007712 VkBufferView view =
7713 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007714 VkWriteDescriptorSet descriptor_write;
7715 memset(&descriptor_write, 0, sizeof(descriptor_write));
7716 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7717 descriptor_write.dstSet = descriptorSet;
7718 descriptor_write.dstBinding = 0;
7719 descriptor_write.descriptorCount = 1;
7720 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7721 descriptor_write.pTexelBufferView = &view;
7722
7723 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7724
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007725 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007726
7727 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7728 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7729}
7730
Mark Youngd339ba32016-05-30 13:28:35 -06007731TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
7732 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has"
7733 " no memory bound to it.");
7734
7735 VkResult err;
7736 m_errorMonitor->SetDesiredFailureMsg(
7737 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -06007738 "used without first calling vkBindBufferMemory");
Mark Youngd339ba32016-05-30 13:28:35 -06007739
7740 ASSERT_NO_FATAL_FAILURE(InitState());
7741
7742 // Create a buffer with no bound memory and then attempt to create
7743 // a buffer view.
7744 VkBufferCreateInfo buff_ci = {};
7745 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7746 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7747 buff_ci.size = 256;
7748 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7749 VkBuffer buffer;
7750 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
7751 ASSERT_VK_SUCCESS(err);
7752
7753 VkBufferViewCreateInfo buff_view_ci = {};
7754 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
7755 buff_view_ci.buffer = buffer;
7756 buff_view_ci.format = VK_FORMAT_R8_UNORM;
7757 buff_view_ci.range = VK_WHOLE_SIZE;
7758 VkBufferView buff_view;
7759 err =
7760 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
7761
7762 m_errorMonitor->VerifyFound();
7763 vkDestroyBuffer(m_device->device(), buffer, NULL);
7764 // If last error is success, it still created the view, so delete it.
7765 if (err == VK_SUCCESS) {
7766 vkDestroyBufferView(m_device->device(), buff_view, NULL);
7767 }
7768}
7769
Karl Schultz6addd812016-02-02 17:17:23 -07007770TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
7771 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
7772 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07007773 // 1. No dynamicOffset supplied
7774 // 2. Too many dynamicOffsets supplied
7775 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07007776 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007778 " requires 1 dynamicOffsets, but only "
7779 "0 dynamicOffsets are left in "
7780 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007781
7782 ASSERT_NO_FATAL_FAILURE(InitState());
7783 ASSERT_NO_FATAL_FAILURE(InitViewport());
7784 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7785
7786 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007787 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7788 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007789
7790 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007791 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7792 ds_pool_ci.pNext = NULL;
7793 ds_pool_ci.maxSets = 1;
7794 ds_pool_ci.poolSizeCount = 1;
7795 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007796
7797 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007798 err =
7799 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007800 ASSERT_VK_SUCCESS(err);
7801
7802 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007803 dsl_binding.binding = 0;
7804 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7805 dsl_binding.descriptorCount = 1;
7806 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7807 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007808
7809 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007810 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7811 ds_layout_ci.pNext = NULL;
7812 ds_layout_ci.bindingCount = 1;
7813 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007814 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007815 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7816 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007817 ASSERT_VK_SUCCESS(err);
7818
7819 VkDescriptorSet descriptorSet;
7820 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007821 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007822 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007823 alloc_info.descriptorPool = ds_pool;
7824 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007825 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7826 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007827 ASSERT_VK_SUCCESS(err);
7828
7829 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007830 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7831 pipeline_layout_ci.pNext = NULL;
7832 pipeline_layout_ci.setLayoutCount = 1;
7833 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007834
7835 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007836 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7837 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007838 ASSERT_VK_SUCCESS(err);
7839
7840 // Create a buffer to update the descriptor with
7841 uint32_t qfi = 0;
7842 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007843 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7844 buffCI.size = 1024;
7845 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7846 buffCI.queueFamilyIndexCount = 1;
7847 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007848
7849 VkBuffer dyub;
7850 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7851 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007852 // Allocate memory and bind to buffer so we can make it to the appropriate
7853 // error
7854 VkMemoryAllocateInfo mem_alloc = {};
7855 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7856 mem_alloc.pNext = NULL;
7857 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12007858 mem_alloc.memoryTypeIndex = 0;
7859
7860 VkMemoryRequirements memReqs;
7861 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
7862 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
7863 0);
7864 if (!pass) {
7865 vkDestroyBuffer(m_device->device(), dyub, NULL);
7866 return;
7867 }
7868
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007869 VkDeviceMemory mem;
7870 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
7871 ASSERT_VK_SUCCESS(err);
7872 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
7873 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007874 // Correctly update descriptor to avoid "NOT_UPDATED" error
7875 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007876 buffInfo.buffer = dyub;
7877 buffInfo.offset = 0;
7878 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007879
7880 VkWriteDescriptorSet descriptor_write;
7881 memset(&descriptor_write, 0, sizeof(descriptor_write));
7882 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7883 descriptor_write.dstSet = descriptorSet;
7884 descriptor_write.dstBinding = 0;
7885 descriptor_write.descriptorCount = 1;
7886 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7887 descriptor_write.pBufferInfo = &buffInfo;
7888
7889 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7890
7891 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007892 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7893 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7894 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007895 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007896 uint32_t pDynOff[2] = {512, 756};
7897 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07007898 m_errorMonitor->SetDesiredFailureMsg(
7899 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07007900 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07007901 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7902 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7903 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12007904 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007905 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007906 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7907 " dynamic offset 512 combined with "
7908 "offset 0 and range 1024 that "
7909 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07007910 // Create PSO to be used for draw-time errors below
7911 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007912 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007913 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007914 "out gl_PerVertex { \n"
7915 " vec4 gl_Position;\n"
7916 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007917 "void main(){\n"
7918 " gl_Position = vec4(1);\n"
7919 "}\n";
7920 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007921 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007922 "\n"
7923 "layout(location=0) out vec4 x;\n"
7924 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7925 "void main(){\n"
7926 " x = vec4(bar.y);\n"
7927 "}\n";
7928 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7929 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7930 VkPipelineObj pipe(m_device);
7931 pipe.AddShader(&vs);
7932 pipe.AddShader(&fs);
7933 pipe.AddColorAttachment();
7934 pipe.CreateVKPipeline(pipeline_layout, renderPass());
7935
Karl Schultz6addd812016-02-02 17:17:23 -07007936 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7937 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7938 // This update should succeed, but offset size of 512 will overstep buffer
7939 // /w range 1024 & size 1024
7940 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7941 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7942 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07007943 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007944 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007945
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007946 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06007947 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007948
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007949 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007950 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007951 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7952}
7953
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007954TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
7955 TEST_DESCRIPTION("Attempt to update a descriptor with a non-sparse buffer "
7956 "that doesn't have memory bound");
7957 VkResult err;
7958 m_errorMonitor->SetDesiredFailureMsg(
7959 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7960 " used without first calling vkBindBufferMemory.");
7961
7962 ASSERT_NO_FATAL_FAILURE(InitState());
7963 ASSERT_NO_FATAL_FAILURE(InitViewport());
7964 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7965
7966 VkDescriptorPoolSize ds_type_count = {};
7967 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7968 ds_type_count.descriptorCount = 1;
7969
7970 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7971 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7972 ds_pool_ci.pNext = NULL;
7973 ds_pool_ci.maxSets = 1;
7974 ds_pool_ci.poolSizeCount = 1;
7975 ds_pool_ci.pPoolSizes = &ds_type_count;
7976
7977 VkDescriptorPool ds_pool;
7978 err =
7979 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
7980 ASSERT_VK_SUCCESS(err);
7981
7982 VkDescriptorSetLayoutBinding dsl_binding = {};
7983 dsl_binding.binding = 0;
7984 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7985 dsl_binding.descriptorCount = 1;
7986 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7987 dsl_binding.pImmutableSamplers = NULL;
7988
7989 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7990 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7991 ds_layout_ci.pNext = NULL;
7992 ds_layout_ci.bindingCount = 1;
7993 ds_layout_ci.pBindings = &dsl_binding;
7994 VkDescriptorSetLayout ds_layout;
7995 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7996 &ds_layout);
7997 ASSERT_VK_SUCCESS(err);
7998
7999 VkDescriptorSet descriptorSet;
8000 VkDescriptorSetAllocateInfo alloc_info = {};
8001 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8002 alloc_info.descriptorSetCount = 1;
8003 alloc_info.descriptorPool = ds_pool;
8004 alloc_info.pSetLayouts = &ds_layout;
8005 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8006 &descriptorSet);
8007 ASSERT_VK_SUCCESS(err);
8008
8009 // Create a buffer to update the descriptor with
8010 uint32_t qfi = 0;
8011 VkBufferCreateInfo buffCI = {};
8012 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8013 buffCI.size = 1024;
8014 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
8015 buffCI.queueFamilyIndexCount = 1;
8016 buffCI.pQueueFamilyIndices = &qfi;
8017
8018 VkBuffer dyub;
8019 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
8020 ASSERT_VK_SUCCESS(err);
8021
8022 // Attempt to update descriptor without binding memory to it
8023 VkDescriptorBufferInfo buffInfo = {};
8024 buffInfo.buffer = dyub;
8025 buffInfo.offset = 0;
8026 buffInfo.range = 1024;
8027
8028 VkWriteDescriptorSet descriptor_write;
8029 memset(&descriptor_write, 0, sizeof(descriptor_write));
8030 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8031 descriptor_write.dstSet = descriptorSet;
8032 descriptor_write.dstBinding = 0;
8033 descriptor_write.descriptorCount = 1;
8034 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
8035 descriptor_write.pBufferInfo = &buffInfo;
8036
8037 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8038 m_errorMonitor->VerifyFound();
8039
8040 vkDestroyBuffer(m_device->device(), dyub, NULL);
8041 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8042 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8043}
8044
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008045TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008046 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008047 ASSERT_NO_FATAL_FAILURE(InitState());
8048 ASSERT_NO_FATAL_FAILURE(InitViewport());
8049 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8050
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008051 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008052 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008053 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8054 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8055 pipeline_layout_ci.pushConstantRangeCount = 1;
8056 pipeline_layout_ci.pPushConstantRanges = &pc_range;
8057
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008058 //
8059 // Check for invalid push constant ranges in pipeline layouts.
8060 //
8061 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06008062 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008063 char const *msg;
8064 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008065
Karl Schultzc81037d2016-05-12 08:11:23 -06008066 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
8067 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
8068 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
8069 "vkCreatePipelineLayout() call has push constants index 0 with "
8070 "size 0."},
8071 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
8072 "vkCreatePipelineLayout() call has push constants index 0 with "
8073 "size 1."},
8074 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
8075 "vkCreatePipelineLayout() call has push constants index 0 with "
8076 "size 1."},
8077 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
8078 "vkCreatePipelineLayout() call has push constants index 0 with "
8079 "size 0."},
8080 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
8081 "vkCreatePipelineLayout() call has push constants index 0 with "
8082 "offset 1. Offset must"},
8083 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
8084 "vkCreatePipelineLayout() call has push constants index 0 "
8085 "with offset "},
8086 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
8087 "vkCreatePipelineLayout() call has push constants "
8088 "index 0 with offset "},
8089 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
8090 "vkCreatePipelineLayout() call has push constants index 0 "
8091 "with offset "},
8092 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
8093 "vkCreatePipelineLayout() call has push "
8094 "constants index 0 with offset "},
8095 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
8096 "vkCreatePipelineLayout() call has push "
8097 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008098 }};
8099
8100 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06008101 for (const auto &iter : range_tests) {
8102 pc_range = iter.range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8104 iter.msg);
8105 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
8106 NULL, &pipeline_layout);
8107 m_errorMonitor->VerifyFound();
8108 if (VK_SUCCESS == err) {
8109 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8110 }
8111 }
8112
8113 // Check for invalid stage flag
8114 pc_range.offset = 0;
8115 pc_range.size = 16;
8116 pc_range.stageFlags = 0;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008117 m_errorMonitor->SetDesiredFailureMsg(
8118 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008119 "vkCreatePipelineLayout() call has no stageFlags set.");
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008120 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8121 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008122 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008123 if (VK_SUCCESS == err) {
8124 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8125 }
8126
8127 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06008128 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008129 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06008130 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008131 char const *msg;
8132 };
8133
Karl Schultzc81037d2016-05-12 08:11:23 -06008134 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008135 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8136 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8137 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8138 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8139 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
8140 "vkCreatePipelineLayout() call has push constants with overlapping "
8141 "ranges: 0:[0, 4), 1:[0, 4)"},
8142 {
8143 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8144 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
8145 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
8146 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
8147 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
8148 "vkCreatePipelineLayout() call has push constants with "
8149 "overlapping "
8150 "ranges: 3:[12, 20), 4:[16, 20)",
8151 },
8152 {
8153 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
8154 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
8155 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
8156 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
8157 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
8158 "vkCreatePipelineLayout() call has push constants with "
8159 "overlapping "
8160 "ranges: 0:[16, 20), 1:[12, 20)",
8161 },
8162 {
8163 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
8164 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
8165 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
8166 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
8167 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
8168 "vkCreatePipelineLayout() call has push constants with "
8169 "overlapping "
8170 "ranges: 0:[16, 20), 3:[12, 20)",
8171 },
8172 {
8173 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
8174 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
8175 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
8176 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
8177 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
8178 "vkCreatePipelineLayout() call has push constants with "
8179 "overlapping "
8180 "ranges: 0:[16, 20), 2:[4, 100)",
8181 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008182
Karl Schultzc81037d2016-05-12 08:11:23 -06008183 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008184 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06008185 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
8186 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008187 iter.msg);
8188 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
8189 NULL, &pipeline_layout);
8190 m_errorMonitor->VerifyFound();
8191 if (VK_SUCCESS == err) {
8192 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8193 }
8194 }
8195
8196 // Run some positive tests to make sure overlap checking in the layer is OK
Karl Schultzc81037d2016-05-12 08:11:23 -06008197 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos =
8198 {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8199 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
8200 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
8201 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
8202 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
8203 ""},
8204 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
8205 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
8206 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
8207 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
8208 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
8209 ""}}};
8210 for (const auto &iter : overlapping_range_tests_pos) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008211 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
8212 m_errorMonitor->ExpectSuccess();
8213 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
8214 NULL, &pipeline_layout);
8215 m_errorMonitor->VerifyNotFound();
8216 if (VK_SUCCESS == err) {
8217 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8218 }
8219 }
8220
8221 //
8222 // CmdPushConstants tests
8223 //
Karl Schultzc81037d2016-05-12 08:11:23 -06008224 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008225
8226 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzc81037d2016-05-12 08:11:23 -06008227 const std::array<PipelineLayoutTestCase, 16> cmd_range_tests = {{
8228 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
8229 "vkCmdPushConstants() call has push constants with size 0. Size "
8230 "must be greater than zero and a multiple of 4."},
8231 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
8232 "vkCmdPushConstants() call has push constants with size 1. Size "
8233 "must be greater than zero and a multiple of 4."},
8234 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
8235 "vkCmdPushConstants() call has push constants with size 1. Size "
8236 "must be greater than zero and a multiple of 4."},
8237 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
8238 "vkCmdPushConstants() call has push constants with offset 1. "
8239 "Offset must be a multiple of 4."},
8240 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
8241 "vkCmdPushConstants() call has push constants with offset 1. "
8242 "Offset must be a multiple of 4."},
8243 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
8244 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
8245 "0x1 not within flag-matching ranges in pipeline layout"},
8246 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
8247 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
8248 "0x1 not within flag-matching ranges in pipeline layout"},
8249 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
8250 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
8251 "0x1 not within flag-matching ranges in pipeline layout"},
8252 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
8253 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
8254 "0x1 not within flag-matching ranges in pipeline layout"},
8255 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
8256 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
8257 "any of the ranges in pipeline layout"},
8258 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
8259 0, 16},
8260 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
8261 "any of the ranges in pipeline layout"},
8262 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008263 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06008264 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008265 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06008266 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008267 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06008268 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008269 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06008270 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008271 "vkCmdPushConstants() call has push constants with offset "},
8272 }};
8273
8274 // Two ranges for testing robustness
Karl Schultzc81037d2016-05-12 08:11:23 -06008275 const VkPushConstantRange pc_range2[] = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008276 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06008277 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008278 };
Karl Schultzc81037d2016-05-12 08:11:23 -06008279 pipeline_layout_ci.pushConstantRangeCount =
8280 sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008281 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008282 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8283 &pipeline_layout);
8284 ASSERT_VK_SUCCESS(err);
8285 BeginCommandBuffer();
Karl Schultzc81037d2016-05-12 08:11:23 -06008286 for (const auto &iter : cmd_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008287 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8288 iter.msg);
8289 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
Karl Schultzc81037d2016-05-12 08:11:23 -06008290 iter.range.stageFlags, iter.range.offset,
8291 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008292 m_errorMonitor->VerifyFound();
8293 }
8294
8295 // Check for invalid stage flag
8296 m_errorMonitor->SetDesiredFailureMsg(
8297 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8298 "vkCmdPushConstants() call has no stageFlags set.");
8299 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0,
Karl Schultzc81037d2016-05-12 08:11:23 -06008300 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008301 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06008302 EndCommandBuffer();
8303 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
8304 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008305
Karl Schultzc81037d2016-05-12 08:11:23 -06008306 // overlapping range tests with cmd
8307 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
8308 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
8309 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
8310 "0x1 not within flag-matching ranges in pipeline layout"},
8311 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
8312 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
8313 "0x1 not within flag-matching ranges in pipeline layout"},
8314 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
8315 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
8316 "0x1 not within flag-matching ranges in pipeline layout"},
8317 }};
8318 const VkPushConstantRange pc_range3[] = {
8319 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
8320 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
8321 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8322 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
8323 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
8324 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
8325 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
8326 };
8327 pipeline_layout_ci.pushConstantRangeCount =
8328 sizeof(pc_range3) / sizeof(VkPushConstantRange);
8329 pipeline_layout_ci.pPushConstantRanges = pc_range3;
8330 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8331 &pipeline_layout);
8332 ASSERT_VK_SUCCESS(err);
8333 BeginCommandBuffer();
8334 for (const auto &iter : cmd_overlap_tests) {
8335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8336 iter.msg);
8337 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
8338 iter.range.stageFlags, iter.range.offset,
8339 iter.range.size, dummy_values);
8340 m_errorMonitor->VerifyFound();
8341 }
8342 EndCommandBuffer();
8343 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
8344 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8345
8346 // positive overlapping range tests with cmd
8347 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
8348 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
8349 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
8350 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
8351 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
8352 }};
8353 const VkPushConstantRange pc_range4[] = {
8354 {VK_SHADER_STAGE_VERTEX_BIT, 0, 64},
8355 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
8356 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
8357 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8358 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
8359 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
8360 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
8361 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
8362 };
8363 pipeline_layout_ci.pushConstantRangeCount =
8364 sizeof(pc_range4) / sizeof(VkPushConstantRange);
8365 pipeline_layout_ci.pPushConstantRanges = pc_range4;
8366 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8367 &pipeline_layout);
8368 ASSERT_VK_SUCCESS(err);
8369 BeginCommandBuffer();
8370 for (const auto &iter : cmd_overlap_tests_pos) {
8371 m_errorMonitor->ExpectSuccess();
8372 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
8373 iter.range.stageFlags, iter.range.offset,
8374 iter.range.size, dummy_values);
8375 m_errorMonitor->VerifyNotFound();
8376 }
8377 EndCommandBuffer();
8378 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008379 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8380}
8381
Karl Schultz6addd812016-02-02 17:17:23 -07008382TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07008383 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07008384 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008385
8386 ASSERT_NO_FATAL_FAILURE(InitState());
8387 ASSERT_NO_FATAL_FAILURE(InitViewport());
8388 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8389
Mike Stroyanb8a61002016-06-20 16:00:28 -06008390 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
8391 VkImageTiling tiling;
8392 VkFormatProperties format_properties;
8393 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
8394 if (format_properties.linearTilingFeatures &
8395 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
8396 tiling = VK_IMAGE_TILING_LINEAR;
8397 } else if (format_properties.optimalTilingFeatures &
8398 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
8399 tiling = VK_IMAGE_TILING_OPTIMAL;
8400 } else {
8401 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
8402 "skipped.\n");
8403 return;
8404 }
8405
Tobin Ehlis559c6382015-11-05 09:52:49 -07008406 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
8407 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008408 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8409 ds_type_count[0].descriptorCount = 10;
8410 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8411 ds_type_count[1].descriptorCount = 2;
8412 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
8413 ds_type_count[2].descriptorCount = 2;
8414 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
8415 ds_type_count[3].descriptorCount = 5;
8416 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
8417 // type
8418 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8419 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
8420 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008421
8422 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008423 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8424 ds_pool_ci.pNext = NULL;
8425 ds_pool_ci.maxSets = 5;
8426 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
8427 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008428
8429 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008430 err =
8431 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008432 ASSERT_VK_SUCCESS(err);
8433
8434 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
8435 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008436 dsl_binding[0].binding = 0;
8437 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8438 dsl_binding[0].descriptorCount = 5;
8439 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
8440 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008441
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008442 // Create layout identical to set0 layout but w/ different stageFlags
8443 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008444 dsl_fs_stage_only.binding = 0;
8445 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8446 dsl_fs_stage_only.descriptorCount = 5;
8447 dsl_fs_stage_only.stageFlags =
8448 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
8449 // bind time
8450 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008451 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008452 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8453 ds_layout_ci.pNext = NULL;
8454 ds_layout_ci.bindingCount = 1;
8455 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008456 static const uint32_t NUM_LAYOUTS = 4;
8457 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008458 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008459 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
8460 // layout for error case
8461 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8462 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008463 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008464 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07008465 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8466 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008467 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008468 dsl_binding[0].binding = 0;
8469 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008470 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008471 dsl_binding[1].binding = 1;
8472 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
8473 dsl_binding[1].descriptorCount = 2;
8474 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
8475 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008476 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008477 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07008478 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8479 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008480 ASSERT_VK_SUCCESS(err);
8481 dsl_binding[0].binding = 0;
8482 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008483 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008484 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008485 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8486 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008487 ASSERT_VK_SUCCESS(err);
8488 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008489 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07008490 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8491 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008492 ASSERT_VK_SUCCESS(err);
8493
8494 static const uint32_t NUM_SETS = 4;
8495 VkDescriptorSet descriptorSet[NUM_SETS] = {};
8496 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008497 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008498 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008499 alloc_info.descriptorPool = ds_pool;
8500 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008501 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8502 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008503 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008504 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008505 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008506 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07008507 err =
8508 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008509 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008510
8511 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008512 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8513 pipeline_layout_ci.pNext = NULL;
8514 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
8515 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008516
8517 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008518 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8519 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008520 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008521 // Create pipelineLayout with only one setLayout
8522 pipeline_layout_ci.setLayoutCount = 1;
8523 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008524 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8525 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008526 ASSERT_VK_SUCCESS(err);
8527 // Create pipelineLayout with 2 descriptor setLayout at index 0
8528 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
8529 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07008530 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8531 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008532 ASSERT_VK_SUCCESS(err);
8533 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
8534 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
8535 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07008536 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8537 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008538 ASSERT_VK_SUCCESS(err);
8539 // Create pipelineLayout with UB type, but stageFlags for FS only
8540 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
8541 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07008542 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8543 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008544 ASSERT_VK_SUCCESS(err);
8545 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
8546 VkDescriptorSetLayout pl_bad_s0[2] = {};
8547 pl_bad_s0[0] = ds_layout_fs_only;
8548 pl_bad_s0[1] = ds_layout[1];
8549 pipeline_layout_ci.setLayoutCount = 2;
8550 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
8551 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07008552 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8553 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008554 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008555
8556 // Create a buffer to update the descriptor with
8557 uint32_t qfi = 0;
8558 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008559 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8560 buffCI.size = 1024;
8561 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
8562 buffCI.queueFamilyIndexCount = 1;
8563 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008564
8565 VkBuffer dyub;
8566 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
8567 ASSERT_VK_SUCCESS(err);
8568 // Correctly update descriptor to avoid "NOT_UPDATED" error
8569 static const uint32_t NUM_BUFFS = 5;
8570 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008571 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07008572 buffInfo[i].buffer = dyub;
8573 buffInfo[i].offset = 0;
8574 buffInfo[i].range = 1024;
8575 }
Karl Schultz6addd812016-02-02 17:17:23 -07008576 VkImage image;
Karl Schultz6addd812016-02-02 17:17:23 -07008577 const int32_t tex_width = 32;
8578 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008579 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008580 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8581 image_create_info.pNext = NULL;
8582 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8583 image_create_info.format = tex_format;
8584 image_create_info.extent.width = tex_width;
8585 image_create_info.extent.height = tex_height;
8586 image_create_info.extent.depth = 1;
8587 image_create_info.mipLevels = 1;
8588 image_create_info.arrayLayers = 1;
8589 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyanb8a61002016-06-20 16:00:28 -06008590 image_create_info.tiling = tiling;
8591 image_create_info.usage =
8592 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07008593 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008594 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
8595 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008596
Karl Schultz6addd812016-02-02 17:17:23 -07008597 VkMemoryRequirements memReqs;
8598 VkDeviceMemory imageMem;
8599 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008600 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008601 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8602 memAlloc.pNext = NULL;
8603 memAlloc.allocationSize = 0;
8604 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008605 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
8606 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008607 pass =
8608 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008609 ASSERT_TRUE(pass);
8610 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
8611 ASSERT_VK_SUCCESS(err);
8612 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
8613 ASSERT_VK_SUCCESS(err);
8614
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008615 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008616 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8617 image_view_create_info.image = image;
8618 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8619 image_view_create_info.format = tex_format;
8620 image_view_create_info.subresourceRange.layerCount = 1;
8621 image_view_create_info.subresourceRange.baseMipLevel = 0;
8622 image_view_create_info.subresourceRange.levelCount = 1;
8623 image_view_create_info.subresourceRange.aspectMask =
8624 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008625
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008626 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008627 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8628 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008629 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008630 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008631 imageInfo[0].imageView = view;
8632 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
8633 imageInfo[1].imageView = view;
8634 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008635 imageInfo[2].imageView = view;
8636 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
8637 imageInfo[3].imageView = view;
8638 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008639
8640 static const uint32_t NUM_SET_UPDATES = 3;
8641 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
8642 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8643 descriptor_write[0].dstSet = descriptorSet[0];
8644 descriptor_write[0].dstBinding = 0;
8645 descriptor_write[0].descriptorCount = 5;
8646 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8647 descriptor_write[0].pBufferInfo = buffInfo;
8648 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8649 descriptor_write[1].dstSet = descriptorSet[1];
8650 descriptor_write[1].dstBinding = 0;
8651 descriptor_write[1].descriptorCount = 2;
8652 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8653 descriptor_write[1].pImageInfo = imageInfo;
8654 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8655 descriptor_write[2].dstSet = descriptorSet[1];
8656 descriptor_write[2].dstBinding = 1;
8657 descriptor_write[2].descriptorCount = 2;
8658 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008659 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008660
8661 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008662
Tobin Ehlis88452832015-12-03 09:40:56 -07008663 // Create PSO to be used for draw-time errors below
8664 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12008665 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07008666 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008667 "out gl_PerVertex {\n"
8668 " vec4 gl_Position;\n"
8669 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07008670 "void main(){\n"
8671 " gl_Position = vec4(1);\n"
8672 "}\n";
8673 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12008674 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07008675 "\n"
8676 "layout(location=0) out vec4 x;\n"
8677 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
8678 "void main(){\n"
8679 " x = vec4(bar.y);\n"
8680 "}\n";
8681 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8682 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008683 VkPipelineObj pipe(m_device);
8684 pipe.AddShader(&vs);
8685 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07008686 pipe.AddColorAttachment();
8687 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07008688
8689 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07008690
Karl Schultz6addd812016-02-02 17:17:23 -07008691 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8692 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8693 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
8694 // of PSO
8695 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
8696 // cmd_pipeline.c
8697 // due to the fact that cmd_alloc_dset_data() has not been called in
8698 // cmd_bind_graphics_pipeline()
8699 // TODO : Want to cause various binding incompatibility issues here to test
8700 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07008701 // First cause various verify_layout_compatibility() fails
8702 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008703 // verify_set_layout_compatibility fail cases:
8704 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07008705 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06008706 "Invalid Pipeline Layout Object ");
Karl Schultz6addd812016-02-02 17:17:23 -07008707 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8708 VK_PIPELINE_BIND_POINT_GRAPHICS,
8709 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
8710 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008711 m_errorMonitor->VerifyFound();
8712
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008713 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07008714 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8715 " attempting to bind set to index 1");
8716 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8717 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
8718 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008719 m_errorMonitor->VerifyFound();
8720
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008721 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008722 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
8723 // descriptors
8724 m_errorMonitor->SetDesiredFailureMsg(
8725 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008726 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07008727 vkCmdBindDescriptorSets(
8728 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8729 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008730 m_errorMonitor->VerifyFound();
8731
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008732 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
8733 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07008734 m_errorMonitor->SetDesiredFailureMsg(
8735 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008736 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07008737 vkCmdBindDescriptorSets(
8738 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8739 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008740 m_errorMonitor->VerifyFound();
8741
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008742 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
8743 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07008744 m_errorMonitor->SetDesiredFailureMsg(
8745 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008746 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07008747 vkCmdBindDescriptorSets(
8748 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8749 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008750 m_errorMonitor->VerifyFound();
8751
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008752 // Cause INFO messages due to disturbing previously bound Sets
8753 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07008754 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8755 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8756 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008757 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07008758 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008759 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008760 " previously bound as set #0 was disturbed ");
8761 vkCmdBindDescriptorSets(
8762 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8763 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008764 m_errorMonitor->VerifyFound();
8765
Karl Schultz6addd812016-02-02 17:17:23 -07008766 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8767 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8768 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008769 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008770 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008771 " newly bound as set #0 so set #1 and "
8772 "any subsequent sets were disturbed ");
8773 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8774 VK_PIPELINE_BIND_POINT_GRAPHICS,
8775 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008776 m_errorMonitor->VerifyFound();
8777
Tobin Ehlis10fad692016-07-07 12:00:36 -06008778 // Now that we're done actively using the pipelineLayout that gfx pipeline
8779 // was created with, we should be able to delete it. Do that now to verify
8780 // that validation obeys pipelineLayout lifetime
8781 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
8782
Tobin Ehlis88452832015-12-03 09:40:56 -07008783 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07008784 // 1. Error due to not binding required set (we actually use same code as
8785 // above to disturb set0)
8786 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8787 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8788 2, &descriptorSet[0], 0, NULL);
8789 vkCmdBindDescriptorSets(
8790 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8791 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
8792 m_errorMonitor->SetDesiredFailureMsg(
8793 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8794 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07008795 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008796 m_errorMonitor->VerifyFound();
8797
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008798 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008799 // 2. Error due to bound set not being compatible with PSO's
8800 // VkPipelineLayout (diff stageFlags in this case)
8801 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8802 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8803 2, &descriptorSet[0], 0, NULL);
8804 m_errorMonitor->SetDesiredFailureMsg(
8805 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8806 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07008807 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008808 m_errorMonitor->VerifyFound();
8809
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008810 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07008811 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008812 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
8813 }
8814 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06008815 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
8816 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008817 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008818 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8819 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008820 vkFreeMemory(m_device->device(), imageMem, NULL);
8821 vkDestroyImage(m_device->device(), image, NULL);
8822 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008823}
Tobin Ehlis559c6382015-11-05 09:52:49 -07008824
Karl Schultz6addd812016-02-02 17:17:23 -07008825TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008826
Karl Schultz6addd812016-02-02 17:17:23 -07008827 m_errorMonitor->SetDesiredFailureMsg(
8828 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008829 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008830
8831 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008832 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008833 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008834 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008835
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008836 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008837}
8838
Karl Schultz6addd812016-02-02 17:17:23 -07008839TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
8840 VkResult err;
8841 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008842
Karl Schultz6addd812016-02-02 17:17:23 -07008843 m_errorMonitor->SetDesiredFailureMsg(
8844 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07008845 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008846
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008847 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008848
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008849 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008850 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06008851 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008852 cmd.commandPool = m_commandPool;
8853 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008854 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06008855
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008856 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06008857 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008858
8859 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008860 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008861 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008862 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06008863 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008864 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
8865 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008866 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008867
8868 // The error should be caught by validation of the BeginCommandBuffer call
8869 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
8870
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008871 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008872 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008873}
8874
Karl Schultz6addd812016-02-02 17:17:23 -07008875TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008876 // Cause error due to Begin while recording CB
8877 // Then cause 2 errors for attempting to reset CB w/o having
8878 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
8879 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008881 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008882
8883 ASSERT_NO_FATAL_FAILURE(InitState());
8884
8885 // Calls AllocateCommandBuffers
8886 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
8887
Karl Schultz6addd812016-02-02 17:17:23 -07008888 // Force the failure by setting the Renderpass and Framebuffer fields with
8889 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008890 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008891 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008892 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8893 cmd_buf_info.pNext = NULL;
8894 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008895 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008896
8897 // Begin CB to transition to recording state
8898 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
8899 // Can't re-begin. This should trigger error
8900 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008901 m_errorMonitor->VerifyFound();
8902
Karl Schultz6addd812016-02-02 17:17:23 -07008903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8904 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008905 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
8906 // Reset attempt will trigger error due to incorrect CommandPool state
8907 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008908 m_errorMonitor->VerifyFound();
8909
Karl Schultz6addd812016-02-02 17:17:23 -07008910 m_errorMonitor->SetDesiredFailureMsg(
8911 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8912 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008913 // Transition CB to RECORDED state
8914 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
8915 // Now attempting to Begin will implicitly reset, which triggers error
8916 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008917 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008918}
8919
Karl Schultz6addd812016-02-02 17:17:23 -07008920TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008921 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07008922 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008923
Karl Schultz6addd812016-02-02 17:17:23 -07008924 m_errorMonitor->SetDesiredFailureMsg(
8925 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008926 "Invalid Pipeline CreateInfo State: Vtx Shader required");
8927
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008928 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008929 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008930
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008931 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008932 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8933 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06008934
8935 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008936 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8937 ds_pool_ci.pNext = NULL;
8938 ds_pool_ci.maxSets = 1;
8939 ds_pool_ci.poolSizeCount = 1;
8940 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008941
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008942 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008943 err =
8944 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008945 ASSERT_VK_SUCCESS(err);
8946
Tony Barboureb254902015-07-15 12:50:33 -06008947 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008948 dsl_binding.binding = 0;
8949 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8950 dsl_binding.descriptorCount = 1;
8951 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8952 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008953
Tony Barboureb254902015-07-15 12:50:33 -06008954 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008955 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8956 ds_layout_ci.pNext = NULL;
8957 ds_layout_ci.bindingCount = 1;
8958 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06008959
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008960 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008961 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8962 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008963 ASSERT_VK_SUCCESS(err);
8964
8965 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008966 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008967 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008968 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008969 alloc_info.descriptorPool = ds_pool;
8970 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008971 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8972 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008973 ASSERT_VK_SUCCESS(err);
8974
Tony Barboureb254902015-07-15 12:50:33 -06008975 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008976 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8977 pipeline_layout_ci.setLayoutCount = 1;
8978 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008979
8980 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008981 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8982 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008983 ASSERT_VK_SUCCESS(err);
8984
Tobin Ehlise68360f2015-10-01 11:15:13 -06008985 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008986 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06008987
8988 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008989 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8990 vp_state_ci.scissorCount = 1;
8991 vp_state_ci.pScissors = &sc;
8992 vp_state_ci.viewportCount = 1;
8993 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008994
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008995 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8996 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8997 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8998 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8999 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9000 rs_state_ci.depthClampEnable = VK_FALSE;
9001 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
9002 rs_state_ci.depthBiasEnable = VK_FALSE;
9003
Tony Barboureb254902015-07-15 12:50:33 -06009004 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009005 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9006 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009007 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07009008 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9009 gp_ci.layout = pipeline_layout;
9010 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06009011
9012 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009013 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9014 pc_ci.initialDataSize = 0;
9015 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009016
9017 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06009018 VkPipelineCache pipelineCache;
9019
Karl Schultz6addd812016-02-02 17:17:23 -07009020 err =
9021 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06009022 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009023 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9024 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06009025
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009026 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009027
Chia-I Wuf7458c52015-10-26 21:10:41 +08009028 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9029 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9030 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9031 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009032}
Tobin Ehlis912df022015-09-17 08:46:18 -06009033/*// TODO : This test should be good, but needs Tess support in compiler to run
9034TEST_F(VkLayerTest, InvalidPatchControlPoints)
9035{
9036 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06009037 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009038
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009039 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009040 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
9041primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009042
Tobin Ehlis912df022015-09-17 08:46:18 -06009043 ASSERT_NO_FATAL_FAILURE(InitState());
9044 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06009045
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009046 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06009047 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009048 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06009049
9050 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9051 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9052 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009053 ds_pool_ci.poolSizeCount = 1;
9054 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06009055
9056 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009057 err = vkCreateDescriptorPool(m_device->device(),
9058VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06009059 ASSERT_VK_SUCCESS(err);
9060
9061 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08009062 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06009063 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08009064 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06009065 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9066 dsl_binding.pImmutableSamplers = NULL;
9067
9068 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009069 ds_layout_ci.sType =
9070VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06009071 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009072 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07009073 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06009074
9075 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009076 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9077&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06009078 ASSERT_VK_SUCCESS(err);
9079
9080 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07009081 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
9082VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06009083 ASSERT_VK_SUCCESS(err);
9084
9085 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009086 pipeline_layout_ci.sType =
9087VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06009088 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009089 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06009090 pipeline_layout_ci.pSetLayouts = &ds_layout;
9091
9092 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009093 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9094&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06009095 ASSERT_VK_SUCCESS(err);
9096
9097 VkPipelineShaderStageCreateInfo shaderStages[3];
9098 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
9099
Karl Schultz6addd812016-02-02 17:17:23 -07009100 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
9101this);
Tobin Ehlis912df022015-09-17 08:46:18 -06009102 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07009103 VkShaderObj
9104tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
9105this);
9106 VkShaderObj
9107te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
9108this);
Tobin Ehlis912df022015-09-17 08:46:18 -06009109
Karl Schultz6addd812016-02-02 17:17:23 -07009110 shaderStages[0].sType =
9111VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009112 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06009113 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07009114 shaderStages[1].sType =
9115VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009116 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06009117 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07009118 shaderStages[2].sType =
9119VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009120 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06009121 shaderStages[2].shader = te.handle();
9122
9123 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009124 iaCI.sType =
9125VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08009126 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06009127
9128 VkPipelineTessellationStateCreateInfo tsCI = {};
9129 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
9130 tsCI.patchControlPoints = 0; // This will cause an error
9131
9132 VkGraphicsPipelineCreateInfo gp_ci = {};
9133 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9134 gp_ci.pNext = NULL;
9135 gp_ci.stageCount = 3;
9136 gp_ci.pStages = shaderStages;
9137 gp_ci.pVertexInputState = NULL;
9138 gp_ci.pInputAssemblyState = &iaCI;
9139 gp_ci.pTessellationState = &tsCI;
9140 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009141 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06009142 gp_ci.pMultisampleState = NULL;
9143 gp_ci.pDepthStencilState = NULL;
9144 gp_ci.pColorBlendState = NULL;
9145 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9146 gp_ci.layout = pipeline_layout;
9147 gp_ci.renderPass = renderPass();
9148
9149 VkPipelineCacheCreateInfo pc_ci = {};
9150 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9151 pc_ci.pNext = NULL;
9152 pc_ci.initialSize = 0;
9153 pc_ci.initialData = 0;
9154 pc_ci.maxSize = 0;
9155
9156 VkPipeline pipeline;
9157 VkPipelineCache pipelineCache;
9158
Karl Schultz6addd812016-02-02 17:17:23 -07009159 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
9160&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06009161 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009162 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9163&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06009164
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009165 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009166
Chia-I Wuf7458c52015-10-26 21:10:41 +08009167 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9168 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9169 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9170 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06009171}
9172*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06009173// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07009174TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07009175 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009176
Karl Schultz6addd812016-02-02 17:17:23 -07009177 m_errorMonitor->SetDesiredFailureMsg(
9178 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009179 "Gfx Pipeline viewport count (1) must match scissor count (0).");
9180
Tobin Ehlise68360f2015-10-01 11:15:13 -06009181 ASSERT_NO_FATAL_FAILURE(InitState());
9182 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06009183
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009184 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009185 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9186 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009187
9188 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009189 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9190 ds_pool_ci.maxSets = 1;
9191 ds_pool_ci.poolSizeCount = 1;
9192 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009193
9194 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009195 err =
9196 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009197 ASSERT_VK_SUCCESS(err);
9198
9199 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009200 dsl_binding.binding = 0;
9201 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9202 dsl_binding.descriptorCount = 1;
9203 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009204
9205 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009206 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9207 ds_layout_ci.bindingCount = 1;
9208 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009209
9210 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009211 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9212 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009213 ASSERT_VK_SUCCESS(err);
9214
9215 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009216 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009217 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009218 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009219 alloc_info.descriptorPool = ds_pool;
9220 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009221 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9222 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009223 ASSERT_VK_SUCCESS(err);
9224
9225 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009226 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9227 pipeline_layout_ci.setLayoutCount = 1;
9228 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009229
9230 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009231 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9232 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009233 ASSERT_VK_SUCCESS(err);
9234
9235 VkViewport vp = {}; // Just need dummy vp to point to
9236
9237 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009238 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9239 vp_state_ci.scissorCount = 0;
9240 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
9241 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009242
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009243 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
9244 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9245 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
9246 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
9247 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9248 rs_state_ci.depthClampEnable = VK_FALSE;
9249 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
9250 rs_state_ci.depthBiasEnable = VK_FALSE;
9251
Cody Northropeb3a6c12015-10-05 14:44:45 -06009252 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07009253 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06009254
Karl Schultz6addd812016-02-02 17:17:23 -07009255 VkShaderObj vs(m_device, bindStateVertShaderText,
9256 VK_SHADER_STAGE_VERTEX_BIT, this);
9257 VkShaderObj fs(m_device, bindStateFragShaderText,
9258 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009259 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009260 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08009261 shaderStages[0] = vs.GetStageCreateInfo();
9262 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009263
9264 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009265 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9266 gp_ci.stageCount = 2;
9267 gp_ci.pStages = shaderStages;
9268 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009269 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07009270 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9271 gp_ci.layout = pipeline_layout;
9272 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009273
9274 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009275 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009276
9277 VkPipeline pipeline;
9278 VkPipelineCache pipelineCache;
9279
Karl Schultz6addd812016-02-02 17:17:23 -07009280 err =
9281 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009282 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009283 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9284 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009285
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009286 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009287
Chia-I Wuf7458c52015-10-26 21:10:41 +08009288 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9289 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9290 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9291 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009292}
Karl Schultz6addd812016-02-02 17:17:23 -07009293// Don't set viewport state in PSO. This is an error b/c we always need this
9294// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06009295// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07009296TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06009297 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07009298 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009299
Karl Schultz6addd812016-02-02 17:17:23 -07009300 m_errorMonitor->SetDesiredFailureMsg(
9301 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009302 "Gfx Pipeline pViewportState is null. Even if ");
9303
Tobin Ehlise68360f2015-10-01 11:15:13 -06009304 ASSERT_NO_FATAL_FAILURE(InitState());
9305 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06009306
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009307 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009308 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9309 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009310
9311 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009312 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9313 ds_pool_ci.maxSets = 1;
9314 ds_pool_ci.poolSizeCount = 1;
9315 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009316
9317 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009318 err =
9319 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009320 ASSERT_VK_SUCCESS(err);
9321
9322 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009323 dsl_binding.binding = 0;
9324 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9325 dsl_binding.descriptorCount = 1;
9326 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009327
9328 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009329 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9330 ds_layout_ci.bindingCount = 1;
9331 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009332
9333 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009334 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9335 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009336 ASSERT_VK_SUCCESS(err);
9337
9338 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009339 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009340 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009341 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009342 alloc_info.descriptorPool = ds_pool;
9343 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009344 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9345 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009346 ASSERT_VK_SUCCESS(err);
9347
9348 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009349 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9350 pipeline_layout_ci.setLayoutCount = 1;
9351 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009352
9353 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009354 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9355 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009356 ASSERT_VK_SUCCESS(err);
9357
9358 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
9359 // Set scissor as dynamic to avoid second error
9360 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009361 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9362 dyn_state_ci.dynamicStateCount = 1;
9363 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009364
Cody Northropeb3a6c12015-10-05 14:44:45 -06009365 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07009366 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06009367
Karl Schultz6addd812016-02-02 17:17:23 -07009368 VkShaderObj vs(m_device, bindStateVertShaderText,
9369 VK_SHADER_STAGE_VERTEX_BIT, this);
9370 VkShaderObj fs(m_device, bindStateFragShaderText,
9371 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009372 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009373 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08009374 shaderStages[0] = vs.GetStageCreateInfo();
9375 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009376
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009377
9378 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
9379 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9380 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
9381 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
9382 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9383 rs_state_ci.depthClampEnable = VK_FALSE;
9384 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
9385 rs_state_ci.depthBiasEnable = VK_FALSE;
9386
Tobin Ehlise68360f2015-10-01 11:15:13 -06009387 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009388 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9389 gp_ci.stageCount = 2;
9390 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009391 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07009392 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
9393 // should cause validation error
9394 gp_ci.pDynamicState = &dyn_state_ci;
9395 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9396 gp_ci.layout = pipeline_layout;
9397 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009398
9399 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009400 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009401
9402 VkPipeline pipeline;
9403 VkPipelineCache pipelineCache;
9404
Karl Schultz6addd812016-02-02 17:17:23 -07009405 err =
9406 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009407 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009408 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9409 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009410
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009411 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009412
Chia-I Wuf7458c52015-10-26 21:10:41 +08009413 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9414 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9415 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9416 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009417}
9418// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07009419// Then run second test where dynamic scissor count doesn't match PSO scissor
9420// count
9421TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
9422 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009423
Karl Schultz6addd812016-02-02 17:17:23 -07009424 m_errorMonitor->SetDesiredFailureMsg(
9425 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009426 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
9427
Tobin Ehlise68360f2015-10-01 11:15:13 -06009428 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009429
9430 if (!m_device->phy().features().multiViewport) {
9431 printf("Device does not support multiple viewports/scissors; skipped.\n");
9432 return;
9433 }
9434
Tobin Ehlise68360f2015-10-01 11:15:13 -06009435 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06009436
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009437 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009438 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9439 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009440
9441 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009442 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9443 ds_pool_ci.maxSets = 1;
9444 ds_pool_ci.poolSizeCount = 1;
9445 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009446
9447 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009448 err =
9449 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009450 ASSERT_VK_SUCCESS(err);
9451
9452 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009453 dsl_binding.binding = 0;
9454 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9455 dsl_binding.descriptorCount = 1;
9456 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009457
9458 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009459 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9460 ds_layout_ci.bindingCount = 1;
9461 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009462
9463 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009464 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9465 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009466 ASSERT_VK_SUCCESS(err);
9467
9468 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009469 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009470 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009471 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009472 alloc_info.descriptorPool = ds_pool;
9473 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009474 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9475 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009476 ASSERT_VK_SUCCESS(err);
9477
9478 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009479 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9480 pipeline_layout_ci.setLayoutCount = 1;
9481 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009482
9483 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009484 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9485 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009486 ASSERT_VK_SUCCESS(err);
9487
9488 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009489 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9490 vp_state_ci.viewportCount = 1;
9491 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
9492 vp_state_ci.scissorCount = 1;
9493 vp_state_ci.pScissors =
9494 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06009495
9496 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
9497 // Set scissor as dynamic to avoid that error
9498 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009499 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9500 dyn_state_ci.dynamicStateCount = 1;
9501 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009502
Cody Northropeb3a6c12015-10-05 14:44:45 -06009503 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07009504 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06009505
Karl Schultz6addd812016-02-02 17:17:23 -07009506 VkShaderObj vs(m_device, bindStateVertShaderText,
9507 VK_SHADER_STAGE_VERTEX_BIT, this);
9508 VkShaderObj fs(m_device, bindStateFragShaderText,
9509 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009510 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009511 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08009512 shaderStages[0] = vs.GetStageCreateInfo();
9513 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009514
Cody Northropf6622dc2015-10-06 10:33:21 -06009515 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9516 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9517 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009518 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06009519 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009520 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06009521 vi_ci.pVertexAttributeDescriptions = nullptr;
9522
9523 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9524 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9525 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9526
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009527 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009528 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06009529 rs_ci.pNext = nullptr;
9530
Mark Youngc89c6312016-03-31 16:03:20 -06009531 VkPipelineColorBlendAttachmentState att = {};
9532 att.blendEnable = VK_FALSE;
9533 att.colorWriteMask = 0xf;
9534
Cody Northropf6622dc2015-10-06 10:33:21 -06009535 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9536 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9537 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06009538 cb_ci.attachmentCount = 1;
9539 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06009540
Tobin Ehlise68360f2015-10-01 11:15:13 -06009541 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009542 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9543 gp_ci.stageCount = 2;
9544 gp_ci.pStages = shaderStages;
9545 gp_ci.pVertexInputState = &vi_ci;
9546 gp_ci.pInputAssemblyState = &ia_ci;
9547 gp_ci.pViewportState = &vp_state_ci;
9548 gp_ci.pRasterizationState = &rs_ci;
9549 gp_ci.pColorBlendState = &cb_ci;
9550 gp_ci.pDynamicState = &dyn_state_ci;
9551 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9552 gp_ci.layout = pipeline_layout;
9553 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009554
9555 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009556 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009557
9558 VkPipeline pipeline;
9559 VkPipelineCache pipelineCache;
9560
Karl Schultz6addd812016-02-02 17:17:23 -07009561 err =
9562 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009563 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009564 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9565 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009566
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009567 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009568
Tobin Ehlisd332f282015-10-02 11:00:56 -06009569 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07009570 // First need to successfully create the PSO from above by setting
9571 // pViewports
9572 m_errorMonitor->SetDesiredFailureMsg(
9573 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009574 "Dynamic scissor(s) 0 are used by PSO, ");
Karl Schultz6addd812016-02-02 17:17:23 -07009575
9576 VkViewport vp = {}; // Just need dummy vp to point to
9577 vp_state_ci.pViewports = &vp;
9578 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9579 &gp_ci, NULL, &pipeline);
9580 ASSERT_VK_SUCCESS(err);
9581 BeginCommandBuffer();
9582 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9583 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009584 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07009585 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009586 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07009587 Draw(1, 0, 0, 0);
9588
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009589 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07009590
9591 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9592 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9593 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9594 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009595 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07009596}
9597// Create PSO w/o non-zero scissorCount but no scissor data
9598// Then run second test where dynamic viewportCount doesn't match PSO
9599// viewportCount
9600TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
9601 VkResult err;
9602
9603 m_errorMonitor->SetDesiredFailureMsg(
9604 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9605 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
9606
9607 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009608
9609 if (!m_device->phy().features().multiViewport) {
9610 printf("Device does not support multiple viewports/scissors; skipped.\n");
9611 return;
9612 }
9613
Karl Schultz6addd812016-02-02 17:17:23 -07009614 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9615
9616 VkDescriptorPoolSize ds_type_count = {};
9617 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9618 ds_type_count.descriptorCount = 1;
9619
9620 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9621 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9622 ds_pool_ci.maxSets = 1;
9623 ds_pool_ci.poolSizeCount = 1;
9624 ds_pool_ci.pPoolSizes = &ds_type_count;
9625
9626 VkDescriptorPool ds_pool;
9627 err =
9628 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9629 ASSERT_VK_SUCCESS(err);
9630
9631 VkDescriptorSetLayoutBinding dsl_binding = {};
9632 dsl_binding.binding = 0;
9633 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9634 dsl_binding.descriptorCount = 1;
9635 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9636
9637 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9638 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9639 ds_layout_ci.bindingCount = 1;
9640 ds_layout_ci.pBindings = &dsl_binding;
9641
9642 VkDescriptorSetLayout ds_layout;
9643 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9644 &ds_layout);
9645 ASSERT_VK_SUCCESS(err);
9646
9647 VkDescriptorSet descriptorSet;
9648 VkDescriptorSetAllocateInfo alloc_info = {};
9649 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9650 alloc_info.descriptorSetCount = 1;
9651 alloc_info.descriptorPool = ds_pool;
9652 alloc_info.pSetLayouts = &ds_layout;
9653 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9654 &descriptorSet);
9655 ASSERT_VK_SUCCESS(err);
9656
9657 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9658 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9659 pipeline_layout_ci.setLayoutCount = 1;
9660 pipeline_layout_ci.pSetLayouts = &ds_layout;
9661
9662 VkPipelineLayout pipeline_layout;
9663 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9664 &pipeline_layout);
9665 ASSERT_VK_SUCCESS(err);
9666
9667 VkPipelineViewportStateCreateInfo vp_state_ci = {};
9668 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9669 vp_state_ci.scissorCount = 1;
9670 vp_state_ci.pScissors =
9671 NULL; // Null scissor w/ count of 1 should cause error
9672 vp_state_ci.viewportCount = 1;
9673 vp_state_ci.pViewports =
9674 NULL; // vp is dynamic (below) so this won't cause error
9675
9676 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
9677 // Set scissor as dynamic to avoid that error
9678 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
9679 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9680 dyn_state_ci.dynamicStateCount = 1;
9681 dyn_state_ci.pDynamicStates = &vp_state;
9682
9683 VkPipelineShaderStageCreateInfo shaderStages[2];
9684 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
9685
9686 VkShaderObj vs(m_device, bindStateVertShaderText,
9687 VK_SHADER_STAGE_VERTEX_BIT, this);
9688 VkShaderObj fs(m_device, bindStateFragShaderText,
9689 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009690 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009691 // but add it to be able to run on more devices
9692 shaderStages[0] = vs.GetStageCreateInfo();
9693 shaderStages[1] = fs.GetStageCreateInfo();
9694
9695 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9696 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9697 vi_ci.pNext = nullptr;
9698 vi_ci.vertexBindingDescriptionCount = 0;
9699 vi_ci.pVertexBindingDescriptions = nullptr;
9700 vi_ci.vertexAttributeDescriptionCount = 0;
9701 vi_ci.pVertexAttributeDescriptions = nullptr;
9702
9703 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9704 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9705 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9706
9707 VkPipelineRasterizationStateCreateInfo rs_ci = {};
9708 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9709 rs_ci.pNext = nullptr;
9710
Mark Youngc89c6312016-03-31 16:03:20 -06009711 VkPipelineColorBlendAttachmentState att = {};
9712 att.blendEnable = VK_FALSE;
9713 att.colorWriteMask = 0xf;
9714
Karl Schultz6addd812016-02-02 17:17:23 -07009715 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9716 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9717 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06009718 cb_ci.attachmentCount = 1;
9719 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07009720
9721 VkGraphicsPipelineCreateInfo gp_ci = {};
9722 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9723 gp_ci.stageCount = 2;
9724 gp_ci.pStages = shaderStages;
9725 gp_ci.pVertexInputState = &vi_ci;
9726 gp_ci.pInputAssemblyState = &ia_ci;
9727 gp_ci.pViewportState = &vp_state_ci;
9728 gp_ci.pRasterizationState = &rs_ci;
9729 gp_ci.pColorBlendState = &cb_ci;
9730 gp_ci.pDynamicState = &dyn_state_ci;
9731 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9732 gp_ci.layout = pipeline_layout;
9733 gp_ci.renderPass = renderPass();
9734
9735 VkPipelineCacheCreateInfo pc_ci = {};
9736 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9737
9738 VkPipeline pipeline;
9739 VkPipelineCache pipelineCache;
9740
9741 err =
9742 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9743 ASSERT_VK_SUCCESS(err);
9744 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9745 &gp_ci, NULL, &pipeline);
9746
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009747 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07009748
9749 // Now hit second fail case where we set scissor w/ different count than PSO
9750 // First need to successfully create the PSO from above by setting
9751 // pViewports
9752 m_errorMonitor->SetDesiredFailureMsg(
9753 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009754 "Dynamic viewport(s) 0 are used by PSO, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009755
Tobin Ehlisd332f282015-10-02 11:00:56 -06009756 VkRect2D sc = {}; // Just need dummy vp to point to
9757 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07009758 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9759 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06009760 ASSERT_VK_SUCCESS(err);
9761 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009762 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9763 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009764 VkViewport viewports[1] = {}; // don't care about data
Tobin Ehlisd332f282015-10-02 11:00:56 -06009765 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009766 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06009767 Draw(1, 0, 0, 0);
9768
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009769 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009770
Chia-I Wuf7458c52015-10-26 21:10:41 +08009771 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9772 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9773 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9774 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009775 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009776}
9777
Mark Young7394fdd2016-03-31 14:56:43 -06009778TEST_F(VkLayerTest, PSOLineWidthInvalid) {
9779 VkResult err;
9780
9781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06009782 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06009783
9784 ASSERT_NO_FATAL_FAILURE(InitState());
9785 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9786
9787 VkDescriptorPoolSize ds_type_count = {};
9788 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9789 ds_type_count.descriptorCount = 1;
9790
9791 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9792 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9793 ds_pool_ci.maxSets = 1;
9794 ds_pool_ci.poolSizeCount = 1;
9795 ds_pool_ci.pPoolSizes = &ds_type_count;
9796
9797 VkDescriptorPool ds_pool;
9798 err =
9799 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9800 ASSERT_VK_SUCCESS(err);
9801
9802 VkDescriptorSetLayoutBinding dsl_binding = {};
9803 dsl_binding.binding = 0;
9804 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9805 dsl_binding.descriptorCount = 1;
9806 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9807
9808 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9809 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9810 ds_layout_ci.bindingCount = 1;
9811 ds_layout_ci.pBindings = &dsl_binding;
9812
9813 VkDescriptorSetLayout ds_layout;
9814 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9815 &ds_layout);
9816 ASSERT_VK_SUCCESS(err);
9817
9818 VkDescriptorSet descriptorSet;
9819 VkDescriptorSetAllocateInfo alloc_info = {};
9820 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9821 alloc_info.descriptorSetCount = 1;
9822 alloc_info.descriptorPool = ds_pool;
9823 alloc_info.pSetLayouts = &ds_layout;
9824 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9825 &descriptorSet);
9826 ASSERT_VK_SUCCESS(err);
9827
9828 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9829 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9830 pipeline_layout_ci.setLayoutCount = 1;
9831 pipeline_layout_ci.pSetLayouts = &ds_layout;
9832
9833 VkPipelineLayout pipeline_layout;
9834 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9835 &pipeline_layout);
9836 ASSERT_VK_SUCCESS(err);
9837
9838 VkPipelineViewportStateCreateInfo vp_state_ci = {};
9839 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9840 vp_state_ci.scissorCount = 1;
9841 vp_state_ci.pScissors = NULL;
9842 vp_state_ci.viewportCount = 1;
9843 vp_state_ci.pViewports = NULL;
9844
9845 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
9846 VK_DYNAMIC_STATE_SCISSOR,
9847 VK_DYNAMIC_STATE_LINE_WIDTH};
9848 // Set scissor as dynamic to avoid that error
9849 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
9850 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9851 dyn_state_ci.dynamicStateCount = 2;
9852 dyn_state_ci.pDynamicStates = dynamic_states;
9853
9854 VkPipelineShaderStageCreateInfo shaderStages[2];
9855 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
9856
9857 VkShaderObj vs(m_device, bindStateVertShaderText,
9858 VK_SHADER_STAGE_VERTEX_BIT, this);
9859 VkShaderObj fs(m_device, bindStateFragShaderText,
9860 VK_SHADER_STAGE_FRAGMENT_BIT,
9861 this); // TODO - We shouldn't need a fragment shader
9862 // but add it to be able to run on more devices
9863 shaderStages[0] = vs.GetStageCreateInfo();
9864 shaderStages[1] = fs.GetStageCreateInfo();
9865
9866 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9867 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9868 vi_ci.pNext = nullptr;
9869 vi_ci.vertexBindingDescriptionCount = 0;
9870 vi_ci.pVertexBindingDescriptions = nullptr;
9871 vi_ci.vertexAttributeDescriptionCount = 0;
9872 vi_ci.pVertexAttributeDescriptions = nullptr;
9873
9874 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9875 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9876 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9877
9878 VkPipelineRasterizationStateCreateInfo rs_ci = {};
9879 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9880 rs_ci.pNext = nullptr;
9881
Mark Young47107952016-05-02 15:59:55 -06009882 // Check too low (line width of -1.0f).
9883 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06009884
9885 VkPipelineColorBlendAttachmentState att = {};
9886 att.blendEnable = VK_FALSE;
9887 att.colorWriteMask = 0xf;
9888
9889 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9890 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9891 cb_ci.pNext = nullptr;
9892 cb_ci.attachmentCount = 1;
9893 cb_ci.pAttachments = &att;
9894
9895 VkGraphicsPipelineCreateInfo gp_ci = {};
9896 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9897 gp_ci.stageCount = 2;
9898 gp_ci.pStages = shaderStages;
9899 gp_ci.pVertexInputState = &vi_ci;
9900 gp_ci.pInputAssemblyState = &ia_ci;
9901 gp_ci.pViewportState = &vp_state_ci;
9902 gp_ci.pRasterizationState = &rs_ci;
9903 gp_ci.pColorBlendState = &cb_ci;
9904 gp_ci.pDynamicState = &dyn_state_ci;
9905 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9906 gp_ci.layout = pipeline_layout;
9907 gp_ci.renderPass = renderPass();
9908
9909 VkPipelineCacheCreateInfo pc_ci = {};
9910 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9911
9912 VkPipeline pipeline;
9913 VkPipelineCache pipelineCache;
9914
9915 err =
9916 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9917 ASSERT_VK_SUCCESS(err);
9918 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9919 &gp_ci, NULL, &pipeline);
9920
9921 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009922 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009923
9924 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9925 "Attempt to set lineWidth to 65536");
9926
9927 // Check too high (line width of 65536.0f).
9928 rs_ci.lineWidth = 65536.0f;
9929
9930 err =
9931 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9932 ASSERT_VK_SUCCESS(err);
9933 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9934 &gp_ci, NULL, &pipeline);
9935
9936 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009937 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009938
9939 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06009940 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06009941
9942 dyn_state_ci.dynamicStateCount = 3;
9943
9944 rs_ci.lineWidth = 1.0f;
9945
9946 err =
9947 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9948 ASSERT_VK_SUCCESS(err);
9949 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9950 &gp_ci, NULL, &pipeline);
9951 BeginCommandBuffer();
9952 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9953 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
9954
9955 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06009956 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06009957 m_errorMonitor->VerifyFound();
9958
9959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9960 "Attempt to set lineWidth to 65536");
9961
9962 // Check too high with dynamic setting.
9963 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
9964 m_errorMonitor->VerifyFound();
9965 EndCommandBuffer();
9966
9967 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9968 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9969 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9970 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009971 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009972}
9973
Karl Schultz6addd812016-02-02 17:17:23 -07009974TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009975 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009976 m_errorMonitor->SetDesiredFailureMsg(
9977 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009978 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009979
9980 ASSERT_NO_FATAL_FAILURE(InitState());
9981 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009982
Tony Barbourfe3351b2015-07-28 10:17:20 -06009983 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009984 // Don't care about RenderPass handle b/c error should be flagged before
9985 // that
9986 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
9987 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009988
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009989 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009990}
9991
Karl Schultz6addd812016-02-02 17:17:23 -07009992TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009993 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009994 m_errorMonitor->SetDesiredFailureMsg(
9995 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009996 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009997
9998 ASSERT_NO_FATAL_FAILURE(InitState());
9999 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -060010000
Tony Barbourfe3351b2015-07-28 10:17:20 -060010001 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070010002 // Just create a dummy Renderpass that's non-NULL so we can get to the
10003 // proper error
Chris Forbes38ae7c42016-06-21 20:51:44 +120010004 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
Karl Schultz6addd812016-02-02 17:17:23 -070010005 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -060010006
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010007 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010008}
10009
Chris Forbes2eeabe32016-06-21 20:52:34 +120010010TEST_F(VkLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
10011 m_errorMonitor->ExpectSuccess();
10012
10013 ASSERT_NO_FATAL_FAILURE(InitState());
10014 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10015
10016 BeginCommandBuffer(); // framework implicitly begins the renderpass.
10017 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // end implicit.
10018
10019 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
10020 VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
10021 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
10022 m_errorMonitor->VerifyNotFound();
10023 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
10024 VK_SUBPASS_CONTENTS_INLINE);
10025 m_errorMonitor->VerifyNotFound();
10026 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
10027 m_errorMonitor->VerifyNotFound();
10028
10029 m_commandBuffer->EndCommandBuffer();
10030 m_errorMonitor->VerifyNotFound();
10031}
10032
Tobin Ehlis5a1c0332016-05-31 13:59:26 -060010033TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
10034 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
10035 "the number of renderPass attachments that use loadOp"
10036 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
10037
10038 ASSERT_NO_FATAL_FAILURE(InitState());
10039 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10040
10041 // Create a renderPass with a single attachment that uses loadOp CLEAR
10042 VkAttachmentReference attach = {};
10043 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
10044 VkSubpassDescription subpass = {};
10045 subpass.inputAttachmentCount = 1;
10046 subpass.pInputAttachments = &attach;
10047 VkRenderPassCreateInfo rpci = {};
10048 rpci.subpassCount = 1;
10049 rpci.pSubpasses = &subpass;
10050 rpci.attachmentCount = 1;
10051 VkAttachmentDescription attach_desc = {};
10052 attach_desc.format = VK_FORMAT_UNDEFINED;
10053 // Set loadOp to CLEAR
10054 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
10055 rpci.pAttachments = &attach_desc;
10056 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
10057 VkRenderPass rp;
10058 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10059
10060 VkCommandBufferInheritanceInfo hinfo = {};
10061 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
10062 hinfo.renderPass = VK_NULL_HANDLE;
10063 hinfo.subpass = 0;
10064 hinfo.framebuffer = VK_NULL_HANDLE;
10065 hinfo.occlusionQueryEnable = VK_FALSE;
10066 hinfo.queryFlags = 0;
10067 hinfo.pipelineStatistics = 0;
10068 VkCommandBufferBeginInfo info = {};
10069 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
10070 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
10071 info.pInheritanceInfo = &hinfo;
10072
10073 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
10074 VkRenderPassBeginInfo rp_begin = {};
10075 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
10076 rp_begin.pNext = NULL;
10077 rp_begin.renderPass = renderPass();
10078 rp_begin.framebuffer = framebuffer();
10079 rp_begin.clearValueCount = 0; // Should be 1
10080
10081 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7f0416c2016-07-15 16:01:13 -060010082 " has a clearValueCount of 0 but "
10083 "there must be at least 1 entries in "
10084 "pClearValues array to account for ");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -060010085
10086 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
10087 VK_SUBPASS_CONTENTS_INLINE);
10088
10089 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -060010090
10091 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -060010092}
10093
Cody Northrop3bb4d962016-05-09 16:15:57 -060010094TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
10095
10096 TEST_DESCRIPTION("End a command buffer with an active render pass");
10097
10098 m_errorMonitor->SetDesiredFailureMsg(
10099 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10100 "It is invalid to issue this call inside an active render pass");
10101
10102 ASSERT_NO_FATAL_FAILURE(InitState());
10103 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10104
10105 // The framework's BeginCommandBuffer calls CreateRenderPass
10106 BeginCommandBuffer();
10107
10108 // Call directly into vkEndCommandBuffer instead of the
10109 // the framework's EndCommandBuffer, which inserts a
10110 // vkEndRenderPass
10111 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
10112
10113 m_errorMonitor->VerifyFound();
10114
10115 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
10116 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
10117}
10118
Karl Schultz6addd812016-02-02 17:17:23 -070010119TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010120 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -070010121 m_errorMonitor->SetDesiredFailureMsg(
10122 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010123 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010124
10125 ASSERT_NO_FATAL_FAILURE(InitState());
10126 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010127
10128 // Renderpass is started here
10129 BeginCommandBuffer();
10130
10131 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010132 vk_testing::Buffer dstBuffer;
10133 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010134
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010135 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010136
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010137 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010138}
10139
Karl Schultz6addd812016-02-02 17:17:23 -070010140TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010141 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -070010142 m_errorMonitor->SetDesiredFailureMsg(
10143 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010144 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010145
10146 ASSERT_NO_FATAL_FAILURE(InitState());
10147 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010148
10149 // Renderpass is started here
10150 BeginCommandBuffer();
10151
10152 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010153 vk_testing::Buffer dstBuffer;
10154 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010155
Karl Schultz6addd812016-02-02 17:17:23 -070010156 VkDeviceSize dstOffset = 0;
10157 VkDeviceSize dataSize = 1024;
Karl Schultzee344492016-07-11 15:09:57 -060010158 const void *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010159
Karl Schultz6addd812016-02-02 17:17:23 -070010160 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
10161 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010162
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010163 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010164}
10165
Karl Schultz6addd812016-02-02 17:17:23 -070010166TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010167 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010168 m_errorMonitor->SetDesiredFailureMsg(
10169 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010170 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010171
10172 ASSERT_NO_FATAL_FAILURE(InitState());
10173 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010174
10175 // Renderpass is started here
10176 BeginCommandBuffer();
10177
Michael Lentine0a369f62016-02-03 16:51:46 -060010178 VkClearColorValue clear_color;
10179 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -070010180 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
10181 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
10182 const int32_t tex_width = 32;
10183 const int32_t tex_height = 32;
10184 VkImageCreateInfo image_create_info = {};
10185 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10186 image_create_info.pNext = NULL;
10187 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10188 image_create_info.format = tex_format;
10189 image_create_info.extent.width = tex_width;
10190 image_create_info.extent.height = tex_height;
10191 image_create_info.extent.depth = 1;
10192 image_create_info.mipLevels = 1;
10193 image_create_info.arrayLayers = 1;
10194 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10195 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
10196 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010197
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010198 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -070010199 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
10200 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010201
Karl Schultz6addd812016-02-02 17:17:23 -070010202 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
10203 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010204
Karl Schultz6addd812016-02-02 17:17:23 -070010205 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
10206 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
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 Schultz6addd812016-02-02 17:17:23 -070010211TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010212 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010213 m_errorMonitor->SetDesiredFailureMsg(
10214 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010215 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010216
10217 ASSERT_NO_FATAL_FAILURE(InitState());
10218 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010219
10220 // Renderpass is started here
10221 BeginCommandBuffer();
10222
10223 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -070010224 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070010225 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
10226 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10227 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
10228 image_create_info.extent.width = 64;
10229 image_create_info.extent.height = 64;
10230 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10231 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010232
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010233 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -070010234 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
10235 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010236
Karl Schultz6addd812016-02-02 17:17:23 -070010237 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
10238 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010239
Karl Schultz6addd812016-02-02 17:17:23 -070010240 vkCmdClearDepthStencilImage(
10241 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
10242 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
10243 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010244
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010245 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010246}
10247
Karl Schultz6addd812016-02-02 17:17:23 -070010248TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060010249 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010250 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010251
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -060010253 "vkCmdClearAttachments(): This call "
Karl Schultz6addd812016-02-02 17:17:23 -070010254 "must be issued inside an active "
10255 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010256
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010257 ASSERT_NO_FATAL_FAILURE(InitState());
10258 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010259
10260 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010261 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010262 ASSERT_VK_SUCCESS(err);
10263
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060010264 VkClearAttachment color_attachment;
10265 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10266 color_attachment.clearValue.color.float32[0] = 0;
10267 color_attachment.clearValue.color.float32[1] = 0;
10268 color_attachment.clearValue.color.float32[2] = 0;
10269 color_attachment.clearValue.color.float32[3] = 0;
10270 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070010271 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
10272 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
10273 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010274
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010275 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010276}
10277
Karl Schultz9e66a292016-04-21 15:57:51 -060010278TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
10279 // Try to add a buffer memory barrier with no buffer.
10280 m_errorMonitor->SetDesiredFailureMsg(
10281 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10282 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
10283
10284 ASSERT_NO_FATAL_FAILURE(InitState());
10285 BeginCommandBuffer();
10286
10287 VkBufferMemoryBarrier buf_barrier = {};
10288 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
10289 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10290 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10291 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10292 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10293 buf_barrier.buffer = VK_NULL_HANDLE;
10294 buf_barrier.offset = 0;
10295 buf_barrier.size = VK_WHOLE_SIZE;
10296 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10297 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
10298 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
10299
10300 m_errorMonitor->VerifyFound();
10301}
10302
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010303TEST_F(VkLayerTest, InvalidBarriers) {
10304 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
10305
10306 m_errorMonitor->SetDesiredFailureMsg(
10307 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
10308
10309 ASSERT_NO_FATAL_FAILURE(InitState());
10310 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10311
10312 VkMemoryBarrier mem_barrier = {};
10313 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
10314 mem_barrier.pNext = NULL;
10315 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10316 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10317 BeginCommandBuffer();
10318 // BeginCommandBuffer() starts a render pass
10319 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10320 VK_PIPELINE_STAGE_HOST_BIT,
10321 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
10322 &mem_barrier, 0, nullptr, 0, nullptr);
10323 m_errorMonitor->VerifyFound();
10324
10325 m_errorMonitor->SetDesiredFailureMsg(
10326 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10327 "Image Layout cannot be transitioned to UNDEFINED");
10328 VkImageObj image(m_device);
10329 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
10330 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10331 ASSERT_TRUE(image.initialized());
10332 VkImageMemoryBarrier img_barrier = {};
10333 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
10334 img_barrier.pNext = NULL;
10335 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10336 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10337 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10338 // New layout can't be UNDEFINED
10339 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
10340 img_barrier.image = image.handle();
10341 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10342 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10343 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10344 img_barrier.subresourceRange.baseArrayLayer = 0;
10345 img_barrier.subresourceRange.baseMipLevel = 0;
10346 img_barrier.subresourceRange.layerCount = 1;
10347 img_barrier.subresourceRange.levelCount = 1;
10348 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10349 VK_PIPELINE_STAGE_HOST_BIT,
10350 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10351 nullptr, 1, &img_barrier);
10352 m_errorMonitor->VerifyFound();
10353 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10354
10355 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10356 "Subresource must have the sum of the "
10357 "baseArrayLayer");
10358 // baseArrayLayer + layerCount must be <= image's arrayLayers
10359 img_barrier.subresourceRange.baseArrayLayer = 1;
10360 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10361 VK_PIPELINE_STAGE_HOST_BIT,
10362 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10363 nullptr, 1, &img_barrier);
10364 m_errorMonitor->VerifyFound();
10365 img_barrier.subresourceRange.baseArrayLayer = 0;
10366
10367 m_errorMonitor->SetDesiredFailureMsg(
10368 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10369 "Subresource must have the sum of the baseMipLevel");
10370 // baseMipLevel + levelCount must be <= image's mipLevels
10371 img_barrier.subresourceRange.baseMipLevel = 1;
10372 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10373 VK_PIPELINE_STAGE_HOST_BIT,
10374 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10375 nullptr, 1, &img_barrier);
10376 m_errorMonitor->VerifyFound();
10377 img_barrier.subresourceRange.baseMipLevel = 0;
10378
10379 m_errorMonitor->SetDesiredFailureMsg(
10380 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10381 "Buffer Barriers cannot be used during a render pass");
10382 vk_testing::Buffer buffer;
10383 buffer.init(*m_device, 256);
10384 VkBufferMemoryBarrier buf_barrier = {};
10385 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
10386 buf_barrier.pNext = NULL;
10387 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10388 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10389 buf_barrier.buffer = buffer.handle();
10390 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10391 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10392 buf_barrier.offset = 0;
10393 buf_barrier.size = VK_WHOLE_SIZE;
10394 // Can't send buffer barrier during a render pass
10395 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10396 VK_PIPELINE_STAGE_HOST_BIT,
10397 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
10398 &buf_barrier, 0, nullptr);
10399 m_errorMonitor->VerifyFound();
10400 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
10401
10402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10403 "which is not less than total size");
10404 buf_barrier.offset = 257;
10405 // Offset greater than total size
10406 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10407 VK_PIPELINE_STAGE_HOST_BIT,
10408 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
10409 &buf_barrier, 0, nullptr);
10410 m_errorMonitor->VerifyFound();
10411 buf_barrier.offset = 0;
10412
10413 m_errorMonitor->SetDesiredFailureMsg(
10414 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
10415 buf_barrier.size = 257;
10416 // Size greater than total size
10417 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10418 VK_PIPELINE_STAGE_HOST_BIT,
10419 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
10420 &buf_barrier, 0, nullptr);
10421 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010422
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010423 // Now exercise barrier aspect bit errors, first DS
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010424 m_errorMonitor->SetDesiredFailureMsg(
10425 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10426 "Image is a depth and stencil format and thus must "
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010427 "have either one or both of VK_IMAGE_ASPECT_DEPTH_BIT and "
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010428 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
10429 VkDepthStencilObj ds_image(m_device);
10430 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
10431 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -060010432 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
10433 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010434 img_barrier.image = ds_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060010435 // Use of COLOR aspect on DS image is error
10436 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010437 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10438 VK_PIPELINE_STAGE_HOST_BIT,
10439 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10440 nullptr, 1, &img_barrier);
10441 m_errorMonitor->VerifyFound();
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010442 // Now test depth-only
10443 VkFormatProperties format_props;
10444
10445 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(),
10446 VK_FORMAT_D16_UNORM, &format_props);
10447 if (format_props.optimalTilingFeatures &
10448 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
10449 m_errorMonitor->SetDesiredFailureMsg(
10450 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10451 "Image is a depth-only format and thus must "
10452 "have VK_IMAGE_ASPECT_DEPTH_BIT set.");
10453 VkDepthStencilObj d_image(m_device);
10454 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
10455 ASSERT_TRUE(d_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -060010456 img_barrier.oldLayout =
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010457 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -060010458 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010459 img_barrier.image = d_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060010460 // Use of COLOR aspect on depth image is error
10461 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010462 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10463 VK_PIPELINE_STAGE_HOST_BIT,
10464 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
10465 0, nullptr, 1, &img_barrier);
10466 m_errorMonitor->VerifyFound();
10467 }
10468 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(),
10469 VK_FORMAT_S8_UINT, &format_props);
10470 if (format_props.optimalTilingFeatures &
10471 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
10472 // Now test stencil-only
10473 m_errorMonitor->SetDesiredFailureMsg(
10474 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10475 "Image is a stencil-only format and thus must "
10476 "have VK_IMAGE_ASPECT_STENCIL_BIT set.");
10477 VkDepthStencilObj s_image(m_device);
10478 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
10479 ASSERT_TRUE(s_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -060010480 img_barrier.oldLayout =
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010481 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -060010482 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010483 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060010484 // Use of COLOR aspect on depth image is error
10485 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010486 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10487 VK_PIPELINE_STAGE_HOST_BIT,
10488 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
10489 0, nullptr, 1, &img_barrier);
10490 m_errorMonitor->VerifyFound();
10491 }
10492 // Finally test color
10493 m_errorMonitor->SetDesiredFailureMsg(
10494 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image is a color format and thus must "
10495 "have VK_IMAGE_ASPECT_COLOR_BIT set.");
10496 VkImageObj c_image(m_device);
10497 c_image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
10498 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10499 0);
10500 ASSERT_TRUE(c_image.initialized());
10501 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10502 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
10503 img_barrier.image = c_image.handle();
10504 // Set aspect to depth (non-color)
10505 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
10506 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10507 VK_PIPELINE_STAGE_HOST_BIT,
10508 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10509 nullptr, 1, &img_barrier);
10510 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010511}
10512
Karl Schultz6addd812016-02-02 17:17:23 -070010513TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010514 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010515 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010516
Karl Schultz6addd812016-02-02 17:17:23 -070010517 m_errorMonitor->SetDesiredFailureMsg(
10518 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010519 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
10520
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010521 ASSERT_NO_FATAL_FAILURE(InitState());
10522 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010523 uint32_t qfi = 0;
10524 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010525 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10526 buffCI.size = 1024;
10527 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
10528 buffCI.queueFamilyIndexCount = 1;
10529 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010530
10531 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010532 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010533 ASSERT_VK_SUCCESS(err);
10534
10535 BeginCommandBuffer();
10536 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -070010537 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10538 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010539 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -070010540 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
10541 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010542
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010543 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010544
Chia-I Wuf7458c52015-10-26 21:10:41 +080010545 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010546}
10547
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010548TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
10549 // Create an out-of-range queueFamilyIndex
10550 m_errorMonitor->SetDesiredFailureMsg(
10551 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -060010552 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
10553 "of the indices specified when the device was created, via the "
10554 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010555
10556 ASSERT_NO_FATAL_FAILURE(InitState());
10557 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10558 VkBufferCreateInfo buffCI = {};
10559 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10560 buffCI.size = 1024;
10561 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
10562 buffCI.queueFamilyIndexCount = 1;
10563 // Introduce failure by specifying invalid queue_family_index
10564 uint32_t qfi = 777;
10565 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -060010566 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010567
10568 VkBuffer ib;
10569 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
10570
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010571 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060010572 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010573}
10574
Karl Schultz6addd812016-02-02 17:17:23 -070010575TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Tobin Ehlis0c94db02016-07-19 10:49:32 -060010576 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands w/ a primary cmd buffer"
10577 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010578
Karl Schultz6addd812016-02-02 17:17:23 -070010579 m_errorMonitor->SetDesiredFailureMsg(
10580 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010581 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010582
10583 ASSERT_NO_FATAL_FAILURE(InitState());
10584 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010585
10586 BeginCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -060010587
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010588 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
10589 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010590
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010591 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010592}
10593
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010594TEST_F(VkLayerTest, DSUsageBitsErrors) {
10595 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
10596 "that do not have correct usage bits sets.");
10597 VkResult err;
10598
10599 ASSERT_NO_FATAL_FAILURE(InitState());
10600 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10601 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10602 ds_type_count[i].type = VkDescriptorType(i);
10603 ds_type_count[i].descriptorCount = 1;
10604 }
10605 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10606 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10607 ds_pool_ci.pNext = NULL;
10608 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10609 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10610 ds_pool_ci.pPoolSizes = ds_type_count;
10611
10612 VkDescriptorPool ds_pool;
10613 err =
10614 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10615 ASSERT_VK_SUCCESS(err);
10616
10617 // Create 10 layouts where each has a single descriptor of different type
10618 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] =
10619 {};
10620 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10621 dsl_binding[i].binding = 0;
10622 dsl_binding[i].descriptorType = VkDescriptorType(i);
10623 dsl_binding[i].descriptorCount = 1;
10624 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
10625 dsl_binding[i].pImmutableSamplers = NULL;
10626 }
10627
10628 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10629 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10630 ds_layout_ci.pNext = NULL;
10631 ds_layout_ci.bindingCount = 1;
10632 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
10633 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10634 ds_layout_ci.pBindings = dsl_binding + i;
10635 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
10636 NULL, ds_layouts + i);
10637 ASSERT_VK_SUCCESS(err);
10638 }
10639 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10640 VkDescriptorSetAllocateInfo alloc_info = {};
10641 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10642 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10643 alloc_info.descriptorPool = ds_pool;
10644 alloc_info.pSetLayouts = ds_layouts;
10645 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10646 descriptor_sets);
10647 ASSERT_VK_SUCCESS(err);
10648
10649 // Create a buffer & bufferView to be used for invalid updates
10650 VkBufferCreateInfo buff_ci = {};
10651 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10652 // This usage is not valid for any descriptor type
10653 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
10654 buff_ci.size = 256;
10655 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10656 VkBuffer buffer;
10657 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10658 ASSERT_VK_SUCCESS(err);
10659
10660 VkBufferViewCreateInfo buff_view_ci = {};
10661 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
10662 buff_view_ci.buffer = buffer;
10663 buff_view_ci.format = VK_FORMAT_R8_UNORM;
10664 buff_view_ci.range = VK_WHOLE_SIZE;
10665 VkBufferView buff_view;
10666 err =
10667 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
10668 ASSERT_VK_SUCCESS(err);
10669
10670 // Create an image to be used for invalid updates
10671 VkImageCreateInfo image_ci = {};
10672 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10673 image_ci.imageType = VK_IMAGE_TYPE_2D;
10674 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
10675 image_ci.extent.width = 64;
10676 image_ci.extent.height = 64;
10677 image_ci.extent.depth = 1;
10678 image_ci.mipLevels = 1;
10679 image_ci.arrayLayers = 1;
10680 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
10681 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10682 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10683 // This usage is not valid for any descriptor type
10684 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
10685 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10686 VkImage image;
10687 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10688 ASSERT_VK_SUCCESS(err);
10689 // Bind memory to image
10690 VkMemoryRequirements mem_reqs;
10691 VkDeviceMemory image_mem;
10692 bool pass;
10693 VkMemoryAllocateInfo mem_alloc = {};
10694 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10695 mem_alloc.pNext = NULL;
10696 mem_alloc.allocationSize = 0;
10697 mem_alloc.memoryTypeIndex = 0;
10698 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10699 mem_alloc.allocationSize = mem_reqs.size;
10700 pass =
10701 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10702 ASSERT_TRUE(pass);
10703 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10704 ASSERT_VK_SUCCESS(err);
10705 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10706 ASSERT_VK_SUCCESS(err);
10707 // Now create view for image
10708 VkImageViewCreateInfo image_view_ci = {};
10709 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10710 image_view_ci.image = image;
10711 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
10712 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10713 image_view_ci.subresourceRange.layerCount = 1;
10714 image_view_ci.subresourceRange.baseArrayLayer = 0;
10715 image_view_ci.subresourceRange.levelCount = 1;
10716 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10717 VkImageView image_view;
10718 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
10719 &image_view);
10720 ASSERT_VK_SUCCESS(err);
10721
10722 VkDescriptorBufferInfo buff_info = {};
10723 buff_info.buffer = buffer;
10724 VkDescriptorImageInfo img_info = {};
10725 img_info.imageView = image_view;
10726 VkWriteDescriptorSet descriptor_write = {};
10727 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10728 descriptor_write.dstBinding = 0;
10729 descriptor_write.descriptorCount = 1;
10730 descriptor_write.pTexelBufferView = &buff_view;
10731 descriptor_write.pBufferInfo = &buff_info;
10732 descriptor_write.pImageInfo = &img_info;
10733
10734 // These error messages align with VkDescriptorType struct
10735 const char *error_msgs[] = {
10736 "", // placeholder, no error for SAMPLER descriptor
10737 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
10738 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
10739 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
10740 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
10741 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
10742 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
10743 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
10744 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
10745 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
10746 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
10747 // Start loop at 1 as SAMPLER desc type has no usage bit error
10748 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10749 descriptor_write.descriptorType = VkDescriptorType(i);
10750 descriptor_write.dstSet = descriptor_sets[i];
10751 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10752 error_msgs[i]);
10753
10754 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
10755 NULL);
10756
10757 m_errorMonitor->VerifyFound();
10758 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
10759 }
10760 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
10761 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060010762 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010763 vkDestroyImageView(m_device->device(), image_view, NULL);
10764 vkDestroyBuffer(m_device->device(), buffer, NULL);
10765 vkDestroyBufferView(m_device->device(), buff_view, NULL);
10766 vkFreeDescriptorSets(m_device->device(), ds_pool,
10767 VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
10768 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10769}
10770
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010771TEST_F(VkLayerTest, DSBufferInfoErrors) {
10772 TEST_DESCRIPTION(
10773 "Attempt to update buffer descriptor set that has incorrect "
10774 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
10775 "1. offset value greater than buffer size\n"
10776 "2. range value of 0\n"
10777 "3. range value greater than buffer (size - offset)");
10778 VkResult err;
10779
10780 ASSERT_NO_FATAL_FAILURE(InitState());
10781 VkDescriptorPoolSize ds_type_count = {};
10782 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10783 ds_type_count.descriptorCount = 1;
10784
10785 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10786 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10787 ds_pool_ci.pNext = NULL;
10788 ds_pool_ci.maxSets = 1;
10789 ds_pool_ci.poolSizeCount = 1;
10790 ds_pool_ci.pPoolSizes = &ds_type_count;
10791
10792 VkDescriptorPool ds_pool;
10793 err =
10794 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10795 ASSERT_VK_SUCCESS(err);
10796
10797 // Create layout with single uniform buffer descriptor
10798 VkDescriptorSetLayoutBinding dsl_binding = {};
10799 dsl_binding.binding = 0;
10800 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10801 dsl_binding.descriptorCount = 1;
10802 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10803 dsl_binding.pImmutableSamplers = NULL;
10804
10805 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10806 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10807 ds_layout_ci.pNext = NULL;
10808 ds_layout_ci.bindingCount = 1;
10809 ds_layout_ci.pBindings = &dsl_binding;
10810 VkDescriptorSetLayout ds_layout;
10811 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10812 &ds_layout);
10813 ASSERT_VK_SUCCESS(err);
10814
10815 VkDescriptorSet descriptor_set = {};
10816 VkDescriptorSetAllocateInfo alloc_info = {};
10817 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10818 alloc_info.descriptorSetCount = 1;
10819 alloc_info.descriptorPool = ds_pool;
10820 alloc_info.pSetLayouts = &ds_layout;
10821 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10822 &descriptor_set);
10823 ASSERT_VK_SUCCESS(err);
10824
10825 // Create a buffer to be used for invalid updates
10826 VkBufferCreateInfo buff_ci = {};
10827 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10828 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10829 buff_ci.size = 256;
10830 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10831 VkBuffer buffer;
10832 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10833 ASSERT_VK_SUCCESS(err);
10834 // Have to bind memory to buffer before descriptor update
10835 VkMemoryAllocateInfo mem_alloc = {};
10836 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10837 mem_alloc.pNext = NULL;
10838 mem_alloc.allocationSize = 256;
10839 mem_alloc.memoryTypeIndex = 0;
10840
10841 VkMemoryRequirements mem_reqs;
10842 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
10843 bool pass =
10844 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10845 if (!pass) {
10846 vkDestroyBuffer(m_device->device(), buffer, NULL);
10847 return;
10848 }
10849
10850 VkDeviceMemory mem;
10851 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
10852 ASSERT_VK_SUCCESS(err);
10853 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10854 ASSERT_VK_SUCCESS(err);
10855
10856 VkDescriptorBufferInfo buff_info = {};
10857 buff_info.buffer = buffer;
10858 // First make offset 1 larger than buffer size
10859 buff_info.offset = 257;
10860 buff_info.range = VK_WHOLE_SIZE;
10861 VkWriteDescriptorSet descriptor_write = {};
10862 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10863 descriptor_write.dstBinding = 0;
10864 descriptor_write.descriptorCount = 1;
10865 descriptor_write.pTexelBufferView = nullptr;
10866 descriptor_write.pBufferInfo = &buff_info;
10867 descriptor_write.pImageInfo = nullptr;
10868
10869 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10870 descriptor_write.dstSet = descriptor_set;
10871 m_errorMonitor->SetDesiredFailureMsg(
10872 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10873 " offset of 257 is greater than buffer ");
10874
10875 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10876
10877 m_errorMonitor->VerifyFound();
10878 // Now cause error due to range of 0
10879 buff_info.offset = 0;
10880 buff_info.range = 0;
10881 m_errorMonitor->SetDesiredFailureMsg(
10882 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10883 " range is not VK_WHOLE_SIZE and is zero, which is not allowed.");
10884
10885 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10886
10887 m_errorMonitor->VerifyFound();
10888 // Now cause error due to range exceeding buffer size - offset
10889 buff_info.offset = 128;
10890 buff_info.range = 200;
10891 m_errorMonitor->SetDesiredFailureMsg(
10892 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10893 " range is 200 which is greater than buffer size ");
10894
10895 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10896
10897 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010898 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010899 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10900 vkDestroyBuffer(m_device->device(), buffer, NULL);
10901 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10902 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10903}
10904
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010905TEST_F(VkLayerTest, DSAspectBitsErrors) {
10906 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10907 // are set, but could expand this test to hit more cases.
10908 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
10909 "that do not have correct aspect bits sets.");
10910 VkResult err;
10911
10912 ASSERT_NO_FATAL_FAILURE(InitState());
10913 VkDescriptorPoolSize ds_type_count = {};
10914 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10915 ds_type_count.descriptorCount = 1;
10916
10917 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10918 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10919 ds_pool_ci.pNext = NULL;
10920 ds_pool_ci.maxSets = 5;
10921 ds_pool_ci.poolSizeCount = 1;
10922 ds_pool_ci.pPoolSizes = &ds_type_count;
10923
10924 VkDescriptorPool ds_pool;
10925 err =
10926 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10927 ASSERT_VK_SUCCESS(err);
10928
10929 VkDescriptorSetLayoutBinding dsl_binding = {};
10930 dsl_binding.binding = 0;
10931 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10932 dsl_binding.descriptorCount = 1;
10933 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10934 dsl_binding.pImmutableSamplers = NULL;
10935
10936 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10937 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10938 ds_layout_ci.pNext = NULL;
10939 ds_layout_ci.bindingCount = 1;
10940 ds_layout_ci.pBindings = &dsl_binding;
10941 VkDescriptorSetLayout ds_layout;
10942 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10943 &ds_layout);
10944 ASSERT_VK_SUCCESS(err);
10945
10946 VkDescriptorSet descriptor_set = {};
10947 VkDescriptorSetAllocateInfo alloc_info = {};
10948 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10949 alloc_info.descriptorSetCount = 1;
10950 alloc_info.descriptorPool = ds_pool;
10951 alloc_info.pSetLayouts = &ds_layout;
10952 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10953 &descriptor_set);
10954 ASSERT_VK_SUCCESS(err);
10955
10956 // Create an image to be used for invalid updates
10957 VkImageCreateInfo image_ci = {};
10958 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10959 image_ci.imageType = VK_IMAGE_TYPE_2D;
10960 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10961 image_ci.extent.width = 64;
10962 image_ci.extent.height = 64;
10963 image_ci.extent.depth = 1;
10964 image_ci.mipLevels = 1;
10965 image_ci.arrayLayers = 1;
10966 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
10967 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10968 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10969 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10970 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10971 VkImage image;
10972 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10973 ASSERT_VK_SUCCESS(err);
10974 // Bind memory to image
10975 VkMemoryRequirements mem_reqs;
10976 VkDeviceMemory image_mem;
10977 bool pass;
10978 VkMemoryAllocateInfo mem_alloc = {};
10979 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10980 mem_alloc.pNext = NULL;
10981 mem_alloc.allocationSize = 0;
10982 mem_alloc.memoryTypeIndex = 0;
10983 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10984 mem_alloc.allocationSize = mem_reqs.size;
10985 pass =
10986 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10987 ASSERT_TRUE(pass);
10988 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10989 ASSERT_VK_SUCCESS(err);
10990 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10991 ASSERT_VK_SUCCESS(err);
10992 // Now create view for image
10993 VkImageViewCreateInfo image_view_ci = {};
10994 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10995 image_view_ci.image = image;
10996 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10997 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10998 image_view_ci.subresourceRange.layerCount = 1;
10999 image_view_ci.subresourceRange.baseArrayLayer = 0;
11000 image_view_ci.subresourceRange.levelCount = 1;
11001 // Setting both depth & stencil aspect bits is illegal for descriptor
11002 image_view_ci.subresourceRange.aspectMask =
11003 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
11004
11005 VkImageView image_view;
11006 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
11007 &image_view);
11008 ASSERT_VK_SUCCESS(err);
11009
11010 VkDescriptorImageInfo img_info = {};
11011 img_info.imageView = image_view;
11012 VkWriteDescriptorSet descriptor_write = {};
11013 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11014 descriptor_write.dstBinding = 0;
11015 descriptor_write.descriptorCount = 1;
11016 descriptor_write.pTexelBufferView = NULL;
11017 descriptor_write.pBufferInfo = NULL;
11018 descriptor_write.pImageInfo = &img_info;
11019 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
11020 descriptor_write.dstSet = descriptor_set;
11021 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
11022 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
11023 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11024 error_msg);
11025
11026 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11027
11028 m_errorMonitor->VerifyFound();
11029 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11030 vkDestroyImage(m_device->device(), image, NULL);
11031 vkFreeMemory(m_device->device(), image_mem, NULL);
11032 vkDestroyImageView(m_device->device(), image_view, NULL);
11033 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
11034 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11035}
11036
Karl Schultz6addd812016-02-02 17:17:23 -070011037TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011038 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070011039 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011040
Karl Schultz6addd812016-02-02 17:17:23 -070011041 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011042 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11043 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
11044 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011045
Tobin Ehlis3b780662015-05-28 12:11:26 -060011046 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011047 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011048 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011049 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11050 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011051
11052 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011053 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11054 ds_pool_ci.pNext = NULL;
11055 ds_pool_ci.maxSets = 1;
11056 ds_pool_ci.poolSizeCount = 1;
11057 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011058
Tobin Ehlis3b780662015-05-28 12:11:26 -060011059 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011060 err =
11061 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011062 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060011063 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011064 dsl_binding.binding = 0;
11065 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11066 dsl_binding.descriptorCount = 1;
11067 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11068 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011069
Tony Barboureb254902015-07-15 12:50:33 -060011070 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011071 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11072 ds_layout_ci.pNext = NULL;
11073 ds_layout_ci.bindingCount = 1;
11074 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011075
Tobin Ehlis3b780662015-05-28 12:11:26 -060011076 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011077 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11078 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011079 ASSERT_VK_SUCCESS(err);
11080
11081 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011082 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011083 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011084 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011085 alloc_info.descriptorPool = ds_pool;
11086 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011087 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11088 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011089 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011090
Tobin Ehlis30db8f82016-05-05 08:19:48 -060011091 VkSamplerCreateInfo sampler_ci = {};
11092 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11093 sampler_ci.pNext = NULL;
11094 sampler_ci.magFilter = VK_FILTER_NEAREST;
11095 sampler_ci.minFilter = VK_FILTER_NEAREST;
11096 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11097 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11098 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11099 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11100 sampler_ci.mipLodBias = 1.0;
11101 sampler_ci.anisotropyEnable = VK_FALSE;
11102 sampler_ci.maxAnisotropy = 1;
11103 sampler_ci.compareEnable = VK_FALSE;
11104 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11105 sampler_ci.minLod = 1.0;
11106 sampler_ci.maxLod = 1.0;
11107 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11108 sampler_ci.unnormalizedCoordinates = VK_FALSE;
11109 VkSampler sampler;
11110 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11111 ASSERT_VK_SUCCESS(err);
11112
11113 VkDescriptorImageInfo info = {};
11114 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011115
11116 VkWriteDescriptorSet descriptor_write;
11117 memset(&descriptor_write, 0, sizeof(descriptor_write));
11118 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011119 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011120 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011121 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011122 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011123 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011124
11125 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11126
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011127 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011128
Chia-I Wuf7458c52015-10-26 21:10:41 +080011129 vkDestroySampler(m_device->device(), sampler, NULL);
11130 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11131 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011132}
11133
Karl Schultz6addd812016-02-02 17:17:23 -070011134TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011135 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070011136 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011137
Karl Schultz6addd812016-02-02 17:17:23 -070011138 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011139 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11140 " binding #0 with 1 total descriptors but update of 1 descriptors "
11141 "starting at binding offset of 0 combined with update array element "
11142 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011143
Tobin Ehlis3b780662015-05-28 12:11:26 -060011144 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011145 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011146 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011147 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11148 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011149
11150 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011151 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11152 ds_pool_ci.pNext = NULL;
11153 ds_pool_ci.maxSets = 1;
11154 ds_pool_ci.poolSizeCount = 1;
11155 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011156
Tobin Ehlis3b780662015-05-28 12:11:26 -060011157 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011158 err =
11159 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011160 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011161
Tony Barboureb254902015-07-15 12:50:33 -060011162 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011163 dsl_binding.binding = 0;
11164 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11165 dsl_binding.descriptorCount = 1;
11166 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11167 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060011168
11169 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011170 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11171 ds_layout_ci.pNext = NULL;
11172 ds_layout_ci.bindingCount = 1;
11173 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011174
Tobin Ehlis3b780662015-05-28 12:11:26 -060011175 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011176 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11177 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011178 ASSERT_VK_SUCCESS(err);
11179
11180 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011181 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011182 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011183 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011184 alloc_info.descriptorPool = ds_pool;
11185 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011186 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11187 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011188 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011189
Tobin Ehlis30db8f82016-05-05 08:19:48 -060011190 // Correctly update descriptor to avoid "NOT_UPDATED" error
11191 VkDescriptorBufferInfo buff_info = {};
11192 buff_info.buffer =
11193 VkBuffer(0); // Don't care about buffer handle for this test
11194 buff_info.offset = 0;
11195 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011196
11197 VkWriteDescriptorSet descriptor_write;
11198 memset(&descriptor_write, 0, sizeof(descriptor_write));
11199 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011200 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011201 descriptor_write.dstArrayElement =
11202 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080011203 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011204 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11205 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011206
11207 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11208
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011209 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011210
Chia-I Wuf7458c52015-10-26 21:10:41 +080011211 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11212 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011213}
11214
Karl Schultz6addd812016-02-02 17:17:23 -070011215TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
11216 // Create layout w/ count of 1 and attempt update to that layout w/ binding
11217 // index 2
11218 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011219
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11221 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011222
Tobin Ehlis3b780662015-05-28 12:11:26 -060011223 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011224 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011225 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011226 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11227 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011228
11229 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011230 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11231 ds_pool_ci.pNext = NULL;
11232 ds_pool_ci.maxSets = 1;
11233 ds_pool_ci.poolSizeCount = 1;
11234 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011235
Tobin Ehlis3b780662015-05-28 12:11:26 -060011236 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011237 err =
11238 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011239 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011240
Tony Barboureb254902015-07-15 12:50:33 -060011241 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011242 dsl_binding.binding = 0;
11243 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11244 dsl_binding.descriptorCount = 1;
11245 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11246 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060011247
11248 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011249 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11250 ds_layout_ci.pNext = NULL;
11251 ds_layout_ci.bindingCount = 1;
11252 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011253 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011254 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11255 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011256 ASSERT_VK_SUCCESS(err);
11257
11258 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011259 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011260 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011261 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011262 alloc_info.descriptorPool = ds_pool;
11263 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011264 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11265 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011266 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011267
Tony Barboureb254902015-07-15 12:50:33 -060011268 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011269 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11270 sampler_ci.pNext = NULL;
11271 sampler_ci.magFilter = VK_FILTER_NEAREST;
11272 sampler_ci.minFilter = VK_FILTER_NEAREST;
11273 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11274 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11275 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11276 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11277 sampler_ci.mipLodBias = 1.0;
11278 sampler_ci.anisotropyEnable = VK_FALSE;
11279 sampler_ci.maxAnisotropy = 1;
11280 sampler_ci.compareEnable = VK_FALSE;
11281 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11282 sampler_ci.minLod = 1.0;
11283 sampler_ci.maxLod = 1.0;
11284 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11285 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060011286
Tobin Ehlis3b780662015-05-28 12:11:26 -060011287 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011288 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011289 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011290
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011291 VkDescriptorImageInfo info = {};
11292 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011293
11294 VkWriteDescriptorSet descriptor_write;
11295 memset(&descriptor_write, 0, sizeof(descriptor_write));
11296 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011297 descriptor_write.dstSet = descriptorSet;
11298 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011299 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011300 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011301 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011302 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011303
11304 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11305
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011306 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011307
Chia-I Wuf7458c52015-10-26 21:10:41 +080011308 vkDestroySampler(m_device->device(), sampler, NULL);
11309 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11310 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011311}
11312
Karl Schultz6addd812016-02-02 17:17:23 -070011313TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
11314 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
11315 // types
11316 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011317
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011318 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis660bcdc2016-05-17 10:39:46 -060011319 ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011320
Tobin Ehlis3b780662015-05-28 12:11:26 -060011321 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011322
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011323 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011324 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11325 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011326
11327 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011328 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11329 ds_pool_ci.pNext = NULL;
11330 ds_pool_ci.maxSets = 1;
11331 ds_pool_ci.poolSizeCount = 1;
11332 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011333
Tobin Ehlis3b780662015-05-28 12:11:26 -060011334 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011335 err =
11336 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011337 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060011338 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011339 dsl_binding.binding = 0;
11340 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11341 dsl_binding.descriptorCount = 1;
11342 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11343 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011344
Tony Barboureb254902015-07-15 12:50:33 -060011345 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011346 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11347 ds_layout_ci.pNext = NULL;
11348 ds_layout_ci.bindingCount = 1;
11349 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011350
Tobin Ehlis3b780662015-05-28 12:11:26 -060011351 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011352 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11353 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011354 ASSERT_VK_SUCCESS(err);
11355
11356 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011357 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011358 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011359 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011360 alloc_info.descriptorPool = ds_pool;
11361 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011362 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11363 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011364 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011365
Tony Barboureb254902015-07-15 12:50:33 -060011366 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011367 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11368 sampler_ci.pNext = NULL;
11369 sampler_ci.magFilter = VK_FILTER_NEAREST;
11370 sampler_ci.minFilter = VK_FILTER_NEAREST;
11371 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11372 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11373 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11374 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11375 sampler_ci.mipLodBias = 1.0;
11376 sampler_ci.anisotropyEnable = VK_FALSE;
11377 sampler_ci.maxAnisotropy = 1;
11378 sampler_ci.compareEnable = VK_FALSE;
11379 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11380 sampler_ci.minLod = 1.0;
11381 sampler_ci.maxLod = 1.0;
11382 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11383 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011384 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011385 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011386 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011387
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011388 VkDescriptorImageInfo info = {};
11389 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011390
11391 VkWriteDescriptorSet descriptor_write;
11392 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -070011393 descriptor_write.sType =
11394 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011395 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011396 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011397 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011398 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011399 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011400
11401 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11402
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011403 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011404
Chia-I Wuf7458c52015-10-26 21:10:41 +080011405 vkDestroySampler(m_device->device(), sampler, NULL);
11406 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11407 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011408}
11409
Karl Schultz6addd812016-02-02 17:17:23 -070011410TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011411 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070011412 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011413
Karl Schultz6addd812016-02-02 17:17:23 -070011414 m_errorMonitor->SetDesiredFailureMsg(
11415 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011416 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011417
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011418 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011419 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
11420 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011421 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011422 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
11423 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011424
11425 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011426 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11427 ds_pool_ci.pNext = NULL;
11428 ds_pool_ci.maxSets = 1;
11429 ds_pool_ci.poolSizeCount = 1;
11430 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011431
11432 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011433 err =
11434 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011435 ASSERT_VK_SUCCESS(err);
11436
11437 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011438 dsl_binding.binding = 0;
11439 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11440 dsl_binding.descriptorCount = 1;
11441 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11442 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011443
11444 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011445 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11446 ds_layout_ci.pNext = NULL;
11447 ds_layout_ci.bindingCount = 1;
11448 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011449 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011450 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11451 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011452 ASSERT_VK_SUCCESS(err);
11453
11454 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011455 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011456 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011457 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011458 alloc_info.descriptorPool = ds_pool;
11459 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011460 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11461 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011462 ASSERT_VK_SUCCESS(err);
11463
Karl Schultz6addd812016-02-02 17:17:23 -070011464 VkSampler sampler =
11465 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011466
11467 VkDescriptorImageInfo descriptor_info;
11468 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11469 descriptor_info.sampler = sampler;
11470
11471 VkWriteDescriptorSet descriptor_write;
11472 memset(&descriptor_write, 0, sizeof(descriptor_write));
11473 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011474 descriptor_write.dstSet = descriptorSet;
11475 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011476 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011477 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11478 descriptor_write.pImageInfo = &descriptor_info;
11479
11480 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11481
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011482 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011483
Chia-I Wuf7458c52015-10-26 21:10:41 +080011484 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11485 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011486}
11487
Karl Schultz6addd812016-02-02 17:17:23 -070011488TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
11489 // Create a single combined Image/Sampler descriptor and send it an invalid
11490 // imageView
11491 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011492
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011493 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11494 "Attempted write update to combined "
11495 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -060011496 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011497
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011498 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011499 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011500 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11501 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011502
11503 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011504 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11505 ds_pool_ci.pNext = NULL;
11506 ds_pool_ci.maxSets = 1;
11507 ds_pool_ci.poolSizeCount = 1;
11508 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011509
11510 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011511 err =
11512 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011513 ASSERT_VK_SUCCESS(err);
11514
11515 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011516 dsl_binding.binding = 0;
11517 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11518 dsl_binding.descriptorCount = 1;
11519 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11520 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011521
11522 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011523 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11524 ds_layout_ci.pNext = NULL;
11525 ds_layout_ci.bindingCount = 1;
11526 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011527 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011528 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11529 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011530 ASSERT_VK_SUCCESS(err);
11531
11532 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011533 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011534 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011535 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011536 alloc_info.descriptorPool = ds_pool;
11537 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011538 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11539 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011540 ASSERT_VK_SUCCESS(err);
11541
11542 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011543 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11544 sampler_ci.pNext = NULL;
11545 sampler_ci.magFilter = VK_FILTER_NEAREST;
11546 sampler_ci.minFilter = VK_FILTER_NEAREST;
11547 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11548 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11549 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11550 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11551 sampler_ci.mipLodBias = 1.0;
11552 sampler_ci.anisotropyEnable = VK_FALSE;
11553 sampler_ci.maxAnisotropy = 1;
11554 sampler_ci.compareEnable = VK_FALSE;
11555 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11556 sampler_ci.minLod = 1.0;
11557 sampler_ci.maxLod = 1.0;
11558 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11559 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011560
11561 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011562 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011563 ASSERT_VK_SUCCESS(err);
11564
Karl Schultz6addd812016-02-02 17:17:23 -070011565 VkImageView view =
11566 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011567
11568 VkDescriptorImageInfo descriptor_info;
11569 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11570 descriptor_info.sampler = sampler;
11571 descriptor_info.imageView = view;
11572
11573 VkWriteDescriptorSet descriptor_write;
11574 memset(&descriptor_write, 0, sizeof(descriptor_write));
11575 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011576 descriptor_write.dstSet = descriptorSet;
11577 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011578 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011579 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11580 descriptor_write.pImageInfo = &descriptor_info;
11581
11582 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11583
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011584 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011585
Chia-I Wuf7458c52015-10-26 21:10:41 +080011586 vkDestroySampler(m_device->device(), sampler, NULL);
11587 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11588 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011589}
11590
Karl Schultz6addd812016-02-02 17:17:23 -070011591TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
11592 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
11593 // into the other
11594 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011595
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011596 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11597 " binding #1 with type "
11598 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
11599 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011600
Tobin Ehlis04356f92015-10-27 16:35:27 -060011601 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011602 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011603 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011604 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11605 ds_type_count[0].descriptorCount = 1;
11606 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
11607 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011608
11609 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011610 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11611 ds_pool_ci.pNext = NULL;
11612 ds_pool_ci.maxSets = 1;
11613 ds_pool_ci.poolSizeCount = 2;
11614 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011615
11616 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011617 err =
11618 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011619 ASSERT_VK_SUCCESS(err);
11620 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011621 dsl_binding[0].binding = 0;
11622 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11623 dsl_binding[0].descriptorCount = 1;
11624 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
11625 dsl_binding[0].pImmutableSamplers = NULL;
11626 dsl_binding[1].binding = 1;
11627 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11628 dsl_binding[1].descriptorCount = 1;
11629 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
11630 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011631
11632 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011633 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11634 ds_layout_ci.pNext = NULL;
11635 ds_layout_ci.bindingCount = 2;
11636 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011637
11638 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011639 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11640 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011641 ASSERT_VK_SUCCESS(err);
11642
11643 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011644 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011645 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011646 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011647 alloc_info.descriptorPool = ds_pool;
11648 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011649 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11650 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011651 ASSERT_VK_SUCCESS(err);
11652
11653 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011654 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11655 sampler_ci.pNext = NULL;
11656 sampler_ci.magFilter = VK_FILTER_NEAREST;
11657 sampler_ci.minFilter = VK_FILTER_NEAREST;
11658 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11659 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11660 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11661 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11662 sampler_ci.mipLodBias = 1.0;
11663 sampler_ci.anisotropyEnable = VK_FALSE;
11664 sampler_ci.maxAnisotropy = 1;
11665 sampler_ci.compareEnable = VK_FALSE;
11666 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11667 sampler_ci.minLod = 1.0;
11668 sampler_ci.maxLod = 1.0;
11669 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11670 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011671
11672 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011673 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011674 ASSERT_VK_SUCCESS(err);
11675
11676 VkDescriptorImageInfo info = {};
11677 info.sampler = sampler;
11678
11679 VkWriteDescriptorSet descriptor_write;
11680 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
11681 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011682 descriptor_write.dstSet = descriptorSet;
11683 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080011684 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011685 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11686 descriptor_write.pImageInfo = &info;
11687 // This write update should succeed
11688 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11689 // Now perform a copy update that fails due to type mismatch
11690 VkCopyDescriptorSet copy_ds_update;
11691 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11692 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11693 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -060011694 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011695 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011696 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +080011697 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011698 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11699
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011700 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011701 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070011702 m_errorMonitor->SetDesiredFailureMsg(
11703 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011704 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -060011705 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11706 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11707 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011708 copy_ds_update.srcBinding =
11709 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011710 copy_ds_update.dstSet = descriptorSet;
11711 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -060011712 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011713 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11714
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011715 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011716
Tobin Ehlis04356f92015-10-27 16:35:27 -060011717 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070011718 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011719 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
11720 "update array offset of 0 and update of "
11721 "5 descriptors oversteps total number "
11722 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011723
Tobin Ehlis04356f92015-10-27 16:35:27 -060011724 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11725 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11726 copy_ds_update.srcSet = descriptorSet;
11727 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011728 copy_ds_update.dstSet = descriptorSet;
11729 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070011730 copy_ds_update.descriptorCount =
11731 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060011732 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11733
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011734 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011735
Chia-I Wuf7458c52015-10-26 21:10:41 +080011736 vkDestroySampler(m_device->device(), sampler, NULL);
11737 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11738 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011739}
11740
Karl Schultz6addd812016-02-02 17:17:23 -070011741TEST_F(VkLayerTest, NumSamplesMismatch) {
11742 // Create CommandBuffer where MSAA samples doesn't match RenderPass
11743 // sampleCount
11744 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011745
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011747 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011748
Tobin Ehlis3b780662015-05-28 12:11:26 -060011749 ASSERT_NO_FATAL_FAILURE(InitState());
11750 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011751 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060011752 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011753 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011754
11755 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011756 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11757 ds_pool_ci.pNext = NULL;
11758 ds_pool_ci.maxSets = 1;
11759 ds_pool_ci.poolSizeCount = 1;
11760 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011761
Tobin Ehlis3b780662015-05-28 12:11:26 -060011762 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011763 err =
11764 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011765 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011766
Tony Barboureb254902015-07-15 12:50:33 -060011767 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080011768 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060011769 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080011770 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011771 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11772 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011773
Tony Barboureb254902015-07-15 12:50:33 -060011774 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11775 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11776 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011777 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011778 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011779
Tobin Ehlis3b780662015-05-28 12:11:26 -060011780 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011781 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11782 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011783 ASSERT_VK_SUCCESS(err);
11784
11785 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011786 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011787 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011788 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011789 alloc_info.descriptorPool = ds_pool;
11790 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011791 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11792 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011793 ASSERT_VK_SUCCESS(err);
11794
Tony Barboureb254902015-07-15 12:50:33 -060011795 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011796 pipe_ms_state_ci.sType =
11797 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11798 pipe_ms_state_ci.pNext = NULL;
11799 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11800 pipe_ms_state_ci.sampleShadingEnable = 0;
11801 pipe_ms_state_ci.minSampleShading = 1.0;
11802 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011803
Tony Barboureb254902015-07-15 12:50:33 -060011804 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011805 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11806 pipeline_layout_ci.pNext = NULL;
11807 pipeline_layout_ci.setLayoutCount = 1;
11808 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011809
11810 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011811 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11812 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011813 ASSERT_VK_SUCCESS(err);
11814
Karl Schultz6addd812016-02-02 17:17:23 -070011815 VkShaderObj vs(m_device, bindStateVertShaderText,
11816 VK_SHADER_STAGE_VERTEX_BIT, this);
11817 VkShaderObj fs(m_device, bindStateFragShaderText,
11818 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011819 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070011820 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011821 VkPipelineObj pipe(m_device);
11822 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011823 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011824 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011825 pipe.SetMSAA(&pipe_ms_state_ci);
11826 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011827
Tony Barbourfe3351b2015-07-28 10:17:20 -060011828 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070011829 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11830 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011831
Mark Young29927482016-05-04 14:38:51 -060011832 // Render triangle (the error should trigger on the attempt to draw).
11833 Draw(3, 1, 0, 0);
11834
11835 // Finalize recording of the command buffer
11836 EndCommandBuffer();
11837
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011838 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011839
Chia-I Wuf7458c52015-10-26 21:10:41 +080011840 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11841 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11842 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011843}
Mark Young29927482016-05-04 14:38:51 -060011844
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011845TEST_F(VkLayerTest, RenderPassIncompatible) {
11846 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
11847 "Initial case is drawing with an active renderpass that's "
11848 "not compatible with the bound PSO's creation renderpass");
11849 VkResult err;
11850
11851 ASSERT_NO_FATAL_FAILURE(InitState());
11852 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11853
11854 VkDescriptorSetLayoutBinding dsl_binding = {};
11855 dsl_binding.binding = 0;
11856 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11857 dsl_binding.descriptorCount = 1;
11858 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11859 dsl_binding.pImmutableSamplers = NULL;
11860
11861 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11862 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11863 ds_layout_ci.pNext = NULL;
11864 ds_layout_ci.bindingCount = 1;
11865 ds_layout_ci.pBindings = &dsl_binding;
11866
11867 VkDescriptorSetLayout ds_layout;
11868 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11869 &ds_layout);
11870 ASSERT_VK_SUCCESS(err);
11871
11872 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11873 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11874 pipeline_layout_ci.pNext = NULL;
11875 pipeline_layout_ci.setLayoutCount = 1;
11876 pipeline_layout_ci.pSetLayouts = &ds_layout;
11877
11878 VkPipelineLayout pipeline_layout;
11879 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11880 &pipeline_layout);
11881 ASSERT_VK_SUCCESS(err);
11882
11883 VkShaderObj vs(m_device, bindStateVertShaderText,
11884 VK_SHADER_STAGE_VERTEX_BIT, this);
11885 VkShaderObj fs(m_device, bindStateFragShaderText,
11886 VK_SHADER_STAGE_FRAGMENT_BIT,
11887 this); // We shouldn't need a fragment shader
11888 // but add it to be able to run on more devices
11889 // Create a renderpass that will be incompatible with default renderpass
11890 VkAttachmentReference attach = {};
11891 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11892 VkAttachmentReference color_att = {};
11893 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11894 VkSubpassDescription subpass = {};
11895 subpass.inputAttachmentCount = 1;
11896 subpass.pInputAttachments = &attach;
11897 subpass.colorAttachmentCount = 1;
11898 subpass.pColorAttachments = &color_att;
11899 VkRenderPassCreateInfo rpci = {};
11900 rpci.subpassCount = 1;
11901 rpci.pSubpasses = &subpass;
11902 rpci.attachmentCount = 1;
11903 VkAttachmentDescription attach_desc = {};
11904 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011905 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11906 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011907 rpci.pAttachments = &attach_desc;
11908 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11909 VkRenderPass rp;
11910 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11911 VkPipelineObj pipe(m_device);
11912 pipe.AddShader(&vs);
11913 pipe.AddShader(&fs);
11914 pipe.AddColorAttachment();
11915 VkViewport view_port = {};
11916 m_viewports.push_back(view_port);
11917 pipe.SetViewport(m_viewports);
11918 VkRect2D rect = {};
11919 m_scissors.push_back(rect);
11920 pipe.SetScissor(m_scissors);
11921 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11922
11923 VkCommandBufferInheritanceInfo cbii = {};
11924 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11925 cbii.renderPass = rp;
11926 cbii.subpass = 0;
11927 VkCommandBufferBeginInfo cbbi = {};
11928 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11929 cbbi.pInheritanceInfo = &cbii;
11930 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11931 VkRenderPassBeginInfo rpbi = {};
11932 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11933 rpbi.framebuffer = m_framebuffer;
11934 rpbi.renderPass = rp;
11935 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi,
11936 VK_SUBPASS_CONTENTS_INLINE);
11937 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11938 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11939
11940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11941 " is incompatible w/ gfx pipeline ");
11942 // Render triangle (the error should trigger on the attempt to draw).
11943 Draw(3, 1, 0, 0);
11944
11945 // Finalize recording of the command buffer
11946 EndCommandBuffer();
11947
11948 m_errorMonitor->VerifyFound();
11949
11950 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11951 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11952 vkDestroyRenderPass(m_device->device(), rp, NULL);
11953}
11954
Mark Youngc89c6312016-03-31 16:03:20 -060011955TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11956 // Create Pipeline where the number of blend attachments doesn't match the
11957 // number of color attachments. In this case, we don't add any color
11958 // blend attachments even though we have a color attachment.
11959 VkResult err;
11960
11961 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -060011962 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -060011963
11964 ASSERT_NO_FATAL_FAILURE(InitState());
11965 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11966 VkDescriptorPoolSize ds_type_count = {};
11967 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11968 ds_type_count.descriptorCount = 1;
11969
11970 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11971 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11972 ds_pool_ci.pNext = NULL;
11973 ds_pool_ci.maxSets = 1;
11974 ds_pool_ci.poolSizeCount = 1;
11975 ds_pool_ci.pPoolSizes = &ds_type_count;
11976
11977 VkDescriptorPool ds_pool;
11978 err =
11979 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11980 ASSERT_VK_SUCCESS(err);
11981
11982 VkDescriptorSetLayoutBinding dsl_binding = {};
11983 dsl_binding.binding = 0;
11984 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11985 dsl_binding.descriptorCount = 1;
11986 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11987 dsl_binding.pImmutableSamplers = NULL;
11988
11989 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11990 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11991 ds_layout_ci.pNext = NULL;
11992 ds_layout_ci.bindingCount = 1;
11993 ds_layout_ci.pBindings = &dsl_binding;
11994
11995 VkDescriptorSetLayout ds_layout;
11996 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11997 &ds_layout);
11998 ASSERT_VK_SUCCESS(err);
11999
12000 VkDescriptorSet descriptorSet;
12001 VkDescriptorSetAllocateInfo alloc_info = {};
12002 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12003 alloc_info.descriptorSetCount = 1;
12004 alloc_info.descriptorPool = ds_pool;
12005 alloc_info.pSetLayouts = &ds_layout;
12006 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
12007 &descriptorSet);
12008 ASSERT_VK_SUCCESS(err);
12009
12010 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
12011 pipe_ms_state_ci.sType =
12012 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
12013 pipe_ms_state_ci.pNext = NULL;
12014 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12015 pipe_ms_state_ci.sampleShadingEnable = 0;
12016 pipe_ms_state_ci.minSampleShading = 1.0;
12017 pipe_ms_state_ci.pSampleMask = NULL;
12018
12019 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12020 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12021 pipeline_layout_ci.pNext = NULL;
12022 pipeline_layout_ci.setLayoutCount = 1;
12023 pipeline_layout_ci.pSetLayouts = &ds_layout;
12024
12025 VkPipelineLayout pipeline_layout;
12026 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
12027 &pipeline_layout);
12028 ASSERT_VK_SUCCESS(err);
12029
12030 VkShaderObj vs(m_device, bindStateVertShaderText,
12031 VK_SHADER_STAGE_VERTEX_BIT, this);
12032 VkShaderObj fs(m_device, bindStateFragShaderText,
12033 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060012034 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -060012035 // but add it to be able to run on more devices
12036 VkPipelineObj pipe(m_device);
12037 pipe.AddShader(&vs);
12038 pipe.AddShader(&fs);
12039 pipe.SetMSAA(&pipe_ms_state_ci);
12040 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12041
12042 BeginCommandBuffer();
12043 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
12044 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12045
Mark Young29927482016-05-04 14:38:51 -060012046 // Render triangle (the error should trigger on the attempt to draw).
12047 Draw(3, 1, 0, 0);
12048
12049 // Finalize recording of the command buffer
12050 EndCommandBuffer();
12051
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012052 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060012053
12054 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12055 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12056 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12057}
Mark Young29927482016-05-04 14:38:51 -060012058
Mark Muellerd4914412016-06-13 17:52:06 -060012059TEST_F(VkLayerTest, MissingClearAttachment) {
12060 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
12061 "structure passed to vkCmdClearAttachments");
12062 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12063 "vkCmdClearAttachments() attachment index 1 not found in attachment "
12064 "reference array of active subpass 0");
12065
12066 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
12067 m_errorMonitor->VerifyFound();
12068}
12069
Karl Schultz6addd812016-02-02 17:17:23 -070012070TEST_F(VkLayerTest, ClearCmdNoDraw) {
12071 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
12072 // to issuing a Draw
12073 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012074
Karl Schultz6addd812016-02-02 17:17:23 -070012075 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -070012076 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012077 "vkCmdClearAttachments() issued on CB object ");
12078
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012079 ASSERT_NO_FATAL_FAILURE(InitState());
12080 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060012081
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012082 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012083 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12084 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012085
12086 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012087 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12088 ds_pool_ci.pNext = NULL;
12089 ds_pool_ci.maxSets = 1;
12090 ds_pool_ci.poolSizeCount = 1;
12091 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060012092
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012093 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070012094 err =
12095 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012096 ASSERT_VK_SUCCESS(err);
12097
Tony Barboureb254902015-07-15 12:50:33 -060012098 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012099 dsl_binding.binding = 0;
12100 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12101 dsl_binding.descriptorCount = 1;
12102 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12103 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012104
Tony Barboureb254902015-07-15 12:50:33 -060012105 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012106 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12107 ds_layout_ci.pNext = NULL;
12108 ds_layout_ci.bindingCount = 1;
12109 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012110
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012111 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012112 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
12113 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012114 ASSERT_VK_SUCCESS(err);
12115
12116 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012117 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012118 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012119 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012120 alloc_info.descriptorPool = ds_pool;
12121 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012122 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
12123 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012124 ASSERT_VK_SUCCESS(err);
12125
Tony Barboureb254902015-07-15 12:50:33 -060012126 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012127 pipe_ms_state_ci.sType =
12128 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
12129 pipe_ms_state_ci.pNext = NULL;
12130 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
12131 pipe_ms_state_ci.sampleShadingEnable = 0;
12132 pipe_ms_state_ci.minSampleShading = 1.0;
12133 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012134
Tony Barboureb254902015-07-15 12:50:33 -060012135 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012136 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12137 pipeline_layout_ci.pNext = NULL;
12138 pipeline_layout_ci.setLayoutCount = 1;
12139 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012140
12141 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012142 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
12143 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012144 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012145
Karl Schultz6addd812016-02-02 17:17:23 -070012146 VkShaderObj vs(m_device, bindStateVertShaderText,
12147 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060012148 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070012149 // on more devices
12150 VkShaderObj fs(m_device, bindStateFragShaderText,
12151 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012152
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012153 VkPipelineObj pipe(m_device);
12154 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012155 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012156 pipe.SetMSAA(&pipe_ms_state_ci);
12157 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060012158
12159 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012160
Karl Schultz6addd812016-02-02 17:17:23 -070012161 // Main thing we care about for this test is that the VkImage obj we're
12162 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012163 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060012164 VkClearAttachment color_attachment;
12165 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12166 color_attachment.clearValue.color.float32[0] = 1.0;
12167 color_attachment.clearValue.color.float32[1] = 1.0;
12168 color_attachment.clearValue.color.float32[2] = 1.0;
12169 color_attachment.clearValue.color.float32[3] = 1.0;
12170 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070012171 VkClearRect clear_rect = {
12172 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012173
Karl Schultz6addd812016-02-02 17:17:23 -070012174 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
12175 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012176
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012177 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012178
Chia-I Wuf7458c52015-10-26 21:10:41 +080012179 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12180 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12181 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012182}
12183
Karl Schultz6addd812016-02-02 17:17:23 -070012184TEST_F(VkLayerTest, VtxBufferBadIndex) {
12185 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012186
Karl Schultz6addd812016-02-02 17:17:23 -070012187 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012188 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -070012189 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012190
Tobin Ehlis502480b2015-06-24 15:53:07 -060012191 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060012192 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060012193 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060012194
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012195 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012196 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12197 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012198
12199 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012200 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12201 ds_pool_ci.pNext = NULL;
12202 ds_pool_ci.maxSets = 1;
12203 ds_pool_ci.poolSizeCount = 1;
12204 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060012205
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060012206 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070012207 err =
12208 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012209 ASSERT_VK_SUCCESS(err);
12210
Tony Barboureb254902015-07-15 12:50:33 -060012211 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012212 dsl_binding.binding = 0;
12213 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12214 dsl_binding.descriptorCount = 1;
12215 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12216 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012217
Tony Barboureb254902015-07-15 12:50:33 -060012218 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012219 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12220 ds_layout_ci.pNext = NULL;
12221 ds_layout_ci.bindingCount = 1;
12222 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060012223
Tobin Ehlis502480b2015-06-24 15:53:07 -060012224 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012225 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
12226 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012227 ASSERT_VK_SUCCESS(err);
12228
12229 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012230 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012231 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012232 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012233 alloc_info.descriptorPool = ds_pool;
12234 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012235 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
12236 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012237 ASSERT_VK_SUCCESS(err);
12238
Tony Barboureb254902015-07-15 12:50:33 -060012239 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012240 pipe_ms_state_ci.sType =
12241 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
12242 pipe_ms_state_ci.pNext = NULL;
12243 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12244 pipe_ms_state_ci.sampleShadingEnable = 0;
12245 pipe_ms_state_ci.minSampleShading = 1.0;
12246 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012247
Tony Barboureb254902015-07-15 12:50:33 -060012248 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012249 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12250 pipeline_layout_ci.pNext = NULL;
12251 pipeline_layout_ci.setLayoutCount = 1;
12252 pipeline_layout_ci.pSetLayouts = &ds_layout;
12253 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012254
Karl Schultz6addd812016-02-02 17:17:23 -070012255 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
12256 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012257 ASSERT_VK_SUCCESS(err);
12258
Karl Schultz6addd812016-02-02 17:17:23 -070012259 VkShaderObj vs(m_device, bindStateVertShaderText,
12260 VK_SHADER_STAGE_VERTEX_BIT, this);
12261 VkShaderObj fs(m_device, bindStateFragShaderText,
12262 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060012263 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070012264 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012265 VkPipelineObj pipe(m_device);
12266 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012267 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060012268 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012269 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060012270 pipe.SetViewport(m_viewports);
12271 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012272 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060012273
12274 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070012275 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
12276 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060012277 // Don't care about actual data, just need to get to draw to flag error
12278 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -070012279 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
12280 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060012281 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060012282 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012283
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012284 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012285
Chia-I Wuf7458c52015-10-26 21:10:41 +080012286 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12287 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12288 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012289}
Mark Muellerdfe37552016-07-07 14:47:42 -060012290
Mark Mueller2ee294f2016-08-04 12:59:48 -060012291TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
12292 TEST_DESCRIPTION("Use an invalid count in a vkEnumeratePhysicalDevices call."
12293 "Use invalid Queue Family Index in vkCreateDevice");
12294
12295 const char *mismatch_count_message =
12296 "Call to vkEnumeratePhysicalDevices() "
12297 "w/ pPhysicalDeviceCount value ";
12298
12299 const char *invalid_queueFamilyIndex_message =
12300 "Invalid queue create request in vkCreateDevice(). Invalid "
12301 "queueFamilyIndex ";
12302
12303 const char *unavailable_feature_message =
12304 "While calling vkCreateDevice(), requesting feature #";
12305
12306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
12307 mismatch_count_message);
Mark Mueller880fce52016-08-17 15:23:23 -060012308 // The following test fails with recent NVidia drivers.
12309 // By the time core_validation is reached, the NVidia
12310 // driver has sanitized the invalid condition and core_validation
12311 // is not introduced to the failure condition. This is not the case
12312 // with AMD and Mesa drivers. Futher investigation is required
12313// uint32_t count = static_cast<uint32_t>(~0);
12314// VkPhysicalDevice physical_device;
12315// vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
12316// m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060012317
12318 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12319 invalid_queueFamilyIndex_message);
12320 float queue_priority = 0.0;
12321
12322 VkDeviceQueueCreateInfo queue_create_info = {};
12323 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
12324 queue_create_info.queueCount = 1;
12325 queue_create_info.pQueuePriorities = &queue_priority;
12326 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
12327
12328 VkPhysicalDeviceFeatures features = m_device->phy().features();
12329 VkDevice testDevice;
12330 VkDeviceCreateInfo device_create_info = {};
12331 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
12332 device_create_info.queueCreateInfoCount = 1;
12333 device_create_info.pQueueCreateInfos = &queue_create_info;
12334 device_create_info.pEnabledFeatures = &features;
12335 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12336 m_errorMonitor->VerifyFound();
12337
12338 queue_create_info.queueFamilyIndex = 1;
12339
12340 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
12341 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
12342 for (unsigned i = 0; i < feature_count; i++) {
12343 if (VK_FALSE == feature_array[i]) {
12344 feature_array[i] = VK_TRUE;
12345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12346 unavailable_feature_message);
12347 device_create_info.pEnabledFeatures = &features;
12348 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12349 m_errorMonitor->VerifyFound();
12350 break;
12351 }
12352 }
12353}
12354
12355TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
12356 TEST_DESCRIPTION("Use an invalid queue index in a vkCmdWaitEvents call."
12357 "End a command buffer with a query still in progress.");
12358
12359 const char *invalid_queue_index =
12360 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
12361 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
12362 "must be.";
12363
12364 const char *invalid_query =
12365 "Ending command buffer with in progress query: queryPool 0x";
12366
12367 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12368 invalid_queue_index);
12369
12370 ASSERT_NO_FATAL_FAILURE(InitState());
12371
12372 VkEvent event;
12373 VkEventCreateInfo event_create_info{};
12374 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12375 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12376
12377
12378 VkQueue queue = VK_NULL_HANDLE;
12379 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
12380 0, &queue);
12381
12382 BeginCommandBuffer();
12383
12384 VkImageObj image(m_device);
12385 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
12386 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12387 ASSERT_TRUE(image.initialized());
12388 VkImageMemoryBarrier img_barrier = {};
12389 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12390 img_barrier.pNext = NULL;
12391 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
12392 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
12393 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12394 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12395 img_barrier.image = image.handle();
12396 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060012397
12398 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
12399 // that layer validation catches the case when it is not.
12400 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012401 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12402 img_barrier.subresourceRange.baseArrayLayer = 0;
12403 img_barrier.subresourceRange.baseMipLevel = 0;
12404 img_barrier.subresourceRange.layerCount = 1;
12405 img_barrier.subresourceRange.levelCount = 1;
12406 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event,
12407 VK_PIPELINE_STAGE_HOST_BIT,
12408 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
12409 nullptr, 1, &img_barrier);
12410 m_errorMonitor->VerifyFound();
12411
12412 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12413 invalid_query);
12414
12415 VkQueryPool query_pool;
12416 VkQueryPoolCreateInfo query_pool_create_info = {};
12417 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12418 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
12419 query_pool_create_info.queryCount = 1;
12420 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
12421 &query_pool);
12422
12423 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/,
12424 1 /*queryCount*/);
12425 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
12426
12427 vkEndCommandBuffer(m_commandBuffer->handle());
12428 m_errorMonitor->VerifyFound();
12429
12430 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
12431 vkDestroyEvent(m_device->device(), event, nullptr);
12432}
12433
Mark Muellerdfe37552016-07-07 14:47:42 -060012434TEST_F(VkLayerTest, VertexBufferInvalid) {
12435 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
12436 "delete a buffer twice, use an invalid offset for each "
12437 "buffer type, and attempt to bind a null buffer");
12438
12439 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
12440 "using deleted buffer ";
12441 const char *double_destroy_message = "Cannot free buffer 0x";
12442 const char *invalid_offset_message = "vkBindBufferMemory(): "
12443 "memoryOffset is 0x";
12444 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
12445 "storage memoryOffset "
12446 "is 0x";
12447 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
12448 "texel memoryOffset "
12449 "is 0x";
12450 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
12451 "uniform memoryOffset "
12452 "is 0x";
12453 const char *bind_null_buffer_message = "In vkBindBufferMemory, attempting"
12454 " to Bind Obj(0x";
12455 const char *free_invalid_buffer_message = "Request to delete memory "
12456 "object 0x";
12457
12458 ASSERT_NO_FATAL_FAILURE(InitState());
12459 ASSERT_NO_FATAL_FAILURE(InitViewport());
12460 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12461
12462 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
12463 pipe_ms_state_ci.sType =
12464 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
12465 pipe_ms_state_ci.pNext = NULL;
12466 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12467 pipe_ms_state_ci.sampleShadingEnable = 0;
12468 pipe_ms_state_ci.minSampleShading = 1.0;
12469 pipe_ms_state_ci.pSampleMask = nullptr;
12470
12471 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12472 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12473 VkPipelineLayout pipeline_layout;
12474
12475 VkResult err = vkCreatePipelineLayout(m_device->device(),
12476 &pipeline_layout_ci, nullptr,
12477 &pipeline_layout);
12478 ASSERT_VK_SUCCESS(err);
12479
12480 VkShaderObj vs(m_device, bindStateVertShaderText,
12481 VK_SHADER_STAGE_VERTEX_BIT, this);
12482 VkShaderObj fs(m_device, bindStateFragShaderText,
12483 VK_SHADER_STAGE_FRAGMENT_BIT,
12484 this);
12485 VkPipelineObj pipe(m_device);
12486 pipe.AddShader(&vs);
12487 pipe.AddShader(&fs);
12488 pipe.AddColorAttachment();
12489 pipe.SetMSAA(&pipe_ms_state_ci);
12490 pipe.SetViewport(m_viewports);
12491 pipe.SetScissor(m_scissors);
12492 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12493
12494 BeginCommandBuffer();
12495 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
12496 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12497
12498 {
12499 // Create and bind a vertex buffer in a reduced scope, which will cause
12500 // it to be deleted upon leaving this scope
12501 const float vbo_data[3] = {1.f, 0.f, 1.f};
12502 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data),
12503 3, vbo_data);
12504 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
12505 draw_verticies.AddVertexInputToPipe(pipe);
12506 }
12507
12508 Draw(1, 0, 0, 0);
12509
12510 EndCommandBuffer();
12511
12512 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12513 deleted_buffer_in_command_buffer);
12514 QueueCommandBuffer(false);
12515 m_errorMonitor->VerifyFound();
12516
12517 {
12518 // Create and bind a vertex buffer in a reduced scope, and delete it
12519 // twice, the second through the destructor
12520 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12521 VkBufferTest::eDoubleDelete);
12522 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12523 double_destroy_message);
12524 buffer_test.TestDoubleDestroy();
12525 }
12526 m_errorMonitor->VerifyFound();
12527
12528 if (VkBufferTest::
12529 GetTestConditionValid(m_device,
12530 VkBufferTest::eInvalidMemoryOffset)) {
12531 // Create and bind a memory buffer with an invalid offset.
12532 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12533 invalid_offset_message);
12534 VkBufferTest buffer_test(m_device,
12535 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
12536 VkBufferTest::eInvalidMemoryOffset);
12537 (void) buffer_test;
12538 m_errorMonitor->VerifyFound();
12539 }
12540
12541 if (VkBufferTest::
12542 GetTestConditionValid(m_device,
12543 VkBufferTest::eInvalidDeviceOffset,
12544 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
12545 // Create and bind a memory buffer with an invalid offset again,
12546 // but look for a texel buffer message.
12547 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12548 invalid_texel_buffer_offset_message);
12549 VkBufferTest buffer_test(m_device,
12550 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
12551 VkBufferTest::eInvalidDeviceOffset);
12552 (void) buffer_test;
12553 m_errorMonitor->VerifyFound();
12554 }
12555
12556 if (VkBufferTest::
12557 GetTestConditionValid(m_device,
12558 VkBufferTest::eInvalidDeviceOffset,
12559 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
12560 // Create and bind a memory buffer with an invalid offset again, but
12561 // look for a uniform buffer message.
12562 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12563 invalid_uniform_buffer_offset_message);
12564 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
12565 VkBufferTest::eInvalidDeviceOffset);
12566 (void) buffer_test;
12567 m_errorMonitor->VerifyFound();
12568 }
12569
12570 if (VkBufferTest::
12571 GetTestConditionValid(m_device,
12572 VkBufferTest::eInvalidDeviceOffset,
12573 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
12574 // Create and bind a memory buffer with an invalid offset again, but
12575 // look for a storage buffer message.
12576 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12577 invalid_storage_buffer_offset_message);
12578 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12579 VkBufferTest::eInvalidDeviceOffset);
12580 (void) buffer_test;
12581 m_errorMonitor->VerifyFound();
12582 }
12583
12584 {
12585 // Attempt to bind a null buffer.
12586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12587 bind_null_buffer_message);
12588 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12589 VkBufferTest::eBindNullBuffer);
12590 (void) buffer_test;
12591 m_errorMonitor->VerifyFound();
12592 }
12593
12594 {
12595 // Attempt to use an invalid handle to delete a buffer.
12596 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12597 free_invalid_buffer_message);
12598 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12599 VkBufferTest::eFreeInvalidHandle);
12600 (void) buffer_test;
12601 }
12602 m_errorMonitor->VerifyFound();
12603
12604 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12605}
12606
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012607// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
12608TEST_F(VkLayerTest, InvalidImageLayout) {
12609 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
12610 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
12611 "images in the wrong layout when they're copied or transitioned.");
12612 // 3 in ValidateCmdBufImageLayouts
12613 // * -1 Attempt to submit cmd buf w/ deleted image
12614 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
12615 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
12616 m_errorMonitor->SetDesiredFailureMsg(
12617 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12618 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12619
12620 ASSERT_NO_FATAL_FAILURE(InitState());
12621 // Create src & dst images to use for copy operations
12622 VkImage src_image;
12623 VkImage dst_image;
12624
12625 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
12626 const int32_t tex_width = 32;
12627 const int32_t tex_height = 32;
12628
12629 VkImageCreateInfo image_create_info = {};
12630 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12631 image_create_info.pNext = NULL;
12632 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12633 image_create_info.format = tex_format;
12634 image_create_info.extent.width = tex_width;
12635 image_create_info.extent.height = tex_height;
12636 image_create_info.extent.depth = 1;
12637 image_create_info.mipLevels = 1;
12638 image_create_info.arrayLayers = 4;
12639 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
12640 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
12641 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
12642 image_create_info.flags = 0;
12643
12644 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
12645 ASSERT_VK_SUCCESS(err);
12646 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
12647 ASSERT_VK_SUCCESS(err);
12648
12649 BeginCommandBuffer();
12650 VkImageCopy copyRegion;
12651 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12652 copyRegion.srcSubresource.mipLevel = 0;
12653 copyRegion.srcSubresource.baseArrayLayer = 0;
12654 copyRegion.srcSubresource.layerCount = 1;
12655 copyRegion.srcOffset.x = 0;
12656 copyRegion.srcOffset.y = 0;
12657 copyRegion.srcOffset.z = 0;
12658 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12659 copyRegion.dstSubresource.mipLevel = 0;
12660 copyRegion.dstSubresource.baseArrayLayer = 0;
12661 copyRegion.dstSubresource.layerCount = 1;
12662 copyRegion.dstOffset.x = 0;
12663 copyRegion.dstOffset.y = 0;
12664 copyRegion.dstOffset.z = 0;
12665 copyRegion.extent.width = 1;
12666 copyRegion.extent.height = 1;
12667 copyRegion.extent.depth = 1;
12668 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12669 m_errorMonitor->VerifyFound();
12670 // Now cause error due to src image layout changing
12671 m_errorMonitor->SetDesiredFailureMsg(
12672 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12673 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
12674 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12675 m_errorMonitor->VerifyFound();
12676 // Final src error is due to bad layout type
12677 m_errorMonitor->SetDesiredFailureMsg(
12678 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12679 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
12680 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12681 m_errorMonitor->VerifyFound();
12682 // Now verify same checks for dst
12683 m_errorMonitor->SetDesiredFailureMsg(
12684 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12685 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
12686 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12687 m_errorMonitor->VerifyFound();
12688 // Now cause error due to src image layout changing
12689 m_errorMonitor->SetDesiredFailureMsg(
12690 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12691 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
12692 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
12693 m_errorMonitor->VerifyFound();
12694 m_errorMonitor->SetDesiredFailureMsg(
12695 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12696 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
12697 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
12698 m_errorMonitor->VerifyFound();
12699 // Now cause error due to bad image layout transition in PipelineBarrier
12700 VkImageMemoryBarrier image_barrier[1] = {};
12701 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12702 image_barrier[0].image = src_image;
12703 image_barrier[0].subresourceRange.layerCount = 2;
12704 image_barrier[0].subresourceRange.levelCount = 2;
12705 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12706 m_errorMonitor->SetDesiredFailureMsg(
12707 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12708 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
12709 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
12710 m_errorMonitor->VerifyFound();
12711
12712 // Finally some layout errors at RenderPass create time
12713 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
12714 VkAttachmentReference attach = {};
12715 // perf warning for GENERAL layout w/ non-DS input attachment
12716 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12717 VkSubpassDescription subpass = {};
12718 subpass.inputAttachmentCount = 1;
12719 subpass.pInputAttachments = &attach;
12720 VkRenderPassCreateInfo rpci = {};
12721 rpci.subpassCount = 1;
12722 rpci.pSubpasses = &subpass;
12723 rpci.attachmentCount = 1;
12724 VkAttachmentDescription attach_desc = {};
12725 attach_desc.format = VK_FORMAT_UNDEFINED;
12726 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012727 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012728 VkRenderPass rp;
12729 m_errorMonitor->SetDesiredFailureMsg(
12730 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12731 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
12732 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12733 m_errorMonitor->VerifyFound();
12734 // error w/ non-general layout
12735 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12736
12737 m_errorMonitor->SetDesiredFailureMsg(
12738 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12739 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
12740 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12741 m_errorMonitor->VerifyFound();
12742 subpass.inputAttachmentCount = 0;
12743 subpass.colorAttachmentCount = 1;
12744 subpass.pColorAttachments = &attach;
12745 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12746 // perf warning for GENERAL layout on color attachment
12747 m_errorMonitor->SetDesiredFailureMsg(
12748 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12749 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
12750 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12751 m_errorMonitor->VerifyFound();
12752 // error w/ non-color opt or GENERAL layout for color attachment
12753 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12754 m_errorMonitor->SetDesiredFailureMsg(
12755 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12756 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12757 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12758 m_errorMonitor->VerifyFound();
12759 subpass.colorAttachmentCount = 0;
12760 subpass.pDepthStencilAttachment = &attach;
12761 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12762 // perf warning for GENERAL layout on DS attachment
12763 m_errorMonitor->SetDesiredFailureMsg(
12764 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Chris Forbesc5dd9bc2016-08-09 08:17:14 +120012765 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012766 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12767 m_errorMonitor->VerifyFound();
12768 // error w/ non-ds opt or GENERAL layout for color attachment
12769 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12770 m_errorMonitor->SetDesiredFailureMsg(
12771 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesc5dd9bc2016-08-09 08:17:14 +120012772 "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 -060012773 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12774 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012775 // For this error we need a valid renderpass so create default one
12776 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12777 attach.attachment = 0;
12778 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
12779 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12780 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12781 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12782 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12783 // Can't do a CLEAR load on READ_ONLY initialLayout
12784 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12785 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12786 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12787 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12788 " with invalid first layout "
12789 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
12790 "ONLY_OPTIMAL");
12791 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12792 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012793
12794 vkDestroyImage(m_device->device(), src_image, NULL);
12795 vkDestroyImage(m_device->device(), dst_image, NULL);
12796}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012797
12798TEST_F(VkLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
12799 TEST_DESCRIPTION("Positive test where we create a renderpass with an "
12800 "attachment that uses LOAD_OP_CLEAR, the first subpass "
12801 "has a valid layout, and a second subpass then uses a "
12802 "valid *READ_ONLY* layout.");
12803 m_errorMonitor->ExpectSuccess();
12804 ASSERT_NO_FATAL_FAILURE(InitState());
12805
12806 VkAttachmentReference attach[2] = {};
12807 attach[0].attachment = 0;
12808 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
12809 attach[1].attachment = 0;
12810 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12811 VkSubpassDescription subpasses[2] = {};
12812 // First subpass clears DS attach on load
12813 subpasses[0].pDepthStencilAttachment = &attach[0];
12814 // 2nd subpass reads in DS as input attachment
12815 subpasses[1].inputAttachmentCount = 1;
12816 subpasses[1].pInputAttachments = &attach[1];
12817 VkAttachmentDescription attach_desc = {};
12818 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
12819 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12820 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12821 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12822 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12823 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12824 attach_desc.initialLayout =
12825 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
12826 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12827 VkRenderPassCreateInfo rpci = {};
12828 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
12829 rpci.attachmentCount = 1;
12830 rpci.pAttachments = &attach_desc;
12831 rpci.subpassCount = 2;
12832 rpci.pSubpasses = subpasses;
12833
12834 // Now create RenderPass and verify no errors
12835 VkRenderPass rp;
12836 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12837 m_errorMonitor->VerifyNotFound();
12838
12839 vkDestroyRenderPass(m_device->device(), rp, NULL);
12840}
Tobin Ehlis4af23302016-07-19 10:50:30 -060012841
12842TEST_F(VkLayerTest, FramebufferIncompatible) {
12843 TEST_DESCRIPTION("Bind a secondary command buffer with with a framebuffer "
12844 "that does not match the framebuffer for the active "
12845 "renderpass.");
12846 ASSERT_NO_FATAL_FAILURE(InitState());
12847 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12848
12849 // A renderpass with one color attachment.
12850 VkAttachmentDescription attachment = {
12851 0,
12852 VK_FORMAT_B8G8R8A8_UNORM,
12853 VK_SAMPLE_COUNT_1_BIT,
12854 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12855 VK_ATTACHMENT_STORE_OP_STORE,
12856 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12857 VK_ATTACHMENT_STORE_OP_DONT_CARE,
12858 VK_IMAGE_LAYOUT_UNDEFINED,
12859 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
12860
12861 VkAttachmentReference att_ref = {0,
12862 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
12863
12864 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS,
12865 0, nullptr,
12866 1, &att_ref,
12867 nullptr, nullptr,
12868 0, nullptr};
12869
12870 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
12871 nullptr,
12872 0,
12873 1,
12874 &attachment,
12875 1,
12876 &subpass,
12877 0,
12878 nullptr};
12879
12880 VkRenderPass rp;
12881 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
12882 ASSERT_VK_SUCCESS(err);
12883
12884 // A compatible framebuffer.
12885 VkImageObj image(m_device);
12886 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM,
12887 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12888 ASSERT_TRUE(image.initialized());
12889
12890 VkImageViewCreateInfo ivci = {
12891 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
12892 nullptr,
12893 0,
12894 image.handle(),
12895 VK_IMAGE_VIEW_TYPE_2D,
12896 VK_FORMAT_B8G8R8A8_UNORM,
12897 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
12898 VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
12899 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
12900 };
12901 VkImageView view;
12902 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
12903 ASSERT_VK_SUCCESS(err);
12904
12905 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
12906 nullptr,
12907 0,
12908 rp,
12909 1,
12910 &view,
12911 32,
12912 32,
12913 1};
12914 VkFramebuffer fb;
12915 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
12916 ASSERT_VK_SUCCESS(err);
12917
12918 VkCommandBufferAllocateInfo cbai = {};
12919 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12920 cbai.commandPool = m_commandPool;
12921 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12922 cbai.commandBufferCount = 1;
12923
12924 VkCommandBuffer sec_cb;
12925 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
12926 ASSERT_VK_SUCCESS(err);
12927 VkCommandBufferBeginInfo cbbi = {};
12928 VkCommandBufferInheritanceInfo cbii = {};
12929 cbii.renderPass = renderPass();
12930 cbii.framebuffer = fb;
12931 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12932 cbbi.pNext = NULL;
12933 cbbi.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
12934 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
12935 cbbi.pInheritanceInfo = &cbii;
12936 vkBeginCommandBuffer(sec_cb, &cbbi);
12937 vkEndCommandBuffer(sec_cb);
12938
12939 BeginCommandBuffer();
12940
12941 m_errorMonitor->SetDesiredFailureMsg(
12942 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12943 " that is not the same as the primaryCB's current active framebuffer ");
12944 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
12945 m_errorMonitor->VerifyFound();
12946 // Cleanup
12947 vkDestroyImageView(m_device->device(), view, NULL);
12948 vkDestroyRenderPass(m_device->device(), rp, NULL);
12949 vkDestroyFramebuffer(m_device->device(), fb, NULL);
12950}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012951
12952TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
12953 TEST_DESCRIPTION("If logicOp is available on the device, set it to an "
12954 "invalid value. If logicOp is not available, attempt to "
12955 "use it and verify that we see the correct error.");
12956 ASSERT_NO_FATAL_FAILURE(InitState());
12957 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12958
12959 auto features = m_device->phy().features();
12960 // Set the expected error depending on whether or not logicOp available
12961 if (VK_FALSE == features.logicOp) {
12962 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12963 "If logic operations feature not "
12964 "enabled, logicOpEnable must be "
12965 "VK_FALSE");
12966 } else {
12967 m_errorMonitor->SetDesiredFailureMsg(
12968 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12969 ", logicOp must be a valid VkLogicOp value");
12970 }
12971 // Create a pipeline using logicOp
12972 VkResult err;
12973
12974 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12975 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12976
12977 VkPipelineLayout pipeline_layout;
12978 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
12979 &pipeline_layout);
12980 ASSERT_VK_SUCCESS(err);
12981
12982 VkPipelineViewportStateCreateInfo vp_state_ci = {};
12983 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
12984 vp_state_ci.viewportCount = 1;
12985 VkViewport vp = {}; // Just need dummy vp to point to
12986 vp_state_ci.pViewports = &vp;
12987 vp_state_ci.scissorCount = 1;
12988 VkRect2D scissors = {}; // Dummy scissors to point to
12989 vp_state_ci.pScissors = &scissors;
12990 // No dynamic state
12991 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
12992 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
12993
12994 VkPipelineShaderStageCreateInfo shaderStages[2];
12995 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
12996
12997 VkShaderObj vs(m_device, bindStateVertShaderText,
12998 VK_SHADER_STAGE_VERTEX_BIT, this);
12999 VkShaderObj fs(m_device, bindStateFragShaderText,
13000 VK_SHADER_STAGE_FRAGMENT_BIT,
13001 this);
13002 shaderStages[0] = vs.GetStageCreateInfo();
13003 shaderStages[1] = fs.GetStageCreateInfo();
13004
13005 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13006 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13007
13008 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13009 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13010 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13011
13012 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13013 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13014
13015 VkPipelineColorBlendAttachmentState att = {};
13016 att.blendEnable = VK_FALSE;
13017 att.colorWriteMask = 0xf;
13018
13019 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13020 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13021 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13022 cb_ci.logicOpEnable = VK_TRUE;
13023 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
13024 cb_ci.attachmentCount = 1;
13025 cb_ci.pAttachments = &att;
13026
13027 VkGraphicsPipelineCreateInfo gp_ci = {};
13028 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13029 gp_ci.stageCount = 2;
13030 gp_ci.pStages = shaderStages;
13031 gp_ci.pVertexInputState = &vi_ci;
13032 gp_ci.pInputAssemblyState = &ia_ci;
13033 gp_ci.pViewportState = &vp_state_ci;
13034 gp_ci.pRasterizationState = &rs_ci;
13035 gp_ci.pColorBlendState = &cb_ci;
13036 gp_ci.pDynamicState = &dyn_state_ci;
13037 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13038 gp_ci.layout = pipeline_layout;
13039 gp_ci.renderPass = renderPass();
13040
13041 VkPipelineCacheCreateInfo pc_ci = {};
13042 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13043
13044 VkPipeline pipeline;
13045 VkPipelineCache pipelineCache;
13046 err =
13047 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
13048 ASSERT_VK_SUCCESS(err);
13049
13050 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
13051 &gp_ci, NULL, &pipeline);
13052 m_errorMonitor->VerifyFound();
13053 if (VK_SUCCESS == err) {
13054 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13055 }
13056 m_errorMonitor->VerifyFound();
13057 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13058 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13059}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013060#endif // DRAW_STATE_TESTS
13061
Tobin Ehlis0788f522015-05-26 16:11:58 -060013062#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060013063#if GTEST_IS_THREADSAFE
13064struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013065 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013066 VkEvent event;
13067 bool bailout;
13068};
13069
Karl Schultz6addd812016-02-02 17:17:23 -070013070extern "C" void *AddToCommandBuffer(void *arg) {
13071 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013072
Mike Stroyana6d14942016-07-13 15:10:05 -060013073 for (int i = 0; i < 80000; i++) {
Karl Schultz6addd812016-02-02 17:17:23 -070013074 vkCmdSetEvent(data->commandBuffer, data->event,
13075 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013076 if (data->bailout) {
13077 break;
13078 }
13079 }
13080 return NULL;
13081}
13082
Karl Schultz6addd812016-02-02 17:17:23 -070013083TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013084 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013085
Karl Schultz6addd812016-02-02 17:17:23 -070013086 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13087 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013088
Mike Stroyanaccf7692015-05-12 16:00:45 -060013089 ASSERT_NO_FATAL_FAILURE(InitState());
13090 ASSERT_NO_FATAL_FAILURE(InitViewport());
13091 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13092
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013093 // Calls AllocateCommandBuffers
13094 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013095
13096 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013097 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013098
13099 VkEventCreateInfo event_info;
13100 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013101 VkResult err;
13102
13103 memset(&event_info, 0, sizeof(event_info));
13104 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13105
Chia-I Wuf7458c52015-10-26 21:10:41 +080013106 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013107 ASSERT_VK_SUCCESS(err);
13108
Mike Stroyanaccf7692015-05-12 16:00:45 -060013109 err = vkResetEvent(device(), event);
13110 ASSERT_VK_SUCCESS(err);
13111
13112 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013113 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013114 data.event = event;
13115 data.bailout = false;
13116 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013117
13118 // First do some correct operations using multiple threads.
13119 // Add many entries to command buffer from another thread.
13120 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13121 // Make non-conflicting calls from this thread at the same time.
13122 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013123 uint32_t count;
13124 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013125 }
13126 test_platform_thread_join(thread, NULL);
13127
13128 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013129 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013130 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013131 // Add many entries to command buffer from this thread at the same time.
13132 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013133
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013134 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013135 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013136
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013137 m_errorMonitor->SetBailout(NULL);
13138
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013139 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013140
Chia-I Wuf7458c52015-10-26 21:10:41 +080013141 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013142}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013143#endif // GTEST_IS_THREADSAFE
13144#endif // THREADING_TESTS
13145
Chris Forbes9f7ff632015-05-25 11:13:08 +120013146#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070013147TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013148 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
13149 "with an impossible code size");
13150
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013151 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013152 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013153
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013154 ASSERT_NO_FATAL_FAILURE(InitState());
13155 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13156
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013157 VkShaderModule module;
13158 VkShaderModuleCreateInfo moduleCreateInfo;
13159 struct icd_spv_header spv;
13160
13161 spv.magic = ICD_SPV_MAGIC;
13162 spv.version = ICD_SPV_VERSION;
13163 spv.gen_magic = 0;
13164
13165 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13166 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013167 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013168 moduleCreateInfo.codeSize = 4;
13169 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013170 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013171
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013172 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013173}
13174
Karl Schultz6addd812016-02-02 17:17:23 -070013175TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013176 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
13177 "with a bad magic number");
13178
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013179 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013180 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013181
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013182 ASSERT_NO_FATAL_FAILURE(InitState());
13183 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13184
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013185 VkShaderModule module;
13186 VkShaderModuleCreateInfo moduleCreateInfo;
13187 struct icd_spv_header spv;
13188
13189 spv.magic = ~ICD_SPV_MAGIC;
13190 spv.version = ICD_SPV_VERSION;
13191 spv.gen_magic = 0;
13192
13193 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13194 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013195 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013196 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13197 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013198 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013199
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013200 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013201}
13202
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013203#if 0
13204// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013205TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013207 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013208
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013209 ASSERT_NO_FATAL_FAILURE(InitState());
13210 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13211
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013212 VkShaderModule module;
13213 VkShaderModuleCreateInfo moduleCreateInfo;
13214 struct icd_spv_header spv;
13215
13216 spv.magic = ICD_SPV_MAGIC;
13217 spv.version = ~ICD_SPV_VERSION;
13218 spv.gen_magic = 0;
13219
13220 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13221 moduleCreateInfo.pNext = NULL;
13222
Karl Schultz6addd812016-02-02 17:17:23 -070013223 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013224 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13225 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013226 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013227
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013228 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013229}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013230#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013231
Karl Schultz6addd812016-02-02 17:17:23 -070013232TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013233 TEST_DESCRIPTION("Test that a warning is produced for a vertex output that "
13234 "is not consumed by the fragment stage");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013236 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013237
Chris Forbes9f7ff632015-05-25 11:13:08 +120013238 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013239 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013240
13241 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013242 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120013243 "\n"
13244 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070013245 "out gl_PerVertex {\n"
13246 " vec4 gl_Position;\n"
13247 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120013248 "void main(){\n"
13249 " gl_Position = vec4(1);\n"
13250 " x = 0;\n"
13251 "}\n";
13252 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013253 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120013254 "\n"
13255 "layout(location=0) out vec4 color;\n"
13256 "void main(){\n"
13257 " color = vec4(1);\n"
13258 "}\n";
13259
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013260 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13261 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013262
13263 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013264 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013265 pipe.AddShader(&vs);
13266 pipe.AddShader(&fs);
13267
Chris Forbes9f7ff632015-05-25 11:13:08 +120013268 VkDescriptorSetObj descriptorSet(m_device);
13269 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013270 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013271
Tony Barbour5781e8f2015-08-04 16:23:11 -060013272 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013273
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013274 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013275}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013276
Karl Schultz6addd812016-02-02 17:17:23 -070013277TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013278 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
13279 "which is not present in the outputs of the previous stage");
13280
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013281 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013282 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013283
Chris Forbes59cb88d2015-05-25 11:13:13 +120013284 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013285 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013286
13287 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013288 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120013289 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013290 "out gl_PerVertex {\n"
13291 " vec4 gl_Position;\n"
13292 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120013293 "void main(){\n"
13294 " gl_Position = vec4(1);\n"
13295 "}\n";
13296 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013297 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120013298 "\n"
13299 "layout(location=0) in float x;\n"
13300 "layout(location=0) out vec4 color;\n"
13301 "void main(){\n"
13302 " color = vec4(x);\n"
13303 "}\n";
13304
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013305 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13306 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120013307
13308 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013309 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120013310 pipe.AddShader(&vs);
13311 pipe.AddShader(&fs);
13312
Chris Forbes59cb88d2015-05-25 11:13:13 +120013313 VkDescriptorSetObj descriptorSet(m_device);
13314 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013315 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120013316
Tony Barbour5781e8f2015-08-04 16:23:11 -060013317 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013318
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013319 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120013320}
13321
Karl Schultz6addd812016-02-02 17:17:23 -070013322TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013323 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
13324 "within an interace block, which is not present in the outputs "
13325 "of the previous stage.");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013326 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013327 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013328
13329 ASSERT_NO_FATAL_FAILURE(InitState());
13330 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13331
13332 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013333 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130013334 "\n"
13335 "out gl_PerVertex {\n"
13336 " vec4 gl_Position;\n"
13337 "};\n"
13338 "void main(){\n"
13339 " gl_Position = vec4(1);\n"
13340 "}\n";
13341 char const *fsSource =
13342 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130013343 "\n"
13344 "in block { layout(location=0) float x; } ins;\n"
13345 "layout(location=0) out vec4 color;\n"
13346 "void main(){\n"
13347 " color = vec4(ins.x);\n"
13348 "}\n";
13349
13350 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13351 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13352
13353 VkPipelineObj pipe(m_device);
13354 pipe.AddColorAttachment();
13355 pipe.AddShader(&vs);
13356 pipe.AddShader(&fs);
13357
13358 VkDescriptorSetObj descriptorSet(m_device);
13359 descriptorSet.AppendDummy();
13360 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13361
13362 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13363
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013364 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013365}
13366
Karl Schultz6addd812016-02-02 17:17:23 -070013367TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013368 TEST_DESCRIPTION("Test that an error is produced for mismatched array sizes "
13369 "across the VS->FS interface");
Chris Forbes0036fd12016-01-26 14:19:49 +130013370 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +130013371 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -070013372 "output arr[2] of float32' vs 'ptr to "
13373 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130013374
13375 ASSERT_NO_FATAL_FAILURE(InitState());
13376 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13377
13378 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013379 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130013380 "\n"
13381 "layout(location=0) out float x[2];\n"
13382 "out gl_PerVertex {\n"
13383 " vec4 gl_Position;\n"
13384 "};\n"
13385 "void main(){\n"
13386 " x[0] = 0; x[1] = 0;\n"
13387 " gl_Position = vec4(1);\n"
13388 "}\n";
13389 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013390 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130013391 "\n"
13392 "layout(location=0) in float x[3];\n"
13393 "layout(location=0) out vec4 color;\n"
13394 "void main(){\n"
13395 " color = vec4(x[0] + x[1] + x[2]);\n"
13396 "}\n";
13397
13398 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13399 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13400
13401 VkPipelineObj pipe(m_device);
13402 pipe.AddColorAttachment();
13403 pipe.AddShader(&vs);
13404 pipe.AddShader(&fs);
13405
13406 VkDescriptorSetObj descriptorSet(m_device);
13407 descriptorSet.AppendDummy();
13408 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13409
13410 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13411
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013412 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130013413}
13414
Karl Schultz6addd812016-02-02 17:17:23 -070013415TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013416 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
13417 "the VS->FS interface");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013418 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013419 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013420
Chris Forbesb56af562015-05-25 11:13:17 +120013421 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013422 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120013423
13424 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013425 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120013426 "\n"
13427 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070013428 "out gl_PerVertex {\n"
13429 " vec4 gl_Position;\n"
13430 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +120013431 "void main(){\n"
13432 " x = 0;\n"
13433 " gl_Position = vec4(1);\n"
13434 "}\n";
13435 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013436 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120013437 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013438 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +120013439 "layout(location=0) out vec4 color;\n"
13440 "void main(){\n"
13441 " color = vec4(x);\n"
13442 "}\n";
13443
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013444 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13445 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120013446
13447 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013448 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120013449 pipe.AddShader(&vs);
13450 pipe.AddShader(&fs);
13451
Chris Forbesb56af562015-05-25 11:13:17 +120013452 VkDescriptorSetObj descriptorSet(m_device);
13453 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013454 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120013455
Tony Barbour5781e8f2015-08-04 16:23:11 -060013456 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120013457
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013458 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120013459}
13460
Karl Schultz6addd812016-02-02 17:17:23 -070013461TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013462 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
13463 "the VS->FS interface, when the variable is contained within "
13464 "an interface block");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013466 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013467
13468 ASSERT_NO_FATAL_FAILURE(InitState());
13469 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13470
13471 char const *vsSource =
13472 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130013473 "\n"
13474 "out block { layout(location=0) int x; } outs;\n"
13475 "out gl_PerVertex {\n"
13476 " vec4 gl_Position;\n"
13477 "};\n"
13478 "void main(){\n"
13479 " outs.x = 0;\n"
13480 " gl_Position = vec4(1);\n"
13481 "}\n";
13482 char const *fsSource =
13483 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130013484 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013485 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +130013486 "layout(location=0) out vec4 color;\n"
13487 "void main(){\n"
13488 " color = vec4(ins.x);\n"
13489 "}\n";
13490
13491 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13492 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13493
13494 VkPipelineObj pipe(m_device);
13495 pipe.AddColorAttachment();
13496 pipe.AddShader(&vs);
13497 pipe.AddShader(&fs);
13498
13499 VkDescriptorSetObj descriptorSet(m_device);
13500 descriptorSet.AppendDummy();
13501 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13502
13503 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13504
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013505 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013506}
13507
13508TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013509 TEST_DESCRIPTION("Test that an error is produced for location mismatches across "
13510 "the VS->FS interface; This should manifest as a not-written/not-consumed "
13511 "pair, but flushes out broken walking of the interfaces");
Chris Forbese9928822016-02-17 14:44:52 +130013512 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13513 "location 0.0 which is not written by vertex shader");
13514
13515 ASSERT_NO_FATAL_FAILURE(InitState());
13516 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13517
13518 char const *vsSource =
13519 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013520 "\n"
13521 "out block { layout(location=1) float x; } outs;\n"
13522 "out gl_PerVertex {\n"
13523 " vec4 gl_Position;\n"
13524 "};\n"
13525 "void main(){\n"
13526 " outs.x = 0;\n"
13527 " gl_Position = vec4(1);\n"
13528 "}\n";
13529 char const *fsSource =
13530 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013531 "\n"
13532 "in block { layout(location=0) float x; } ins;\n"
13533 "layout(location=0) out vec4 color;\n"
13534 "void main(){\n"
13535 " color = vec4(ins.x);\n"
13536 "}\n";
13537
13538 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13539 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13540
13541 VkPipelineObj pipe(m_device);
13542 pipe.AddColorAttachment();
13543 pipe.AddShader(&vs);
13544 pipe.AddShader(&fs);
13545
13546 VkDescriptorSetObj descriptorSet(m_device);
13547 descriptorSet.AppendDummy();
13548 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13549
13550 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13551
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013552 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013553}
13554
13555TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013556 TEST_DESCRIPTION("Test that an error is produced for component mismatches across the "
13557 "VS->FS interface. It's not enough to have the same set of locations in "
13558 "use; matching is defined in terms of spirv variables.");
Chris Forbese9928822016-02-17 14:44:52 +130013559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13560 "location 0.1 which is not written by vertex shader");
13561
13562 ASSERT_NO_FATAL_FAILURE(InitState());
13563 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13564
13565 char const *vsSource =
13566 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013567 "\n"
13568 "out block { layout(location=0, component=0) float x; } outs;\n"
13569 "out gl_PerVertex {\n"
13570 " vec4 gl_Position;\n"
13571 "};\n"
13572 "void main(){\n"
13573 " outs.x = 0;\n"
13574 " gl_Position = vec4(1);\n"
13575 "}\n";
13576 char const *fsSource =
13577 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013578 "\n"
13579 "in block { layout(location=0, component=1) float x; } ins;\n"
13580 "layout(location=0) out vec4 color;\n"
13581 "void main(){\n"
13582 " color = vec4(ins.x);\n"
13583 "}\n";
13584
13585 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13586 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13587
13588 VkPipelineObj pipe(m_device);
13589 pipe.AddColorAttachment();
13590 pipe.AddShader(&vs);
13591 pipe.AddShader(&fs);
13592
13593 VkDescriptorSetObj descriptorSet(m_device);
13594 descriptorSet.AppendDummy();
13595 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13596
13597 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13598
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013599 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013600}
13601
Karl Schultz6addd812016-02-02 17:17:23 -070013602TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013603 TEST_DESCRIPTION("Test that a warning is produced for a vertex attribute which is "
13604 "not consumed by the vertex shader");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013605 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013606 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013607
Chris Forbesde136e02015-05-25 11:13:28 +120013608 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013609 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120013610
13611 VkVertexInputBindingDescription input_binding;
13612 memset(&input_binding, 0, sizeof(input_binding));
13613
13614 VkVertexInputAttributeDescription input_attrib;
13615 memset(&input_attrib, 0, sizeof(input_attrib));
13616 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13617
13618 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013619 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120013620 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013621 "out gl_PerVertex {\n"
13622 " vec4 gl_Position;\n"
13623 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +120013624 "void main(){\n"
13625 " gl_Position = vec4(1);\n"
13626 "}\n";
13627 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013628 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120013629 "\n"
13630 "layout(location=0) out vec4 color;\n"
13631 "void main(){\n"
13632 " color = vec4(1);\n"
13633 "}\n";
13634
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013635 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13636 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120013637
13638 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013639 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120013640 pipe.AddShader(&vs);
13641 pipe.AddShader(&fs);
13642
13643 pipe.AddVertexInputBindings(&input_binding, 1);
13644 pipe.AddVertexInputAttribs(&input_attrib, 1);
13645
Chris Forbesde136e02015-05-25 11:13:28 +120013646 VkDescriptorSetObj descriptorSet(m_device);
13647 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013648 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120013649
Tony Barbour5781e8f2015-08-04 16:23:11 -060013650 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120013651
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013652 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120013653}
13654
Karl Schultz6addd812016-02-02 17:17:23 -070013655TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013656 TEST_DESCRIPTION("Test that a warning is produced for a location mismatch on "
13657 "vertex attributes. This flushes out bad behavior in the interface walker");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013659 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +130013660
13661 ASSERT_NO_FATAL_FAILURE(InitState());
13662 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13663
13664 VkVertexInputBindingDescription input_binding;
13665 memset(&input_binding, 0, sizeof(input_binding));
13666
13667 VkVertexInputAttributeDescription input_attrib;
13668 memset(&input_attrib, 0, sizeof(input_attrib));
13669 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13670
13671 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013672 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130013673 "\n"
13674 "layout(location=1) in float x;\n"
13675 "out gl_PerVertex {\n"
13676 " vec4 gl_Position;\n"
13677 "};\n"
13678 "void main(){\n"
13679 " gl_Position = vec4(x);\n"
13680 "}\n";
13681 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013682 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130013683 "\n"
13684 "layout(location=0) out vec4 color;\n"
13685 "void main(){\n"
13686 " color = vec4(1);\n"
13687 "}\n";
13688
13689 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13690 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13691
13692 VkPipelineObj pipe(m_device);
13693 pipe.AddColorAttachment();
13694 pipe.AddShader(&vs);
13695 pipe.AddShader(&fs);
13696
13697 pipe.AddVertexInputBindings(&input_binding, 1);
13698 pipe.AddVertexInputAttribs(&input_attrib, 1);
13699
13700 VkDescriptorSetObj descriptorSet(m_device);
13701 descriptorSet.AppendDummy();
13702 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13703
13704 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13705
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013706 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130013707}
13708
Karl Schultz6addd812016-02-02 17:17:23 -070013709TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013710 TEST_DESCRIPTION("Test that an error is produced for a VS input which is not "
13711 "provided by a vertex attribute");
Karl Schultz6addd812016-02-02 17:17:23 -070013712 m_errorMonitor->SetDesiredFailureMsg(
13713 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013714 "VS consumes input at location 0 but not provided");
13715
Chris Forbes62e8e502015-05-25 11:13:29 +120013716 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013717 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120013718
13719 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013720 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120013721 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013722 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -070013723 "out gl_PerVertex {\n"
13724 " vec4 gl_Position;\n"
13725 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120013726 "void main(){\n"
13727 " gl_Position = x;\n"
13728 "}\n";
13729 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013730 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120013731 "\n"
13732 "layout(location=0) out vec4 color;\n"
13733 "void main(){\n"
13734 " color = vec4(1);\n"
13735 "}\n";
13736
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013737 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13738 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120013739
13740 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013741 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120013742 pipe.AddShader(&vs);
13743 pipe.AddShader(&fs);
13744
Chris Forbes62e8e502015-05-25 11:13:29 +120013745 VkDescriptorSetObj descriptorSet(m_device);
13746 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013747 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120013748
Tony Barbour5781e8f2015-08-04 16:23:11 -060013749 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120013750
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013751 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120013752}
13753
Karl Schultz6addd812016-02-02 17:17:23 -070013754TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013755 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the "
13756 "fundamental type (float/int/uint) of an attribute and the "
13757 "VS input that consumes it");
Karl Schultz6addd812016-02-02 17:17:23 -070013758 m_errorMonitor->SetDesiredFailureMsg(
13759 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013760 "location 0 does not match VS input type");
13761
Chris Forbesc97d98e2015-05-25 11:13:31 +120013762 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013763 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013764
13765 VkVertexInputBindingDescription input_binding;
13766 memset(&input_binding, 0, sizeof(input_binding));
13767
13768 VkVertexInputAttributeDescription input_attrib;
13769 memset(&input_attrib, 0, sizeof(input_attrib));
13770 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13771
13772 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013773 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120013774 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013775 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070013776 "out gl_PerVertex {\n"
13777 " vec4 gl_Position;\n"
13778 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120013779 "void main(){\n"
13780 " gl_Position = vec4(x);\n"
13781 "}\n";
13782 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013783 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120013784 "\n"
13785 "layout(location=0) out vec4 color;\n"
13786 "void main(){\n"
13787 " color = vec4(1);\n"
13788 "}\n";
13789
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013790 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13791 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013792
13793 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013794 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013795 pipe.AddShader(&vs);
13796 pipe.AddShader(&fs);
13797
13798 pipe.AddVertexInputBindings(&input_binding, 1);
13799 pipe.AddVertexInputAttribs(&input_attrib, 1);
13800
Chris Forbesc97d98e2015-05-25 11:13:31 +120013801 VkDescriptorSetObj descriptorSet(m_device);
13802 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013803 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013804
Tony Barbour5781e8f2015-08-04 16:23:11 -060013805 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013806
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013807 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013808}
13809
Chris Forbesc68b43c2016-04-06 11:18:47 +120013810TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013811 TEST_DESCRIPTION("Test that an error is produced for a pipeline containing multiple "
13812 "shaders for the same stage");
Chris Forbesc68b43c2016-04-06 11:18:47 +120013813 m_errorMonitor->SetDesiredFailureMsg(
13814 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13815 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
13816
13817 ASSERT_NO_FATAL_FAILURE(InitState());
13818 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13819
13820 char const *vsSource =
13821 "#version 450\n"
13822 "\n"
13823 "out gl_PerVertex {\n"
13824 " vec4 gl_Position;\n"
13825 "};\n"
13826 "void main(){\n"
13827 " gl_Position = vec4(1);\n"
13828 "}\n";
13829 char const *fsSource =
13830 "#version 450\n"
13831 "\n"
13832 "layout(location=0) out vec4 color;\n"
13833 "void main(){\n"
13834 " color = vec4(1);\n"
13835 "}\n";
13836
13837 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13838 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13839
13840 VkPipelineObj pipe(m_device);
13841 pipe.AddColorAttachment();
13842 pipe.AddShader(&vs);
13843 pipe.AddShader(&vs);
13844 pipe.AddShader(&fs);
13845
13846 VkDescriptorSetObj descriptorSet(m_device);
13847 descriptorSet.AppendDummy();
13848 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13849
13850 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13851
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013852 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120013853}
13854
Karl Schultz6addd812016-02-02 17:17:23 -070013855TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013856 TEST_DESCRIPTION("Test that pipeline validation accepts matrices passed "
13857 "as vertex attributes");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013858 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130013859
13860 ASSERT_NO_FATAL_FAILURE(InitState());
13861 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13862
13863 VkVertexInputBindingDescription input_binding;
13864 memset(&input_binding, 0, sizeof(input_binding));
13865
13866 VkVertexInputAttributeDescription input_attribs[2];
13867 memset(input_attribs, 0, sizeof(input_attribs));
13868
13869 for (int i = 0; i < 2; i++) {
13870 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
13871 input_attribs[i].location = i;
13872 }
13873
13874 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013875 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013876 "\n"
13877 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070013878 "out gl_PerVertex {\n"
13879 " vec4 gl_Position;\n"
13880 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013881 "void main(){\n"
13882 " gl_Position = x[0] + x[1];\n"
13883 "}\n";
13884 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013885 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013886 "\n"
13887 "layout(location=0) out vec4 color;\n"
13888 "void main(){\n"
13889 " color = vec4(1);\n"
13890 "}\n";
13891
13892 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13893 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13894
13895 VkPipelineObj pipe(m_device);
13896 pipe.AddColorAttachment();
13897 pipe.AddShader(&vs);
13898 pipe.AddShader(&fs);
13899
13900 pipe.AddVertexInputBindings(&input_binding, 1);
13901 pipe.AddVertexInputAttribs(input_attribs, 2);
13902
13903 VkDescriptorSetObj descriptorSet(m_device);
13904 descriptorSet.AppendDummy();
13905 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13906
13907 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13908
13909 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013910 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130013911}
13912
Chris Forbes2682b242015-11-24 11:13:14 +130013913TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
13914{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013915 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130013916
13917 ASSERT_NO_FATAL_FAILURE(InitState());
13918 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13919
13920 VkVertexInputBindingDescription input_binding;
13921 memset(&input_binding, 0, sizeof(input_binding));
13922
13923 VkVertexInputAttributeDescription input_attribs[2];
13924 memset(input_attribs, 0, sizeof(input_attribs));
13925
13926 for (int i = 0; i < 2; i++) {
13927 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
13928 input_attribs[i].location = i;
13929 }
13930
13931 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013932 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013933 "\n"
13934 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -070013935 "out gl_PerVertex {\n"
13936 " vec4 gl_Position;\n"
13937 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013938 "void main(){\n"
13939 " gl_Position = x[0] + x[1];\n"
13940 "}\n";
13941 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013942 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013943 "\n"
13944 "layout(location=0) out vec4 color;\n"
13945 "void main(){\n"
13946 " color = vec4(1);\n"
13947 "}\n";
13948
13949 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13950 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13951
13952 VkPipelineObj pipe(m_device);
13953 pipe.AddColorAttachment();
13954 pipe.AddShader(&vs);
13955 pipe.AddShader(&fs);
13956
13957 pipe.AddVertexInputBindings(&input_binding, 1);
13958 pipe.AddVertexInputAttribs(input_attribs, 2);
13959
13960 VkDescriptorSetObj descriptorSet(m_device);
13961 descriptorSet.AppendDummy();
13962 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13963
13964 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13965
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013966 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130013967}
Chris Forbes2682b242015-11-24 11:13:14 +130013968
Chris Forbesbc290ce2016-07-06 12:01:49 +120013969TEST_F(VkLayerTest, CreatePipelineAttribComponents)
13970{
Chris Forbes1cc79542016-07-20 11:13:44 +120013971 TEST_DESCRIPTION("Test that pipeline validation accepts consuming a vertex attribute "
13972 "through multiple VS inputs, each consuming a different subset of the "
13973 "components.");
Chris Forbesbc290ce2016-07-06 12:01:49 +120013974 m_errorMonitor->ExpectSuccess();
13975
13976 ASSERT_NO_FATAL_FAILURE(InitState());
13977 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13978
13979 VkVertexInputBindingDescription input_binding;
13980 memset(&input_binding, 0, sizeof(input_binding));
13981
13982 VkVertexInputAttributeDescription input_attribs[3];
13983 memset(input_attribs, 0, sizeof(input_attribs));
13984
13985 for (int i = 0; i < 3; i++) {
13986 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
13987 input_attribs[i].location = i;
13988 }
13989
13990 char const *vsSource =
13991 "#version 450\n"
13992 "\n"
13993 "layout(location=0) in vec4 x;\n"
13994 "layout(location=1) in vec3 y1;\n"
13995 "layout(location=1, component=3) in float y2;\n"
13996 "layout(location=2) in vec4 z;\n"
13997 "out gl_PerVertex {\n"
13998 " vec4 gl_Position;\n"
13999 "};\n"
14000 "void main(){\n"
14001 " gl_Position = x + vec4(y1, y2) + z;\n"
14002 "}\n";
14003 char const *fsSource =
14004 "#version 450\n"
14005 "\n"
14006 "layout(location=0) out vec4 color;\n"
14007 "void main(){\n"
14008 " color = vec4(1);\n"
14009 "}\n";
14010
14011 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14012 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14013
14014 VkPipelineObj pipe(m_device);
14015 pipe.AddColorAttachment();
14016 pipe.AddShader(&vs);
14017 pipe.AddShader(&fs);
14018
14019 pipe.AddVertexInputBindings(&input_binding, 1);
14020 pipe.AddVertexInputAttribs(input_attribs, 3);
14021
14022 VkDescriptorSetObj descriptorSet(m_device);
14023 descriptorSet.AppendDummy();
14024 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14025
14026 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14027
14028 m_errorMonitor->VerifyNotFound();
14029}
14030
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014031TEST_F(VkLayerTest, CreatePipelineSimplePositive)
14032{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014033 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014034
14035 ASSERT_NO_FATAL_FAILURE(InitState());
14036 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14037
14038 char const *vsSource =
14039 "#version 450\n"
14040 "out gl_PerVertex {\n"
14041 " vec4 gl_Position;\n"
14042 "};\n"
14043 "void main(){\n"
14044 " gl_Position = vec4(0);\n"
14045 "}\n";
14046 char const *fsSource =
14047 "#version 450\n"
14048 "\n"
14049 "layout(location=0) out vec4 color;\n"
14050 "void main(){\n"
14051 " color = vec4(1);\n"
14052 "}\n";
14053
14054 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14055 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14056
14057 VkPipelineObj pipe(m_device);
14058 pipe.AddColorAttachment();
14059 pipe.AddShader(&vs);
14060 pipe.AddShader(&fs);
14061
14062 VkDescriptorSetObj descriptorSet(m_device);
14063 descriptorSet.AppendDummy();
14064 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14065
14066 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14067
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014068 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014069}
14070
Chris Forbes912c9192016-04-05 17:50:35 +120014071TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
14072{
Chris Forbes1cc79542016-07-20 11:13:44 +120014073 TEST_DESCRIPTION("Test that pipeline validation accepts the relaxed type matching rules "
14074 "set out in 14.1.3: fundamental type must match, and producer side must "
14075 "have at least as many components");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014076 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +120014077
14078 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
14079
14080 ASSERT_NO_FATAL_FAILURE(InitState());
14081 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14082
14083 char const *vsSource =
14084 "#version 450\n"
14085 "out gl_PerVertex {\n"
14086 " vec4 gl_Position;\n"
14087 "};\n"
14088 "layout(location=0) out vec3 x;\n"
14089 "layout(location=1) out ivec3 y;\n"
14090 "layout(location=2) out vec3 z;\n"
14091 "void main(){\n"
14092 " gl_Position = vec4(0);\n"
14093 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
14094 "}\n";
14095 char const *fsSource =
14096 "#version 450\n"
14097 "\n"
14098 "layout(location=0) out vec4 color;\n"
14099 "layout(location=0) in float x;\n"
14100 "layout(location=1) flat in int y;\n"
14101 "layout(location=2) in vec2 z;\n"
14102 "void main(){\n"
14103 " color = vec4(1 + x + y + z.x);\n"
14104 "}\n";
14105
14106 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14107 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14108
14109 VkPipelineObj pipe(m_device);
14110 pipe.AddColorAttachment();
14111 pipe.AddShader(&vs);
14112 pipe.AddShader(&fs);
14113
14114 VkDescriptorSetObj descriptorSet(m_device);
14115 descriptorSet.AppendDummy();
14116 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14117
Mike Stroyan255e9582016-06-24 09:49:32 -060014118 VkResult err = VK_SUCCESS;
14119 err =
14120 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14121 ASSERT_VK_SUCCESS(err);
14122
Chris Forbes912c9192016-04-05 17:50:35 +120014123
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014124 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +120014125}
14126
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014127TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
14128{
Chris Forbes1cc79542016-07-20 11:13:44 +120014129 TEST_DESCRIPTION("Test that pipeline validation accepts per-vertex variables "
14130 "passed between the TCS and TES stages");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014131 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014132
14133 ASSERT_NO_FATAL_FAILURE(InitState());
14134 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14135
Chris Forbesc1e852d2016-04-04 19:26:42 +120014136 if (!m_device->phy().features().tessellationShader) {
14137 printf("Device does not support tessellation shaders; skipped.\n");
14138 return;
14139 }
14140
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014141 char const *vsSource =
14142 "#version 450\n"
14143 "void main(){}\n";
14144 char const *tcsSource =
14145 "#version 450\n"
14146 "layout(location=0) out int x[];\n"
14147 "layout(vertices=3) out;\n"
14148 "void main(){\n"
14149 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14150 " gl_TessLevelInner[0] = 1;\n"
14151 " x[gl_InvocationID] = gl_InvocationID;\n"
14152 "}\n";
14153 char const *tesSource =
14154 "#version 450\n"
14155 "layout(triangles, equal_spacing, cw) in;\n"
14156 "layout(location=0) in int x[];\n"
14157 "out gl_PerVertex { vec4 gl_Position; };\n"
14158 "void main(){\n"
14159 " gl_Position.xyz = gl_TessCoord;\n"
14160 " gl_Position.w = x[0] + x[1] + x[2];\n"
14161 "}\n";
14162 char const *fsSource =
14163 "#version 450\n"
14164 "layout(location=0) out vec4 color;\n"
14165 "void main(){\n"
14166 " color = vec4(1);\n"
14167 "}\n";
14168
14169 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14170 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14171 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14172 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14173
14174 VkPipelineInputAssemblyStateCreateInfo iasci{
14175 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
14176 nullptr,
14177 0,
14178 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
14179 VK_FALSE};
14180
Chris Forbesb4cacb62016-04-04 19:15:00 +120014181 VkPipelineTessellationStateCreateInfo tsci{
14182 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
14183 nullptr,
14184 0,
14185 3};
14186
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014187 VkPipelineObj pipe(m_device);
14188 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +120014189 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014190 pipe.AddColorAttachment();
14191 pipe.AddShader(&vs);
14192 pipe.AddShader(&tcs);
14193 pipe.AddShader(&tes);
14194 pipe.AddShader(&fs);
14195
14196 VkDescriptorSetObj descriptorSet(m_device);
14197 descriptorSet.AppendDummy();
14198 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14199
14200 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14201
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014202 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120014203}
14204
Chris Forbesa0ab8152016-04-20 13:34:27 +120014205TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
14206{
Chris Forbes1cc79542016-07-20 11:13:44 +120014207 TEST_DESCRIPTION("Test that pipeline validation accepts a user-defined "
14208 "interface block passed into the geometry shader. This "
14209 "is interesting because the 'extra' array level is not "
14210 "present on the member type, but on the block instance.");
Chris Forbesa0ab8152016-04-20 13:34:27 +120014211 m_errorMonitor->ExpectSuccess();
14212
14213 ASSERT_NO_FATAL_FAILURE(InitState());
14214 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14215
14216 if (!m_device->phy().features().geometryShader) {
14217 printf("Device does not support geometry shaders; skipped.\n");
14218 return;
14219 }
14220
14221 char const *vsSource =
14222 "#version 450\n"
14223 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
14224 "void main(){\n"
14225 " vs_out.x = vec4(1);\n"
14226 "}\n";
14227 char const *gsSource =
14228 "#version 450\n"
14229 "layout(triangles) in;\n"
14230 "layout(triangle_strip, max_vertices=3) out;\n"
14231 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
14232 "out gl_PerVertex { vec4 gl_Position; };\n"
14233 "void main() {\n"
14234 " gl_Position = gs_in[0].x;\n"
14235 " EmitVertex();\n"
14236 "}\n";
14237 char const *fsSource =
14238 "#version 450\n"
14239 "layout(location=0) out vec4 color;\n"
14240 "void main(){\n"
14241 " color = vec4(1);\n"
14242 "}\n";
14243
14244 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14245 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
14246 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14247
14248 VkPipelineObj pipe(m_device);
14249 pipe.AddColorAttachment();
14250 pipe.AddShader(&vs);
14251 pipe.AddShader(&gs);
14252 pipe.AddShader(&fs);
14253
14254 VkDescriptorSetObj descriptorSet(m_device);
14255 descriptorSet.AppendDummy();
14256 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14257
14258 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14259
14260 m_errorMonitor->VerifyNotFound();
14261}
14262
Chris Forbesa0193bc2016-04-04 19:19:47 +120014263TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
14264{
Chris Forbes1cc79542016-07-20 11:13:44 +120014265 TEST_DESCRIPTION("Test that an error is produced for a variable output from "
14266 "the TCS without the patch decoration, but consumed in the TES "
14267 "with the decoration.");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014268 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14269 "is per-vertex in tessellation control shader stage "
14270 "but per-patch in tessellation evaluation shader stage");
14271
14272 ASSERT_NO_FATAL_FAILURE(InitState());
14273 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14274
Chris Forbesc1e852d2016-04-04 19:26:42 +120014275 if (!m_device->phy().features().tessellationShader) {
14276 printf("Device does not support tessellation shaders; skipped.\n");
14277 return;
14278 }
14279
Chris Forbesa0193bc2016-04-04 19:19:47 +120014280 char const *vsSource =
14281 "#version 450\n"
14282 "void main(){}\n";
14283 char const *tcsSource =
14284 "#version 450\n"
14285 "layout(location=0) out int x[];\n"
14286 "layout(vertices=3) out;\n"
14287 "void main(){\n"
14288 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14289 " gl_TessLevelInner[0] = 1;\n"
14290 " x[gl_InvocationID] = gl_InvocationID;\n"
14291 "}\n";
14292 char const *tesSource =
14293 "#version 450\n"
14294 "layout(triangles, equal_spacing, cw) in;\n"
14295 "layout(location=0) patch in int x;\n"
14296 "out gl_PerVertex { vec4 gl_Position; };\n"
14297 "void main(){\n"
14298 " gl_Position.xyz = gl_TessCoord;\n"
14299 " gl_Position.w = x;\n"
14300 "}\n";
14301 char const *fsSource =
14302 "#version 450\n"
14303 "layout(location=0) out vec4 color;\n"
14304 "void main(){\n"
14305 " color = vec4(1);\n"
14306 "}\n";
14307
14308 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14309 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14310 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14311 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14312
14313 VkPipelineInputAssemblyStateCreateInfo iasci{
14314 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
14315 nullptr,
14316 0,
14317 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
14318 VK_FALSE};
14319
14320 VkPipelineTessellationStateCreateInfo tsci{
14321 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
14322 nullptr,
14323 0,
14324 3};
14325
14326 VkPipelineObj pipe(m_device);
14327 pipe.SetInputAssembly(&iasci);
14328 pipe.SetTessellation(&tsci);
14329 pipe.AddColorAttachment();
14330 pipe.AddShader(&vs);
14331 pipe.AddShader(&tcs);
14332 pipe.AddShader(&tes);
14333 pipe.AddShader(&fs);
14334
14335 VkDescriptorSetObj descriptorSet(m_device);
14336 descriptorSet.AppendDummy();
14337 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14338
14339 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14340
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014341 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014342}
14343
Karl Schultz6addd812016-02-02 17:17:23 -070014344TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014345 TEST_DESCRIPTION("Test that an error is produced for a vertex attribute setup where multiple "
14346 "bindings provide the same location");
Karl Schultz6addd812016-02-02 17:17:23 -070014347 m_errorMonitor->SetDesiredFailureMsg(
14348 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014349 "Duplicate vertex input binding descriptions for binding 0");
14350
Chris Forbes280ba2c2015-06-12 11:16:41 +120014351 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014352 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014353
14354 /* Two binding descriptions for binding 0 */
14355 VkVertexInputBindingDescription input_bindings[2];
14356 memset(input_bindings, 0, sizeof(input_bindings));
14357
14358 VkVertexInputAttributeDescription input_attrib;
14359 memset(&input_attrib, 0, sizeof(input_attrib));
14360 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14361
14362 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014363 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120014364 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070014365 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070014366 "out gl_PerVertex {\n"
14367 " vec4 gl_Position;\n"
14368 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120014369 "void main(){\n"
14370 " gl_Position = vec4(x);\n"
14371 "}\n";
14372 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014373 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120014374 "\n"
14375 "layout(location=0) out vec4 color;\n"
14376 "void main(){\n"
14377 " color = vec4(1);\n"
14378 "}\n";
14379
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014380 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14381 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014382
14383 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014384 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014385 pipe.AddShader(&vs);
14386 pipe.AddShader(&fs);
14387
14388 pipe.AddVertexInputBindings(input_bindings, 2);
14389 pipe.AddVertexInputAttribs(&input_attrib, 1);
14390
Chris Forbes280ba2c2015-06-12 11:16:41 +120014391 VkDescriptorSetObj descriptorSet(m_device);
14392 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014393 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014394
Tony Barbour5781e8f2015-08-04 16:23:11 -060014395 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014396
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014397 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014398}
Chris Forbes8f68b562015-05-25 11:13:32 +120014399
Chris Forbes35efec72016-04-21 14:32:08 +120014400TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014401 TEST_DESCRIPTION("Test that pipeline validation accepts basic use of 64bit vertex "
14402 "attributes. This is interesting because they consume multiple "
14403 "locations.");
Chris Forbes35efec72016-04-21 14:32:08 +120014404 m_errorMonitor->ExpectSuccess();
14405
14406 ASSERT_NO_FATAL_FAILURE(InitState());
14407 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14408
Chris Forbes91cf3a82016-06-28 17:51:35 +120014409 if (!m_device->phy().features().shaderFloat64) {
Chris Forbes35efec72016-04-21 14:32:08 +120014410 printf("Device does not support 64bit vertex attributes; skipped.\n");
14411 return;
14412 }
14413
14414 VkVertexInputBindingDescription input_bindings[1];
14415 memset(input_bindings, 0, sizeof(input_bindings));
14416
14417 VkVertexInputAttributeDescription input_attribs[4];
14418 memset(input_attribs, 0, sizeof(input_attribs));
14419 input_attribs[0].location = 0;
14420 input_attribs[0].offset = 0;
14421 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
14422 input_attribs[1].location = 2;
14423 input_attribs[1].offset = 32;
14424 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
14425 input_attribs[2].location = 4;
14426 input_attribs[2].offset = 64;
14427 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
14428 input_attribs[3].location = 6;
14429 input_attribs[3].offset = 96;
14430 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
14431
14432 char const *vsSource =
14433 "#version 450\n"
14434 "\n"
14435 "layout(location=0) in dmat4 x;\n"
14436 "out gl_PerVertex {\n"
14437 " vec4 gl_Position;\n"
14438 "};\n"
14439 "void main(){\n"
14440 " gl_Position = vec4(x[0][0]);\n"
14441 "}\n";
14442 char const *fsSource =
14443 "#version 450\n"
14444 "\n"
14445 "layout(location=0) out vec4 color;\n"
14446 "void main(){\n"
14447 " color = vec4(1);\n"
14448 "}\n";
14449
14450 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14451 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14452
14453 VkPipelineObj pipe(m_device);
14454 pipe.AddColorAttachment();
14455 pipe.AddShader(&vs);
14456 pipe.AddShader(&fs);
14457
14458 pipe.AddVertexInputBindings(input_bindings, 1);
14459 pipe.AddVertexInputAttribs(input_attribs, 4);
14460
14461 VkDescriptorSetObj descriptorSet(m_device);
14462 descriptorSet.AppendDummy();
14463 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14464
14465 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14466
14467 m_errorMonitor->VerifyNotFound();
14468}
14469
Karl Schultz6addd812016-02-02 17:17:23 -070014470TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014471 TEST_DESCRIPTION("Test that an error is produced for a FS which does not "
14472 "provide an output for one of the pipeline's color attachments");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014474 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014475
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014476 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014477
14478 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014479 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014480 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014481 "out gl_PerVertex {\n"
14482 " vec4 gl_Position;\n"
14483 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014484 "void main(){\n"
14485 " gl_Position = vec4(1);\n"
14486 "}\n";
14487 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014488 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014489 "\n"
14490 "void main(){\n"
14491 "}\n";
14492
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014493 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14494 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014495
14496 VkPipelineObj pipe(m_device);
14497 pipe.AddShader(&vs);
14498 pipe.AddShader(&fs);
14499
Chia-I Wu08accc62015-07-07 11:50:03 +080014500 /* set up CB 0, not written */
14501 pipe.AddColorAttachment();
14502 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014503
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014504 VkDescriptorSetObj descriptorSet(m_device);
14505 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014506 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014507
Tony Barbour5781e8f2015-08-04 16:23:11 -060014508 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014509
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014510 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014511}
14512
Karl Schultz6addd812016-02-02 17:17:23 -070014513TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014514 TEST_DESCRIPTION("Test that a warning is produced for a FS which provides a spurious "
14515 "output with no matching attachment");
Karl Schultz6addd812016-02-02 17:17:23 -070014516 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070014517 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014518 "FS writes to output location 1 with no matching attachment");
14519
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014520 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014521
14522 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014523 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014524 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014525 "out gl_PerVertex {\n"
14526 " vec4 gl_Position;\n"
14527 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014528 "void main(){\n"
14529 " gl_Position = vec4(1);\n"
14530 "}\n";
14531 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014532 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014533 "\n"
14534 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -070014535 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014536 "void main(){\n"
14537 " x = vec4(1);\n"
14538 " y = vec4(1);\n"
14539 "}\n";
14540
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014541 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14542 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014543
14544 VkPipelineObj pipe(m_device);
14545 pipe.AddShader(&vs);
14546 pipe.AddShader(&fs);
14547
Chia-I Wu08accc62015-07-07 11:50:03 +080014548 /* set up CB 0, not written */
14549 pipe.AddColorAttachment();
14550 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014551 /* FS writes CB 1, but we don't configure it */
14552
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014553 VkDescriptorSetObj descriptorSet(m_device);
14554 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014555 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014556
Tony Barbour5781e8f2015-08-04 16:23:11 -060014557 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014558
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014559 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014560}
14561
Karl Schultz6addd812016-02-02 17:17:23 -070014562TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014563 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the fundamental "
14564 "type of an FS output variable, and the format of the corresponding attachment");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014565 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014566 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014567
Chris Forbesa36d69e2015-05-25 11:13:44 +120014568 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014569
14570 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014571 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120014572 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014573 "out gl_PerVertex {\n"
14574 " vec4 gl_Position;\n"
14575 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120014576 "void main(){\n"
14577 " gl_Position = vec4(1);\n"
14578 "}\n";
14579 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014580 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120014581 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070014582 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +120014583 "void main(){\n"
14584 " x = ivec4(1);\n"
14585 "}\n";
14586
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014587 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14588 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014589
14590 VkPipelineObj pipe(m_device);
14591 pipe.AddShader(&vs);
14592 pipe.AddShader(&fs);
14593
Chia-I Wu08accc62015-07-07 11:50:03 +080014594 /* set up CB 0; type is UNORM by default */
14595 pipe.AddColorAttachment();
14596 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014597
Chris Forbesa36d69e2015-05-25 11:13:44 +120014598 VkDescriptorSetObj descriptorSet(m_device);
14599 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014600 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014601
Tony Barbour5781e8f2015-08-04 16:23:11 -060014602 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014603
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014604 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120014605}
Chris Forbes7b1b8932015-06-05 14:43:36 +120014606
Karl Schultz6addd812016-02-02 17:17:23 -070014607TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014608 TEST_DESCRIPTION("Test that an error is produced for a shader consuming a uniform "
14609 "block which has no corresponding binding in the pipeline layout");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014610 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014611 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014612
Chris Forbes556c76c2015-08-14 12:04:59 +120014613 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120014614
14615 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014616 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120014617 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014618 "out gl_PerVertex {\n"
14619 " vec4 gl_Position;\n"
14620 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120014621 "void main(){\n"
14622 " gl_Position = vec4(1);\n"
14623 "}\n";
14624 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014625 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120014626 "\n"
14627 "layout(location=0) out vec4 x;\n"
14628 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
14629 "void main(){\n"
14630 " x = vec4(bar.y);\n"
14631 "}\n";
14632
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014633 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14634 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120014635
Chris Forbes556c76c2015-08-14 12:04:59 +120014636 VkPipelineObj pipe(m_device);
14637 pipe.AddShader(&vs);
14638 pipe.AddShader(&fs);
14639
14640 /* set up CB 0; type is UNORM by default */
14641 pipe.AddColorAttachment();
14642 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14643
14644 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014645 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120014646
14647 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14648
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014649 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120014650}
14651
Chris Forbes5c59e902016-02-26 16:56:09 +130014652TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014653 TEST_DESCRIPTION("Test that an error is produced for a shader consuming push constants "
14654 "which are not provided in the pipeline layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130014655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14656 "not declared in layout");
14657
14658 ASSERT_NO_FATAL_FAILURE(InitState());
14659
14660 char const *vsSource =
14661 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130014662 "\n"
14663 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14664 "out gl_PerVertex {\n"
14665 " vec4 gl_Position;\n"
14666 "};\n"
14667 "void main(){\n"
14668 " gl_Position = vec4(consts.x);\n"
14669 "}\n";
14670 char const *fsSource =
14671 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130014672 "\n"
14673 "layout(location=0) out vec4 x;\n"
14674 "void main(){\n"
14675 " x = vec4(1);\n"
14676 "}\n";
14677
14678 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14679 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14680
14681 VkPipelineObj pipe(m_device);
14682 pipe.AddShader(&vs);
14683 pipe.AddShader(&fs);
14684
14685 /* set up CB 0; type is UNORM by default */
14686 pipe.AddColorAttachment();
14687 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14688
14689 VkDescriptorSetObj descriptorSet(m_device);
14690 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14691
14692 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14693
14694 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014695 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130014696}
14697
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014698TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014699 TEST_DESCRIPTION("Test that an error is produced for a compute pipeline consuming a "
14700 "descriptor which is not provided in the pipeline layout");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014701 m_errorMonitor->SetDesiredFailureMsg(
14702 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14703 "Shader uses descriptor slot 0.0");
14704
14705 ASSERT_NO_FATAL_FAILURE(InitState());
14706
14707 char const *csSource =
14708 "#version 450\n"
14709 "\n"
14710 "layout(local_size_x=1) in;\n"
14711 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14712 "void main(){\n"
14713 " x = vec4(1);\n"
14714 "}\n";
14715
14716 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14717
14718 VkDescriptorSetObj descriptorSet(m_device);
14719 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14720
14721 VkComputePipelineCreateInfo cpci = {
14722 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14723 nullptr, 0, {
14724 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14725 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14726 cs.handle(), "main", nullptr
14727 },
14728 descriptorSet.GetPipelineLayout(),
14729 VK_NULL_HANDLE, -1
14730 };
14731
14732 VkPipeline pipe;
14733 VkResult err = vkCreateComputePipelines(
14734 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14735
14736 m_errorMonitor->VerifyFound();
14737
14738 if (err == VK_SUCCESS) {
14739 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14740 }
14741}
14742
14743TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014744 TEST_DESCRIPTION("Test that pipeline validation accepts a compute pipeline which declares a "
14745 "descriptor-backed resource which is not provided, but the shader does not "
14746 "statically use it. This is interesting because it requires compute pipelines "
14747 "to have a proper descriptor use walk, which they didn't for some time.");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014748 m_errorMonitor->ExpectSuccess();
14749
14750 ASSERT_NO_FATAL_FAILURE(InitState());
14751
14752 char const *csSource =
14753 "#version 450\n"
14754 "\n"
14755 "layout(local_size_x=1) in;\n"
14756 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14757 "void main(){\n"
14758 " // x is not used.\n"
14759 "}\n";
14760
14761 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14762
14763 VkDescriptorSetObj descriptorSet(m_device);
14764 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14765
14766 VkComputePipelineCreateInfo cpci = {
14767 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14768 nullptr, 0, {
14769 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14770 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14771 cs.handle(), "main", nullptr
14772 },
14773 descriptorSet.GetPipelineLayout(),
14774 VK_NULL_HANDLE, -1
14775 };
14776
14777 VkPipeline pipe;
14778 VkResult err = vkCreateComputePipelines(
14779 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14780
14781 m_errorMonitor->VerifyNotFound();
14782
14783 if (err == VK_SUCCESS) {
14784 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14785 }
14786}
14787
Chris Forbes22a9b092016-07-19 14:34:05 +120014788TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014789 TEST_DESCRIPTION("Test that an error is produced for a pipeline consuming a "
14790 "descriptor-backed resource of a mismatched type");
Chris Forbes22a9b092016-07-19 14:34:05 +120014791 m_errorMonitor->SetDesiredFailureMsg(
14792 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14793 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
14794
14795 ASSERT_NO_FATAL_FAILURE(InitState());
14796
14797 VkDescriptorSetLayoutBinding binding = {
14798 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14799 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14800 };
14801 VkDescriptorSetLayoutCreateInfo dslci = {
14802 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14803 0, 1, &binding
14804 };
14805 VkDescriptorSetLayout dsl;
14806 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14807 nullptr, &dsl);
14808 ASSERT_VK_SUCCESS(err);
14809
14810 VkPipelineLayoutCreateInfo plci = {
14811 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14812 0, 1, &dsl, 0, nullptr
14813 };
14814 VkPipelineLayout pl;
14815 err = vkCreatePipelineLayout(m_device->device(), &plci,
14816 nullptr, &pl);
14817 ASSERT_VK_SUCCESS(err);
14818
14819 char const *csSource =
14820 "#version 450\n"
14821 "\n"
14822 "layout(local_size_x=1) in;\n"
14823 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14824 "void main() {\n"
14825 " x.x = 1.0f;\n"
14826 "}\n";
14827 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14828
14829 VkComputePipelineCreateInfo cpci = {
14830 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14831 0, {
14832 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14833 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14834 cs.handle(), "main", nullptr
14835 },
14836 pl, VK_NULL_HANDLE, -1
14837 };
14838
14839 VkPipeline pipe;
14840 err = vkCreateComputePipelines(
14841 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14842
14843 m_errorMonitor->VerifyFound();
14844
14845 if (err == VK_SUCCESS) {
14846 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14847 }
14848
14849 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14850 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14851}
14852
Chris Forbese10a51f2016-07-19 14:42:51 +120014853TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014854 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
14855 "sampler portion of a combined image + sampler");
Chris Forbese10a51f2016-07-19 14:42:51 +120014856 m_errorMonitor->ExpectSuccess();
14857
14858 ASSERT_NO_FATAL_FAILURE(InitState());
14859
14860 VkDescriptorSetLayoutBinding bindings[] = {
14861 {
14862 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14863 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14864 },
14865 {
14866 1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
14867 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14868 },
14869 {
14870 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
14871 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14872 },
14873 };
14874 VkDescriptorSetLayoutCreateInfo dslci = {
14875 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14876 0, 3, bindings
14877 };
14878 VkDescriptorSetLayout dsl;
14879 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14880 nullptr, &dsl);
14881 ASSERT_VK_SUCCESS(err);
14882
14883 VkPipelineLayoutCreateInfo plci = {
14884 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14885 0, 1, &dsl, 0, nullptr
14886 };
14887 VkPipelineLayout pl;
14888 err = vkCreatePipelineLayout(m_device->device(), &plci,
14889 nullptr, &pl);
14890 ASSERT_VK_SUCCESS(err);
14891
14892 char const *csSource =
14893 "#version 450\n"
14894 "\n"
14895 "layout(local_size_x=1) in;\n"
14896 "layout(set=0, binding=0) uniform sampler s;\n"
14897 "layout(set=0, binding=1) uniform texture2D t;\n"
14898 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
14899 "void main() {\n"
14900 " x = texture(sampler2D(t, s), vec2(0));\n"
14901 "}\n";
14902 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14903
14904 VkComputePipelineCreateInfo cpci = {
14905 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14906 0, {
14907 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14908 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14909 cs.handle(), "main", nullptr
14910 },
14911 pl, VK_NULL_HANDLE, -1
14912 };
14913
14914 VkPipeline pipe;
14915 err = vkCreateComputePipelines(
14916 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14917
14918 m_errorMonitor->VerifyNotFound();
14919
14920 if (err == VK_SUCCESS) {
14921 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14922 }
14923
14924 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14925 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14926}
14927
Chris Forbes91c3b2a2016-07-19 14:46:38 +120014928TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014929 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
14930 "image portion of a combined image + sampler");
Chris Forbes91c3b2a2016-07-19 14:46:38 +120014931 m_errorMonitor->ExpectSuccess();
14932
14933 ASSERT_NO_FATAL_FAILURE(InitState());
14934
14935 VkDescriptorSetLayoutBinding bindings[] = {
14936 {
14937 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14938 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14939 },
14940 {
14941 1, VK_DESCRIPTOR_TYPE_SAMPLER,
14942 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14943 },
14944 {
14945 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
14946 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14947 },
14948 };
14949 VkDescriptorSetLayoutCreateInfo dslci = {
14950 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14951 0, 3, bindings
14952 };
14953 VkDescriptorSetLayout dsl;
14954 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14955 nullptr, &dsl);
14956 ASSERT_VK_SUCCESS(err);
14957
14958 VkPipelineLayoutCreateInfo plci = {
14959 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14960 0, 1, &dsl, 0, nullptr
14961 };
14962 VkPipelineLayout pl;
14963 err = vkCreatePipelineLayout(m_device->device(), &plci,
14964 nullptr, &pl);
14965 ASSERT_VK_SUCCESS(err);
14966
14967 char const *csSource =
14968 "#version 450\n"
14969 "\n"
14970 "layout(local_size_x=1) in;\n"
14971 "layout(set=0, binding=0) uniform texture2D t;\n"
14972 "layout(set=0, binding=1) uniform sampler s;\n"
14973 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
14974 "void main() {\n"
14975 " x = texture(sampler2D(t, s), vec2(0));\n"
14976 "}\n";
14977 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14978
14979 VkComputePipelineCreateInfo cpci = {
14980 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14981 0, {
14982 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14983 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14984 cs.handle(), "main", nullptr
14985 },
14986 pl, VK_NULL_HANDLE, -1
14987 };
14988
14989 VkPipeline pipe;
14990 err = vkCreateComputePipelines(
14991 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14992
14993 m_errorMonitor->VerifyNotFound();
14994
14995 if (err == VK_SUCCESS) {
14996 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14997 }
14998
14999 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15000 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15001}
15002
Chris Forbes6a4991a2016-07-19 15:07:32 +120015003TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015004 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming "
15005 "both the sampler and the image of a combined image+sampler "
15006 "but via separate variables");
Chris Forbes6a4991a2016-07-19 15:07:32 +120015007 m_errorMonitor->ExpectSuccess();
15008
15009 ASSERT_NO_FATAL_FAILURE(InitState());
15010
15011 VkDescriptorSetLayoutBinding bindings[] = {
15012 {
15013 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
15014 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
15015 },
15016 {
15017 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
15018 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
15019 },
15020 };
15021 VkDescriptorSetLayoutCreateInfo dslci = {
15022 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
15023 0, 2, bindings
15024 };
15025 VkDescriptorSetLayout dsl;
15026 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
15027 nullptr, &dsl);
15028 ASSERT_VK_SUCCESS(err);
15029
15030 VkPipelineLayoutCreateInfo plci = {
15031 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
15032 0, 1, &dsl, 0, nullptr
15033 };
15034 VkPipelineLayout pl;
15035 err = vkCreatePipelineLayout(m_device->device(), &plci,
15036 nullptr, &pl);
15037 ASSERT_VK_SUCCESS(err);
15038
15039 char const *csSource =
15040 "#version 450\n"
15041 "\n"
15042 "layout(local_size_x=1) in;\n"
15043 "layout(set=0, binding=0) uniform texture2D t;\n"
15044 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
15045 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
15046 "void main() {\n"
15047 " x = texture(sampler2D(t, s), vec2(0));\n"
15048 "}\n";
15049 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15050
15051 VkComputePipelineCreateInfo cpci = {
15052 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
15053 0, {
15054 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
15055 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
15056 cs.handle(), "main", nullptr
15057 },
15058 pl, VK_NULL_HANDLE, -1
15059 };
15060
15061 VkPipeline pipe;
15062 err = vkCreateComputePipelines(
15063 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
15064
15065 m_errorMonitor->VerifyNotFound();
15066
15067 if (err == VK_SUCCESS) {
15068 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15069 }
15070
15071 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15072 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15073}
15074
Chris Forbes50020592016-07-27 13:52:41 +120015075TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
15076 TEST_DESCRIPTION("Test that an error is produced when an image view type "
15077 "does not match the dimensionality declared in the shader");
15078
15079 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15080 "requires an image view of type VK_IMAGE_VIEW_TYPE_3D");
15081
15082 ASSERT_NO_FATAL_FAILURE(InitState());
15083 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15084
15085 char const *vsSource =
15086 "#version 450\n"
15087 "\n"
15088 "out gl_PerVertex { vec4 gl_Position; };\n"
15089 "void main() { gl_Position = vec4(0); }\n";
15090 char const *fsSource =
15091 "#version 450\n"
15092 "\n"
15093 "layout(set=0, binding=0) uniform sampler3D s;\n"
15094 "layout(location=0) out vec4 color;\n"
15095 "void main() {\n"
15096 " color = texture(s, vec3(0));\n"
15097 "}\n";
15098 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15099 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15100
15101 VkPipelineObj pipe(m_device);
15102 pipe.AddShader(&vs);
15103 pipe.AddShader(&fs);
15104 pipe.AddColorAttachment();
15105
15106 VkTextureObj texture(m_device, nullptr);
15107 VkSamplerObj sampler(m_device);
15108
15109 VkDescriptorSetObj descriptorSet(m_device);
15110 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15111 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15112
15113 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15114 ASSERT_VK_SUCCESS(err);
15115
15116 BeginCommandBuffer();
15117
15118 m_commandBuffer->BindPipeline(pipe);
15119 m_commandBuffer->BindDescriptorSet(descriptorSet);
15120
15121 VkViewport viewport = { 0, 0, 16, 16, 0, 1 };
15122 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
15123 VkRect2D scissor = { { 0, 0 }, { 16, 16 } };
15124 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15125
15126 // error produced here.
15127 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15128
15129 m_errorMonitor->VerifyFound();
15130
15131 EndCommandBuffer();
15132}
15133
Chris Forbes5533bfc2016-07-27 14:12:34 +120015134TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
15135 TEST_DESCRIPTION("Test that an error is produced when a multisampled images "
15136 "are consumed via singlesample images types in the shader, or vice versa.");
15137
15138 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15139 "requires bound image to have multiple samples");
15140
15141 ASSERT_NO_FATAL_FAILURE(InitState());
15142 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15143
15144 char const *vsSource =
15145 "#version 450\n"
15146 "\n"
15147 "out gl_PerVertex { vec4 gl_Position; };\n"
15148 "void main() { gl_Position = vec4(0); }\n";
15149 char const *fsSource =
15150 "#version 450\n"
15151 "\n"
15152 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15153 "layout(location=0) out vec4 color;\n"
15154 "void main() {\n"
15155 " color = texelFetch(s, ivec2(0), 0);\n"
15156 "}\n";
15157 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15158 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15159
15160 VkPipelineObj pipe(m_device);
15161 pipe.AddShader(&vs);
15162 pipe.AddShader(&fs);
15163 pipe.AddColorAttachment();
15164
15165 VkTextureObj texture(m_device, nullptr);
15166 VkSamplerObj sampler(m_device);
15167
15168 VkDescriptorSetObj descriptorSet(m_device);
15169 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15170 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15171
15172 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15173 ASSERT_VK_SUCCESS(err);
15174
15175 BeginCommandBuffer();
15176
15177 m_commandBuffer->BindPipeline(pipe);
15178 m_commandBuffer->BindDescriptorSet(descriptorSet);
15179
15180 VkViewport viewport = { 0, 0, 16, 16, 0, 1 };
15181 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
15182 VkRect2D scissor = { { 0, 0 }, { 16, 16 } };
15183 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15184
15185 // error produced here.
15186 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15187
15188 m_errorMonitor->VerifyFound();
15189
15190 EndCommandBuffer();
15191}
15192
Mark Lobodzinski209b5292015-09-17 09:44:05 -060015193#endif // SHADER_CHECKER_TESTS
15194
15195#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060015196TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -070015197 m_errorMonitor->SetDesiredFailureMsg(
15198 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015199 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015200
15201 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015202
15203 // Create an image
15204 VkImage image;
15205
Karl Schultz6addd812016-02-02 17:17:23 -070015206 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15207 const int32_t tex_width = 32;
15208 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015209
15210 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015211 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15212 image_create_info.pNext = NULL;
15213 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15214 image_create_info.format = tex_format;
15215 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015216 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070015217 image_create_info.extent.depth = 1;
15218 image_create_info.mipLevels = 1;
15219 image_create_info.arrayLayers = 1;
15220 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15221 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15222 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15223 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015224
15225 // Introduce error by sending down a bogus width extent
15226 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080015227 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015228
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015229 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015230}
15231
Mark Youngc48c4c12016-04-11 14:26:49 -060015232TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
15233 m_errorMonitor->SetDesiredFailureMsg(
15234 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15235 "CreateImage extents is 0 for at least one required dimension");
15236
15237 ASSERT_NO_FATAL_FAILURE(InitState());
15238
15239 // Create an image
15240 VkImage image;
15241
15242 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15243 const int32_t tex_width = 32;
15244 const int32_t tex_height = 32;
15245
15246 VkImageCreateInfo image_create_info = {};
15247 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15248 image_create_info.pNext = NULL;
15249 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15250 image_create_info.format = tex_format;
15251 image_create_info.extent.width = tex_width;
15252 image_create_info.extent.height = tex_height;
15253 image_create_info.extent.depth = 1;
15254 image_create_info.mipLevels = 1;
15255 image_create_info.arrayLayers = 1;
15256 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15257 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15258 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15259 image_create_info.flags = 0;
15260
15261 // Introduce error by sending down a bogus width extent
15262 image_create_info.extent.width = 0;
15263 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15264
15265 m_errorMonitor->VerifyFound();
15266}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060015267#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120015268
Tobin Ehliscde08892015-09-22 10:11:37 -060015269#if IMAGE_TESTS
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015270TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
15271 TEST_DESCRIPTION("Create a render pass with an attachment description "
15272 "format set to VK_FORMAT_UNDEFINED");
15273
15274 ASSERT_NO_FATAL_FAILURE(InitState());
15275 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15276
15277 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15278 "format is VK_FORMAT_UNDEFINED");
15279
15280 VkAttachmentReference color_attach = {};
15281 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15282 color_attach.attachment = 0;
15283 VkSubpassDescription subpass = {};
15284 subpass.colorAttachmentCount = 1;
15285 subpass.pColorAttachments = &color_attach;
15286
15287 VkRenderPassCreateInfo rpci = {};
15288 rpci.subpassCount = 1;
15289 rpci.pSubpasses = &subpass;
15290 rpci.attachmentCount = 1;
15291 VkAttachmentDescription attach_desc = {};
15292 attach_desc.format = VK_FORMAT_UNDEFINED;
15293 rpci.pAttachments = &attach_desc;
15294 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15295 VkRenderPass rp;
15296 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15297
15298 m_errorMonitor->VerifyFound();
15299
15300 if (result == VK_SUCCESS) {
15301 vkDestroyRenderPass(m_device->device(), rp, NULL);
15302 }
15303}
15304
Karl Schultz6addd812016-02-02 17:17:23 -070015305TEST_F(VkLayerTest, InvalidImageView) {
15306 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060015307
Karl Schultz6addd812016-02-02 17:17:23 -070015308 m_errorMonitor->SetDesiredFailureMsg(
15309 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015310 "vkCreateImageView called with baseMipLevel 10 ");
15311
Tobin Ehliscde08892015-09-22 10:11:37 -060015312 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060015313
Mike Stroyana3082432015-09-25 13:39:21 -060015314 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015315 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060015316
Karl Schultz6addd812016-02-02 17:17:23 -070015317 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15318 const int32_t tex_width = 32;
15319 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015320
15321 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015322 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15323 image_create_info.pNext = NULL;
15324 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15325 image_create_info.format = tex_format;
15326 image_create_info.extent.width = tex_width;
15327 image_create_info.extent.height = tex_height;
15328 image_create_info.extent.depth = 1;
15329 image_create_info.mipLevels = 1;
15330 image_create_info.arrayLayers = 1;
15331 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15332 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15333 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15334 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015335
Chia-I Wuf7458c52015-10-26 21:10:41 +080015336 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015337 ASSERT_VK_SUCCESS(err);
15338
15339 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015340 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15341 image_view_create_info.image = image;
15342 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15343 image_view_create_info.format = tex_format;
15344 image_view_create_info.subresourceRange.layerCount = 1;
15345 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
15346 image_view_create_info.subresourceRange.levelCount = 1;
15347 image_view_create_info.subresourceRange.aspectMask =
15348 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015349
15350 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070015351 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
15352 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060015353
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015354 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060015355 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015356}
Mike Stroyana3082432015-09-25 13:39:21 -060015357
Mark Youngd339ba32016-05-30 13:28:35 -060015358TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15359 VkResult err;
15360
15361 m_errorMonitor->SetDesiredFailureMsg(
15362 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -060015363 "used without first calling vkBindImageMemory");
Mark Youngd339ba32016-05-30 13:28:35 -060015364
15365 ASSERT_NO_FATAL_FAILURE(InitState());
15366
15367 // Create an image and try to create a view with no memory backing the image
15368 VkImage image;
15369
15370 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15371 const int32_t tex_width = 32;
15372 const int32_t tex_height = 32;
15373
15374 VkImageCreateInfo image_create_info = {};
15375 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15376 image_create_info.pNext = NULL;
15377 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15378 image_create_info.format = tex_format;
15379 image_create_info.extent.width = tex_width;
15380 image_create_info.extent.height = tex_height;
15381 image_create_info.extent.depth = 1;
15382 image_create_info.mipLevels = 1;
15383 image_create_info.arrayLayers = 1;
15384 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15385 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15386 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15387 image_create_info.flags = 0;
15388
15389 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15390 ASSERT_VK_SUCCESS(err);
15391
15392 VkImageViewCreateInfo image_view_create_info = {};
15393 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15394 image_view_create_info.image = image;
15395 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15396 image_view_create_info.format = tex_format;
15397 image_view_create_info.subresourceRange.layerCount = 1;
15398 image_view_create_info.subresourceRange.baseMipLevel = 0;
15399 image_view_create_info.subresourceRange.levelCount = 1;
15400 image_view_create_info.subresourceRange.aspectMask =
15401 VK_IMAGE_ASPECT_COLOR_BIT;
15402
15403 VkImageView view;
15404 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
15405 &view);
15406
15407 m_errorMonitor->VerifyFound();
15408 vkDestroyImage(m_device->device(), image, NULL);
15409 // If last error is success, it still created the view, so delete it.
15410 if (err == VK_SUCCESS) {
15411 vkDestroyImageView(m_device->device(), view, NULL);
15412 }
15413
15414}
15415
Karl Schultz6addd812016-02-02 17:17:23 -070015416TEST_F(VkLayerTest, InvalidImageViewAspect) {
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015417 TEST_DESCRIPTION(
15418 "Create an image and try to create a view with an invalid aspectMask");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070015419 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070015420 "vkCreateImageView: Color image "
15421 "formats must have ONLY the "
15422 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015423
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015424 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015425
Karl Schultz6addd812016-02-02 17:17:23 -070015426 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015427 VkImageObj image(m_device);
15428 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT,
15429 VK_IMAGE_TILING_LINEAR, 0);
15430 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015431
15432 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015433 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015434 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015435 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15436 image_view_create_info.format = tex_format;
15437 image_view_create_info.subresourceRange.baseMipLevel = 0;
15438 image_view_create_info.subresourceRange.levelCount = 1;
15439 // Cause an error by setting an invalid image aspect
15440 image_view_create_info.subresourceRange.aspectMask =
15441 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015442
15443 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015444 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015445
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015446 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015447}
15448
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015449TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015450 VkResult err;
15451 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015452
Karl Schultz6addd812016-02-02 17:17:23 -070015453 m_errorMonitor->SetDesiredFailureMsg(
15454 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015455 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015456
Mike Stroyana3082432015-09-25 13:39:21 -060015457 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015458
15459 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015460 VkImage srcImage;
15461 VkImage dstImage;
15462 VkDeviceMemory srcMem;
15463 VkDeviceMemory destMem;
15464 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015465
15466 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015467 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15468 image_create_info.pNext = NULL;
15469 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15470 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15471 image_create_info.extent.width = 32;
15472 image_create_info.extent.height = 32;
15473 image_create_info.extent.depth = 1;
15474 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015475 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015476 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15477 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15478 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15479 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015480
Karl Schultz6addd812016-02-02 17:17:23 -070015481 err =
15482 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015483 ASSERT_VK_SUCCESS(err);
15484
Karl Schultz6addd812016-02-02 17:17:23 -070015485 err =
15486 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015487 ASSERT_VK_SUCCESS(err);
15488
15489 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015490 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015491 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15492 memAlloc.pNext = NULL;
15493 memAlloc.allocationSize = 0;
15494 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015495
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015496 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015497 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015498 pass =
15499 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015500 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015501 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015502 ASSERT_VK_SUCCESS(err);
15503
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015504 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015505 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015506 pass =
15507 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015508 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015509 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015510 ASSERT_VK_SUCCESS(err);
15511
15512 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15513 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015514 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015515 ASSERT_VK_SUCCESS(err);
15516
15517 BeginCommandBuffer();
15518 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015519 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015520 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015521 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015522 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015523 copyRegion.srcOffset.x = 0;
15524 copyRegion.srcOffset.y = 0;
15525 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015526 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015527 copyRegion.dstSubresource.mipLevel = 0;
15528 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015529 // Introduce failure by forcing the dst layerCount to differ from src
15530 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015531 copyRegion.dstOffset.x = 0;
15532 copyRegion.dstOffset.y = 0;
15533 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015534 copyRegion.extent.width = 1;
15535 copyRegion.extent.height = 1;
15536 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015537 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15538 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015539 EndCommandBuffer();
15540
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015541 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015542
Chia-I Wuf7458c52015-10-26 21:10:41 +080015543 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015544 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015545 vkFreeMemory(m_device->device(), srcMem, NULL);
15546 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015547}
15548
Tony Barbourd6673642016-05-05 14:46:39 -060015549TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
15550
15551 TEST_DESCRIPTION("Creating images with unsuported formats ");
15552
15553 ASSERT_NO_FATAL_FAILURE(InitState());
15554 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15555 VkImageObj image(m_device);
15556 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
15557 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
15558 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15559 VK_IMAGE_TILING_OPTIMAL, 0);
15560 ASSERT_TRUE(image.initialized());
15561
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015562 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
15563 VkImageCreateInfo image_create_info;
15564 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15565 image_create_info.pNext = NULL;
15566 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15567 image_create_info.format = VK_FORMAT_UNDEFINED;
15568 image_create_info.extent.width = 32;
15569 image_create_info.extent.height = 32;
15570 image_create_info.extent.depth = 1;
15571 image_create_info.mipLevels = 1;
15572 image_create_info.arrayLayers = 1;
15573 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15574 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15575 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15576 image_create_info.flags = 0;
15577
15578 m_errorMonitor->SetDesiredFailureMsg(
15579 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15580 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
15581
15582 VkImage localImage;
15583 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
15584 m_errorMonitor->VerifyFound();
15585
Tony Barbourd6673642016-05-05 14:46:39 -060015586 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015587 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060015588 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15589 VkFormat format = static_cast<VkFormat>(f);
15590 VkFormatProperties fProps = m_device->format_properties(format);
15591 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
15592 fProps.optimalTilingFeatures == 0) {
15593 unsupported = format;
15594 break;
15595 }
15596 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015597
Tony Barbourd6673642016-05-05 14:46:39 -060015598 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015599 image_create_info.format = unsupported;
Tony Barbourd6673642016-05-05 14:46:39 -060015600 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015601 "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015602
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015603 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060015604 m_errorMonitor->VerifyFound();
15605 }
15606}
15607
15608TEST_F(VkLayerTest, ImageLayerViewTests) {
15609 VkResult ret;
15610 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15611
15612 ASSERT_NO_FATAL_FAILURE(InitState());
15613
15614 VkImageObj image(m_device);
15615 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
15616 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
15617 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15618 VK_IMAGE_TILING_OPTIMAL, 0);
15619 ASSERT_TRUE(image.initialized());
15620
15621 VkImageView imgView;
15622 VkImageViewCreateInfo imgViewInfo = {};
15623 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15624 imgViewInfo.image = image.handle();
15625 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
15626 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15627 imgViewInfo.subresourceRange.layerCount = 1;
15628 imgViewInfo.subresourceRange.baseMipLevel = 0;
15629 imgViewInfo.subresourceRange.levelCount = 1;
15630 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15631
15632 m_errorMonitor->SetDesiredFailureMsg(
15633 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15634 "vkCreateImageView called with baseMipLevel");
15635 // View can't have baseMipLevel >= image's mipLevels - Expect
15636 // VIEW_CREATE_ERROR
15637 imgViewInfo.subresourceRange.baseMipLevel = 1;
15638 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15639 m_errorMonitor->VerifyFound();
15640 imgViewInfo.subresourceRange.baseMipLevel = 0;
15641
15642 m_errorMonitor->SetDesiredFailureMsg(
15643 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15644 "vkCreateImageView called with baseArrayLayer");
15645 // View can't have baseArrayLayer >= image's arraySize - Expect
15646 // VIEW_CREATE_ERROR
15647 imgViewInfo.subresourceRange.baseArrayLayer = 1;
15648 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15649 m_errorMonitor->VerifyFound();
15650 imgViewInfo.subresourceRange.baseArrayLayer = 0;
15651
15652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15653 "vkCreateImageView called with 0 in "
15654 "pCreateInfo->subresourceRange."
15655 "levelCount");
15656 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
15657 imgViewInfo.subresourceRange.levelCount = 0;
15658 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15659 m_errorMonitor->VerifyFound();
15660 imgViewInfo.subresourceRange.levelCount = 1;
15661
15662 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15663 "vkCreateImageView called with 0 in "
15664 "pCreateInfo->subresourceRange."
15665 "layerCount");
15666 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
15667 imgViewInfo.subresourceRange.layerCount = 0;
15668 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15669 m_errorMonitor->VerifyFound();
15670 imgViewInfo.subresourceRange.layerCount = 1;
15671
15672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15673 "but both must be color formats");
15674 // Can't use depth format for view into color image - Expect INVALID_FORMAT
15675 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
15676 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15677 m_errorMonitor->VerifyFound();
15678 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15679
15680 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15681 "Formats MUST be IDENTICAL unless "
15682 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
15683 "was set on image creation.");
15684 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
15685 // VIEW_CREATE_ERROR
15686 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
15687 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15688 m_errorMonitor->VerifyFound();
15689 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15690
15691 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15692 "can support ImageViews with "
15693 "differing formats but they must be "
15694 "in the same compatibility class.");
15695 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
15696 // VIEW_CREATE_ERROR
15697 VkImageCreateInfo mutImgInfo = image.create_info();
15698 VkImage mutImage;
15699 mutImgInfo.format = VK_FORMAT_R8_UINT;
15700 assert(
15701 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
15702 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
15703 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
15704 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15705 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
15706 ASSERT_VK_SUCCESS(ret);
15707 imgViewInfo.image = mutImage;
15708 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15709 m_errorMonitor->VerifyFound();
15710 imgViewInfo.image = image.handle();
15711 vkDestroyImage(m_device->handle(), mutImage, NULL);
15712}
15713
15714TEST_F(VkLayerTest, MiscImageLayerTests) {
15715
15716 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
15717
15718 ASSERT_NO_FATAL_FAILURE(InitState());
15719
15720 VkImageObj image(m_device);
15721 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
15722 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
15723 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15724 VK_IMAGE_TILING_OPTIMAL, 0);
15725 ASSERT_TRUE(image.initialized());
15726
15727 m_errorMonitor->SetDesiredFailureMsg(
15728 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15729 "number of layers in image subresource is zero");
15730 vk_testing::Buffer buffer;
15731 VkMemoryPropertyFlags reqs = 0;
15732 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
15733 VkBufferImageCopy region = {};
15734 region.bufferRowLength = 128;
15735 region.bufferImageHeight = 128;
15736 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15737 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
15738 region.imageSubresource.layerCount = 0;
15739 region.imageExtent.height = 4;
15740 region.imageExtent.width = 4;
15741 region.imageExtent.depth = 1;
15742 m_commandBuffer->BeginCommandBuffer();
15743 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
15744 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
15745 1, &region);
15746 m_errorMonitor->VerifyFound();
15747 region.imageSubresource.layerCount = 1;
15748
15749 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15750 "aspectMasks for each region must "
15751 "specify only COLOR or DEPTH or "
15752 "STENCIL");
15753 // Expect MISMATCHED_IMAGE_ASPECT
15754 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
15755 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
15756 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
15757 1, &region);
15758 m_errorMonitor->VerifyFound();
15759 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15760
15761 m_errorMonitor->SetDesiredFailureMsg(
15762 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15763 "If the format of srcImage is a depth, stencil, depth stencil or "
15764 "integer-based format then filter must be VK_FILTER_NEAREST");
15765 // Expect INVALID_FILTER
15766 VkImageObj intImage1(m_device);
15767 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
15768 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
15769 0);
15770 VkImageObj intImage2(m_device);
15771 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
15772 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
15773 0);
15774 VkImageBlit blitRegion = {};
15775 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15776 blitRegion.srcSubresource.baseArrayLayer = 0;
15777 blitRegion.srcSubresource.layerCount = 1;
15778 blitRegion.srcSubresource.mipLevel = 0;
15779 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15780 blitRegion.dstSubresource.baseArrayLayer = 0;
15781 blitRegion.dstSubresource.layerCount = 1;
15782 blitRegion.dstSubresource.mipLevel = 0;
15783
15784 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
15785 intImage1.layout(), intImage2.handle(), intImage2.layout(),
15786 16, &blitRegion, VK_FILTER_LINEAR);
15787 m_errorMonitor->VerifyFound();
15788
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060015789 // Look for NULL-blit warning
15790 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
15791 "Offsets specify a zero-volume area.");
15792 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
15793 intImage1.layout(), intImage2.handle(), intImage2.layout(),
15794 1, &blitRegion, VK_FILTER_LINEAR);
15795 m_errorMonitor->VerifyFound();
15796
Tony Barbourd6673642016-05-05 14:46:39 -060015797 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15798 "called with 0 in ppMemoryBarriers");
15799 VkImageMemoryBarrier img_barrier;
15800 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
15801 img_barrier.pNext = NULL;
15802 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
15803 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
15804 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15805 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15806 img_barrier.image = image.handle();
15807 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
15808 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
15809 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15810 img_barrier.subresourceRange.baseArrayLayer = 0;
15811 img_barrier.subresourceRange.baseMipLevel = 0;
15812 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
15813 img_barrier.subresourceRange.layerCount = 0;
15814 img_barrier.subresourceRange.levelCount = 1;
15815 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
15816 VK_PIPELINE_STAGE_HOST_BIT,
15817 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
15818 nullptr, 1, &img_barrier);
15819 m_errorMonitor->VerifyFound();
15820 img_barrier.subresourceRange.layerCount = 1;
15821}
15822
15823TEST_F(VkLayerTest, ImageFormatLimits) {
15824
15825 TEST_DESCRIPTION("Exceed the limits of image format ");
15826
15827 m_errorMonitor->SetDesiredFailureMsg(
15828 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15829 "CreateImage extents exceed allowable limits for format");
15830 VkImageCreateInfo image_create_info = {};
15831 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15832 image_create_info.pNext = NULL;
15833 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15834 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15835 image_create_info.extent.width = 32;
15836 image_create_info.extent.height = 32;
15837 image_create_info.extent.depth = 1;
15838 image_create_info.mipLevels = 1;
15839 image_create_info.arrayLayers = 1;
15840 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15841 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15842 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15843 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
15844 image_create_info.flags = 0;
15845
15846 VkImage nullImg;
15847 VkImageFormatProperties imgFmtProps;
15848 vkGetPhysicalDeviceImageFormatProperties(
15849 gpu(), image_create_info.format, image_create_info.imageType,
15850 image_create_info.tiling, image_create_info.usage,
15851 image_create_info.flags, &imgFmtProps);
15852 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
15853 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15854 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15855 m_errorMonitor->VerifyFound();
15856 image_create_info.extent.depth = 1;
15857
15858 m_errorMonitor->SetDesiredFailureMsg(
15859 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15860 "exceeds allowable maximum supported by format of");
15861 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
15862 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15863 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15864 m_errorMonitor->VerifyFound();
15865 image_create_info.mipLevels = 1;
15866
15867 m_errorMonitor->SetDesiredFailureMsg(
15868 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15869 "exceeds allowable maximum supported by format of");
15870 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
15871 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15872 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15873 m_errorMonitor->VerifyFound();
15874 image_create_info.arrayLayers = 1;
15875
15876 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15877 "is not supported by format");
15878 int samples = imgFmtProps.sampleCounts >> 1;
15879 image_create_info.samples = (VkSampleCountFlagBits)samples;
15880 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15881 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15882 m_errorMonitor->VerifyFound();
15883 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15884
15885 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15886 "pCreateInfo->initialLayout, must be "
15887 "VK_IMAGE_LAYOUT_UNDEFINED or "
15888 "VK_IMAGE_LAYOUT_PREINITIALIZED");
15889 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15890 // Expect INVALID_LAYOUT
15891 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15892 m_errorMonitor->VerifyFound();
15893 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
15894}
15895
Karl Schultz6addd812016-02-02 17:17:23 -070015896TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060015897 VkResult err;
15898 bool pass;
15899
15900 // Create color images with different format sizes and try to copy between them
15901 m_errorMonitor->SetDesiredFailureMsg(
15902 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15903 "vkCmdCopyImage called with unmatched source and dest image format sizes");
15904
15905 ASSERT_NO_FATAL_FAILURE(InitState());
15906
15907 // Create two images of different types and try to copy between them
15908 VkImage srcImage;
15909 VkImage dstImage;
15910 VkDeviceMemory srcMem;
15911 VkDeviceMemory destMem;
15912 VkMemoryRequirements memReqs;
15913
15914 VkImageCreateInfo image_create_info = {};
15915 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15916 image_create_info.pNext = NULL;
15917 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15918 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15919 image_create_info.extent.width = 32;
15920 image_create_info.extent.height = 32;
15921 image_create_info.extent.depth = 1;
15922 image_create_info.mipLevels = 1;
15923 image_create_info.arrayLayers = 1;
15924 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15925 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15926 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15927 image_create_info.flags = 0;
15928
15929 err =
15930 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
15931 ASSERT_VK_SUCCESS(err);
15932
15933 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15934 // Introduce failure by creating second image with a different-sized format.
15935 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
15936
15937 err =
15938 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
15939 ASSERT_VK_SUCCESS(err);
15940
15941 // Allocate memory
15942 VkMemoryAllocateInfo memAlloc = {};
15943 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15944 memAlloc.pNext = NULL;
15945 memAlloc.allocationSize = 0;
15946 memAlloc.memoryTypeIndex = 0;
15947
15948 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
15949 memAlloc.allocationSize = memReqs.size;
15950 pass =
15951 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
15952 ASSERT_TRUE(pass);
15953 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
15954 ASSERT_VK_SUCCESS(err);
15955
15956 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
15957 memAlloc.allocationSize = memReqs.size;
15958 pass =
15959 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
15960 ASSERT_TRUE(pass);
15961 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
15962 ASSERT_VK_SUCCESS(err);
15963
15964 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15965 ASSERT_VK_SUCCESS(err);
15966 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
15967 ASSERT_VK_SUCCESS(err);
15968
15969 BeginCommandBuffer();
15970 VkImageCopy copyRegion;
15971 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15972 copyRegion.srcSubresource.mipLevel = 0;
15973 copyRegion.srcSubresource.baseArrayLayer = 0;
15974 copyRegion.srcSubresource.layerCount = 0;
15975 copyRegion.srcOffset.x = 0;
15976 copyRegion.srcOffset.y = 0;
15977 copyRegion.srcOffset.z = 0;
15978 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15979 copyRegion.dstSubresource.mipLevel = 0;
15980 copyRegion.dstSubresource.baseArrayLayer = 0;
15981 copyRegion.dstSubresource.layerCount = 0;
15982 copyRegion.dstOffset.x = 0;
15983 copyRegion.dstOffset.y = 0;
15984 copyRegion.dstOffset.z = 0;
15985 copyRegion.extent.width = 1;
15986 copyRegion.extent.height = 1;
15987 copyRegion.extent.depth = 1;
15988 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15989 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
15990 EndCommandBuffer();
15991
15992 m_errorMonitor->VerifyFound();
15993
15994 vkDestroyImage(m_device->device(), srcImage, NULL);
15995 vkDestroyImage(m_device->device(), dstImage, NULL);
15996 vkFreeMemory(m_device->device(), srcMem, NULL);
15997 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015998}
15999
Karl Schultz6addd812016-02-02 17:17:23 -070016000TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
16001 VkResult err;
16002 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016003
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016004 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016005 m_errorMonitor->SetDesiredFailureMsg(
16006 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016007 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016008
Mike Stroyana3082432015-09-25 13:39:21 -060016009 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016010
16011 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016012 VkImage srcImage;
16013 VkImage dstImage;
16014 VkDeviceMemory srcMem;
16015 VkDeviceMemory destMem;
16016 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016017
16018 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016019 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16020 image_create_info.pNext = NULL;
16021 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16022 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16023 image_create_info.extent.width = 32;
16024 image_create_info.extent.height = 32;
16025 image_create_info.extent.depth = 1;
16026 image_create_info.mipLevels = 1;
16027 image_create_info.arrayLayers = 1;
16028 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16029 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16030 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16031 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016032
Karl Schultz6addd812016-02-02 17:17:23 -070016033 err =
16034 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016035 ASSERT_VK_SUCCESS(err);
16036
Karl Schultzbdb75952016-04-19 11:36:49 -060016037 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16038
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016039 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070016040 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016041 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
16042 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016043
Karl Schultz6addd812016-02-02 17:17:23 -070016044 err =
16045 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016046 ASSERT_VK_SUCCESS(err);
16047
16048 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016049 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016050 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16051 memAlloc.pNext = NULL;
16052 memAlloc.allocationSize = 0;
16053 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016054
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016055 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016056 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016057 pass =
16058 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016059 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016060 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016061 ASSERT_VK_SUCCESS(err);
16062
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016063 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016064 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016065 pass =
16066 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016067 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016068 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016069 ASSERT_VK_SUCCESS(err);
16070
16071 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16072 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016073 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016074 ASSERT_VK_SUCCESS(err);
16075
16076 BeginCommandBuffer();
16077 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016078 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016079 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016080 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016081 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016082 copyRegion.srcOffset.x = 0;
16083 copyRegion.srcOffset.y = 0;
16084 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016085 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016086 copyRegion.dstSubresource.mipLevel = 0;
16087 copyRegion.dstSubresource.baseArrayLayer = 0;
16088 copyRegion.dstSubresource.layerCount = 0;
16089 copyRegion.dstOffset.x = 0;
16090 copyRegion.dstOffset.y = 0;
16091 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016092 copyRegion.extent.width = 1;
16093 copyRegion.extent.height = 1;
16094 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016095 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16096 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016097 EndCommandBuffer();
16098
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016099 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016100
Chia-I Wuf7458c52015-10-26 21:10:41 +080016101 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016102 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016103 vkFreeMemory(m_device->device(), srcMem, NULL);
16104 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016105}
16106
Karl Schultz6addd812016-02-02 17:17:23 -070016107TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
16108 VkResult err;
16109 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016110
Karl Schultz6addd812016-02-02 17:17:23 -070016111 m_errorMonitor->SetDesiredFailureMsg(
16112 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016113 "vkCmdResolveImage called with source sample count less than 2.");
16114
Mike Stroyana3082432015-09-25 13:39:21 -060016115 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016116
16117 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070016118 VkImage srcImage;
16119 VkImage dstImage;
16120 VkDeviceMemory srcMem;
16121 VkDeviceMemory destMem;
16122 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016123
16124 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016125 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16126 image_create_info.pNext = NULL;
16127 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16128 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16129 image_create_info.extent.width = 32;
16130 image_create_info.extent.height = 1;
16131 image_create_info.extent.depth = 1;
16132 image_create_info.mipLevels = 1;
16133 image_create_info.arrayLayers = 1;
16134 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16135 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16136 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16137 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016138
Karl Schultz6addd812016-02-02 17:17:23 -070016139 err =
16140 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016141 ASSERT_VK_SUCCESS(err);
16142
Karl Schultz6addd812016-02-02 17:17:23 -070016143 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016144
Karl Schultz6addd812016-02-02 17:17:23 -070016145 err =
16146 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016147 ASSERT_VK_SUCCESS(err);
16148
16149 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016150 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016151 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16152 memAlloc.pNext = NULL;
16153 memAlloc.allocationSize = 0;
16154 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016155
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016156 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016157 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016158 pass =
16159 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016160 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016161 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016162 ASSERT_VK_SUCCESS(err);
16163
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016164 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016165 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016166 pass =
16167 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016168 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016169 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016170 ASSERT_VK_SUCCESS(err);
16171
16172 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16173 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016174 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016175 ASSERT_VK_SUCCESS(err);
16176
16177 BeginCommandBuffer();
16178 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016179 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16180 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016181 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016182 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016183 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016184 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016185 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016186 resolveRegion.srcOffset.x = 0;
16187 resolveRegion.srcOffset.y = 0;
16188 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016189 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016190 resolveRegion.dstSubresource.mipLevel = 0;
16191 resolveRegion.dstSubresource.baseArrayLayer = 0;
16192 resolveRegion.dstSubresource.layerCount = 0;
16193 resolveRegion.dstOffset.x = 0;
16194 resolveRegion.dstOffset.y = 0;
16195 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016196 resolveRegion.extent.width = 1;
16197 resolveRegion.extent.height = 1;
16198 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016199 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16200 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016201 EndCommandBuffer();
16202
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016203 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016204
Chia-I Wuf7458c52015-10-26 21:10:41 +080016205 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016206 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016207 vkFreeMemory(m_device->device(), srcMem, NULL);
16208 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016209}
16210
Karl Schultz6addd812016-02-02 17:17:23 -070016211TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
16212 VkResult err;
16213 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016214
Karl Schultz6addd812016-02-02 17:17:23 -070016215 m_errorMonitor->SetDesiredFailureMsg(
16216 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016217 "vkCmdResolveImage called with dest sample count greater than 1.");
16218
Mike Stroyana3082432015-09-25 13:39:21 -060016219 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016220
Chris Forbesa7530692016-05-08 12:35:39 +120016221 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070016222 VkImage srcImage;
16223 VkImage dstImage;
16224 VkDeviceMemory srcMem;
16225 VkDeviceMemory destMem;
16226 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016227
16228 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016229 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16230 image_create_info.pNext = NULL;
16231 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16232 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16233 image_create_info.extent.width = 32;
16234 image_create_info.extent.height = 1;
16235 image_create_info.extent.depth = 1;
16236 image_create_info.mipLevels = 1;
16237 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120016238 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016239 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16240 // Note: Some implementations expect color attachment usage for any
16241 // multisample surface
16242 image_create_info.usage =
16243 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16244 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016245
Karl Schultz6addd812016-02-02 17:17:23 -070016246 err =
16247 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016248 ASSERT_VK_SUCCESS(err);
16249
Karl Schultz6addd812016-02-02 17:17:23 -070016250 // Note: Some implementations expect color attachment usage for any
16251 // multisample surface
16252 image_create_info.usage =
16253 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016254
Karl Schultz6addd812016-02-02 17:17:23 -070016255 err =
16256 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016257 ASSERT_VK_SUCCESS(err);
16258
16259 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016260 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016261 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16262 memAlloc.pNext = NULL;
16263 memAlloc.allocationSize = 0;
16264 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016265
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016266 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016267 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016268 pass =
16269 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016270 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016271 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016272 ASSERT_VK_SUCCESS(err);
16273
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016274 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016275 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016276 pass =
16277 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016278 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016279 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016280 ASSERT_VK_SUCCESS(err);
16281
16282 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16283 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016284 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016285 ASSERT_VK_SUCCESS(err);
16286
16287 BeginCommandBuffer();
16288 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016289 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16290 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016291 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016292 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016293 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016294 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016295 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016296 resolveRegion.srcOffset.x = 0;
16297 resolveRegion.srcOffset.y = 0;
16298 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016299 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016300 resolveRegion.dstSubresource.mipLevel = 0;
16301 resolveRegion.dstSubresource.baseArrayLayer = 0;
16302 resolveRegion.dstSubresource.layerCount = 0;
16303 resolveRegion.dstOffset.x = 0;
16304 resolveRegion.dstOffset.y = 0;
16305 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016306 resolveRegion.extent.width = 1;
16307 resolveRegion.extent.height = 1;
16308 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016309 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16310 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016311 EndCommandBuffer();
16312
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016313 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016314
Chia-I Wuf7458c52015-10-26 21:10:41 +080016315 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016316 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016317 vkFreeMemory(m_device->device(), srcMem, NULL);
16318 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016319}
16320
Karl Schultz6addd812016-02-02 17:17:23 -070016321TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
16322 VkResult err;
16323 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016324
Karl Schultz6addd812016-02-02 17:17:23 -070016325 m_errorMonitor->SetDesiredFailureMsg(
16326 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016327 "vkCmdResolveImage called with unmatched source and dest formats.");
16328
Mike Stroyana3082432015-09-25 13:39:21 -060016329 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016330
16331 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016332 VkImage srcImage;
16333 VkImage dstImage;
16334 VkDeviceMemory srcMem;
16335 VkDeviceMemory destMem;
16336 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016337
16338 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016339 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16340 image_create_info.pNext = NULL;
16341 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16342 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16343 image_create_info.extent.width = 32;
16344 image_create_info.extent.height = 1;
16345 image_create_info.extent.depth = 1;
16346 image_create_info.mipLevels = 1;
16347 image_create_info.arrayLayers = 1;
16348 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
16349 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16350 // Note: Some implementations expect color attachment usage for any
16351 // multisample surface
16352 image_create_info.usage =
16353 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16354 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016355
Karl Schultz6addd812016-02-02 17:17:23 -070016356 err =
16357 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016358 ASSERT_VK_SUCCESS(err);
16359
Karl Schultz6addd812016-02-02 17:17:23 -070016360 // Set format to something other than source image
16361 image_create_info.format = VK_FORMAT_R32_SFLOAT;
16362 // Note: Some implementations expect color attachment usage for any
16363 // multisample surface
16364 image_create_info.usage =
16365 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16366 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016367
Karl Schultz6addd812016-02-02 17:17:23 -070016368 err =
16369 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016370 ASSERT_VK_SUCCESS(err);
16371
16372 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016373 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016374 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16375 memAlloc.pNext = NULL;
16376 memAlloc.allocationSize = 0;
16377 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016378
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016379 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016380 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016381 pass =
16382 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016383 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016384 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016385 ASSERT_VK_SUCCESS(err);
16386
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016387 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016388 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016389 pass =
16390 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016391 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016392 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016393 ASSERT_VK_SUCCESS(err);
16394
16395 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16396 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016397 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016398 ASSERT_VK_SUCCESS(err);
16399
16400 BeginCommandBuffer();
16401 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016402 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16403 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016404 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016405 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016406 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016407 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016408 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016409 resolveRegion.srcOffset.x = 0;
16410 resolveRegion.srcOffset.y = 0;
16411 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016412 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016413 resolveRegion.dstSubresource.mipLevel = 0;
16414 resolveRegion.dstSubresource.baseArrayLayer = 0;
16415 resolveRegion.dstSubresource.layerCount = 0;
16416 resolveRegion.dstOffset.x = 0;
16417 resolveRegion.dstOffset.y = 0;
16418 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016419 resolveRegion.extent.width = 1;
16420 resolveRegion.extent.height = 1;
16421 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016422 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16423 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016424 EndCommandBuffer();
16425
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016426 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016427
Chia-I Wuf7458c52015-10-26 21:10:41 +080016428 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016429 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016430 vkFreeMemory(m_device->device(), srcMem, NULL);
16431 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016432}
16433
Karl Schultz6addd812016-02-02 17:17:23 -070016434TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
16435 VkResult err;
16436 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016437
Karl Schultz6addd812016-02-02 17:17:23 -070016438 m_errorMonitor->SetDesiredFailureMsg(
16439 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016440 "vkCmdResolveImage called with unmatched source and dest image types.");
16441
Mike Stroyana3082432015-09-25 13:39:21 -060016442 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016443
16444 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016445 VkImage srcImage;
16446 VkImage dstImage;
16447 VkDeviceMemory srcMem;
16448 VkDeviceMemory destMem;
16449 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016450
16451 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016452 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16453 image_create_info.pNext = NULL;
16454 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16455 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16456 image_create_info.extent.width = 32;
16457 image_create_info.extent.height = 1;
16458 image_create_info.extent.depth = 1;
16459 image_create_info.mipLevels = 1;
16460 image_create_info.arrayLayers = 1;
16461 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
16462 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16463 // Note: Some implementations expect color attachment usage for any
16464 // multisample surface
16465 image_create_info.usage =
16466 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16467 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016468
Karl Schultz6addd812016-02-02 17:17:23 -070016469 err =
16470 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016471 ASSERT_VK_SUCCESS(err);
16472
Karl Schultz6addd812016-02-02 17:17:23 -070016473 image_create_info.imageType = VK_IMAGE_TYPE_1D;
16474 // Note: Some implementations expect color attachment usage for any
16475 // multisample surface
16476 image_create_info.usage =
16477 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16478 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016479
Karl Schultz6addd812016-02-02 17:17:23 -070016480 err =
16481 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016482 ASSERT_VK_SUCCESS(err);
16483
16484 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016485 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016486 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16487 memAlloc.pNext = NULL;
16488 memAlloc.allocationSize = 0;
16489 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016490
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016491 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016492 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016493 pass =
16494 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016495 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016496 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016497 ASSERT_VK_SUCCESS(err);
16498
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016499 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016500 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016501 pass =
16502 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016503 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016504 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016505 ASSERT_VK_SUCCESS(err);
16506
16507 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16508 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016509 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016510 ASSERT_VK_SUCCESS(err);
16511
16512 BeginCommandBuffer();
16513 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016514 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16515 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016516 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016517 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016518 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016519 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016520 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016521 resolveRegion.srcOffset.x = 0;
16522 resolveRegion.srcOffset.y = 0;
16523 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016524 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016525 resolveRegion.dstSubresource.mipLevel = 0;
16526 resolveRegion.dstSubresource.baseArrayLayer = 0;
16527 resolveRegion.dstSubresource.layerCount = 0;
16528 resolveRegion.dstOffset.x = 0;
16529 resolveRegion.dstOffset.y = 0;
16530 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016531 resolveRegion.extent.width = 1;
16532 resolveRegion.extent.height = 1;
16533 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016534 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16535 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016536 EndCommandBuffer();
16537
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016538 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016539
Chia-I Wuf7458c52015-10-26 21:10:41 +080016540 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016541 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016542 vkFreeMemory(m_device->device(), srcMem, NULL);
16543 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016544}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016545
Karl Schultz6addd812016-02-02 17:17:23 -070016546TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016547 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070016548 // to using a DS format, then cause it to hit error due to COLOR_BIT not
16549 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016550 // The image format check comes 2nd in validation so we trigger it first,
16551 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070016552 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016553
Karl Schultz6addd812016-02-02 17:17:23 -070016554 m_errorMonitor->SetDesiredFailureMsg(
16555 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016556 "Combination depth/stencil image formats can have only the ");
16557
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016558 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016559
Chia-I Wu1b99bb22015-10-27 19:25:11 +080016560 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016561 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16562 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016563
16564 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016565 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16566 ds_pool_ci.pNext = NULL;
16567 ds_pool_ci.maxSets = 1;
16568 ds_pool_ci.poolSizeCount = 1;
16569 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016570
16571 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070016572 err =
16573 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016574 ASSERT_VK_SUCCESS(err);
16575
16576 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016577 dsl_binding.binding = 0;
16578 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16579 dsl_binding.descriptorCount = 1;
16580 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16581 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016582
16583 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016584 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16585 ds_layout_ci.pNext = NULL;
16586 ds_layout_ci.bindingCount = 1;
16587 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016588 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070016589 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
16590 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016591 ASSERT_VK_SUCCESS(err);
16592
16593 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016594 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080016595 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070016596 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016597 alloc_info.descriptorPool = ds_pool;
16598 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070016599 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
16600 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016601 ASSERT_VK_SUCCESS(err);
16602
Karl Schultz6addd812016-02-02 17:17:23 -070016603 VkImage image_bad;
16604 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016605 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060016606 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016607 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070016608 const int32_t tex_width = 32;
16609 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016610
16611 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016612 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16613 image_create_info.pNext = NULL;
16614 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16615 image_create_info.format = tex_format_bad;
16616 image_create_info.extent.width = tex_width;
16617 image_create_info.extent.height = tex_height;
16618 image_create_info.extent.depth = 1;
16619 image_create_info.mipLevels = 1;
16620 image_create_info.arrayLayers = 1;
16621 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16622 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16623 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
16624 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
16625 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016626
Karl Schultz6addd812016-02-02 17:17:23 -070016627 err =
16628 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016629 ASSERT_VK_SUCCESS(err);
16630 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070016631 image_create_info.usage =
16632 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16633 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
16634 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016635 ASSERT_VK_SUCCESS(err);
16636
16637 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016638 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16639 image_view_create_info.image = image_bad;
16640 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16641 image_view_create_info.format = tex_format_bad;
16642 image_view_create_info.subresourceRange.baseArrayLayer = 0;
16643 image_view_create_info.subresourceRange.baseMipLevel = 0;
16644 image_view_create_info.subresourceRange.layerCount = 1;
16645 image_view_create_info.subresourceRange.levelCount = 1;
16646 image_view_create_info.subresourceRange.aspectMask =
16647 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016648
16649 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070016650 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
16651 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016652
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016653 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016654
Chia-I Wuf7458c52015-10-26 21:10:41 +080016655 vkDestroyImage(m_device->device(), image_bad, NULL);
16656 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016657 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16658 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016659}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016660
16661TEST_F(VkLayerTest, ClearImageErrors) {
16662 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
16663 "ClearDepthStencilImage with a color image.");
16664
16665 ASSERT_NO_FATAL_FAILURE(InitState());
16666 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16667
16668 // Renderpass is started here so end it as Clear cmds can't be in renderpass
16669 BeginCommandBuffer();
16670 m_commandBuffer->EndRenderPass();
16671
16672 // Color image
16673 VkClearColorValue clear_color;
16674 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
16675 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
16676 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
16677 const int32_t img_width = 32;
16678 const int32_t img_height = 32;
16679 VkImageCreateInfo image_create_info = {};
16680 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16681 image_create_info.pNext = NULL;
16682 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16683 image_create_info.format = color_format;
16684 image_create_info.extent.width = img_width;
16685 image_create_info.extent.height = img_height;
16686 image_create_info.extent.depth = 1;
16687 image_create_info.mipLevels = 1;
16688 image_create_info.arrayLayers = 1;
16689 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16690 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16691 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16692
16693 vk_testing::Image color_image;
16694 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info,
16695 reqs);
16696
16697 const VkImageSubresourceRange color_range =
16698 vk_testing::Image::subresource_range(image_create_info,
16699 VK_IMAGE_ASPECT_COLOR_BIT);
16700
16701 // Depth/Stencil image
16702 VkClearDepthStencilValue clear_value = {0};
16703 reqs = 0; // don't need HOST_VISIBLE DS image
16704 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
16705 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
16706 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
16707 ds_image_create_info.extent.width = 64;
16708 ds_image_create_info.extent.height = 64;
16709 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16710 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
16711
16712 vk_testing::Image ds_image;
16713 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info,
16714 reqs);
16715
16716 const VkImageSubresourceRange ds_range =
16717 vk_testing::Image::subresource_range(ds_image_create_info,
16718 VK_IMAGE_ASPECT_DEPTH_BIT);
16719
16720 m_errorMonitor->SetDesiredFailureMsg(
16721 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16722 "vkCmdClearColorImage called with depth/stencil image.");
16723
16724 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
16725 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
16726 &color_range);
16727
16728 m_errorMonitor->VerifyFound();
16729
Tony Barbour26434b92016-06-02 09:43:50 -060016730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16731 "vkCmdClearColorImage called with "
16732 "image created without "
16733 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
16734
16735 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
16736 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
16737 &color_range);
16738
16739 m_errorMonitor->VerifyFound();
16740
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016741 // Call CmdClearDepthStencilImage with color image
16742 m_errorMonitor->SetDesiredFailureMsg(
16743 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16744 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
16745
16746 vkCmdClearDepthStencilImage(
16747 m_commandBuffer->GetBufferHandle(), color_image.handle(),
16748 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
16749 &ds_range);
16750
16751 m_errorMonitor->VerifyFound();
16752}
Tobin Ehliscde08892015-09-22 10:11:37 -060016753#endif // IMAGE_TESTS
16754
Cody Northrop1242dfd2016-07-13 17:24:59 -060016755#if defined(ANDROID) && defined(VALIDATION_APK)
16756static bool initialized = false;
16757static bool active = false;
16758
16759// Convert Intents to argv
16760// Ported from Hologram sample, only difference is flexible key
16761std::vector<std::string> get_args(android_app &app, const char* intent_extra_data_key)
16762{
16763 std::vector<std::string> args;
16764 JavaVM &vm = *app.activity->vm;
16765 JNIEnv *p_env;
16766 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK)
16767 return args;
16768
16769 JNIEnv &env = *p_env;
16770 jobject activity = app.activity->clazz;
16771 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity),
16772 "getIntent", "()Landroid/content/Intent;");
16773 jobject intent = env.CallObjectMethod(activity, get_intent_method);
16774 jmethodID get_string_extra_method = env.GetMethodID(env.GetObjectClass(intent),
16775 "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
16776 jvalue get_string_extra_args;
16777 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
16778 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent,
16779 get_string_extra_method, &get_string_extra_args));
16780
16781 std::string args_str;
16782 if (extra_str) {
16783 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
16784 args_str = extra_utf;
16785 env.ReleaseStringUTFChars(extra_str, extra_utf);
16786 env.DeleteLocalRef(extra_str);
16787 }
16788
16789 env.DeleteLocalRef(get_string_extra_args.l);
16790 env.DeleteLocalRef(intent);
16791 vm.DetachCurrentThread();
16792
16793 // split args_str
16794 std::stringstream ss(args_str);
16795 std::string arg;
16796 while (std::getline(ss, arg, ' ')) {
16797 if (!arg.empty())
16798 args.push_back(arg);
16799 }
16800
16801 return args;
16802}
16803
16804
16805static int32_t processInput(struct android_app* app, AInputEvent* event) {
16806 return 0;
16807}
16808
16809static void processCommand(struct android_app* app, int32_t cmd) {
16810 switch(cmd) {
16811 case APP_CMD_INIT_WINDOW: {
16812 if (app->window) {
16813 initialized = true;
16814 }
16815 break;
16816 }
16817 case APP_CMD_GAINED_FOCUS: {
16818 active = true;
16819 break;
16820 }
16821 case APP_CMD_LOST_FOCUS: {
16822 active = false;
16823 break;
16824 }
16825 }
16826}
16827
16828void android_main(struct android_app *app)
16829{
16830 app_dummy();
16831
16832 const char* appTag = "VulkanLayerValidationTests";
16833
16834 int vulkanSupport = InitVulkan();
16835 if (vulkanSupport == 0) {
16836 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
16837 return;
16838 }
16839
16840 app->onAppCmd = processCommand;
16841 app->onInputEvent = processInput;
16842
16843 while(1) {
16844 int events;
16845 struct android_poll_source* source;
16846 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void**)&source) >= 0) {
16847 if (source) {
16848 source->process(app, source);
16849 }
16850
16851 if (app->destroyRequested != 0) {
16852 VkTestFramework::Finish();
16853 return;
16854 }
16855 }
16856
16857 if (initialized && active) {
16858 // Use the following key to send arguments to gtest, i.e.
16859 // --es args "--gtest_filter=-VkLayerTest.foo"
16860 const char key[] = "args";
16861 std::vector<std::string> args = get_args(*app, key);
16862
16863 std::string filter = "";
16864 if (args.size() > 0) {
16865 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
16866 filter += args[0];
16867 } else {
16868 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
16869 }
16870
16871 int argc = 2;
16872 char *argv[] = { (char*)"foo", (char*)filter.c_str() };
16873 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
16874
16875 // Route output to files until we can override the gtest output
16876 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
16877 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
16878
16879 ::testing::InitGoogleTest(&argc, argv);
16880 VkTestFramework::InitArgs(&argc, argv);
16881 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
16882
16883 int result = RUN_ALL_TESTS();
16884
16885 if (result != 0) {
16886 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
16887 } else {
16888 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
16889 }
16890
16891 VkTestFramework::Finish();
16892
16893 fclose(stdout);
16894 fclose(stderr);
16895
16896 ANativeActivity_finish(app->activity);
16897
16898 return;
16899 }
16900 }
16901}
16902#endif
16903
Tony Barbour300a6082015-04-07 13:44:53 -060016904int main(int argc, char **argv) {
16905 int result;
16906
Cody Northrop8e54a402016-03-08 22:25:52 -070016907#ifdef ANDROID
16908 int vulkanSupport = InitVulkan();
16909 if (vulkanSupport == 0)
16910 return 1;
16911#endif
16912
Tony Barbour300a6082015-04-07 13:44:53 -060016913 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060016914 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060016915
16916 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
16917
16918 result = RUN_ALL_TESTS();
16919
Tony Barbour6918cd52015-04-09 12:58:51 -060016920 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060016921 return result;
16922}