blob: 230a68cc965a9de76ab04d391b10f6ee30575fea [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}
Dustin Gravesffa90fa2016-05-06 11:20:38 -06001671#endif // PARAMETER_VALIDATION_TESTS
1672
Tobin Ehlis0788f522015-05-26 16:11:58 -06001673#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001674#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001675TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001676{
1677 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001678 VkFenceCreateInfo fenceInfo = {};
1679 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1680 fenceInfo.pNext = NULL;
1681 fenceInfo.flags = 0;
1682
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001684
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001685 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001686
1687 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1688 vk_testing::Buffer buffer;
1689 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001690
Tony Barbourfe3351b2015-07-28 10:17:20 -06001691 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001692 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001693 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001694
1695 testFence.init(*m_device, fenceInfo);
1696
1697 // Bypass framework since it does the waits automatically
1698 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001699 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001700 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1701 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001702 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001703 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001704 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001705 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001706 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001707 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001708 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001709
1710 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001711 ASSERT_VK_SUCCESS( err );
1712
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001713 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001714 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001715
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001716 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001717}
1718
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001719TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001720{
1721 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001722 VkFenceCreateInfo fenceInfo = {};
1723 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1724 fenceInfo.pNext = NULL;
1725 fenceInfo.flags = 0;
1726
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001727 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001728
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001729 ASSERT_NO_FATAL_FAILURE(InitState());
1730 ASSERT_NO_FATAL_FAILURE(InitViewport());
1731 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1732
Tony Barbourfe3351b2015-07-28 10:17:20 -06001733 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001734 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001735 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001736
1737 testFence.init(*m_device, fenceInfo);
1738
1739 // Bypass framework since it does the waits automatically
1740 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001741 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001742 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1743 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001744 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001745 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001746 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001747 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001748 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001749 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001750 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001751
1752 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001753 ASSERT_VK_SUCCESS( err );
1754
Jon Ashburnf19916e2016-01-11 13:12:43 -07001755 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001756 VkCommandBufferBeginInfo info = {};
1757 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1758 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001759 info.renderPass = VK_NULL_HANDLE;
1760 info.subpass = 0;
1761 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001762 info.occlusionQueryEnable = VK_FALSE;
1763 info.queryFlags = 0;
1764 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001765
1766 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001767 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001768
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001769 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001770}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001771#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001772
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001773// This is a positive test. No failures are expected.
1774TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
1775 VkResult err;
1776 bool pass;
1777
1778 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
1779 "the buffer, create an image, and bind the same memory to "
1780 "it");
1781
1782 m_errorMonitor->ExpectSuccess();
1783
1784 ASSERT_NO_FATAL_FAILURE(InitState());
1785
1786 VkBuffer buffer;
1787 VkImage image;
1788 VkDeviceMemory mem;
1789 VkMemoryRequirements mem_reqs;
1790
1791 VkBufferCreateInfo buf_info = {};
1792 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1793 buf_info.pNext = NULL;
1794 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1795 buf_info.size = 256;
1796 buf_info.queueFamilyIndexCount = 0;
1797 buf_info.pQueueFamilyIndices = NULL;
1798 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1799 buf_info.flags = 0;
1800 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1801 ASSERT_VK_SUCCESS(err);
1802
1803 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1804
1805 VkMemoryAllocateInfo alloc_info = {};
1806 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1807 alloc_info.pNext = NULL;
1808 alloc_info.memoryTypeIndex = 0;
1809
1810 // Ensure memory is big enough for both bindings
1811 alloc_info.allocationSize = 0x10000;
1812
1813 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1814 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1815 if (!pass) {
1816 vkDestroyBuffer(m_device->device(), buffer, NULL);
1817 return;
1818 }
1819
1820 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1821 ASSERT_VK_SUCCESS(err);
1822
1823 uint8_t *pData;
1824 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1825 (void **)&pData);
1826 ASSERT_VK_SUCCESS(err);
1827
Mark Lobodzinski2abefa92016-05-05 11:45:57 -06001828 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001829
1830 vkUnmapMemory(m_device->device(), mem);
1831
1832 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1833 ASSERT_VK_SUCCESS(err);
1834
1835 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
1836 // memory. In fact, it was never used by the GPU.
1837 // Just be be sure, wait for idle.
1838 vkDestroyBuffer(m_device->device(), buffer, NULL);
1839 vkDeviceWaitIdle(m_device->device());
1840
1841 VkImageCreateInfo image_create_info = {};
1842 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1843 image_create_info.pNext = NULL;
1844 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1845 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1846 image_create_info.extent.width = 64;
1847 image_create_info.extent.height = 64;
1848 image_create_info.extent.depth = 1;
1849 image_create_info.mipLevels = 1;
1850 image_create_info.arrayLayers = 1;
1851 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1852 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1853 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1854 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1855 image_create_info.queueFamilyIndexCount = 0;
1856 image_create_info.pQueueFamilyIndices = NULL;
1857 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1858 image_create_info.flags = 0;
1859
1860 VkMemoryAllocateInfo mem_alloc = {};
1861 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1862 mem_alloc.pNext = NULL;
1863 mem_alloc.allocationSize = 0;
1864 mem_alloc.memoryTypeIndex = 0;
1865
1866 /* Create a mappable image. It will be the texture if linear images are ok
1867 * to be textures or it will be the staging image if they are not.
1868 */
1869 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1870 ASSERT_VK_SUCCESS(err);
1871
1872 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
1873
1874 mem_alloc.allocationSize = mem_reqs.size;
1875
1876 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
1877 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1878 if (!pass) {
1879 vkDestroyImage(m_device->device(), image, NULL);
1880 return;
1881 }
1882
Tobin Ehlis077ded32016-05-12 17:39:13 -06001883 // VALIDATION FAILURE:
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001884 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1885 ASSERT_VK_SUCCESS(err);
1886
1887 m_errorMonitor->VerifyNotFound();
1888
Tony Barbourdf4c0042016-06-01 15:55:43 -06001889 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001890 vkDestroyBuffer(m_device->device(), buffer, NULL);
1891 vkDestroyImage(m_device->device(), image, NULL);
1892}
1893
Tobin Ehlisf11be982016-05-11 13:52:53 -06001894TEST_F(VkLayerTest, InvalidMemoryAliasing) {
1895 TEST_DESCRIPTION("Create a buffer and image, allocate memory, and bind the "
1896 "buffer and image to memory such that they will alias.");
1897 VkResult err;
1898 bool pass;
1899 ASSERT_NO_FATAL_FAILURE(InitState());
1900
Tobin Ehlis077ded32016-05-12 17:39:13 -06001901 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001902 VkImage image;
1903 VkDeviceMemory mem; // buffer will be bound first
1904 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001905 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001906
1907 VkBufferCreateInfo buf_info = {};
1908 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1909 buf_info.pNext = NULL;
1910 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1911 buf_info.size = 256;
1912 buf_info.queueFamilyIndexCount = 0;
1913 buf_info.pQueueFamilyIndices = NULL;
1914 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1915 buf_info.flags = 0;
1916 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1917 ASSERT_VK_SUCCESS(err);
1918
Tobin Ehlis077ded32016-05-12 17:39:13 -06001919 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001920
1921 VkImageCreateInfo image_create_info = {};
1922 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1923 image_create_info.pNext = NULL;
1924 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1925 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1926 image_create_info.extent.width = 64;
1927 image_create_info.extent.height = 64;
1928 image_create_info.extent.depth = 1;
1929 image_create_info.mipLevels = 1;
1930 image_create_info.arrayLayers = 1;
1931 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001932 // Image tiling must be optimal to trigger error when aliasing linear buffer
1933 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001934 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1935 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1936 image_create_info.queueFamilyIndexCount = 0;
1937 image_create_info.pQueueFamilyIndices = NULL;
1938 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1939 image_create_info.flags = 0;
1940
Tobin Ehlisf11be982016-05-11 13:52:53 -06001941 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1942 ASSERT_VK_SUCCESS(err);
1943
Tobin Ehlis077ded32016-05-12 17:39:13 -06001944 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1945
1946 VkMemoryAllocateInfo alloc_info = {};
1947 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1948 alloc_info.pNext = NULL;
1949 alloc_info.memoryTypeIndex = 0;
1950 // Ensure memory is big enough for both bindings
1951 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
1952 pass = m_device->phy().set_memory_type(
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001953 buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1954 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001955 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001956 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001957 vkDestroyImage(m_device->device(), image, NULL);
1958 return;
1959 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001960 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1961 ASSERT_VK_SUCCESS(err);
1962 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1963 ASSERT_VK_SUCCESS(err);
1964
Tobin Ehlisf11be982016-05-11 13:52:53 -06001965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001966 " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001967 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001968 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1969 m_errorMonitor->VerifyFound();
1970
1971 // Now correctly bind image to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001972 // aliasing buffer2
1973 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1974 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001975 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1976 ASSERT_VK_SUCCESS(err);
1977 err = vkBindImageMemory(m_device->device(), image, mem_img, 0);
1978 ASSERT_VK_SUCCESS(err);
1979 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001980 "is aliased with non-linear image 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001981 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001982 m_errorMonitor->VerifyFound();
1983
1984 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001985 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001986 vkDestroyImage(m_device->device(), image, NULL);
1987 vkFreeMemory(m_device->device(), mem, NULL);
1988 vkFreeMemory(m_device->device(), mem_img, NULL);
1989}
1990
Tobin Ehlis35372522016-05-12 08:32:31 -06001991TEST_F(VkLayerTest, InvalidMemoryMapping) {
1992 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1993 VkResult err;
1994 bool pass;
1995 ASSERT_NO_FATAL_FAILURE(InitState());
1996
1997 VkBuffer buffer;
1998 VkDeviceMemory mem;
1999 VkMemoryRequirements mem_reqs;
2000
2001 VkBufferCreateInfo buf_info = {};
2002 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2003 buf_info.pNext = NULL;
2004 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2005 buf_info.size = 256;
2006 buf_info.queueFamilyIndexCount = 0;
2007 buf_info.pQueueFamilyIndices = NULL;
2008 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2009 buf_info.flags = 0;
2010 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
2011 ASSERT_VK_SUCCESS(err);
2012
2013 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
2014 VkMemoryAllocateInfo alloc_info = {};
2015 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2016 alloc_info.pNext = NULL;
2017 alloc_info.memoryTypeIndex = 0;
2018
2019 // Ensure memory is big enough for both bindings
2020 static const VkDeviceSize allocation_size = 0x10000;
2021 alloc_info.allocationSize = allocation_size;
2022 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2023 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2024 if (!pass) {
2025 vkDestroyBuffer(m_device->device(), buffer, NULL);
2026 return;
2027 }
2028 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2029 ASSERT_VK_SUCCESS(err);
2030
2031 uint8_t *pData;
2032 // Attempt to map memory size 0 is invalid
2033 m_errorMonitor->SetDesiredFailureMsg(
2034 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2035 "VkMapMemory: Attempting to map memory range of size zero");
2036 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
2037 m_errorMonitor->VerifyFound();
2038 // Map memory twice
2039 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2040 (void **)&pData);
2041 ASSERT_VK_SUCCESS(err);
2042 m_errorMonitor->SetDesiredFailureMsg(
2043 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2044 "VkMapMemory: Attempting to map memory on an already-mapped object ");
2045 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2046 (void **)&pData);
2047 m_errorMonitor->VerifyFound();
2048
2049 // Unmap the memory to avoid re-map error
2050 vkUnmapMemory(m_device->device(), mem);
2051 // overstep allocation with VK_WHOLE_SIZE
2052 m_errorMonitor->SetDesiredFailureMsg(
2053 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2054 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
2055 err = vkMapMemory(m_device->device(), mem, allocation_size + 1,
2056 VK_WHOLE_SIZE, 0, (void **)&pData);
2057 m_errorMonitor->VerifyFound();
2058 // overstep allocation w/o VK_WHOLE_SIZE
2059 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2060 " oversteps total array size 0x");
2061 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0,
2062 (void **)&pData);
2063 m_errorMonitor->VerifyFound();
2064 // Now error due to unmapping memory that's not mapped
2065 m_errorMonitor->SetDesiredFailureMsg(
2066 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2067 "Unmapping Memory without memory being mapped: ");
2068 vkUnmapMemory(m_device->device(), mem);
2069 m_errorMonitor->VerifyFound();
2070 // Now map memory and cause errors due to flushing invalid ranges
2071 err = vkMapMemory(m_device->device(), mem, 16, VK_WHOLE_SIZE, 0,
2072 (void **)&pData);
2073 ASSERT_VK_SUCCESS(err);
2074 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12002075 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06002076 mmr.memory = mem;
2077 mmr.offset = 15; // Error b/c offset less than offset of mapped mem
2078 m_errorMonitor->SetDesiredFailureMsg(
2079 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2080 ") is less than Memory Object's offset (");
2081 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2082 m_errorMonitor->VerifyFound();
2083 // Now flush range that oversteps mapped range
2084 vkUnmapMemory(m_device->device(), mem);
2085 err = vkMapMemory(m_device->device(), mem, 0, 256, 0, (void **)&pData);
2086 ASSERT_VK_SUCCESS(err);
2087 mmr.offset = 16;
2088 mmr.size = 256; // flushing bounds (272) exceed mapped bounds (256)
2089 m_errorMonitor->SetDesiredFailureMsg(
2090 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2091 ") exceeds the Memory Object's upper-bound (");
2092 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2093 m_errorMonitor->VerifyFound();
2094
2095 pass =
2096 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2097 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
2098 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
2099 if (!pass) {
2100 vkFreeMemory(m_device->device(), mem, NULL);
2101 vkDestroyBuffer(m_device->device(), buffer, NULL);
2102 return;
2103 }
2104 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
2105 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
2106
2107 vkDestroyBuffer(m_device->device(), buffer, NULL);
2108 vkFreeMemory(m_device->device(), mem, NULL);
2109}
2110
Ian Elliott1c32c772016-04-28 14:47:13 -06002111TEST_F(VkLayerTest, EnableWsiBeforeUse) {
2112 VkResult err;
2113 bool pass;
2114
Ian Elliott489eec02016-05-05 14:12:44 -06002115// FIXME: After we turn on this code for non-Linux platforms, uncomment the
2116// following declaration (which is temporarily being moved below):
2117// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002118 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2119 VkSwapchainCreateInfoKHR swapchain_create_info = {};
2120 uint32_t swapchain_image_count = 0;
2121// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2122 uint32_t image_index = 0;
2123// VkPresentInfoKHR present_info = {};
2124
2125 ASSERT_NO_FATAL_FAILURE(InitState());
2126
Ian Elliott3f06ce52016-04-29 14:46:21 -06002127#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
2128#if defined(VK_USE_PLATFORM_ANDROID_KHR)
2129 // Use the functions from the VK_KHR_android_surface extension without
2130 // enabling that extension:
2131
2132 // Create a surface:
2133 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002134 m_errorMonitor->SetDesiredFailureMsg(
2135 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2136 "extension was not enabled for this");
2137 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
2138 &surface);
2139 pass = (err != VK_SUCCESS);
2140 ASSERT_TRUE(pass);
2141 m_errorMonitor->VerifyFound();
2142#endif // VK_USE_PLATFORM_ANDROID_KHR
2143
2144
2145#if defined(VK_USE_PLATFORM_MIR_KHR)
2146 // Use the functions from the VK_KHR_mir_surface extension without enabling
2147 // that extension:
2148
2149 // Create a surface:
2150 VkMirSurfaceCreateInfoKHR mir_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002151 m_errorMonitor->SetDesiredFailureMsg(
2152 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2153 "extension was not enabled for this");
2154 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
2155 pass = (err != VK_SUCCESS);
2156 ASSERT_TRUE(pass);
2157 m_errorMonitor->VerifyFound();
2158
2159 // Tell whether an mir_connection supports presentation:
2160 MirConnection *mir_connection = NULL;
2161 m_errorMonitor->SetDesiredFailureMsg(
2162 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2163 "extension was not enabled for this");
2164 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
2165 visual_id);
2166 m_errorMonitor->VerifyFound();
2167#endif // VK_USE_PLATFORM_MIR_KHR
2168
2169
2170#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
2171 // Use the functions from the VK_KHR_wayland_surface extension without
2172 // enabling that extension:
2173
2174 // Create a surface:
2175 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002176 m_errorMonitor->SetDesiredFailureMsg(
2177 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2178 "extension was not enabled for this");
2179 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
2180 &surface);
2181 pass = (err != VK_SUCCESS);
2182 ASSERT_TRUE(pass);
2183 m_errorMonitor->VerifyFound();
2184
2185 // Tell whether an wayland_display supports presentation:
2186 struct wl_display wayland_display = {};
2187 m_errorMonitor->SetDesiredFailureMsg(
2188 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2189 "extension was not enabled for this");
2190 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
2191 &wayland_display);
2192 m_errorMonitor->VerifyFound();
2193#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06002194#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06002195
2196
2197#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002198// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2199// TO NON-LINUX PLATFORMS:
2200VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06002201 // Use the functions from the VK_KHR_win32_surface extension without
2202 // enabling that extension:
2203
2204 // Create a surface:
2205 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002206 m_errorMonitor->SetDesiredFailureMsg(
2207 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2208 "extension was not enabled for this");
2209 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
2210 &surface);
2211 pass = (err != VK_SUCCESS);
2212 ASSERT_TRUE(pass);
2213 m_errorMonitor->VerifyFound();
2214
2215 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002216 m_errorMonitor->SetDesiredFailureMsg(
2217 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2218 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06002219 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002220 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002221// Set this (for now, until all platforms are supported and tested):
2222#define NEED_TO_TEST_THIS_ON_PLATFORM
2223#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06002224
2225
Ian Elliott1c32c772016-04-28 14:47:13 -06002226#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002227// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2228// TO NON-LINUX PLATFORMS:
2229VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002230 // Use the functions from the VK_KHR_xcb_surface extension without enabling
2231 // that extension:
2232
2233 // Create a surface:
2234 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06002235 m_errorMonitor->SetDesiredFailureMsg(
2236 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2237 "extension was not enabled for this");
2238 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2239 pass = (err != VK_SUCCESS);
2240 ASSERT_TRUE(pass);
2241 m_errorMonitor->VerifyFound();
2242
2243 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002244 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002245 xcb_visualid_t visual_id = 0;
2246 m_errorMonitor->SetDesiredFailureMsg(
2247 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2248 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06002249 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -06002250 visual_id);
2251 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002252// Set this (for now, until all platforms are supported and tested):
2253#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002254#endif // VK_USE_PLATFORM_XCB_KHR
2255
2256
Ian Elliott12630812016-04-29 14:35:43 -06002257#if defined(VK_USE_PLATFORM_XLIB_KHR)
2258 // Use the functions from the VK_KHR_xlib_surface extension without enabling
2259 // that extension:
2260
2261 // Create a surface:
2262 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
Ian Elliott12630812016-04-29 14:35:43 -06002263 m_errorMonitor->SetDesiredFailureMsg(
2264 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2265 "extension was not enabled for this");
2266 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
2267 pass = (err != VK_SUCCESS);
2268 ASSERT_TRUE(pass);
2269 m_errorMonitor->VerifyFound();
2270
2271 // Tell whether an Xlib VisualID supports presentation:
2272 Display *dpy = NULL;
2273 VisualID visual = 0;
2274 m_errorMonitor->SetDesiredFailureMsg(
2275 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2276 "extension was not enabled for this");
2277 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
2278 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002279// Set this (for now, until all platforms are supported and tested):
2280#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06002281#endif // VK_USE_PLATFORM_XLIB_KHR
2282
2283
Ian Elliott1c32c772016-04-28 14:47:13 -06002284 // Use the functions from the VK_KHR_surface extension without enabling
2285 // that extension:
2286
Ian Elliott489eec02016-05-05 14:12:44 -06002287#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002288 // Destroy a surface:
2289 m_errorMonitor->SetDesiredFailureMsg(
2290 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2291 "extension was not enabled for this");
2292 vkDestroySurfaceKHR(instance(), surface, NULL);
2293 m_errorMonitor->VerifyFound();
2294
2295 // Check if surface supports presentation:
2296 VkBool32 supported = false;
2297 m_errorMonitor->SetDesiredFailureMsg(
2298 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2299 "extension was not enabled for this");
2300 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2301 pass = (err != VK_SUCCESS);
2302 ASSERT_TRUE(pass);
2303 m_errorMonitor->VerifyFound();
2304
2305 // Check surface capabilities:
2306 VkSurfaceCapabilitiesKHR capabilities = {};
2307 m_errorMonitor->SetDesiredFailureMsg(
2308 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2309 "extension was not enabled for this");
2310 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2311 &capabilities);
2312 pass = (err != VK_SUCCESS);
2313 ASSERT_TRUE(pass);
2314 m_errorMonitor->VerifyFound();
2315
2316 // Check surface formats:
2317 uint32_t format_count = 0;
2318 VkSurfaceFormatKHR *formats = NULL;
2319 m_errorMonitor->SetDesiredFailureMsg(
2320 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2321 "extension was not enabled for this");
2322 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2323 &format_count, formats);
2324 pass = (err != VK_SUCCESS);
2325 ASSERT_TRUE(pass);
2326 m_errorMonitor->VerifyFound();
2327
2328 // Check surface present modes:
2329 uint32_t present_mode_count = 0;
2330 VkSurfaceFormatKHR *present_modes = NULL;
2331 m_errorMonitor->SetDesiredFailureMsg(
2332 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2333 "extension was not enabled for this");
2334 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2335 &present_mode_count, present_modes);
2336 pass = (err != VK_SUCCESS);
2337 ASSERT_TRUE(pass);
2338 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002339#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002340
2341
2342 // Use the functions from the VK_KHR_swapchain extension without enabling
2343 // that extension:
2344
2345 // Create a swapchain:
2346 m_errorMonitor->SetDesiredFailureMsg(
2347 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2348 "extension was not enabled for this");
2349 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2350 swapchain_create_info.pNext = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002351 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
2352 NULL, &swapchain);
2353 pass = (err != VK_SUCCESS);
2354 ASSERT_TRUE(pass);
2355 m_errorMonitor->VerifyFound();
2356
2357 // Get the images from the swapchain:
2358 m_errorMonitor->SetDesiredFailureMsg(
2359 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2360 "extension was not enabled for this");
2361 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
2362 &swapchain_image_count, NULL);
2363 pass = (err != VK_SUCCESS);
2364 ASSERT_TRUE(pass);
2365 m_errorMonitor->VerifyFound();
2366
2367 // Try to acquire an image:
2368 m_errorMonitor->SetDesiredFailureMsg(
2369 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2370 "extension was not enabled for this");
2371 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
2372 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
2373 pass = (err != VK_SUCCESS);
2374 ASSERT_TRUE(pass);
2375 m_errorMonitor->VerifyFound();
2376
2377 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002378 //
2379 // NOTE: Currently can't test this because a real swapchain is needed (as
2380 // opposed to the fake one we created) in order for the layer to lookup the
2381 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06002382
2383 // Destroy the swapchain:
2384 m_errorMonitor->SetDesiredFailureMsg(
2385 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2386 "extension was not enabled for this");
2387 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
2388 m_errorMonitor->VerifyFound();
2389}
2390
Ian Elliott2c1daf52016-05-12 09:41:46 -06002391TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
Ian Elliott2c1daf52016-05-12 09:41:46 -06002392
Dustin Graves6c6d8982016-05-17 10:09:21 -06002393#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott2c1daf52016-05-12 09:41:46 -06002394 VkSurfaceKHR surface = VK_NULL_HANDLE;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002395
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002396 VkResult err;
2397 bool pass;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002398 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2399 VkSwapchainCreateInfoKHR swapchain_create_info = {};
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002400 // uint32_t swapchain_image_count = 0;
2401 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2402 // uint32_t image_index = 0;
2403 // VkPresentInfoKHR present_info = {};
Ian Elliott2c1daf52016-05-12 09:41:46 -06002404
2405 ASSERT_NO_FATAL_FAILURE(InitState());
2406
2407 // Use the create function from one of the VK_KHR_*_surface extension in
2408 // order to create a surface, testing all known errors in the process,
2409 // before successfully creating a surface:
2410 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002411 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2412 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002413 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
2414 pass = (err != VK_SUCCESS);
2415 ASSERT_TRUE(pass);
2416 m_errorMonitor->VerifyFound();
2417
2418 // Next, try to create a surface with the wrong
2419 // VkXcbSurfaceCreateInfoKHR::sType:
2420 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
2421 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002422 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2423 "called with the wrong value for");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002424 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2425 pass = (err != VK_SUCCESS);
2426 ASSERT_TRUE(pass);
2427 m_errorMonitor->VerifyFound();
2428
Ian Elliott2c1daf52016-05-12 09:41:46 -06002429 // Create a native window, and then correctly create a surface:
2430 xcb_connection_t *connection;
2431 xcb_screen_t *screen;
2432 xcb_window_t xcb_window;
2433 xcb_intern_atom_reply_t *atom_wm_delete_window;
2434
2435 const xcb_setup_t *setup;
2436 xcb_screen_iterator_t iter;
2437 int scr;
2438 uint32_t value_mask, value_list[32];
2439 int width = 1;
2440 int height = 1;
2441
2442 connection = xcb_connect(NULL, &scr);
2443 ASSERT_TRUE(connection != NULL);
2444 setup = xcb_get_setup(connection);
2445 iter = xcb_setup_roots_iterator(setup);
2446 while (scr-- > 0)
2447 xcb_screen_next(&iter);
2448 screen = iter.data;
2449
2450 xcb_window = xcb_generate_id(connection);
2451
2452 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
2453 value_list[0] = screen->black_pixel;
2454 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE |
2455 XCB_EVENT_MASK_STRUCTURE_NOTIFY;
2456
2457 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window,
2458 screen->root, 0, 0, width, height, 0,
2459 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual,
2460 value_mask, value_list);
2461
2462 /* Magic code that will send notification when window is destroyed */
2463 xcb_intern_atom_cookie_t cookie =
2464 xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
2465 xcb_intern_atom_reply_t *reply =
2466 xcb_intern_atom_reply(connection, cookie, 0);
2467
2468 xcb_intern_atom_cookie_t cookie2 =
2469 xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002470 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002471 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window,
2472 (*reply).atom, 4, 32, 1,
2473 &(*atom_wm_delete_window).atom);
2474 free(reply);
2475
2476 xcb_map_window(connection, xcb_window);
2477
2478 // Force the x/y coordinates to 100,100 results are identical in consecutive
2479 // runs
2480 const uint32_t coords[] = {100, 100};
2481 xcb_configure_window(connection, xcb_window,
2482 XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
2483
Ian Elliott2c1daf52016-05-12 09:41:46 -06002484 // Finally, try to correctly create a surface:
2485 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
2486 xcb_create_info.pNext = NULL;
2487 xcb_create_info.flags = 0;
2488 xcb_create_info.connection = connection;
2489 xcb_create_info.window = xcb_window;
2490 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2491 pass = (err == VK_SUCCESS);
2492 ASSERT_TRUE(pass);
2493
Ian Elliott2c1daf52016-05-12 09:41:46 -06002494 // Check if surface supports presentation:
2495
2496 // 1st, do so without having queried the queue families:
2497 VkBool32 supported = false;
2498 // TODO: Get the following error to come out:
2499 m_errorMonitor->SetDesiredFailureMsg(
2500 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2501 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
2502 "function");
2503 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2504 pass = (err != VK_SUCCESS);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002505 // ASSERT_TRUE(pass);
2506 // m_errorMonitor->VerifyFound();
Ian Elliott2c1daf52016-05-12 09:41:46 -06002507
2508 // Next, query a queue family index that's too large:
2509 m_errorMonitor->SetDesiredFailureMsg(
2510 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2511 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002512 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface,
2513 &supported);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002514 pass = (err != VK_SUCCESS);
2515 ASSERT_TRUE(pass);
2516 m_errorMonitor->VerifyFound();
2517
2518 // Finally, do so correctly:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002519 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2520 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002521 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2522 pass = (err == VK_SUCCESS);
2523 ASSERT_TRUE(pass);
2524
Ian Elliott2c1daf52016-05-12 09:41:46 -06002525 // Before proceeding, try to create a swapchain without having called
2526 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
2527 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2528 swapchain_create_info.pNext = NULL;
2529 swapchain_create_info.flags = 0;
2530 m_errorMonitor->SetDesiredFailureMsg(
2531 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2532 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002533 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2534 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002535 pass = (err != VK_SUCCESS);
2536 ASSERT_TRUE(pass);
2537 m_errorMonitor->VerifyFound();
2538
Ian Elliott2c1daf52016-05-12 09:41:46 -06002539 // Get the surface capabilities:
2540 VkSurfaceCapabilitiesKHR surface_capabilities;
2541
2542 // Do so correctly (only error logged by this entrypoint is if the
2543 // extension isn't enabled):
2544 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2545 &surface_capabilities);
2546 pass = (err == VK_SUCCESS);
2547 ASSERT_TRUE(pass);
2548
Ian Elliott2c1daf52016-05-12 09:41:46 -06002549 // Get the surface formats:
2550 uint32_t surface_format_count;
2551
2552 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002553 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2554 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002555 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
2556 pass = (err == VK_SUCCESS);
2557 ASSERT_TRUE(pass);
2558 m_errorMonitor->VerifyFound();
2559
2560 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
2561 // correctly done a 1st try (to get the count):
2562 m_errorMonitor->SetDesiredFailureMsg(
2563 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2564 "but no prior positive value has been seen for");
2565 surface_format_count = 0;
2566 vkGetPhysicalDeviceSurfaceFormatsKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002567 gpu(), surface, &surface_format_count,
2568 (VkSurfaceFormatKHR *)&surface_format_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002569 pass = (err == VK_SUCCESS);
2570 ASSERT_TRUE(pass);
2571 m_errorMonitor->VerifyFound();
2572
2573 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002574 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2575 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002576 pass = (err == VK_SUCCESS);
2577 ASSERT_TRUE(pass);
2578
2579 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002580 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(
2581 surface_format_count * sizeof(VkSurfaceFormatKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002582
2583 // Next, do a 2nd try with surface_format_count being set too high:
2584 surface_format_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002585 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2586 "that is greater than the value");
2587 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002588 surface_formats);
2589 pass = (err == VK_SUCCESS);
2590 ASSERT_TRUE(pass);
2591 m_errorMonitor->VerifyFound();
2592
2593 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002594 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2595 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002596 pass = (err == VK_SUCCESS);
2597 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002598 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002599 surface_formats);
2600 pass = (err == VK_SUCCESS);
2601 ASSERT_TRUE(pass);
2602
Ian Elliott2c1daf52016-05-12 09:41:46 -06002603 // Get the surface present modes:
2604 uint32_t surface_present_mode_count;
2605
2606 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2608 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002609 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
2610 pass = (err == VK_SUCCESS);
2611 ASSERT_TRUE(pass);
2612 m_errorMonitor->VerifyFound();
2613
2614 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
2615 // correctly done a 1st try (to get the count):
2616 m_errorMonitor->SetDesiredFailureMsg(
2617 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2618 "but no prior positive value has been seen for");
2619 surface_present_mode_count = 0;
2620 vkGetPhysicalDeviceSurfacePresentModesKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002621 gpu(), surface, &surface_present_mode_count,
2622 (VkPresentModeKHR *)&surface_present_mode_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002623 pass = (err == VK_SUCCESS);
2624 ASSERT_TRUE(pass);
2625 m_errorMonitor->VerifyFound();
2626
2627 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002628 vkGetPhysicalDeviceSurfacePresentModesKHR(
2629 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002630 pass = (err == VK_SUCCESS);
2631 ASSERT_TRUE(pass);
2632
2633 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002634 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(
2635 surface_present_mode_count * sizeof(VkPresentModeKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002636
2637 // Next, do a 2nd try with surface_format_count being set too high:
2638 surface_present_mode_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002639 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2640 "that is greater than the value");
2641 vkGetPhysicalDeviceSurfacePresentModesKHR(
2642 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002643 pass = (err == VK_SUCCESS);
2644 ASSERT_TRUE(pass);
2645 m_errorMonitor->VerifyFound();
2646
2647 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002648 vkGetPhysicalDeviceSurfacePresentModesKHR(
2649 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002650 pass = (err == VK_SUCCESS);
2651 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002652 vkGetPhysicalDeviceSurfacePresentModesKHR(
2653 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002654 pass = (err == VK_SUCCESS);
2655 ASSERT_TRUE(pass);
2656
Ian Elliott2c1daf52016-05-12 09:41:46 -06002657 // Create a swapchain:
2658
2659 // First, try without a pointer to swapchain_create_info:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2661 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002662 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
2663 pass = (err != VK_SUCCESS);
2664 ASSERT_TRUE(pass);
2665 m_errorMonitor->VerifyFound();
2666
2667 // Next, call with a non-NULL swapchain_create_info, that has the wrong
2668 // sType:
2669 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002670 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2671 "called with the wrong value for");
2672 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2673 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002674 pass = (err != VK_SUCCESS);
2675 ASSERT_TRUE(pass);
2676 m_errorMonitor->VerifyFound();
2677
2678 // Next, call with a NULL swapchain pointer:
2679 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2680 swapchain_create_info.pNext = NULL;
2681 swapchain_create_info.flags = 0;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002682 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2683 "called with NULL pointer");
2684 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2685 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002686 pass = (err != VK_SUCCESS);
2687 ASSERT_TRUE(pass);
2688 m_errorMonitor->VerifyFound();
2689
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002690 // TODO: Enhance swapchain layer so that
2691 // swapchain_create_info.queueFamilyIndexCount is checked against something?
Ian Elliott2c1daf52016-05-12 09:41:46 -06002692
2693 // Next, call with a queue family index that's too large:
2694 uint32_t queueFamilyIndex[2] = {100000, 0};
2695 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2696 swapchain_create_info.queueFamilyIndexCount = 2;
2697 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
2698 m_errorMonitor->SetDesiredFailureMsg(
2699 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2700 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002701 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2702 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002703 pass = (err != VK_SUCCESS);
2704 ASSERT_TRUE(pass);
2705 m_errorMonitor->VerifyFound();
2706
2707 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
2708 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2709 swapchain_create_info.queueFamilyIndexCount = 1;
2710 m_errorMonitor->SetDesiredFailureMsg(
2711 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2712 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
2713 "pCreateInfo->pQueueFamilyIndices).");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002714 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2715 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002716 pass = (err != VK_SUCCESS);
2717 ASSERT_TRUE(pass);
2718 m_errorMonitor->VerifyFound();
2719
2720 // Next, call with an invalid imageSharingMode:
2721 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
2722 swapchain_create_info.queueFamilyIndexCount = 1;
2723 m_errorMonitor->SetDesiredFailureMsg(
2724 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2725 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002726 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2727 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002728 pass = (err != VK_SUCCESS);
2729 ASSERT_TRUE(pass);
2730 m_errorMonitor->VerifyFound();
2731 // Fix for the future:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002732 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2733 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002734 swapchain_create_info.queueFamilyIndexCount = 0;
2735 queueFamilyIndex[0] = 0;
2736 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
2737
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002738 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
Ian Elliott2c1daf52016-05-12 09:41:46 -06002739 // Get the images from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002740 // Acquire an image from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002741 // Present an image to a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002742 // Destroy the swapchain:
2743
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002744 // TODOs:
2745 //
2746 // - Try destroying the device without first destroying the swapchain
2747 //
2748 // - Try destroying the device without first destroying the surface
2749 //
2750 // - Try destroying the surface without first destroying the swapchain
Ian Elliott2c1daf52016-05-12 09:41:46 -06002751
2752 // Destroy the surface:
2753 vkDestroySurfaceKHR(instance(), surface, NULL);
2754
Ian Elliott2c1daf52016-05-12 09:41:46 -06002755 // Tear down the window:
2756 xcb_destroy_window(connection, xcb_window);
2757 xcb_disconnect(connection);
2758
2759#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002760 return;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002761#endif // VK_USE_PLATFORM_XCB_KHR
2762}
2763
Karl Schultz6addd812016-02-02 17:17:23 -07002764TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2765 VkResult err;
2766 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002767
Karl Schultz6addd812016-02-02 17:17:23 -07002768 m_errorMonitor->SetDesiredFailureMsg(
2769 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002770 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
2771
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002772 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002773
2774 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002775 VkImage image;
2776 VkDeviceMemory mem;
2777 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002778
Karl Schultz6addd812016-02-02 17:17:23 -07002779 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2780 const int32_t tex_width = 32;
2781 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002782
Tony Barboureb254902015-07-15 12:50:33 -06002783 VkImageCreateInfo image_create_info = {};
2784 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002785 image_create_info.pNext = NULL;
2786 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2787 image_create_info.format = tex_format;
2788 image_create_info.extent.width = tex_width;
2789 image_create_info.extent.height = tex_height;
2790 image_create_info.extent.depth = 1;
2791 image_create_info.mipLevels = 1;
2792 image_create_info.arrayLayers = 1;
2793 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2794 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2795 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2796 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002797
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002798 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002799 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002800 mem_alloc.pNext = NULL;
2801 mem_alloc.allocationSize = 0;
2802 // Introduce failure, do NOT set memProps to
2803 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
2804 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002805
Chia-I Wuf7458c52015-10-26 21:10:41 +08002806 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002807 ASSERT_VK_SUCCESS(err);
2808
Karl Schultz6addd812016-02-02 17:17:23 -07002809 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002810
Mark Lobodzinski23065352015-05-29 09:32:35 -05002811 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002812
Karl Schultz6addd812016-02-02 17:17:23 -07002813 pass =
2814 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
2815 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2816 if (!pass) { // If we can't find any unmappable memory this test doesn't
2817 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002818 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002819 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002820 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002821
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002822 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002823 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002824 ASSERT_VK_SUCCESS(err);
2825
2826 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002827 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002828 ASSERT_VK_SUCCESS(err);
2829
2830 // Map memory as if to initialize the image
2831 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07002832 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
2833 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002834
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002835 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002836
Chia-I Wuf7458c52015-10-26 21:10:41 +08002837 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002838 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002839}
2840
Karl Schultz6addd812016-02-02 17:17:23 -07002841TEST_F(VkLayerTest, RebindMemory) {
2842 VkResult err;
2843 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002844
Karl Schultz6addd812016-02-02 17:17:23 -07002845 m_errorMonitor->SetDesiredFailureMsg(
2846 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002847 "which has already been bound to mem object");
2848
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002849 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002850
2851 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002852 VkImage image;
2853 VkDeviceMemory mem1;
2854 VkDeviceMemory mem2;
2855 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002856
Karl Schultz6addd812016-02-02 17:17:23 -07002857 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2858 const int32_t tex_width = 32;
2859 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002860
Tony Barboureb254902015-07-15 12:50:33 -06002861 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002862 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2863 image_create_info.pNext = NULL;
2864 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2865 image_create_info.format = tex_format;
2866 image_create_info.extent.width = tex_width;
2867 image_create_info.extent.height = tex_height;
2868 image_create_info.extent.depth = 1;
2869 image_create_info.mipLevels = 1;
2870 image_create_info.arrayLayers = 1;
2871 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2872 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2873 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2874 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002875
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002876 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002877 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2878 mem_alloc.pNext = NULL;
2879 mem_alloc.allocationSize = 0;
2880 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002881
Karl Schultz6addd812016-02-02 17:17:23 -07002882 // Introduce failure, do NOT set memProps to
2883 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002884 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002885 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002886 ASSERT_VK_SUCCESS(err);
2887
Karl Schultz6addd812016-02-02 17:17:23 -07002888 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002889
2890 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002891 pass =
2892 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002893 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002894
2895 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002896 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002897 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002898 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002899 ASSERT_VK_SUCCESS(err);
2900
2901 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002902 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002903 ASSERT_VK_SUCCESS(err);
2904
Karl Schultz6addd812016-02-02 17:17:23 -07002905 // Introduce validation failure, try to bind a different memory object to
2906 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002907 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002908
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002909 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002910
Chia-I Wuf7458c52015-10-26 21:10:41 +08002911 vkDestroyImage(m_device->device(), image, NULL);
2912 vkFreeMemory(m_device->device(), mem1, NULL);
2913 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002914}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002915
Karl Schultz6addd812016-02-02 17:17:23 -07002916TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002917 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002918
Karl Schultz6addd812016-02-02 17:17:23 -07002919 m_errorMonitor->SetDesiredFailureMsg(
2920 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
2921 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002922
2923 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002924 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2925 fenceInfo.pNext = NULL;
2926 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002927
Tony Barbour300a6082015-04-07 13:44:53 -06002928 ASSERT_NO_FATAL_FAILURE(InitState());
2929 ASSERT_NO_FATAL_FAILURE(InitViewport());
2930 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2931
Tony Barbourfe3351b2015-07-28 10:17:20 -06002932 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002933 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2934 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06002935 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002936
2937 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002938
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002939 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002940 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2941 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002942 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002943 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002944 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002945 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002946 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002947 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002948 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002949
2950 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002951 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002952
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002953 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002954}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002955// This is a positive test. We used to expect error in this case but spec now
2956// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07002957TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002958 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002959 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002960 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002961 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2962 fenceInfo.pNext = NULL;
2963
Tony Barbour0b4d9562015-04-09 10:48:04 -06002964 ASSERT_NO_FATAL_FAILURE(InitState());
2965 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08002966 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002967 VkResult result = vkResetFences(m_device->device(), 1, fences);
2968 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06002969
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002970 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06002971}
Tobin Ehlis41376e12015-07-03 08:45:14 -06002972
Chris Forbese70b7d32016-06-15 15:49:12 +12002973#if 0
2974TEST_F(VkLayerTest, LongFenceChain)
2975{
2976 m_errorMonitor->ExpectSuccess();
2977
2978 ASSERT_NO_FATAL_FAILURE(InitState());
2979 VkResult err;
2980
2981 std::vector<VkFence> fences;
2982
2983 const int chainLength = 32768;
2984
2985 for (int i = 0; i < chainLength; i++) {
2986 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
2987 VkFence fence;
2988 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
2989 ASSERT_VK_SUCCESS(err);
2990
2991 fences.push_back(fence);
2992
2993 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
2994 0, nullptr, 0, nullptr };
2995 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
2996 ASSERT_VK_SUCCESS(err);
2997
2998 }
2999
3000 // BOOM, stack overflow.
3001 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
3002
3003 for (auto fence : fences)
3004 vkDestroyFence(m_device->device(), fence, nullptr);
3005
3006 m_errorMonitor->VerifyNotFound();
3007}
3008#endif
3009
Chris Forbes18127d12016-06-08 16:52:28 +12003010TEST_F(VkLayerTest, CommandBufferSimultaneousUseSync)
3011{
3012 m_errorMonitor->ExpectSuccess();
3013
3014 ASSERT_NO_FATAL_FAILURE(InitState());
3015 VkResult err;
3016
3017 // Record (empty!) command buffer that can be submitted multiple times
3018 // simultaneously.
3019 VkCommandBufferBeginInfo cbbi = {
3020 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
3021 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr
3022 };
3023 m_commandBuffer->BeginCommandBuffer(&cbbi);
3024 m_commandBuffer->EndCommandBuffer();
3025
3026 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3027 VkFence fence;
3028 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3029 ASSERT_VK_SUCCESS(err);
3030
3031 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
3032 VkSemaphore s1, s2;
3033 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
3034 ASSERT_VK_SUCCESS(err);
3035 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
3036 ASSERT_VK_SUCCESS(err);
3037
3038 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
3039 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3040 1, &m_commandBuffer->handle(), 1, &s1 };
3041 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3042 ASSERT_VK_SUCCESS(err);
3043
3044 // Submit CB again, signaling s2.
3045 si.pSignalSemaphores = &s2;
3046 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
3047 ASSERT_VK_SUCCESS(err);
3048
3049 // Wait for fence.
3050 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3051 ASSERT_VK_SUCCESS(err);
3052
3053 // CB is still in flight from second submission, but semaphore s1 is no
3054 // longer in flight. delete it.
3055 vkDestroySemaphore(m_device->device(), s1, nullptr);
3056
3057 m_errorMonitor->VerifyNotFound();
3058
3059 // Force device idle and clean up remaining objects
3060 vkDeviceWaitIdle(m_device->device());
3061 vkDestroySemaphore(m_device->device(), s2, nullptr);
3062 vkDestroyFence(m_device->device(), fence, nullptr);
3063}
3064
Chris Forbes4e44c912016-06-16 10:20:00 +12003065TEST_F(VkLayerTest, FenceCreateSignaledWaitHandling)
3066{
3067 m_errorMonitor->ExpectSuccess();
3068
3069 ASSERT_NO_FATAL_FAILURE(InitState());
3070 VkResult err;
3071
3072 // A fence created signaled
3073 VkFenceCreateInfo fci1 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT };
3074 VkFence f1;
3075 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
3076 ASSERT_VK_SUCCESS(err);
3077
3078 // A fence created not
3079 VkFenceCreateInfo fci2 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3080 VkFence f2;
3081 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
3082 ASSERT_VK_SUCCESS(err);
3083
3084 // Submit the unsignaled fence
3085 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3086 0, nullptr, 0, nullptr };
3087 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
3088
3089 // Wait on both fences, with signaled first.
3090 VkFence fences[] = { f1, f2 };
3091 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
3092
3093 // Should have both retired!
3094 vkDestroyFence(m_device->device(), f1, nullptr);
3095 vkDestroyFence(m_device->device(), f2, nullptr);
3096
3097 m_errorMonitor->VerifyNotFound();
3098}
3099
Tobin Ehlis41376e12015-07-03 08:45:14 -06003100TEST_F(VkLayerTest, InvalidUsageBits)
3101{
Tony Barbourf92621a2016-05-02 14:28:12 -06003102 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003103 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06003104 "Initialize buffer with wrong usage then perform copy expecting errors "
3105 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003106 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003107 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06003108
3109 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06003110 VkImageObj image(m_device);
3111 // Initialize image with USAGE_INPUT_ATTACHMENT
Tobin Ehlis8b313c02016-05-25 15:01:52 -06003112 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003113 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
3114 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06003115
Tony Barbourf92621a2016-05-02 14:28:12 -06003116 VkImageView dsv;
3117 VkImageViewCreateInfo dsvci = {};
3118 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3119 dsvci.image = image.handle();
3120 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3121 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
3122 dsvci.subresourceRange.layerCount = 1;
3123 dsvci.subresourceRange.baseMipLevel = 0;
3124 dsvci.subresourceRange.levelCount = 1;
3125 dsvci.subresourceRange.aspectMask =
3126 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06003127
Tony Barbourf92621a2016-05-02 14:28:12 -06003128 // Create a view with depth / stencil aspect for image with different usage
3129 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003130
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003131 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06003132
3133 // Initialize buffer with TRANSFER_DST usage
3134 vk_testing::Buffer buffer;
3135 VkMemoryPropertyFlags reqs = 0;
3136 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3137 VkBufferImageCopy region = {};
3138 region.bufferRowLength = 128;
3139 region.bufferImageHeight = 128;
3140 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3141 region.imageSubresource.layerCount = 1;
3142 region.imageExtent.height = 16;
3143 region.imageExtent.width = 16;
3144 region.imageExtent.depth = 1;
3145
3146 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3147 "Invalid usage flag for buffer ");
3148 // Buffer usage not set to TRANSFER_SRC and image usage not set to
3149 // TRANSFER_DST
3150 BeginCommandBuffer();
3151 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3152 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3153 1, &region);
3154 m_errorMonitor->VerifyFound();
3155
3156 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3157 "Invalid usage flag for image ");
3158 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3159 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3160 1, &region);
3161 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06003162}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003163#endif // MEM_TRACKER_TESTS
3164
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06003165#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003166
3167TEST_F(VkLayerTest, LeakAnObject) {
3168 VkResult err;
3169
3170 TEST_DESCRIPTION(
3171 "Create a fence and destroy its device without first destroying the fence.");
3172
3173 // Note that we have to create a new device since destroying the
3174 // framework's device causes Teardown() to fail and just calling Teardown
3175 // will destroy the errorMonitor.
3176
3177 m_errorMonitor->SetDesiredFailureMsg(
3178 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003179 "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003180
3181 ASSERT_NO_FATAL_FAILURE(InitState());
3182
3183 const std::vector<VkQueueFamilyProperties> queue_props =
3184 m_device->queue_props;
3185 std::vector<VkDeviceQueueCreateInfo> queue_info;
3186 queue_info.reserve(queue_props.size());
3187 std::vector<std::vector<float>> queue_priorities;
3188 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
3189 VkDeviceQueueCreateInfo qi = {};
3190 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
3191 qi.pNext = NULL;
3192 qi.queueFamilyIndex = i;
3193 qi.queueCount = queue_props[i].queueCount;
3194 queue_priorities.emplace_back(qi.queueCount, 0.0f);
3195 qi.pQueuePriorities = queue_priorities[i].data();
3196 queue_info.push_back(qi);
3197 }
3198
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003199 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003200
3201 // The sacrificial device object
3202 VkDevice testDevice;
3203 VkDeviceCreateInfo device_create_info = {};
3204 auto features = m_device->phy().features();
3205 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
3206 device_create_info.pNext = NULL;
3207 device_create_info.queueCreateInfoCount = queue_info.size();
3208 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06003209 device_create_info.enabledLayerCount = 0;
3210 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003211 device_create_info.pEnabledFeatures = &features;
3212 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
3213 ASSERT_VK_SUCCESS(err);
3214
3215 VkFence fence;
3216 VkFenceCreateInfo fence_create_info = {};
3217 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3218 fence_create_info.pNext = NULL;
3219 fence_create_info.flags = 0;
3220 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
3221 ASSERT_VK_SUCCESS(err);
3222
3223 // Induce failure by not calling vkDestroyFence
3224 vkDestroyDevice(testDevice, NULL);
3225 m_errorMonitor->VerifyFound();
3226}
3227
3228TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
3229
3230 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
3231 "attempt to delete them from another.");
3232
3233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3234 "FreeCommandBuffers is attempting to free Command Buffer");
3235
3236 VkCommandPool command_pool_one;
3237 VkCommandPool command_pool_two;
3238
3239 VkCommandPoolCreateInfo pool_create_info{};
3240 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3241 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3242 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3243
3244 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3245 &command_pool_one);
3246
3247 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3248 &command_pool_two);
3249
3250 VkCommandBuffer command_buffer[9];
3251 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3252 command_buffer_allocate_info.sType =
3253 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3254 command_buffer_allocate_info.commandPool = command_pool_one;
3255 command_buffer_allocate_info.commandBufferCount = 9;
3256 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3257 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3258 command_buffer);
3259
3260 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
3261 &command_buffer[3]);
3262
3263 m_errorMonitor->VerifyFound();
3264
3265 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
3266 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
3267}
3268
3269TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
3270 VkResult err;
3271
3272 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
3273 "attempt to delete them from another.");
3274
3275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3276 "FreeDescriptorSets is attempting to free descriptorSet");
3277
3278 ASSERT_NO_FATAL_FAILURE(InitState());
3279 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3280
3281 VkDescriptorPoolSize ds_type_count = {};
3282 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3283 ds_type_count.descriptorCount = 1;
3284
3285 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3286 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3287 ds_pool_ci.pNext = NULL;
3288 ds_pool_ci.flags = 0;
3289 ds_pool_ci.maxSets = 1;
3290 ds_pool_ci.poolSizeCount = 1;
3291 ds_pool_ci.pPoolSizes = &ds_type_count;
3292
3293 VkDescriptorPool ds_pool_one;
3294 err =
3295 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
3296 ASSERT_VK_SUCCESS(err);
3297
3298 // Create a second descriptor pool
3299 VkDescriptorPool ds_pool_two;
3300 err =
3301 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
3302 ASSERT_VK_SUCCESS(err);
3303
3304 VkDescriptorSetLayoutBinding dsl_binding = {};
3305 dsl_binding.binding = 0;
3306 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3307 dsl_binding.descriptorCount = 1;
3308 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3309 dsl_binding.pImmutableSamplers = NULL;
3310
3311 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3312 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3313 ds_layout_ci.pNext = NULL;
3314 ds_layout_ci.bindingCount = 1;
3315 ds_layout_ci.pBindings = &dsl_binding;
3316
3317 VkDescriptorSetLayout ds_layout;
3318 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3319 &ds_layout);
3320 ASSERT_VK_SUCCESS(err);
3321
3322 VkDescriptorSet descriptorSet;
3323 VkDescriptorSetAllocateInfo alloc_info = {};
3324 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3325 alloc_info.descriptorSetCount = 1;
3326 alloc_info.descriptorPool = ds_pool_one;
3327 alloc_info.pSetLayouts = &ds_layout;
3328 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3329 &descriptorSet);
3330 ASSERT_VK_SUCCESS(err);
3331
3332 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
3333
3334 m_errorMonitor->VerifyFound();
3335
3336 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3337 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
3338 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
3339}
3340
3341TEST_F(VkLayerTest, CreateUnknownObject) {
3342 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003343 "Invalid Image Object ");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003344
3345 TEST_DESCRIPTION(
3346 "Pass an invalid image object handle into a Vulkan API call.");
3347
3348 ASSERT_NO_FATAL_FAILURE(InitState());
3349
3350 // Pass bogus handle into GetImageMemoryRequirements
3351 VkMemoryRequirements mem_reqs;
3352 uint64_t fakeImageHandle = 0xCADECADE;
3353 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
3354
3355 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
3356
3357 m_errorMonitor->VerifyFound();
3358}
3359
Karl Schultz6addd812016-02-02 17:17:23 -07003360TEST_F(VkLayerTest, PipelineNotBound) {
3361 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003362
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003363 TEST_DESCRIPTION(
3364 "Pass in an invalid pipeline object handle into a Vulkan API call.");
3365
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003367 "Invalid Pipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003368
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003369 ASSERT_NO_FATAL_FAILURE(InitState());
3370 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003371
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003372 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003373 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3374 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003375
3376 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003377 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3378 ds_pool_ci.pNext = NULL;
3379 ds_pool_ci.maxSets = 1;
3380 ds_pool_ci.poolSizeCount = 1;
3381 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003382
3383 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003384 err =
3385 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003386 ASSERT_VK_SUCCESS(err);
3387
3388 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003389 dsl_binding.binding = 0;
3390 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3391 dsl_binding.descriptorCount = 1;
3392 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3393 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003394
3395 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003396 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3397 ds_layout_ci.pNext = NULL;
3398 ds_layout_ci.bindingCount = 1;
3399 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003400
3401 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003402 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3403 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003404 ASSERT_VK_SUCCESS(err);
3405
3406 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003407 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003408 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003409 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003410 alloc_info.descriptorPool = ds_pool;
3411 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003412 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3413 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003414 ASSERT_VK_SUCCESS(err);
3415
3416 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003417 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3418 pipeline_layout_ci.pNext = NULL;
3419 pipeline_layout_ci.setLayoutCount = 1;
3420 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003421
3422 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003423 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3424 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003425 ASSERT_VK_SUCCESS(err);
3426
Mark Youngad779052016-01-06 14:26:04 -07003427 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003428
3429 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003430 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3431 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003432
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003433 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003434
Chia-I Wuf7458c52015-10-26 21:10:41 +08003435 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3436 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3437 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003438}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003439
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003440TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
3441 VkResult err;
3442
3443 TEST_DESCRIPTION("Test validation check for an invalid memory type index "
3444 "during bind[Buffer|Image]Memory time");
3445
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003446 ASSERT_NO_FATAL_FAILURE(InitState());
3447
3448 // Create an image, allocate memory, set a bad typeIndex and then try to
3449 // bind it
3450 VkImage image;
3451 VkDeviceMemory mem;
3452 VkMemoryRequirements mem_reqs;
3453 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3454 const int32_t tex_width = 32;
3455 const int32_t tex_height = 32;
3456
3457 VkImageCreateInfo image_create_info = {};
3458 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3459 image_create_info.pNext = NULL;
3460 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3461 image_create_info.format = tex_format;
3462 image_create_info.extent.width = tex_width;
3463 image_create_info.extent.height = tex_height;
3464 image_create_info.extent.depth = 1;
3465 image_create_info.mipLevels = 1;
3466 image_create_info.arrayLayers = 1;
3467 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3468 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3469 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3470 image_create_info.flags = 0;
3471
3472 VkMemoryAllocateInfo mem_alloc = {};
3473 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3474 mem_alloc.pNext = NULL;
3475 mem_alloc.allocationSize = 0;
3476 mem_alloc.memoryTypeIndex = 0;
3477
3478 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3479 ASSERT_VK_SUCCESS(err);
3480
3481 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
3482 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003483
3484 // Introduce Failure, select invalid TypeIndex
3485 VkPhysicalDeviceMemoryProperties memory_info;
3486
3487 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
3488 unsigned int i;
3489 for (i = 0; i < memory_info.memoryTypeCount; i++) {
3490 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
3491 mem_alloc.memoryTypeIndex = i;
3492 break;
3493 }
3494 }
3495 if (i >= memory_info.memoryTypeCount) {
3496 printf("No invalid memory type index could be found; skipped.\n");
3497 vkDestroyImage(m_device->device(), image, NULL);
3498 return;
3499 }
3500
3501 m_errorMonitor->SetDesiredFailureMsg(
3502 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3503 "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003504
3505 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3506 ASSERT_VK_SUCCESS(err);
3507
3508 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3509 (void)err;
3510
3511 m_errorMonitor->VerifyFound();
3512
3513 vkDestroyImage(m_device->device(), image, NULL);
3514 vkFreeMemory(m_device->device(), mem, NULL);
3515}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003516
Karl Schultz6addd812016-02-02 17:17:23 -07003517TEST_F(VkLayerTest, BindInvalidMemory) {
3518 VkResult err;
3519 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003520
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003521 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003522 "Invalid Device Memory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003523
Tobin Ehlisec598302015-09-15 15:02:17 -06003524 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003525
3526 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07003527 VkImage image;
3528 VkDeviceMemory mem;
3529 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003530
Karl Schultz6addd812016-02-02 17:17:23 -07003531 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3532 const int32_t tex_width = 32;
3533 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003534
3535 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003536 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3537 image_create_info.pNext = NULL;
3538 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3539 image_create_info.format = tex_format;
3540 image_create_info.extent.width = tex_width;
3541 image_create_info.extent.height = tex_height;
3542 image_create_info.extent.depth = 1;
3543 image_create_info.mipLevels = 1;
3544 image_create_info.arrayLayers = 1;
3545 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3546 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3547 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3548 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003549
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003550 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003551 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3552 mem_alloc.pNext = NULL;
3553 mem_alloc.allocationSize = 0;
3554 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003555
Chia-I Wuf7458c52015-10-26 21:10:41 +08003556 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003557 ASSERT_VK_SUCCESS(err);
3558
Karl Schultz6addd812016-02-02 17:17:23 -07003559 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003560
3561 mem_alloc.allocationSize = mem_reqs.size;
3562
Karl Schultz6addd812016-02-02 17:17:23 -07003563 pass =
3564 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003565 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003566
3567 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003568 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003569 ASSERT_VK_SUCCESS(err);
3570
3571 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003572 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003573
3574 // Try to bind free memory that has been freed
3575 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3576 // This may very well return an error.
3577 (void)err;
3578
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003579 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003580
Chia-I Wuf7458c52015-10-26 21:10:41 +08003581 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003582}
3583
Karl Schultz6addd812016-02-02 17:17:23 -07003584TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
3585 VkResult err;
3586 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003587
Karl Schultz6addd812016-02-02 17:17:23 -07003588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003589 "Invalid Image Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003590
Tobin Ehlisec598302015-09-15 15:02:17 -06003591 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003592
Karl Schultz6addd812016-02-02 17:17:23 -07003593 // Create an image object, allocate memory, destroy the object and then try
3594 // to bind it
3595 VkImage image;
3596 VkDeviceMemory mem;
3597 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003598
Karl Schultz6addd812016-02-02 17:17:23 -07003599 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3600 const int32_t tex_width = 32;
3601 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003602
3603 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003604 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3605 image_create_info.pNext = NULL;
3606 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3607 image_create_info.format = tex_format;
3608 image_create_info.extent.width = tex_width;
3609 image_create_info.extent.height = tex_height;
3610 image_create_info.extent.depth = 1;
3611 image_create_info.mipLevels = 1;
3612 image_create_info.arrayLayers = 1;
3613 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3614 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3615 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3616 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003617
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003618 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003619 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3620 mem_alloc.pNext = NULL;
3621 mem_alloc.allocationSize = 0;
3622 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003623
Chia-I Wuf7458c52015-10-26 21:10:41 +08003624 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003625 ASSERT_VK_SUCCESS(err);
3626
Karl Schultz6addd812016-02-02 17:17:23 -07003627 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003628
3629 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003630 pass =
3631 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003632 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003633
3634 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003635 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003636 ASSERT_VK_SUCCESS(err);
3637
3638 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003639 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003640 ASSERT_VK_SUCCESS(err);
3641
3642 // Now Try to bind memory to this destroyed object
3643 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3644 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003645 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003646
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003647 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003648
Chia-I Wuf7458c52015-10-26 21:10:41 +08003649 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003650}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003651
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003652#endif // OBJ_TRACKER_TESTS
3653
Tobin Ehlis0788f522015-05-26 16:11:58 -06003654#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06003655
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003656TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003657 TEST_DESCRIPTION("Submit command buffer created using one queue family and "
3658 "attempt to submit them on a queue created in a different "
3659 "queue family.");
3660
3661 // This test is meaningless unless we have multiple queue families
3662 auto queue_family_properties = m_device->phy().queue_properties();
3663 if (queue_family_properties.size() < 2) {
3664 return;
3665 }
3666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3667 " is being submitted on queue ");
3668 // Get safe index of another queue family
3669 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
3670 ASSERT_NO_FATAL_FAILURE(InitState());
3671 // Create a second queue using a different queue family
3672 VkQueue other_queue;
3673 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3674
3675 // Record an empty cmd buffer
3676 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3677 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3678 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3679 vkEndCommandBuffer(m_commandBuffer->handle());
3680
3681 // And submit on the wrong queue
3682 VkSubmitInfo submit_info = {};
3683 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3684 submit_info.commandBufferCount = 1;
3685 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003686 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003687
3688 m_errorMonitor->VerifyFound();
3689
3690}
3691
Chris Forbes48a53902016-06-30 11:46:27 +12003692TEST_F(VkLayerTest, RenderPassInitialLayoutUndefined) {
3693 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass with an attachment's "
3694 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
3695 "the command buffer has prior knowledge of that "
3696 "attachment's layout.");
3697
3698 m_errorMonitor->ExpectSuccess();
3699
3700 ASSERT_NO_FATAL_FAILURE(InitState());
3701
3702 // A renderpass with one color attachment.
3703 VkAttachmentDescription attachment = {
3704 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3705 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3706 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3707 VK_IMAGE_LAYOUT_UNDEFINED,
3708 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3709 };
3710
3711 VkAttachmentReference att_ref = {
3712 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3713 };
3714
3715 VkSubpassDescription subpass = {
3716 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3717 1, &att_ref, nullptr, nullptr, 0, nullptr
3718 };
3719
3720 VkRenderPassCreateInfo rpci = {
3721 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3722 0, 1, &attachment, 1, &subpass, 0, nullptr
3723 };
3724
3725 VkRenderPass rp;
3726 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3727 ASSERT_VK_SUCCESS(err);
3728
3729 // A compatible framebuffer.
3730 VkImageObj image(m_device);
3731 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3732 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3733 VK_IMAGE_TILING_OPTIMAL, 0);
3734 ASSERT_TRUE(image.initialized());
3735
3736 VkImageViewCreateInfo ivci = {
3737 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3738 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3739 {
3740 VK_COMPONENT_SWIZZLE_IDENTITY,
3741 VK_COMPONENT_SWIZZLE_IDENTITY,
3742 VK_COMPONENT_SWIZZLE_IDENTITY,
3743 VK_COMPONENT_SWIZZLE_IDENTITY
3744 },
3745 {
3746 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3747 },
3748 };
3749 VkImageView view;
3750 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3751 ASSERT_VK_SUCCESS(err);
3752
3753 VkFramebufferCreateInfo fci = {
3754 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3755 0, rp, 1, &view,
3756 32, 32, 1
3757 };
3758 VkFramebuffer fb;
3759 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3760 ASSERT_VK_SUCCESS(err);
3761
3762 // Record a single command buffer which uses this renderpass twice. The
3763 // bug is triggered at the beginning of the second renderpass, when the
3764 // command buffer already has a layout recorded for the attachment.
3765 VkRenderPassBeginInfo rpbi = {
3766 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003767 rp, fb, { { 0, 0 } , { 32, 32 } },
Chris Forbes48a53902016-06-30 11:46:27 +12003768 0, nullptr
3769 };
3770 BeginCommandBuffer();
3771 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3772 VK_SUBPASS_CONTENTS_INLINE);
3773 vkCmdEndRenderPass(m_commandBuffer->handle());
3774 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3775 VK_SUBPASS_CONTENTS_INLINE);
3776
3777 m_errorMonitor->VerifyNotFound();
3778
3779 vkCmdEndRenderPass(m_commandBuffer->handle());
3780 EndCommandBuffer();
3781
3782 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3783 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3784 vkDestroyImageView(m_device->device(), view, nullptr);
3785}
3786
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06003787TEST_F(VkLayerTest, FramebufferBindingDestroyCommandPool) {
3788 TEST_DESCRIPTION("This test should pass. Create a Framebuffer and "
3789 "command buffer, bind them together, then destroy "
3790 "command pool and framebuffer and verify there are no "
3791 "errors.");
3792
3793 m_errorMonitor->ExpectSuccess();
3794
3795 ASSERT_NO_FATAL_FAILURE(InitState());
3796
3797 // A renderpass with one color attachment.
3798 VkAttachmentDescription attachment = {
3799 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3800 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3801 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3802 VK_IMAGE_LAYOUT_UNDEFINED,
3803 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3804 };
3805
3806 VkAttachmentReference att_ref = {
3807 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3808 };
3809
3810 VkSubpassDescription subpass = {
3811 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3812 1, &att_ref, nullptr, nullptr, 0, nullptr
3813 };
3814
3815 VkRenderPassCreateInfo rpci = {
3816 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3817 0, 1, &attachment, 1, &subpass, 0, nullptr
3818 };
3819
3820 VkRenderPass rp;
3821 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3822 ASSERT_VK_SUCCESS(err);
3823
3824 // A compatible framebuffer.
3825 VkImageObj image(m_device);
3826 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3827 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3828 VK_IMAGE_TILING_OPTIMAL, 0);
3829 ASSERT_TRUE(image.initialized());
3830
3831 VkImageViewCreateInfo ivci = {
3832 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3833 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3834 {
3835 VK_COMPONENT_SWIZZLE_IDENTITY,
3836 VK_COMPONENT_SWIZZLE_IDENTITY,
3837 VK_COMPONENT_SWIZZLE_IDENTITY,
3838 VK_COMPONENT_SWIZZLE_IDENTITY
3839 },
3840 {
3841 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3842 },
3843 };
3844 VkImageView view;
3845 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3846 ASSERT_VK_SUCCESS(err);
3847
3848 VkFramebufferCreateInfo fci = {
3849 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3850 0, rp, 1, &view,
3851 32, 32, 1
3852 };
3853 VkFramebuffer fb;
3854 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3855 ASSERT_VK_SUCCESS(err);
3856
3857 // Explicitly create a command buffer to bind the FB to so that we can then
3858 // destroy the command pool in order to implicitly free command buffer
3859 VkCommandPool command_pool;
3860 VkCommandPoolCreateInfo pool_create_info{};
3861 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3862 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3863 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3864 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3865 &command_pool);
3866
3867 VkCommandBuffer command_buffer;
3868 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3869 command_buffer_allocate_info.sType =
3870 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3871 command_buffer_allocate_info.commandPool = command_pool;
3872 command_buffer_allocate_info.commandBufferCount = 1;
3873 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3874 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3875 &command_buffer);
3876
3877 // Begin our cmd buffer with renderpass using our framebuffer
3878 VkRenderPassBeginInfo rpbi = {
3879 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
3880 rp, fb, { { 0, 0 } , { 32, 32 } },
3881 0, nullptr
3882 };
3883 VkCommandBufferBeginInfo begin_info{};
3884 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3885 vkBeginCommandBuffer(command_buffer, &begin_info);
3886
3887 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3888 vkCmdEndRenderPass(command_buffer);
3889 vkEndCommandBuffer(command_buffer);
Mark Lobodzinski7d10a822016-08-03 14:08:40 -06003890 vkDestroyImageView(m_device->device(), view, nullptr);
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06003891 // Destroy command pool to implicitly free command buffer
3892 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3893 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3894 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3895 m_errorMonitor->VerifyNotFound();
3896}
3897
Chris Forbes51bf7c92016-06-30 15:22:08 +12003898TEST_F(VkLayerTest, RenderPassSubpassZeroTransitionsApplied) {
3899 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass applies the layout "
3900 "transitions for the first subpass");
3901
3902 m_errorMonitor->ExpectSuccess();
3903
3904 ASSERT_NO_FATAL_FAILURE(InitState());
3905
3906 // A renderpass with one color attachment.
3907 VkAttachmentDescription attachment = {
3908 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3909 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3910 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3911 VK_IMAGE_LAYOUT_UNDEFINED,
3912 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3913 };
3914
3915 VkAttachmentReference att_ref = {
3916 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3917 };
3918
3919 VkSubpassDescription subpass = {
3920 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3921 1, &att_ref, nullptr, nullptr, 0, nullptr
3922 };
3923
3924 VkSubpassDependency dep = {
Chris Forbescb4c7ad2016-07-06 10:28:18 +12003925 0, 0, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3926 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12003927 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3928 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3929 VK_DEPENDENCY_BY_REGION_BIT
3930 };
3931
3932 VkRenderPassCreateInfo rpci = {
3933 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3934 0, 1, &attachment, 1, &subpass, 1, &dep
3935 };
3936
3937 VkResult err;
3938 VkRenderPass rp;
3939 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3940 ASSERT_VK_SUCCESS(err);
3941
3942 // A compatible framebuffer.
3943 VkImageObj image(m_device);
3944 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3945 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3946 VK_IMAGE_TILING_OPTIMAL, 0);
3947 ASSERT_TRUE(image.initialized());
3948
3949 VkImageViewCreateInfo ivci = {
3950 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3951 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3952 {
3953 VK_COMPONENT_SWIZZLE_IDENTITY,
3954 VK_COMPONENT_SWIZZLE_IDENTITY,
3955 VK_COMPONENT_SWIZZLE_IDENTITY,
3956 VK_COMPONENT_SWIZZLE_IDENTITY
3957 },
3958 {
3959 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3960 },
3961 };
3962 VkImageView view;
3963 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3964 ASSERT_VK_SUCCESS(err);
3965
3966 VkFramebufferCreateInfo fci = {
3967 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3968 0, rp, 1, &view,
3969 32, 32, 1
3970 };
3971 VkFramebuffer fb;
3972 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3973 ASSERT_VK_SUCCESS(err);
3974
3975 // Record a single command buffer which issues a pipeline barrier w/
3976 // image memory barrier for the attachment. This detects the previously
3977 // missing tracking of the subpass layout by throwing a validation error
3978 // if it doesn't occur.
3979 VkRenderPassBeginInfo rpbi = {
3980 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003981 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes51bf7c92016-06-30 15:22:08 +12003982 0, nullptr
3983 };
3984 BeginCommandBuffer();
3985 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3986 VK_SUBPASS_CONTENTS_INLINE);
3987
3988 VkImageMemoryBarrier imb = {
3989 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, nullptr,
3990 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3991 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3992 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3993 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3994 VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
3995 image.handle(),
3996 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
3997 };
3998 vkCmdPipelineBarrier(m_commandBuffer->handle(),
Chris Forbescb4c7ad2016-07-06 10:28:18 +12003999 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4000 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12004001 VK_DEPENDENCY_BY_REGION_BIT,
4002 0, nullptr, 0, nullptr, 1, &imb);
4003
4004 vkCmdEndRenderPass(m_commandBuffer->handle());
4005 m_errorMonitor->VerifyNotFound();
4006 EndCommandBuffer();
4007
4008 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4009 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4010 vkDestroyImageView(m_device->device(), view, nullptr);
4011}
4012
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004013TEST_F(VkLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
4014 TEST_DESCRIPTION("Validate that when an imageView of a depth/stencil image "
4015 "is used as a depth/stencil framebuffer attachment, the "
4016 "aspectMask is ignored and both depth and stencil image "
4017 "subresources are used.");
4018
4019 VkFormatProperties format_properties;
4020 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT,
4021 &format_properties);
4022 if (!(format_properties.optimalTilingFeatures &
4023 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
4024 return;
4025 }
4026
4027 m_errorMonitor->ExpectSuccess();
4028
4029 ASSERT_NO_FATAL_FAILURE(InitState());
4030
4031 VkAttachmentDescription attachment = {
4032 0,
4033 VK_FORMAT_D32_SFLOAT_S8_UINT,
4034 VK_SAMPLE_COUNT_1_BIT,
4035 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4036 VK_ATTACHMENT_STORE_OP_STORE,
4037 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4038 VK_ATTACHMENT_STORE_OP_DONT_CARE,
4039 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4040 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
4041
4042 VkAttachmentReference att_ref = {
4043 0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
4044
4045 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4046 0, nullptr,
4047 0, nullptr,
4048 nullptr, &att_ref,
4049 0, nullptr};
4050
4051 VkSubpassDependency dep = {0,
4052 0,
4053 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4054 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4055 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4056 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4057 VK_DEPENDENCY_BY_REGION_BIT};
4058
4059 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
4060 nullptr,
4061 0,
4062 1,
4063 &attachment,
4064 1,
4065 &subpass,
4066 1,
4067 &dep};
4068
4069 VkResult err;
4070 VkRenderPass rp;
4071 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4072 ASSERT_VK_SUCCESS(err);
4073
4074 VkImageObj image(m_device);
4075 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
4076 0x26, // usage
4077 VK_IMAGE_TILING_OPTIMAL, 0);
4078 ASSERT_TRUE(image.initialized());
4079 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
4080
4081 VkImageViewCreateInfo ivci = {
4082 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4083 nullptr,
4084 0,
4085 image.handle(),
4086 VK_IMAGE_VIEW_TYPE_2D,
4087 VK_FORMAT_D32_SFLOAT_S8_UINT,
4088 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B,
4089 VK_COMPONENT_SWIZZLE_A},
4090 {0x2, 0, 1, 0, 1},
4091 };
4092 VkImageView view;
4093 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4094 ASSERT_VK_SUCCESS(err);
4095
4096 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
4097 nullptr,
4098 0,
4099 rp,
4100 1,
4101 &view,
4102 32,
4103 32,
4104 1};
4105 VkFramebuffer fb;
4106 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4107 ASSERT_VK_SUCCESS(err);
4108
4109 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
4110 nullptr,
4111 rp,
4112 fb,
4113 {{0, 0}, {32, 32}},
4114 0,
4115 nullptr};
4116 BeginCommandBuffer();
4117 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
4118 VK_SUBPASS_CONTENTS_INLINE);
4119
4120 VkImageMemoryBarrier imb = {};
4121 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4122 imb.pNext = nullptr;
4123 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4124 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4125 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4126 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4127 imb.srcQueueFamilyIndex = 0;
4128 imb.dstQueueFamilyIndex = 0;
4129 imb.image = image.handle();
4130 imb.subresourceRange.aspectMask = 0x6;
4131 imb.subresourceRange.baseMipLevel = 0;
4132 imb.subresourceRange.levelCount = 0x1;
4133 imb.subresourceRange.baseArrayLayer = 0;
4134 imb.subresourceRange.layerCount = 0x1;
4135
4136 vkCmdPipelineBarrier(m_commandBuffer->handle(),
4137 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4138 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4139 VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
4140 &imb);
4141
4142 vkCmdEndRenderPass(m_commandBuffer->handle());
4143 EndCommandBuffer();
4144 QueueCommandBuffer(false);
4145 m_errorMonitor->VerifyNotFound();
4146
4147 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4148 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4149 vkDestroyImageView(m_device->device(), view, nullptr);
4150}
Tony Barbourd5f7b822016-08-02 15:39:33 -06004151
Tony Barbour4e919972016-08-09 13:27:40 -06004152TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
4153 TEST_DESCRIPTION("Generate INVALID_RENDER_AREA error by beginning renderpass"
4154 "with extent outside of framebuffer");
4155 ASSERT_NO_FATAL_FAILURE(InitState());
4156 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4157
4158 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4159 "Cannot execute a render pass with renderArea "
4160 "not within the bound of the framebuffer.");
4161
4162 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
4163 m_renderPassBeginInfo.renderArea.extent.width = 257;
4164 m_renderPassBeginInfo.renderArea.extent.height = 257;
4165 BeginCommandBuffer();
4166 m_errorMonitor->VerifyFound();
4167}
4168
4169TEST_F(VkLayerTest, DisabledIndependentBlend) {
4170 TEST_DESCRIPTION("Generate INDEPENDENT_BLEND by disabling independent "
4171 "blend and then specifying different blend states for two "
4172 "attachements");
4173 ASSERT_NO_FATAL_FAILURE(InitState());
4174
4175 m_errorMonitor->SetDesiredFailureMsg(
4176 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4177 "Invalid Pipeline CreateInfo: If independent blend feature not "
4178 "enabled, all elements of pAttachments must be identical");
4179 VkPhysicalDeviceFeatures features = {};
4180 features.independentBlend = VK_FALSE;
4181 std::vector<const char *> extension_names;
4182 VkDeviceObj noib_device(0, gpu(), extension_names, &features);
4183
4184 VkCommandPool cmd_pool;
4185 VkCommandPoolCreateInfo pool_create_info{};
4186 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4187 pool_create_info.queueFamilyIndex = noib_device.graphics_queue_node_index_;
4188 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4189
4190 vkCreateCommandPool(noib_device.device(), &pool_create_info, nullptr,
4191 &cmd_pool);
4192 {
4193 // Need cmd_buffer's destructor to be called before calling DestroyCommandPool
4194 VkCommandBufferObj cmd_buffer(&noib_device, cmd_pool);
4195 VkDescriptorSetObj descriptorSet(&noib_device);
4196 descriptorSet.AppendDummy();
4197 descriptorSet.CreateVKDescriptorSet(&cmd_buffer);
4198
4199 VkPipelineObj pipeline(&noib_device);
4200
4201 VkRenderpassObj renderpass(&noib_device);
4202
4203 VkShaderObj vs(&noib_device, bindStateVertShaderText,
4204 VK_SHADER_STAGE_VERTEX_BIT, this);
4205
4206 pipeline.AddShader(&vs);
4207
4208 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
4209 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
4210 att_state1.blendEnable = VK_TRUE;
4211 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
4212 att_state2.blendEnable = VK_FALSE;
4213 pipeline.AddColorAttachment(0, &att_state1);
4214 pipeline.AddColorAttachment(1, &att_state2);
4215 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(),
4216 renderpass.handle());
4217 m_errorMonitor->VerifyFound();
4218 }
4219 vkDestroyCommandPool(noib_device.device(), cmd_pool, NULL);
4220}
4221
4222TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
4223 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
4224 "depth attachments in subpass");
4225
4226 m_errorMonitor->SetDesiredFailureMsg(
4227 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4228 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
4229
4230 // Create a renderPass with a single color attachment
4231 VkAttachmentReference attach = {};
4232 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4233 VkSubpassDescription subpass = {};
4234 VkRenderPassCreateInfo rpci = {};
4235 rpci.subpassCount = 1;
4236 rpci.pSubpasses = &subpass;
4237 rpci.attachmentCount = 1;
4238 VkAttachmentDescription attach_desc = {};
4239 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4240 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4241 rpci.pAttachments = &attach_desc;
4242 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4243 VkRenderPass rp;
4244 subpass.pDepthStencilAttachment = &attach;
4245 subpass.pColorAttachments = NULL;
4246 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4247 m_errorMonitor->VerifyFound();
4248}
4249
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004250TEST_F(VkLayerTest, RenderPassTransitionsAttachmentUnused) {
4251 TEST_DESCRIPTION("Ensure that layout transitions work correctly without "
4252 "errors, when an attachment reference is "
4253 "VK_ATTACHMENT_UNUSED");
4254
4255 m_errorMonitor->ExpectSuccess();
4256
4257 ASSERT_NO_FATAL_FAILURE(InitState());
4258
4259 // A renderpass with no attachments
4260 VkAttachmentReference att_ref = {
4261 VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4262 };
4263
4264 VkSubpassDescription subpass = {
4265 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
4266 1, &att_ref, nullptr, nullptr, 0, nullptr
4267 };
4268
4269 VkRenderPassCreateInfo rpci = {
4270 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4271 0, 0, nullptr, 1, &subpass, 0, nullptr
4272 };
4273
4274 VkRenderPass rp;
4275 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4276 ASSERT_VK_SUCCESS(err);
4277
4278 // A compatible framebuffer.
4279 VkFramebufferCreateInfo fci = {
4280 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
4281 0, rp, 0, nullptr,
4282 32, 32, 1
4283 };
4284 VkFramebuffer fb;
4285 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4286 ASSERT_VK_SUCCESS(err);
4287
4288 // Record a command buffer which just begins and ends the renderpass. The
4289 // bug manifests in BeginRenderPass.
4290 VkRenderPassBeginInfo rpbi = {
4291 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06004292 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004293 0, nullptr
4294 };
4295 BeginCommandBuffer();
4296 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
4297 VK_SUBPASS_CONTENTS_INLINE);
4298 vkCmdEndRenderPass(m_commandBuffer->handle());
4299 m_errorMonitor->VerifyNotFound();
4300 EndCommandBuffer();
4301
4302 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4303 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4304}
4305
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004306// This is a positive test. No errors are expected.
4307TEST_F(VkLayerTest, StencilLoadOp) {
4308 TEST_DESCRIPTION("Create a stencil-only attachment with a LOAD_OP set to "
4309 "CLEAR. stencil[Load|Store]Op used to be ignored.");
4310 VkResult result = VK_SUCCESS;
4311 VkImageFormatProperties formatProps;
4312 vkGetPhysicalDeviceImageFormatProperties(
4313 gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D,
4314 VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4315 VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
4316 0, &formatProps);
4317 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
4318 return;
4319 }
4320
4321 ASSERT_NO_FATAL_FAILURE(InitState());
4322 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
4323 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
4324 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4325 VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
4326 VkAttachmentDescription att = {};
4327 VkAttachmentReference ref = {};
4328 att.format = depth_stencil_fmt;
4329 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
4330 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
4331 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
4332 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
4333 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4334 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4335
4336 VkClearValue clear;
4337 clear.depthStencil.depth = 1.0;
4338 clear.depthStencil.stencil = 0;
4339 ref.attachment = 0;
4340 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4341
4342 VkSubpassDescription subpass = {};
4343 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
4344 subpass.flags = 0;
4345 subpass.inputAttachmentCount = 0;
4346 subpass.pInputAttachments = NULL;
4347 subpass.colorAttachmentCount = 0;
4348 subpass.pColorAttachments = NULL;
4349 subpass.pResolveAttachments = NULL;
4350 subpass.pDepthStencilAttachment = &ref;
4351 subpass.preserveAttachmentCount = 0;
4352 subpass.pPreserveAttachments = NULL;
4353
4354 VkRenderPass rp;
4355 VkRenderPassCreateInfo rp_info = {};
4356 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4357 rp_info.attachmentCount = 1;
4358 rp_info.pAttachments = &att;
4359 rp_info.subpassCount = 1;
4360 rp_info.pSubpasses = &subpass;
4361 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
4362 ASSERT_VK_SUCCESS(result);
4363
4364 VkImageView *depthView = m_depthStencil->BindInfo();
4365 VkFramebufferCreateInfo fb_info = {};
4366 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4367 fb_info.pNext = NULL;
4368 fb_info.renderPass = rp;
4369 fb_info.attachmentCount = 1;
4370 fb_info.pAttachments = depthView;
4371 fb_info.width = 100;
4372 fb_info.height = 100;
4373 fb_info.layers = 1;
4374 VkFramebuffer fb;
4375 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4376 ASSERT_VK_SUCCESS(result);
4377
4378
4379 VkRenderPassBeginInfo rpbinfo = {};
4380 rpbinfo.clearValueCount = 1;
4381 rpbinfo.pClearValues = &clear;
4382 rpbinfo.pNext = NULL;
4383 rpbinfo.renderPass = rp;
4384 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4385 rpbinfo.renderArea.extent.width = 100;
4386 rpbinfo.renderArea.extent.height = 100;
4387 rpbinfo.renderArea.offset.x = 0;
4388 rpbinfo.renderArea.offset.y = 0;
4389 rpbinfo.framebuffer = fb;
4390
4391 VkFence fence = {};
4392 VkFenceCreateInfo fence_ci = {};
4393 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4394 fence_ci.pNext = nullptr;
4395 fence_ci.flags = 0;
4396 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
4397 ASSERT_VK_SUCCESS(result);
4398
4399
4400 m_commandBuffer->BeginCommandBuffer();
4401 m_commandBuffer->BeginRenderPass(rpbinfo);
4402 m_commandBuffer->EndRenderPass();
4403 m_commandBuffer->EndCommandBuffer();
4404 m_commandBuffer->QueueCommandBuffer(fence);
4405
4406 VkImageObj destImage(m_device);
4407 destImage.init(100, 100, depth_stencil_fmt,
4408 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4409 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4410 VK_IMAGE_TILING_OPTIMAL, 0);
4411 VkImageMemoryBarrier barrier = {};
4412 VkImageSubresourceRange range;
4413 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4414 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4415 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4416 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT |
4417 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
4418 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4419 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
4420 barrier.image = m_depthStencil->handle();
4421 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4422 range.baseMipLevel = 0;
4423 range.levelCount = 1;
4424 range.baseArrayLayer = 0;
4425 range.layerCount = 1;
4426 barrier.subresourceRange = range;
4427 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
4428 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
4429 cmdbuf.BeginCommandBuffer();
4430 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4431 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4432 nullptr, 1, &barrier);
4433 barrier.srcAccessMask = 0;
4434 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4435 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
4436 barrier.image = destImage.handle();
4437 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4438 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4439 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4440 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4441 nullptr, 1, &barrier);
4442 VkImageCopy cregion;
4443 cregion.srcSubresource.aspectMask =
4444 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4445 cregion.srcSubresource.mipLevel = 0;
4446 cregion.srcSubresource.baseArrayLayer = 0;
4447 cregion.srcSubresource.layerCount = 1;
4448 cregion.srcOffset.x = 0;
4449 cregion.srcOffset.y = 0;
4450 cregion.srcOffset.z = 0;
4451 cregion.dstSubresource.aspectMask =
4452 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4453 cregion.dstSubresource.mipLevel = 0;
4454 cregion.dstSubresource.baseArrayLayer = 0;
4455 cregion.dstSubresource.layerCount = 1;
4456 cregion.dstOffset.x = 0;
4457 cregion.dstOffset.y = 0;
4458 cregion.dstOffset.z = 0;
4459 cregion.extent.width = 100;
4460 cregion.extent.height = 100;
4461 cregion.extent.depth = 1;
4462 cmdbuf.CopyImage(m_depthStencil->handle(),
4463 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
4464 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
4465 cmdbuf.EndCommandBuffer();
4466
4467 VkSubmitInfo submit_info;
4468 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4469 submit_info.pNext = NULL;
4470 submit_info.waitSemaphoreCount = 0;
4471 submit_info.pWaitSemaphores = NULL;
4472 submit_info.pWaitDstStageMask = NULL;
4473 submit_info.commandBufferCount = 1;
4474 submit_info.pCommandBuffers = &cmdbuf.handle();
4475 submit_info.signalSemaphoreCount = 0;
4476 submit_info.pSignalSemaphores = NULL;
4477
4478 m_errorMonitor->ExpectSuccess();
4479 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4480 m_errorMonitor->VerifyNotFound();
4481
Mark Lobodzinskid0440da2016-06-17 15:10:03 -06004482 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004483 vkDestroyFence(m_device->device(), fence, nullptr);
4484 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4485 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4486}
4487
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004488TEST_F(VkLayerTest, UnusedPreserveAttachment) {
4489 TEST_DESCRIPTION("Create a framebuffer where a subpass has a preserve "
4490 "attachment reference of VK_ATTACHMENT_UNUSED");
4491
4492 ASSERT_NO_FATAL_FAILURE(InitState());
4493 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4494
4495 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4496 "must not be VK_ATTACHMENT_UNUSED");
4497
4498 VkAttachmentReference color_attach = {};
4499 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4500 color_attach.attachment = 0;
4501 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
4502 VkSubpassDescription subpass = {};
4503 subpass.colorAttachmentCount = 1;
4504 subpass.pColorAttachments = &color_attach;
4505 subpass.preserveAttachmentCount = 1;
4506 subpass.pPreserveAttachments = &preserve_attachment;
4507
4508 VkRenderPassCreateInfo rpci = {};
4509 rpci.subpassCount = 1;
4510 rpci.pSubpasses = &subpass;
4511 rpci.attachmentCount = 1;
4512 VkAttachmentDescription attach_desc = {};
4513 attach_desc.format = VK_FORMAT_UNDEFINED;
4514 rpci.pAttachments = &attach_desc;
4515 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4516 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004517 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004518
4519 m_errorMonitor->VerifyFound();
4520
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004521 if (result == VK_SUCCESS) {
4522 vkDestroyRenderPass(m_device->device(), rp, NULL);
4523 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004524}
4525
Chris Forbesc5389742016-06-29 11:49:23 +12004526TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004527 TEST_DESCRIPTION("Ensure that CreateRenderPass produces a validation error "
4528 "when the source of a subpass multisample resolve "
4529 "does not have multiple samples.");
4530
Chris Forbesc5389742016-06-29 11:49:23 +12004531 ASSERT_NO_FATAL_FAILURE(InitState());
4532
4533 m_errorMonitor->SetDesiredFailureMsg(
4534 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbes6655bb32016-07-01 18:27:30 +12004535 "Subpass 0 requests multisample resolve from attachment 0 which has "
4536 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12004537
4538 VkAttachmentDescription attachments[] = {
4539 {
4540 0, VK_FORMAT_R8G8B8A8_UNORM,
4541 VK_SAMPLE_COUNT_1_BIT,
4542 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4543 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4544 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4545 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4546 },
4547 {
4548 0, VK_FORMAT_R8G8B8A8_UNORM,
4549 VK_SAMPLE_COUNT_1_BIT,
4550 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4551 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4552 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4553 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4554 },
4555 };
4556
4557 VkAttachmentReference color = {
4558 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4559 };
4560
4561 VkAttachmentReference resolve = {
4562 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4563 };
4564
4565 VkSubpassDescription subpass = {
4566 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4567 0, nullptr,
4568 1, &color,
4569 &resolve,
4570 nullptr,
4571 0, nullptr
4572 };
4573
4574 VkRenderPassCreateInfo rpci = {
4575 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4576 0, 2, attachments, 1, &subpass, 0, nullptr
4577 };
4578
4579 VkRenderPass rp;
4580 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4581
4582 m_errorMonitor->VerifyFound();
4583
4584 if (err == VK_SUCCESS)
4585 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4586}
4587
4588TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004589 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4590 "when a subpass multisample resolve operation is "
4591 "requested, and the destination of that resolve has "
4592 "multiple samples.");
4593
Chris Forbesc5389742016-06-29 11:49:23 +12004594 ASSERT_NO_FATAL_FAILURE(InitState());
4595
4596 m_errorMonitor->SetDesiredFailureMsg(
4597 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4598 "Subpass 0 requests multisample resolve into attachment 1, which "
4599 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
4600
4601 VkAttachmentDescription attachments[] = {
4602 {
4603 0, VK_FORMAT_R8G8B8A8_UNORM,
4604 VK_SAMPLE_COUNT_4_BIT,
4605 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4606 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4607 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4608 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4609 },
4610 {
4611 0, VK_FORMAT_R8G8B8A8_UNORM,
4612 VK_SAMPLE_COUNT_4_BIT,
4613 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4614 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4615 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4616 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4617 },
4618 };
4619
4620 VkAttachmentReference color = {
4621 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4622 };
4623
4624 VkAttachmentReference resolve = {
4625 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4626 };
4627
4628 VkSubpassDescription subpass = {
4629 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4630 0, nullptr,
4631 1, &color,
4632 &resolve,
4633 nullptr,
4634 0, nullptr
4635 };
4636
4637 VkRenderPassCreateInfo rpci = {
4638 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4639 0, 2, attachments, 1, &subpass, 0, nullptr
4640 };
4641
4642 VkRenderPass rp;
4643 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4644
4645 m_errorMonitor->VerifyFound();
4646
4647 if (err == VK_SUCCESS)
4648 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4649}
4650
Chris Forbes3f128ef2016-06-29 14:58:53 +12004651TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004652 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4653 "when the color and depth attachments used by a subpass "
4654 "have inconsistent sample counts");
4655
Chris Forbes3f128ef2016-06-29 14:58:53 +12004656 ASSERT_NO_FATAL_FAILURE(InitState());
4657
4658 m_errorMonitor->SetDesiredFailureMsg(
4659 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4660 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
4661
4662 VkAttachmentDescription attachments[] = {
4663 {
4664 0, VK_FORMAT_R8G8B8A8_UNORM,
4665 VK_SAMPLE_COUNT_1_BIT,
4666 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4667 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4668 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4669 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4670 },
4671 {
4672 0, VK_FORMAT_R8G8B8A8_UNORM,
4673 VK_SAMPLE_COUNT_4_BIT,
4674 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4675 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4676 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4677 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4678 },
4679 };
4680
4681 VkAttachmentReference color[] = {
4682 {
4683 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4684 },
4685 {
4686 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4687 },
4688 };
4689
4690 VkSubpassDescription subpass = {
4691 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4692 0, nullptr,
4693 2, color,
4694 nullptr,
4695 nullptr,
4696 0, nullptr
4697 };
4698
4699 VkRenderPassCreateInfo rpci = {
4700 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4701 0, 2, attachments, 1, &subpass, 0, nullptr
4702 };
4703
4704 VkRenderPass rp;
4705 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4706
4707 m_errorMonitor->VerifyFound();
4708
4709 if (err == VK_SUCCESS)
4710 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4711}
4712
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004713TEST_F(VkLayerTest, FramebufferCreateErrors) {
4714 TEST_DESCRIPTION("Hit errors when attempting to create a framebuffer :\n"
4715 " 1. Mismatch between fb & renderPass attachmentCount\n"
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004716 " 2. Use a color image as depthStencil attachment\n"
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004717 " 3. Mismatch fb & renderPass attachment formats\n"
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004718 " 4. Mismatch fb & renderPass attachment #samples\n"
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004719 " 5. FB attachment w/ non-1 mip-levels\n"
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004720 " 6. FB attachment where dimensions don't match\n"
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004721 " 7. FB attachment w/o identity swizzle\n"
4722 " 8. FB dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004723
4724 ASSERT_NO_FATAL_FAILURE(InitState());
4725 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4726
4727 m_errorMonitor->SetDesiredFailureMsg(
4728 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004729 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
4730 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004731
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004732 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004733 VkAttachmentReference attach = {};
4734 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4735 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004736 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004737 VkRenderPassCreateInfo rpci = {};
4738 rpci.subpassCount = 1;
4739 rpci.pSubpasses = &subpass;
4740 rpci.attachmentCount = 1;
4741 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004742 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004743 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004744 rpci.pAttachments = &attach_desc;
4745 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4746 VkRenderPass rp;
4747 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4748 ASSERT_VK_SUCCESS(err);
4749
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004750 VkImageView ivs[2];
4751 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
4752 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004753 VkFramebufferCreateInfo fb_info = {};
4754 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4755 fb_info.pNext = NULL;
4756 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004757 // Set mis-matching attachmentCount
4758 fb_info.attachmentCount = 2;
4759 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004760 fb_info.width = 100;
4761 fb_info.height = 100;
4762 fb_info.layers = 1;
4763
4764 VkFramebuffer fb;
4765 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4766
4767 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004768 if (err == VK_SUCCESS) {
4769 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4770 }
4771 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004772
4773 // Create a renderPass with a depth-stencil attachment created with
4774 // IMAGE_USAGE_COLOR_ATTACHMENT
4775 // Add our color attachment to pDepthStencilAttachment
4776 subpass.pDepthStencilAttachment = &attach;
4777 subpass.pColorAttachments = NULL;
4778 VkRenderPass rp_ds;
4779 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
4780 ASSERT_VK_SUCCESS(err);
4781 // Set correct attachment count, but attachment has COLOR usage bit set
4782 fb_info.attachmentCount = 1;
4783 fb_info.renderPass = rp_ds;
4784
4785 m_errorMonitor->SetDesiredFailureMsg(
4786 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4787 " conflicts with the image's IMAGE_USAGE flags ");
4788 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4789
4790 m_errorMonitor->VerifyFound();
4791 if (err == VK_SUCCESS) {
4792 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4793 }
4794 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004795
4796 // Create new renderpass with alternate attachment format from fb
4797 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
4798 subpass.pDepthStencilAttachment = NULL;
4799 subpass.pColorAttachments = &attach;
4800 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4801 ASSERT_VK_SUCCESS(err);
4802
4803 // Cause error due to mis-matched formats between rp & fb
4804 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
4805 fb_info.renderPass = rp;
4806 m_errorMonitor->SetDesiredFailureMsg(
4807 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4808 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
4809 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4810
4811 m_errorMonitor->VerifyFound();
4812 if (err == VK_SUCCESS) {
4813 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4814 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004815 vkDestroyRenderPass(m_device->device(), rp, NULL);
4816
4817 // Create new renderpass with alternate sample count from fb
4818 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4819 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
4820 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4821 ASSERT_VK_SUCCESS(err);
4822
4823 // Cause error due to mis-matched sample count between rp & fb
4824 fb_info.renderPass = rp;
4825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4826 " has VK_SAMPLE_COUNT_1_BIT samples "
4827 "that do not match the "
4828 "VK_SAMPLE_COUNT_4_BIT ");
4829 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4830
4831 m_errorMonitor->VerifyFound();
4832 if (err == VK_SUCCESS) {
4833 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4834 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004835
4836 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004837
4838 // Create a custom imageView with non-1 mip levels
4839 VkImageObj image(m_device);
4840 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
4841 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4842 ASSERT_TRUE(image.initialized());
4843
4844 VkImageView view;
4845 VkImageViewCreateInfo ivci = {};
4846 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4847 ivci.image = image.handle();
4848 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4849 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4850 ivci.subresourceRange.layerCount = 1;
4851 ivci.subresourceRange.baseMipLevel = 0;
4852 // Set level count 2 (only 1 is allowed for FB attachment)
4853 ivci.subresourceRange.levelCount = 2;
4854 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4855 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4856 ASSERT_VK_SUCCESS(err);
4857 // Re-create renderpass to have matching sample count
4858 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4859 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4860 ASSERT_VK_SUCCESS(err);
4861
4862 fb_info.renderPass = rp;
4863 fb_info.pAttachments = &view;
4864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4865 " has mip levelCount of 2 but only ");
4866 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4867
4868 m_errorMonitor->VerifyFound();
4869 if (err == VK_SUCCESS) {
4870 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4871 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004872 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004873 // Update view to original color buffer and grow FB dimensions too big
4874 fb_info.pAttachments = ivs;
4875 fb_info.height = 1024;
4876 fb_info.width = 1024;
4877 fb_info.layers = 2;
4878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4879 " Attachment dimensions must be at "
4880 "least as large. ");
4881 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4882
4883 m_errorMonitor->VerifyFound();
4884 if (err == VK_SUCCESS) {
4885 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4886 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004887 // Create view attachment with non-identity swizzle
4888 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4889 ivci.image = image.handle();
4890 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4891 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4892 ivci.subresourceRange.layerCount = 1;
4893 ivci.subresourceRange.baseMipLevel = 0;
4894 ivci.subresourceRange.levelCount = 1;
4895 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4896 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4897 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4898 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4899 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4900 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4901 ASSERT_VK_SUCCESS(err);
4902
4903 fb_info.pAttachments = &view;
4904 fb_info.height = 100;
4905 fb_info.width = 100;
4906 fb_info.layers = 1;
4907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4908 " has non-identy swizzle. All "
4909 "framebuffer attachments must have "
4910 "been created with the identity "
4911 "swizzle. ");
4912 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4913
4914 m_errorMonitor->VerifyFound();
4915 if (err == VK_SUCCESS) {
4916 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4917 }
4918 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004919 // Request fb that exceeds max dimensions
4920 // reset attachment to color attachment
4921 fb_info.pAttachments = ivs;
4922 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
4923 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
4924 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
4925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4926 " Requested VkFramebufferCreateInfo "
4927 "dimensions exceed physical device "
4928 "limits. ");
4929 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4930
4931 m_errorMonitor->VerifyFound();
4932 if (err == VK_SUCCESS) {
4933 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4934 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004935
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004936 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004937}
4938
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004939// This is a positive test. No errors should be generated.
Michael Lentine860b0fe2016-05-20 10:14:00 -05004940TEST_F(VkLayerTest, WaitEventThenSet) {
4941 TEST_DESCRIPTION(
4942 "Wait on a event then set it after the wait has been submitted.");
4943
Michael Lentine860b0fe2016-05-20 10:14:00 -05004944 m_errorMonitor->ExpectSuccess();
4945
4946 VkEvent event;
4947 VkEventCreateInfo event_create_info{};
4948 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4949 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
4950
4951 VkCommandPool command_pool;
4952 VkCommandPoolCreateInfo pool_create_info{};
4953 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4954 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4955 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4956 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4957 &command_pool);
4958
4959 VkCommandBuffer command_buffer;
4960 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4961 command_buffer_allocate_info.sType =
4962 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4963 command_buffer_allocate_info.commandPool = command_pool;
4964 command_buffer_allocate_info.commandBufferCount = 1;
4965 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4966 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4967 &command_buffer);
4968
4969 VkQueue queue = VK_NULL_HANDLE;
4970 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06004971 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05004972
4973 {
4974 VkCommandBufferBeginInfo begin_info{};
4975 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4976 vkBeginCommandBuffer(command_buffer, &begin_info);
4977
4978 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT,
4979 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
4980 nullptr, 0, nullptr);
4981 vkCmdResetEvent(command_buffer, event,
4982 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
4983 vkEndCommandBuffer(command_buffer);
4984 }
4985 {
4986 VkSubmitInfo submit_info{};
4987 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4988 submit_info.commandBufferCount = 1;
4989 submit_info.pCommandBuffers = &command_buffer;
4990 submit_info.signalSemaphoreCount = 0;
4991 submit_info.pSignalSemaphores = nullptr;
4992 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4993 }
4994 { vkSetEvent(m_device->device(), event); }
4995
4996 vkQueueWaitIdle(queue);
4997
4998 vkDestroyEvent(m_device->device(), event, nullptr);
4999 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5000 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5001
5002 m_errorMonitor->VerifyNotFound();
5003}
Michael Lentine5627e692016-05-20 17:45:02 -05005004// This is a positive test. No errors should be generated.
Michael Lentinef01fb382016-07-21 17:24:56 -05005005TEST_F(VkLayerTest, QueryAndCopySecondaryCommandBuffers) {
5006 TEST_DESCRIPTION(
5007 "Issue a query on a secondary command buffery and copy it on a primary.");
5008
5009 if ((m_device->queue_props.empty()) ||
5010 (m_device->queue_props[0].queueCount < 2))
5011 return;
5012
5013 m_errorMonitor->ExpectSuccess();
5014
5015 VkQueryPool query_pool;
5016 VkQueryPoolCreateInfo query_pool_create_info{};
5017 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5018 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
5019 query_pool_create_info.queryCount = 1;
5020 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
5021 &query_pool);
5022
5023 VkCommandPool command_pool;
5024 VkCommandPoolCreateInfo pool_create_info{};
5025 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5026 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5027 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5028 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5029 &command_pool);
5030
5031 VkCommandBuffer command_buffer;
5032 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5033 command_buffer_allocate_info.sType =
5034 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5035 command_buffer_allocate_info.commandPool = command_pool;
5036 command_buffer_allocate_info.commandBufferCount = 1;
5037 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5038 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5039 &command_buffer);
5040
5041 VkCommandBuffer secondary_command_buffer;
5042 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5043 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5044 &secondary_command_buffer);
5045
5046 VkQueue queue = VK_NULL_HANDLE;
5047 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5048 1, &queue);
5049
5050 uint32_t qfi = 0;
5051 VkBufferCreateInfo buff_create_info = {};
5052 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5053 buff_create_info.size = 1024;
5054 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
5055 buff_create_info.queueFamilyIndexCount = 1;
5056 buff_create_info.pQueueFamilyIndices = &qfi;
5057
5058 VkResult err;
5059 VkBuffer buffer;
5060 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
5061 ASSERT_VK_SUCCESS(err);
5062 VkMemoryAllocateInfo mem_alloc = {};
5063 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5064 mem_alloc.pNext = NULL;
5065 mem_alloc.allocationSize = 1024;
5066 mem_alloc.memoryTypeIndex = 0;
5067
5068 VkMemoryRequirements memReqs;
5069 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
5070 bool pass =
5071 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
5072 if (!pass) {
5073 vkDestroyBuffer(m_device->device(), buffer, NULL);
5074 return;
5075 }
5076
5077 VkDeviceMemory mem;
5078 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5079 ASSERT_VK_SUCCESS(err);
5080 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5081 ASSERT_VK_SUCCESS(err);
5082
5083 VkCommandBufferInheritanceInfo hinfo = {};
5084 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
5085 hinfo.renderPass = VK_NULL_HANDLE;
5086 hinfo.subpass = 0;
5087 hinfo.framebuffer = VK_NULL_HANDLE;
5088 hinfo.occlusionQueryEnable = VK_FALSE;
5089 hinfo.queryFlags = 0;
5090 hinfo.pipelineStatistics = 0;
5091
5092 {
5093 VkCommandBufferBeginInfo begin_info{};
5094 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5095 begin_info.pInheritanceInfo = &hinfo;
5096 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
5097
5098 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
5099 vkCmdWriteTimestamp(secondary_command_buffer,
5100 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
5101
5102 vkEndCommandBuffer(secondary_command_buffer);
5103
5104 begin_info.pInheritanceInfo = nullptr;
5105 vkBeginCommandBuffer(command_buffer, &begin_info);
5106
5107 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
5108 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer,
5109 0, 0, 0);
5110
5111 vkEndCommandBuffer(command_buffer);
5112 }
5113 {
5114 VkSubmitInfo submit_info{};
5115 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5116 submit_info.commandBufferCount = 1;
5117 submit_info.pCommandBuffers = &command_buffer;
5118 submit_info.signalSemaphoreCount = 0;
5119 submit_info.pSignalSemaphores = nullptr;
5120 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5121 }
5122
5123 vkQueueWaitIdle(queue);
5124
5125 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
5126 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5127 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
5128 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5129 vkDestroyBuffer(m_device->device(), buffer, NULL);
5130 vkFreeMemory(m_device->device(), mem, NULL);
5131
5132 m_errorMonitor->VerifyNotFound();
5133}
5134
5135// This is a positive test. No errors should be generated.
Michael Lentine5627e692016-05-20 17:45:02 -05005136TEST_F(VkLayerTest, QueryAndCopyMultipleCommandBuffers) {
5137 TEST_DESCRIPTION(
5138 "Issue a query and copy from it on a second command buffer.");
5139
5140 if ((m_device->queue_props.empty()) ||
5141 (m_device->queue_props[0].queueCount < 2))
5142 return;
5143
5144 m_errorMonitor->ExpectSuccess();
5145
5146 VkQueryPool query_pool;
5147 VkQueryPoolCreateInfo query_pool_create_info{};
5148 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5149 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
5150 query_pool_create_info.queryCount = 1;
5151 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
5152 &query_pool);
5153
5154 VkCommandPool command_pool;
5155 VkCommandPoolCreateInfo pool_create_info{};
5156 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5157 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5158 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5159 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5160 &command_pool);
5161
5162 VkCommandBuffer command_buffer[2];
5163 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5164 command_buffer_allocate_info.sType =
5165 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5166 command_buffer_allocate_info.commandPool = command_pool;
5167 command_buffer_allocate_info.commandBufferCount = 2;
5168 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5169 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5170 command_buffer);
5171
5172 VkQueue queue = VK_NULL_HANDLE;
5173 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5174 1, &queue);
5175
5176 uint32_t qfi = 0;
5177 VkBufferCreateInfo buff_create_info = {};
5178 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5179 buff_create_info.size = 1024;
5180 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
5181 buff_create_info.queueFamilyIndexCount = 1;
5182 buff_create_info.pQueueFamilyIndices = &qfi;
5183
5184 VkResult err;
5185 VkBuffer buffer;
5186 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
5187 ASSERT_VK_SUCCESS(err);
5188 VkMemoryAllocateInfo mem_alloc = {};
5189 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5190 mem_alloc.pNext = NULL;
5191 mem_alloc.allocationSize = 1024;
5192 mem_alloc.memoryTypeIndex = 0;
5193
5194 VkMemoryRequirements memReqs;
5195 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
5196 bool pass =
5197 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
5198 if (!pass) {
5199 vkDestroyBuffer(m_device->device(), buffer, NULL);
5200 return;
5201 }
5202
5203 VkDeviceMemory mem;
5204 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5205 ASSERT_VK_SUCCESS(err);
5206 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5207 ASSERT_VK_SUCCESS(err);
5208
5209 {
5210 VkCommandBufferBeginInfo begin_info{};
5211 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5212 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5213
5214 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
5215 vkCmdWriteTimestamp(command_buffer[0],
5216 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
5217
5218 vkEndCommandBuffer(command_buffer[0]);
5219
5220 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5221
5222 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer,
5223 0, 0, 0);
5224
5225 vkEndCommandBuffer(command_buffer[1]);
5226 }
5227 {
5228 VkSubmitInfo submit_info{};
5229 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5230 submit_info.commandBufferCount = 2;
5231 submit_info.pCommandBuffers = command_buffer;
5232 submit_info.signalSemaphoreCount = 0;
5233 submit_info.pSignalSemaphores = nullptr;
5234 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5235 }
5236
5237 vkQueueWaitIdle(queue);
5238
5239 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
5240 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
5241 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06005242 vkDestroyBuffer(m_device->device(), buffer, NULL);
5243 vkFreeMemory(m_device->device(), mem, NULL);
Michael Lentine5627e692016-05-20 17:45:02 -05005244
5245 m_errorMonitor->VerifyNotFound();
5246}
Michael Lentine860b0fe2016-05-20 10:14:00 -05005247
5248TEST_F(VkLayerTest, ResetEventThenSet) {
5249 TEST_DESCRIPTION(
5250 "Reset an event then set it after the reset has been submitted.");
5251
Michael Lentine860b0fe2016-05-20 10:14:00 -05005252 m_errorMonitor->ExpectSuccess();
5253
5254 VkEvent event;
5255 VkEventCreateInfo event_create_info{};
5256 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5257 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
5258
5259 VkCommandPool command_pool;
5260 VkCommandPoolCreateInfo pool_create_info{};
5261 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5262 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5263 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5264 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5265 &command_pool);
5266
5267 VkCommandBuffer command_buffer;
5268 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5269 command_buffer_allocate_info.sType =
5270 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5271 command_buffer_allocate_info.commandPool = command_pool;
5272 command_buffer_allocate_info.commandBufferCount = 1;
5273 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5274 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5275 &command_buffer);
5276
5277 VkQueue queue = VK_NULL_HANDLE;
5278 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06005279 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005280
5281 {
5282 VkCommandBufferBeginInfo begin_info{};
5283 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5284 vkBeginCommandBuffer(command_buffer, &begin_info);
5285
5286 vkCmdResetEvent(command_buffer, event,
5287 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
5288 vkCmdWaitEvents(command_buffer, 1, &event,
5289 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5290 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
5291 nullptr, 0, nullptr);
5292 vkEndCommandBuffer(command_buffer);
5293 }
5294 {
5295 VkSubmitInfo submit_info{};
5296 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5297 submit_info.commandBufferCount = 1;
5298 submit_info.pCommandBuffers = &command_buffer;
5299 submit_info.signalSemaphoreCount = 0;
5300 submit_info.pSignalSemaphores = nullptr;
5301 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5302 }
5303 {
5304 m_errorMonitor->SetDesiredFailureMsg(
5305 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkSetEvent() on event "
5306 "0x1 that is already in use by a "
5307 "command buffer.");
5308 vkSetEvent(m_device->device(), event);
5309 m_errorMonitor->VerifyFound();
5310 }
5311
5312 vkQueueWaitIdle(queue);
5313
5314 vkDestroyEvent(m_device->device(), event, nullptr);
5315 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5316 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5317}
5318
5319// This is a positive test. No errors should be generated.
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005320TEST_F(VkLayerTest, TwoFencesThreeFrames) {
5321 TEST_DESCRIPTION("Two command buffers with two separate fences are each "
5322 "run through a Submit & WaitForFences cycle 3 times. This "
5323 "previously revealed a bug so running this positive test "
5324 "to prevent a regression.");
5325 m_errorMonitor->ExpectSuccess();
5326
5327 ASSERT_NO_FATAL_FAILURE(InitState());
5328 VkQueue queue = VK_NULL_HANDLE;
5329 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5330 0, &queue);
5331
5332 static const uint32_t NUM_OBJECTS = 2;
5333 static const uint32_t NUM_FRAMES = 3;
5334 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
5335 VkFence fences[NUM_OBJECTS] = {};
5336
5337 VkCommandPool cmd_pool;
5338 VkCommandPoolCreateInfo cmd_pool_ci = {};
5339 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5340 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
5341 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5342 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci,
5343 nullptr, &cmd_pool);
5344 ASSERT_VK_SUCCESS(err);
5345
5346 VkCommandBufferAllocateInfo cmd_buf_info = {};
5347 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5348 cmd_buf_info.commandPool = cmd_pool;
5349 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5350 cmd_buf_info.commandBufferCount = 1;
5351
5352 VkFenceCreateInfo fence_ci = {};
5353 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5354 fence_ci.pNext = nullptr;
5355 fence_ci.flags = 0;
5356
5357 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
5358 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info,
5359 &cmd_buffers[i]);
5360 ASSERT_VK_SUCCESS(err);
5361 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
5362 ASSERT_VK_SUCCESS(err);
5363 }
5364
5365 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
Tobin Ehlisf9025162016-05-26 06:55:21 -06005366 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
5367 // Create empty cmd buffer
5368 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
5369 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005370
Tobin Ehlisf9025162016-05-26 06:55:21 -06005371 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
5372 ASSERT_VK_SUCCESS(err);
5373 err = vkEndCommandBuffer(cmd_buffers[obj]);
5374 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005375
Tobin Ehlisf9025162016-05-26 06:55:21 -06005376 VkSubmitInfo submit_info = {};
5377 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5378 submit_info.commandBufferCount = 1;
5379 submit_info.pCommandBuffers = &cmd_buffers[obj];
5380 // Submit cmd buffer and wait for fence
5381 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
5382 ASSERT_VK_SUCCESS(err);
5383 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE,
5384 UINT64_MAX);
5385 ASSERT_VK_SUCCESS(err);
5386 err = vkResetFences(m_device->device(), 1, &fences[obj]);
5387 ASSERT_VK_SUCCESS(err);
5388 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005389 }
5390 m_errorMonitor->VerifyNotFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06005391 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
5392 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
5393 vkDestroyFence(m_device->device(), fences[i], nullptr);
5394 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005395}
5396// This is a positive test. No errors should be generated.
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005397TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
5398
5399 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5400 "submitted on separate queues followed by a QueueWaitIdle.");
5401
Dustin Graves48458142016-04-29 16:11:55 -06005402 if ((m_device->queue_props.empty()) ||
5403 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005404 return;
5405
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005406 m_errorMonitor->ExpectSuccess();
5407
5408 VkSemaphore semaphore;
5409 VkSemaphoreCreateInfo semaphore_create_info{};
5410 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5411 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5412 &semaphore);
5413
5414 VkCommandPool command_pool;
5415 VkCommandPoolCreateInfo pool_create_info{};
5416 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5417 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5418 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5419 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5420 &command_pool);
5421
5422 VkCommandBuffer command_buffer[2];
5423 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5424 command_buffer_allocate_info.sType =
5425 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5426 command_buffer_allocate_info.commandPool = command_pool;
5427 command_buffer_allocate_info.commandBufferCount = 2;
5428 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5429 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5430 command_buffer);
5431
5432 VkQueue queue = VK_NULL_HANDLE;
5433 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5434 1, &queue);
5435
5436 {
5437 VkCommandBufferBeginInfo begin_info{};
5438 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5439 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5440
5441 vkCmdPipelineBarrier(command_buffer[0],
5442 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5443 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5444 0, nullptr, 0, nullptr);
5445
5446 VkViewport viewport{};
5447 viewport.maxDepth = 1.0f;
5448 viewport.minDepth = 0.0f;
5449 viewport.width = 512;
5450 viewport.height = 512;
5451 viewport.x = 0;
5452 viewport.y = 0;
5453 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5454 vkEndCommandBuffer(command_buffer[0]);
5455 }
5456 {
5457 VkCommandBufferBeginInfo begin_info{};
5458 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5459 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5460
5461 VkViewport viewport{};
5462 viewport.maxDepth = 1.0f;
5463 viewport.minDepth = 0.0f;
5464 viewport.width = 512;
5465 viewport.height = 512;
5466 viewport.x = 0;
5467 viewport.y = 0;
5468 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5469 vkEndCommandBuffer(command_buffer[1]);
5470 }
5471 {
5472 VkSubmitInfo submit_info{};
5473 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5474 submit_info.commandBufferCount = 1;
5475 submit_info.pCommandBuffers = &command_buffer[0];
5476 submit_info.signalSemaphoreCount = 1;
5477 submit_info.pSignalSemaphores = &semaphore;
5478 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5479 }
5480 {
5481 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5482 VkSubmitInfo submit_info{};
5483 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5484 submit_info.commandBufferCount = 1;
5485 submit_info.pCommandBuffers = &command_buffer[1];
5486 submit_info.waitSemaphoreCount = 1;
5487 submit_info.pWaitSemaphores = &semaphore;
5488 submit_info.pWaitDstStageMask = flags;
5489 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5490 }
5491
5492 vkQueueWaitIdle(m_device->m_queue);
5493
5494 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5495 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5496 &command_buffer[0]);
5497 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5498
5499 m_errorMonitor->VerifyNotFound();
5500}
5501
5502// This is a positive test. No errors should be generated.
5503TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
5504
5505 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5506 "submitted on separate queues, the second having a fence"
5507 "followed by a QueueWaitIdle.");
5508
Dustin Graves48458142016-04-29 16:11:55 -06005509 if ((m_device->queue_props.empty()) ||
5510 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005511 return;
5512
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005513 m_errorMonitor->ExpectSuccess();
5514
5515 VkFence fence;
5516 VkFenceCreateInfo fence_create_info{};
5517 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5518 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5519
5520 VkSemaphore semaphore;
5521 VkSemaphoreCreateInfo semaphore_create_info{};
5522 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5523 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5524 &semaphore);
5525
5526 VkCommandPool command_pool;
5527 VkCommandPoolCreateInfo pool_create_info{};
5528 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5529 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5530 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5531 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5532 &command_pool);
5533
5534 VkCommandBuffer command_buffer[2];
5535 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5536 command_buffer_allocate_info.sType =
5537 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5538 command_buffer_allocate_info.commandPool = command_pool;
5539 command_buffer_allocate_info.commandBufferCount = 2;
5540 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5541 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5542 command_buffer);
5543
5544 VkQueue queue = VK_NULL_HANDLE;
5545 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5546 1, &queue);
5547
5548 {
5549 VkCommandBufferBeginInfo begin_info{};
5550 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5551 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5552
5553 vkCmdPipelineBarrier(command_buffer[0],
5554 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5555 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5556 0, nullptr, 0, nullptr);
5557
5558 VkViewport viewport{};
5559 viewport.maxDepth = 1.0f;
5560 viewport.minDepth = 0.0f;
5561 viewport.width = 512;
5562 viewport.height = 512;
5563 viewport.x = 0;
5564 viewport.y = 0;
5565 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5566 vkEndCommandBuffer(command_buffer[0]);
5567 }
5568 {
5569 VkCommandBufferBeginInfo begin_info{};
5570 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5571 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5572
5573 VkViewport viewport{};
5574 viewport.maxDepth = 1.0f;
5575 viewport.minDepth = 0.0f;
5576 viewport.width = 512;
5577 viewport.height = 512;
5578 viewport.x = 0;
5579 viewport.y = 0;
5580 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5581 vkEndCommandBuffer(command_buffer[1]);
5582 }
5583 {
5584 VkSubmitInfo submit_info{};
5585 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5586 submit_info.commandBufferCount = 1;
5587 submit_info.pCommandBuffers = &command_buffer[0];
5588 submit_info.signalSemaphoreCount = 1;
5589 submit_info.pSignalSemaphores = &semaphore;
5590 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5591 }
5592 {
5593 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5594 VkSubmitInfo submit_info{};
5595 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5596 submit_info.commandBufferCount = 1;
5597 submit_info.pCommandBuffers = &command_buffer[1];
5598 submit_info.waitSemaphoreCount = 1;
5599 submit_info.pWaitSemaphores = &semaphore;
5600 submit_info.pWaitDstStageMask = flags;
5601 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5602 }
5603
5604 vkQueueWaitIdle(m_device->m_queue);
5605
5606 vkDestroyFence(m_device->device(), fence, nullptr);
5607 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5608 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5609 &command_buffer[0]);
5610 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5611
5612 m_errorMonitor->VerifyNotFound();
5613}
5614
5615// This is a positive test. No errors should be generated.
5616TEST_F(VkLayerTest,
5617 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
5618
5619 TEST_DESCRIPTION(
5620 "Two command buffers, each in a separate QueueSubmit call "
5621 "submitted on separate queues, the second having a fence"
5622 "followed by two consecutive WaitForFences calls on the same fence.");
5623
Dustin Graves48458142016-04-29 16:11:55 -06005624 if ((m_device->queue_props.empty()) ||
5625 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005626 return;
5627
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005628 m_errorMonitor->ExpectSuccess();
5629
5630 VkFence fence;
5631 VkFenceCreateInfo fence_create_info{};
5632 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5633 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5634
5635 VkSemaphore semaphore;
5636 VkSemaphoreCreateInfo semaphore_create_info{};
5637 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5638 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5639 &semaphore);
5640
5641 VkCommandPool command_pool;
5642 VkCommandPoolCreateInfo pool_create_info{};
5643 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5644 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5645 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5646 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5647 &command_pool);
5648
5649 VkCommandBuffer command_buffer[2];
5650 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5651 command_buffer_allocate_info.sType =
5652 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5653 command_buffer_allocate_info.commandPool = command_pool;
5654 command_buffer_allocate_info.commandBufferCount = 2;
5655 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5656 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5657 command_buffer);
5658
5659 VkQueue queue = VK_NULL_HANDLE;
5660 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5661 1, &queue);
5662
5663 {
5664 VkCommandBufferBeginInfo begin_info{};
5665 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5666 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5667
5668 vkCmdPipelineBarrier(command_buffer[0],
5669 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5670 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5671 0, nullptr, 0, nullptr);
5672
5673 VkViewport viewport{};
5674 viewport.maxDepth = 1.0f;
5675 viewport.minDepth = 0.0f;
5676 viewport.width = 512;
5677 viewport.height = 512;
5678 viewport.x = 0;
5679 viewport.y = 0;
5680 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5681 vkEndCommandBuffer(command_buffer[0]);
5682 }
5683 {
5684 VkCommandBufferBeginInfo begin_info{};
5685 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5686 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5687
5688 VkViewport viewport{};
5689 viewport.maxDepth = 1.0f;
5690 viewport.minDepth = 0.0f;
5691 viewport.width = 512;
5692 viewport.height = 512;
5693 viewport.x = 0;
5694 viewport.y = 0;
5695 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5696 vkEndCommandBuffer(command_buffer[1]);
5697 }
5698 {
5699 VkSubmitInfo submit_info{};
5700 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5701 submit_info.commandBufferCount = 1;
5702 submit_info.pCommandBuffers = &command_buffer[0];
5703 submit_info.signalSemaphoreCount = 1;
5704 submit_info.pSignalSemaphores = &semaphore;
5705 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5706 }
5707 {
5708 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5709 VkSubmitInfo submit_info{};
5710 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5711 submit_info.commandBufferCount = 1;
5712 submit_info.pCommandBuffers = &command_buffer[1];
5713 submit_info.waitSemaphoreCount = 1;
5714 submit_info.pWaitSemaphores = &semaphore;
5715 submit_info.pWaitDstStageMask = flags;
5716 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5717 }
5718
5719 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5720 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5721
5722 vkDestroyFence(m_device->device(), fence, nullptr);
5723 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5724 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5725 &command_buffer[0]);
5726 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5727
5728 m_errorMonitor->VerifyNotFound();
5729}
5730
Chris Forbes0f8126b2016-06-20 17:48:22 +12005731#if 0
5732TEST_F(VkLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
5733 if ((m_device->queue_props.empty()) ||
5734 (m_device->queue_props[0].queueCount < 2)) {
5735 printf("Test requires two queues, skipping\n");
5736 return;
5737 }
5738
5739 VkResult err;
5740
5741 m_errorMonitor->ExpectSuccess();
5742
5743 VkQueue q0 = m_device->m_queue;
5744 VkQueue q1 = nullptr;
5745 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
5746 ASSERT_NE(q1, nullptr);
5747
5748 // An (empty) command buffer. We must have work in the first submission --
5749 // the layer treats unfenced work differently from fenced work.
5750 VkCommandPoolCreateInfo cpci = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0 };
5751 VkCommandPool pool;
5752 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
5753 ASSERT_VK_SUCCESS(err);
5754 VkCommandBufferAllocateInfo cbai = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr,
5755 pool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1
5756 };
5757 VkCommandBuffer cb;
5758 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
5759 ASSERT_VK_SUCCESS(err);
5760 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
5761 0, nullptr
5762 };
5763 err = vkBeginCommandBuffer(cb, &cbbi);
5764 ASSERT_VK_SUCCESS(err);
5765 err = vkEndCommandBuffer(cb);
5766 ASSERT_VK_SUCCESS(err);
5767
5768 // A semaphore
5769 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
5770 VkSemaphore s;
5771 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
5772 ASSERT_VK_SUCCESS(err);
5773
5774 // First submission, to q0
5775 VkSubmitInfo s0 = {
5776 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5777 0, nullptr, nullptr,
5778 1, &cb,
5779 1, &s
5780 };
5781
5782 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
5783 ASSERT_VK_SUCCESS(err);
5784
5785 // Second submission, to q1, waiting on s
5786 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
5787 VkSubmitInfo s1 = {
5788 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5789 1, &s, &waitmask,
5790 0, nullptr,
5791 0, nullptr
5792 };
5793
5794 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
5795 ASSERT_VK_SUCCESS(err);
5796
5797 // Wait for q0 idle
5798 err = vkQueueWaitIdle(q0);
5799 ASSERT_VK_SUCCESS(err);
5800
5801 // Command buffer should have been completed (it was on q0); reset the pool.
5802 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
5803
5804 m_errorMonitor->VerifyNotFound();
5805
5806 // Force device completely idle and clean up resources
5807 vkDeviceWaitIdle(m_device->device());
5808 vkDestroyCommandPool(m_device->device(), pool, nullptr);
5809 vkDestroySemaphore(m_device->device(), s, nullptr);
5810}
5811#endif
5812
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005813// This is a positive test. No errors should be generated.
5814TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
5815
5816 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5817 "submitted on separate queues, the second having a fence, "
5818 "followed by a WaitForFences call.");
5819
Dustin Graves48458142016-04-29 16:11:55 -06005820 if ((m_device->queue_props.empty()) ||
5821 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005822 return;
5823
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005824 m_errorMonitor->ExpectSuccess();
5825
5826 VkFence fence;
5827 VkFenceCreateInfo fence_create_info{};
5828 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5829 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5830
5831 VkSemaphore semaphore;
5832 VkSemaphoreCreateInfo semaphore_create_info{};
5833 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5834 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5835 &semaphore);
5836
5837 VkCommandPool command_pool;
5838 VkCommandPoolCreateInfo pool_create_info{};
5839 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5840 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5841 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5842 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5843 &command_pool);
5844
5845 VkCommandBuffer command_buffer[2];
5846 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5847 command_buffer_allocate_info.sType =
5848 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5849 command_buffer_allocate_info.commandPool = command_pool;
5850 command_buffer_allocate_info.commandBufferCount = 2;
5851 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5852 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5853 command_buffer);
5854
5855 VkQueue queue = VK_NULL_HANDLE;
5856 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5857 1, &queue);
5858
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
5918 vkDestroyFence(m_device->device(), fence, nullptr);
5919 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5920 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5921 &command_buffer[0]);
5922 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5923
5924 m_errorMonitor->VerifyNotFound();
5925}
5926
5927// This is a positive test. No errors should be generated.
5928TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
5929
5930 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5931 "on the same queue, sharing a signal/wait semaphore, the "
5932 "second having a fence, "
5933 "followed by a WaitForFences call.");
5934
5935 m_errorMonitor->ExpectSuccess();
5936
5937 VkFence fence;
5938 VkFenceCreateInfo fence_create_info{};
5939 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5940 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5941
5942 VkSemaphore semaphore;
5943 VkSemaphoreCreateInfo semaphore_create_info{};
5944 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5945 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5946 &semaphore);
5947
5948 VkCommandPool command_pool;
5949 VkCommandPoolCreateInfo pool_create_info{};
5950 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5951 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5952 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5953 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5954 &command_pool);
5955
5956 VkCommandBuffer command_buffer[2];
5957 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5958 command_buffer_allocate_info.sType =
5959 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5960 command_buffer_allocate_info.commandPool = command_pool;
5961 command_buffer_allocate_info.commandBufferCount = 2;
5962 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5963 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5964 command_buffer);
5965
5966 {
5967 VkCommandBufferBeginInfo begin_info{};
5968 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5969 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5970
5971 vkCmdPipelineBarrier(command_buffer[0],
5972 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5973 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5974 0, nullptr, 0, nullptr);
5975
5976 VkViewport viewport{};
5977 viewport.maxDepth = 1.0f;
5978 viewport.minDepth = 0.0f;
5979 viewport.width = 512;
5980 viewport.height = 512;
5981 viewport.x = 0;
5982 viewport.y = 0;
5983 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5984 vkEndCommandBuffer(command_buffer[0]);
5985 }
5986 {
5987 VkCommandBufferBeginInfo begin_info{};
5988 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5989 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5990
5991 VkViewport viewport{};
5992 viewport.maxDepth = 1.0f;
5993 viewport.minDepth = 0.0f;
5994 viewport.width = 512;
5995 viewport.height = 512;
5996 viewport.x = 0;
5997 viewport.y = 0;
5998 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5999 vkEndCommandBuffer(command_buffer[1]);
6000 }
6001 {
6002 VkSubmitInfo submit_info{};
6003 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6004 submit_info.commandBufferCount = 1;
6005 submit_info.pCommandBuffers = &command_buffer[0];
6006 submit_info.signalSemaphoreCount = 1;
6007 submit_info.pSignalSemaphores = &semaphore;
6008 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6009 }
6010 {
6011 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6012 VkSubmitInfo submit_info{};
6013 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6014 submit_info.commandBufferCount = 1;
6015 submit_info.pCommandBuffers = &command_buffer[1];
6016 submit_info.waitSemaphoreCount = 1;
6017 submit_info.pWaitSemaphores = &semaphore;
6018 submit_info.pWaitDstStageMask = flags;
6019 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
6020 }
6021
6022 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6023
6024 vkDestroyFence(m_device->device(), fence, nullptr);
6025 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
6026 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6027 &command_buffer[0]);
6028 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6029
6030 m_errorMonitor->VerifyNotFound();
6031}
6032
6033// This is a positive test. No errors should be generated.
6034TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
6035
6036 TEST_DESCRIPTION(
6037 "Two command buffers, each in a separate QueueSubmit call "
6038 "on the same queue, no fences, followed by a third QueueSubmit with NO "
6039 "SubmitInfos but with a fence, followed by a WaitForFences call.");
6040
6041 m_errorMonitor->ExpectSuccess();
6042
6043 VkFence fence;
6044 VkFenceCreateInfo fence_create_info{};
6045 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6046 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6047
6048 VkCommandPool command_pool;
6049 VkCommandPoolCreateInfo pool_create_info{};
6050 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6051 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6052 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6053 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6054 &command_pool);
6055
6056 VkCommandBuffer command_buffer[2];
6057 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6058 command_buffer_allocate_info.sType =
6059 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6060 command_buffer_allocate_info.commandPool = command_pool;
6061 command_buffer_allocate_info.commandBufferCount = 2;
6062 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6063 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6064 command_buffer);
6065
6066 {
6067 VkCommandBufferBeginInfo begin_info{};
6068 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6069 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6070
6071 vkCmdPipelineBarrier(command_buffer[0],
6072 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6073 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6074 0, nullptr, 0, nullptr);
6075
6076 VkViewport viewport{};
6077 viewport.maxDepth = 1.0f;
6078 viewport.minDepth = 0.0f;
6079 viewport.width = 512;
6080 viewport.height = 512;
6081 viewport.x = 0;
6082 viewport.y = 0;
6083 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6084 vkEndCommandBuffer(command_buffer[0]);
6085 }
6086 {
6087 VkCommandBufferBeginInfo begin_info{};
6088 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6089 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6090
6091 VkViewport viewport{};
6092 viewport.maxDepth = 1.0f;
6093 viewport.minDepth = 0.0f;
6094 viewport.width = 512;
6095 viewport.height = 512;
6096 viewport.x = 0;
6097 viewport.y = 0;
6098 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6099 vkEndCommandBuffer(command_buffer[1]);
6100 }
6101 {
6102 VkSubmitInfo submit_info{};
6103 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6104 submit_info.commandBufferCount = 1;
6105 submit_info.pCommandBuffers = &command_buffer[0];
6106 submit_info.signalSemaphoreCount = 0;
6107 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
6108 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6109 }
6110 {
6111 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6112 VkSubmitInfo submit_info{};
6113 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6114 submit_info.commandBufferCount = 1;
6115 submit_info.pCommandBuffers = &command_buffer[1];
6116 submit_info.waitSemaphoreCount = 0;
6117 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
6118 submit_info.pWaitDstStageMask = flags;
6119 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6120 }
6121
6122 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
6123
Mike Stroyancd1c3e52016-06-21 09:20:01 -06006124 VkResult err =
6125 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6126 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006127
6128 vkDestroyFence(m_device->device(), fence, nullptr);
6129 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6130 &command_buffer[0]);
6131 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6132
6133 m_errorMonitor->VerifyNotFound();
6134}
6135
6136// This is a positive test. No errors should be generated.
6137TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
6138
6139 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
6140 "on the same queue, the second having a fence, followed "
6141 "by a WaitForFences call.");
6142
6143 m_errorMonitor->ExpectSuccess();
6144
6145 VkFence fence;
6146 VkFenceCreateInfo fence_create_info{};
6147 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6148 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6149
6150 VkCommandPool command_pool;
6151 VkCommandPoolCreateInfo pool_create_info{};
6152 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6153 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6154 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6155 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6156 &command_pool);
6157
6158 VkCommandBuffer command_buffer[2];
6159 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6160 command_buffer_allocate_info.sType =
6161 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6162 command_buffer_allocate_info.commandPool = command_pool;
6163 command_buffer_allocate_info.commandBufferCount = 2;
6164 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6165 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6166 command_buffer);
6167
6168 {
6169 VkCommandBufferBeginInfo begin_info{};
6170 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6171 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6172
6173 vkCmdPipelineBarrier(command_buffer[0],
6174 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6175 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6176 0, nullptr, 0, nullptr);
6177
6178 VkViewport viewport{};
6179 viewport.maxDepth = 1.0f;
6180 viewport.minDepth = 0.0f;
6181 viewport.width = 512;
6182 viewport.height = 512;
6183 viewport.x = 0;
6184 viewport.y = 0;
6185 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6186 vkEndCommandBuffer(command_buffer[0]);
6187 }
6188 {
6189 VkCommandBufferBeginInfo begin_info{};
6190 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6191 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6192
6193 VkViewport viewport{};
6194 viewport.maxDepth = 1.0f;
6195 viewport.minDepth = 0.0f;
6196 viewport.width = 512;
6197 viewport.height = 512;
6198 viewport.x = 0;
6199 viewport.y = 0;
6200 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6201 vkEndCommandBuffer(command_buffer[1]);
6202 }
6203 {
6204 VkSubmitInfo submit_info{};
6205 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6206 submit_info.commandBufferCount = 1;
6207 submit_info.pCommandBuffers = &command_buffer[0];
6208 submit_info.signalSemaphoreCount = 0;
6209 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
6210 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6211 }
6212 {
6213 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6214 VkSubmitInfo submit_info{};
6215 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6216 submit_info.commandBufferCount = 1;
6217 submit_info.pCommandBuffers = &command_buffer[1];
6218 submit_info.waitSemaphoreCount = 0;
6219 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
6220 submit_info.pWaitDstStageMask = flags;
6221 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
6222 }
6223
6224 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6225
6226 vkDestroyFence(m_device->device(), fence, nullptr);
6227 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6228 &command_buffer[0]);
6229 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6230
6231 m_errorMonitor->VerifyNotFound();
6232}
6233
6234// This is a positive test. No errors should be generated.
6235TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
6236
6237 TEST_DESCRIPTION(
6238 "Two command buffers each in a separate SubmitInfo sent in a single "
6239 "QueueSubmit call followed by a WaitForFences call.");
6240
6241 m_errorMonitor->ExpectSuccess();
6242
6243 VkFence fence;
6244 VkFenceCreateInfo fence_create_info{};
6245 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6246 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6247
6248 VkSemaphore semaphore;
6249 VkSemaphoreCreateInfo semaphore_create_info{};
6250 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
6251 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
6252 &semaphore);
6253
6254 VkCommandPool command_pool;
6255 VkCommandPoolCreateInfo pool_create_info{};
6256 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6257 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6258 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
6259 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
6260 &command_pool);
6261
6262 VkCommandBuffer command_buffer[2];
6263 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
6264 command_buffer_allocate_info.sType =
6265 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6266 command_buffer_allocate_info.commandPool = command_pool;
6267 command_buffer_allocate_info.commandBufferCount = 2;
6268 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
6269 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
6270 command_buffer);
6271
6272 {
6273 VkCommandBufferBeginInfo begin_info{};
6274 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6275 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6276
6277 vkCmdPipelineBarrier(command_buffer[0],
6278 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
6279 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
6280 0, nullptr, 0, nullptr);
6281
6282 VkViewport viewport{};
6283 viewport.maxDepth = 1.0f;
6284 viewport.minDepth = 0.0f;
6285 viewport.width = 512;
6286 viewport.height = 512;
6287 viewport.x = 0;
6288 viewport.y = 0;
6289 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6290 vkEndCommandBuffer(command_buffer[0]);
6291 }
6292 {
6293 VkCommandBufferBeginInfo begin_info{};
6294 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6295 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6296
6297 VkViewport viewport{};
6298 viewport.maxDepth = 1.0f;
6299 viewport.minDepth = 0.0f;
6300 viewport.width = 512;
6301 viewport.height = 512;
6302 viewport.x = 0;
6303 viewport.y = 0;
6304 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6305 vkEndCommandBuffer(command_buffer[1]);
6306 }
6307 {
6308 VkSubmitInfo submit_info[2];
6309 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6310
6311 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6312 submit_info[0].pNext = NULL;
6313 submit_info[0].commandBufferCount = 1;
6314 submit_info[0].pCommandBuffers = &command_buffer[0];
6315 submit_info[0].signalSemaphoreCount = 1;
6316 submit_info[0].pSignalSemaphores = &semaphore;
6317 submit_info[0].waitSemaphoreCount = 0;
6318 submit_info[0].pWaitSemaphores = NULL;
6319 submit_info[0].pWaitDstStageMask = 0;
6320
6321 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6322 submit_info[1].pNext = NULL;
6323 submit_info[1].commandBufferCount = 1;
6324 submit_info[1].pCommandBuffers = &command_buffer[1];
6325 submit_info[1].waitSemaphoreCount = 1;
6326 submit_info[1].pWaitSemaphores = &semaphore;
6327 submit_info[1].pWaitDstStageMask = flags;
6328 submit_info[1].signalSemaphoreCount = 0;
6329 submit_info[1].pSignalSemaphores = NULL;
6330 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
6331 }
6332
6333 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6334
6335 vkDestroyFence(m_device->device(), fence, nullptr);
6336 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
6337 &command_buffer[0]);
6338 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006339 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006340
6341 m_errorMonitor->VerifyNotFound();
6342}
6343
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006344TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006345 TEST_DESCRIPTION(
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006346 "Run a simple draw calls to validate failure when Depth Bias dynamic "
6347 "state is required but not correctly bound.");
6348
6349 // Dynamic depth bias
6350 m_errorMonitor->SetDesiredFailureMsg(
6351 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6352 "Dynamic depth bias state not set for this command buffer");
6353 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6354 BsoFailDepthBias);
6355 m_errorMonitor->VerifyFound();
6356}
6357
6358TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
6359 TEST_DESCRIPTION(
6360 "Run a simple draw calls to validate failure when Line Width dynamic "
6361 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006362
6363 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07006364 m_errorMonitor->SetDesiredFailureMsg(
6365 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006366 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006367 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6368 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006369 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006370}
6371
6372TEST_F(VkLayerTest, DynamicViewportNotBound) {
6373 TEST_DESCRIPTION(
6374 "Run a simple draw calls to validate failure when Viewport dynamic "
6375 "state is required but not correctly bound.");
6376
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006377 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07006378 m_errorMonitor->SetDesiredFailureMsg(
6379 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006380 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006381 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6382 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006383 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006384}
6385
6386TEST_F(VkLayerTest, DynamicScissorNotBound) {
6387 TEST_DESCRIPTION(
6388 "Run a simple draw calls to validate failure when Scissor dynamic "
6389 "state is required but not correctly bound.");
6390
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006391 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07006392 m_errorMonitor->SetDesiredFailureMsg(
6393 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006394 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006395 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6396 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006397 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006398}
6399
Tobin Ehlis21c88352016-05-26 06:15:45 -06006400TEST_F(VkLayerTest, DynamiBlendConstantsNotBound) {
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006401 TEST_DESCRIPTION(
Tobin Ehlis21c88352016-05-26 06:15:45 -06006402 "Run a simple draw calls to validate failure when Blend Constants "
6403 "dynamic state is required but not correctly bound.");
6404 // Dynamic blend constant state
6405 m_errorMonitor->SetDesiredFailureMsg(
6406 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6407 "Dynamic blend constants state not set for this command buffer");
6408 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6409 BsoFailBlend);
6410 m_errorMonitor->VerifyFound();
6411}
6412
6413TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
6414 TEST_DESCRIPTION(
6415 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006416 "state is required but not correctly bound.");
Tobin Ehlis21c88352016-05-26 06:15:45 -06006417 if (!m_device->phy().features().depthBounds) {
6418 printf("Device does not support depthBounds test; skipped.\n");
6419 return;
6420 }
6421 // Dynamic depth bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006422 m_errorMonitor->SetDesiredFailureMsg(
6423 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006424 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006425 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6426 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006427 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006428}
6429
6430TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
6431 TEST_DESCRIPTION(
6432 "Run a simple draw calls to validate failure when Stencil Read dynamic "
6433 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006434 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07006435 m_errorMonitor->SetDesiredFailureMsg(
6436 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006437 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006438 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6439 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006440 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006441}
6442
6443TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
6444 TEST_DESCRIPTION(
6445 "Run a simple draw calls to validate failure when Stencil Write dynamic"
6446 " state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006447 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07006448 m_errorMonitor->SetDesiredFailureMsg(
6449 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006450 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006451 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6452 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006453 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006454}
6455
6456TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
6457 TEST_DESCRIPTION(
6458 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
6459 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006460 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07006461 m_errorMonitor->SetDesiredFailureMsg(
6462 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006463 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006464 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6465 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006466 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06006467}
6468
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06006469TEST_F(VkLayerTest, IndexBufferNotBound) {
6470 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
6471 m_errorMonitor->SetDesiredFailureMsg(
6472 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6473 "Index buffer object not bound to this command buffer when Indexed ");
6474 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6475 BsoFailIndexBuffer);
6476 m_errorMonitor->VerifyFound();
6477}
6478
Karl Schultz6addd812016-02-02 17:17:23 -07006479TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Karl Schultz6addd812016-02-02 17:17:23 -07006480 m_errorMonitor->SetDesiredFailureMsg(
6481 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6482 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
6483 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006484
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006485 ASSERT_NO_FATAL_FAILURE(InitState());
6486 ASSERT_NO_FATAL_FAILURE(InitViewport());
6487 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6488
Karl Schultz6addd812016-02-02 17:17:23 -07006489 // We luck out b/c by default the framework creates CB w/ the
6490 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006491 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006492 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
6493 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006494 EndCommandBuffer();
6495
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006496 // Bypass framework since it does the waits automatically
6497 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006498 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08006499 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6500 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006501 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006502 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07006503 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006504 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006505 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08006506 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006507 submit_info.pSignalSemaphores = NULL;
6508
Chris Forbes40028e22016-06-13 09:59:34 +12006509 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07006510 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006511
Karl Schultz6addd812016-02-02 17:17:23 -07006512 // Cause validation error by re-submitting cmd buffer that should only be
6513 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12006514 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006515
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006516 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006517}
6518
Karl Schultz6addd812016-02-02 17:17:23 -07006519TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006520 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07006521 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006522
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006523 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006524 "Unable to allocate 1 descriptors of "
6525 "type "
6526 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006527
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006528 ASSERT_NO_FATAL_FAILURE(InitState());
6529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006530
Karl Schultz6addd812016-02-02 17:17:23 -07006531 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
6532 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006533 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006534 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6535 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006536
6537 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006538 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6539 ds_pool_ci.pNext = NULL;
6540 ds_pool_ci.flags = 0;
6541 ds_pool_ci.maxSets = 1;
6542 ds_pool_ci.poolSizeCount = 1;
6543 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006544
6545 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006546 err =
6547 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006548 ASSERT_VK_SUCCESS(err);
6549
6550 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006551 dsl_binding.binding = 0;
6552 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6553 dsl_binding.descriptorCount = 1;
6554 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6555 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006556
6557 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006558 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6559 ds_layout_ci.pNext = NULL;
6560 ds_layout_ci.bindingCount = 1;
6561 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006562
6563 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006564 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6565 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006566 ASSERT_VK_SUCCESS(err);
6567
6568 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006569 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006570 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006571 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006572 alloc_info.descriptorPool = ds_pool;
6573 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006574 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6575 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006576
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006577 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006578
Chia-I Wuf7458c52015-10-26 21:10:41 +08006579 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6580 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006581}
6582
Karl Schultz6addd812016-02-02 17:17:23 -07006583TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
6584 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06006585
Karl Schultz6addd812016-02-02 17:17:23 -07006586 m_errorMonitor->SetDesiredFailureMsg(
6587 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6588 "It is invalid to call vkFreeDescriptorSets() with a pool created "
6589 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006590
Tobin Ehlise735c692015-10-08 13:13:50 -06006591 ASSERT_NO_FATAL_FAILURE(InitState());
6592 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06006593
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006594 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006595 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6596 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06006597
6598 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006599 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6600 ds_pool_ci.pNext = NULL;
6601 ds_pool_ci.maxSets = 1;
6602 ds_pool_ci.poolSizeCount = 1;
6603 ds_pool_ci.flags = 0;
6604 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
6605 // app can only call vkResetDescriptorPool on this pool.;
6606 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06006607
6608 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006609 err =
6610 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06006611 ASSERT_VK_SUCCESS(err);
6612
6613 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006614 dsl_binding.binding = 0;
6615 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6616 dsl_binding.descriptorCount = 1;
6617 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6618 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06006619
6620 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006621 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6622 ds_layout_ci.pNext = NULL;
6623 ds_layout_ci.bindingCount = 1;
6624 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06006625
6626 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006627 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6628 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06006629 ASSERT_VK_SUCCESS(err);
6630
6631 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006632 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006633 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006634 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006635 alloc_info.descriptorPool = ds_pool;
6636 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006637 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6638 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06006639 ASSERT_VK_SUCCESS(err);
6640
6641 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006642 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06006643
Chia-I Wuf7458c52015-10-26 21:10:41 +08006644 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6645 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06006646}
6647
Karl Schultz6addd812016-02-02 17:17:23 -07006648TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006649 // Attempt to clear Descriptor Pool with bad object.
6650 // ObjectTracker should catch this.
6651 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006652 "Invalid Descriptor Pool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006653 uint64_t fake_pool_handle = 0xbaad6001;
6654 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
6655 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06006656 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006657}
6658
Karl Schultz6addd812016-02-02 17:17:23 -07006659TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006660 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
6661 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006662 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06006663 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006664
6665 uint64_t fake_set_handle = 0xbaad6001;
6666 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006667 VkResult err;
6668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006669 "Invalid Descriptor Set Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06006670
6671 ASSERT_NO_FATAL_FAILURE(InitState());
6672
6673 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
6674 layout_bindings[0].binding = 0;
6675 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6676 layout_bindings[0].descriptorCount = 1;
6677 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
6678 layout_bindings[0].pImmutableSamplers = NULL;
6679
6680 VkDescriptorSetLayout descriptor_set_layout;
6681 VkDescriptorSetLayoutCreateInfo dslci = {};
6682 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6683 dslci.pNext = NULL;
6684 dslci.bindingCount = 1;
6685 dslci.pBindings = layout_bindings;
6686 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006687 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006688
6689 VkPipelineLayout pipeline_layout;
6690 VkPipelineLayoutCreateInfo plci = {};
6691 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6692 plci.pNext = NULL;
6693 plci.setLayoutCount = 1;
6694 plci.pSetLayouts = &descriptor_set_layout;
6695 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006696 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006697
6698 BeginCommandBuffer();
6699 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006700 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06006701 m_errorMonitor->VerifyFound();
6702 EndCommandBuffer();
6703 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
6704 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006705}
6706
Karl Schultz6addd812016-02-02 17:17:23 -07006707TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006708 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
6709 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006710 uint64_t fake_layout_handle = 0xbaad6001;
6711 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006712 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006713 "Invalid Descriptor Set Layout Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06006714
6715 VkPipelineLayout pipeline_layout;
6716 VkPipelineLayoutCreateInfo plci = {};
6717 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6718 plci.pNext = NULL;
6719 plci.setLayoutCount = 1;
6720 plci.pSetLayouts = &bad_layout;
6721 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
6722
6723 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006724}
6725
Mark Muellerd4914412016-06-13 17:52:06 -06006726TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
6727 TEST_DESCRIPTION("This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
6728 "1) A uniform buffer update must have a valid buffer index."
6729 "2) When using an array of descriptors in a single WriteDescriptor,"
6730 " the descriptor types and stageflags must all be the same."
6731 "3) Immutable Sampler state must match across descriptors");
6732
6733 const char *invalid_BufferInfo_ErrorMessage =
6734 "vkUpdateDescriptorSets: if pDescriptorWrites[0].descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, "
6735 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or "
6736 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pDescriptorWrites[0].pBufferInfo must not be NULL";
6737 const char *stateFlag_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006738 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006739 const char *immutable_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006740 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006741
Mark Muellerd4914412016-06-13 17:52:06 -06006742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_BufferInfo_ErrorMessage);
6743
6744 ASSERT_NO_FATAL_FAILURE(InitState());
6745 VkDescriptorPoolSize ds_type_count[4] = {};
6746 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6747 ds_type_count[0].descriptorCount = 1;
6748 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6749 ds_type_count[1].descriptorCount = 1;
6750 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6751 ds_type_count[2].descriptorCount = 1;
6752 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6753 ds_type_count[3].descriptorCount = 1;
6754
6755 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6756 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6757 ds_pool_ci.maxSets = 1;
6758 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
6759 ds_pool_ci.pPoolSizes = ds_type_count;
6760
6761 VkDescriptorPool ds_pool;
6762 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6763 ASSERT_VK_SUCCESS(err);
6764
Mark Muellerb9896722016-06-16 09:54:29 -06006765 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006766 layout_binding[0].binding = 0;
6767 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6768 layout_binding[0].descriptorCount = 1;
6769 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6770 layout_binding[0].pImmutableSamplers = NULL;
6771
6772 layout_binding[1].binding = 1;
6773 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6774 layout_binding[1].descriptorCount = 1;
6775 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6776 layout_binding[1].pImmutableSamplers = NULL;
6777
6778 VkSamplerCreateInfo sampler_ci = {};
6779 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6780 sampler_ci.pNext = NULL;
6781 sampler_ci.magFilter = VK_FILTER_NEAREST;
6782 sampler_ci.minFilter = VK_FILTER_NEAREST;
6783 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6784 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6785 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6786 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6787 sampler_ci.mipLodBias = 1.0;
6788 sampler_ci.anisotropyEnable = VK_FALSE;
6789 sampler_ci.maxAnisotropy = 1;
6790 sampler_ci.compareEnable = VK_FALSE;
6791 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6792 sampler_ci.minLod = 1.0;
6793 sampler_ci.maxLod = 1.0;
6794 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6795 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6796 VkSampler sampler;
6797
6798 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6799 ASSERT_VK_SUCCESS(err);
6800
6801 layout_binding[2].binding = 2;
6802 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6803 layout_binding[2].descriptorCount = 1;
6804 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6805 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
6806
Mark Muellerd4914412016-06-13 17:52:06 -06006807 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6808 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6809 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
6810 ds_layout_ci.pBindings = layout_binding;
6811 VkDescriptorSetLayout ds_layout;
6812 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6813 ASSERT_VK_SUCCESS(err);
6814
6815 VkDescriptorSetAllocateInfo alloc_info = {};
6816 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6817 alloc_info.descriptorSetCount = 1;
6818 alloc_info.descriptorPool = ds_pool;
6819 alloc_info.pSetLayouts = &ds_layout;
6820 VkDescriptorSet descriptorSet;
6821 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6822 ASSERT_VK_SUCCESS(err);
6823
6824 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6825 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6826 pipeline_layout_ci.pNext = NULL;
6827 pipeline_layout_ci.setLayoutCount = 1;
6828 pipeline_layout_ci.pSetLayouts = &ds_layout;
6829
6830 VkPipelineLayout pipeline_layout;
6831 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6832 ASSERT_VK_SUCCESS(err);
6833
Mark Mueller5c838ce2016-06-16 09:54:29 -06006834 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006835 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6836 descriptor_write.dstSet = descriptorSet;
6837 descriptor_write.dstBinding = 0;
6838 descriptor_write.descriptorCount = 1;
6839 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6840
Mark Mueller5c838ce2016-06-16 09:54:29 -06006841 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06006842 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6843 m_errorMonitor->VerifyFound();
6844
6845 // Create a buffer to update the descriptor with
6846 uint32_t qfi = 0;
6847 VkBufferCreateInfo buffCI = {};
6848 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6849 buffCI.size = 1024;
6850 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6851 buffCI.queueFamilyIndexCount = 1;
6852 buffCI.pQueueFamilyIndices = &qfi;
6853
6854 VkBuffer dyub;
6855 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6856 ASSERT_VK_SUCCESS(err);
6857 VkDescriptorBufferInfo buffInfo = {};
6858 buffInfo.buffer = dyub;
6859 buffInfo.offset = 0;
6860 buffInfo.range = 1024;
6861
6862 descriptor_write.pBufferInfo = &buffInfo;
6863 descriptor_write.descriptorCount = 2;
6864
Mark Mueller5c838ce2016-06-16 09:54:29 -06006865 // 2) The stateFlags don't match between the first and second descriptor
Mark Muellerd4914412016-06-13 17:52:06 -06006866 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, stateFlag_ErrorMessage);
6867 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6868 m_errorMonitor->VerifyFound();
6869
Mark Mueller5c838ce2016-06-16 09:54:29 -06006870 // 3) The second descriptor has a null_ptr pImmutableSamplers and
6871 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06006872 descriptor_write.dstBinding = 1;
6873 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06006874
6875
6876 // Make pImageInfo index non-null to avoid complaints of it missing
6877 VkDescriptorImageInfo imageInfo = {};
6878 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6879 descriptor_write.pImageInfo = &imageInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06006880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, immutable_ErrorMessage);
6881 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6882 m_errorMonitor->VerifyFound();
6883
Mark Muellerd4914412016-06-13 17:52:06 -06006884 vkDestroyBuffer(m_device->device(), dyub, NULL);
6885 vkDestroySampler(m_device->device(), sampler, NULL);
6886 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6887 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6888 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6889}
6890
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06006891TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
6892 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6893 "due to a buffer dependency being destroyed.");
6894 ASSERT_NO_FATAL_FAILURE(InitState());
6895
6896 VkImageObj image(m_device);
6897 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
6898 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
6899 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
6900 VK_IMAGE_TILING_OPTIMAL, 0);
6901 ASSERT_TRUE(image.initialized());
6902
6903 VkBuffer buffer;
6904 VkDeviceMemory mem;
6905 VkMemoryRequirements mem_reqs;
6906
6907 VkBufferCreateInfo buf_info = {};
6908 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6909 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6910 buf_info.size = 256;
6911 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6912 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
6913 ASSERT_VK_SUCCESS(err);
6914
6915 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
6916
6917 VkMemoryAllocateInfo alloc_info = {};
6918 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6919 alloc_info.allocationSize = 256;
6920 bool pass = false;
6921 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
6922 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6923 if (!pass) {
6924 vkDestroyBuffer(m_device->device(), buffer, NULL);
6925 return;
6926 }
6927 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
6928 ASSERT_VK_SUCCESS(err);
6929
6930 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
6931 ASSERT_VK_SUCCESS(err);
6932
6933 VkBufferImageCopy region = {};
6934 region.bufferRowLength = 128;
6935 region.bufferImageHeight = 128;
6936 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6937
6938 region.imageSubresource.layerCount = 1;
6939 region.imageExtent.height = 4;
6940 region.imageExtent.width = 4;
6941 region.imageExtent.depth = 1;
6942 m_commandBuffer->BeginCommandBuffer();
6943 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
6944 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
6945 1, &region);
6946 m_commandBuffer->EndCommandBuffer();
6947
6948 m_errorMonitor->SetDesiredFailureMsg(
6949 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6950 " that is invalid because bound buffer ");
6951 // Destroy buffer dependency prior to submit to cause ERROR
6952 vkDestroyBuffer(m_device->device(), buffer, NULL);
6953
6954 VkSubmitInfo submit_info = {};
6955 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6956 submit_info.commandBufferCount = 1;
6957 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6958 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6959
6960 m_errorMonitor->VerifyFound();
6961 vkFreeMemory(m_device->handle(), mem, NULL);
6962}
6963
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006964TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
6965 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6966 "due to an image dependency being destroyed.");
6967 ASSERT_NO_FATAL_FAILURE(InitState());
6968
6969 VkImage image;
6970 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6971 VkImageCreateInfo image_create_info = {};
6972 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6973 image_create_info.pNext = NULL;
6974 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6975 image_create_info.format = tex_format;
6976 image_create_info.extent.width = 32;
6977 image_create_info.extent.height = 32;
6978 image_create_info.extent.depth = 1;
6979 image_create_info.mipLevels = 1;
6980 image_create_info.arrayLayers = 1;
6981 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6982 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6983 image_create_info.usage =
6984 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6985 image_create_info.flags = 0;
6986 VkResult err =
6987 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6988 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006989 // Have to bind memory to image before recording cmd in cmd buffer using it
6990 VkMemoryRequirements mem_reqs;
6991 VkDeviceMemory image_mem;
6992 bool pass;
6993 VkMemoryAllocateInfo mem_alloc = {};
6994 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6995 mem_alloc.pNext = NULL;
6996 mem_alloc.memoryTypeIndex = 0;
6997 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
6998 mem_alloc.allocationSize = mem_reqs.size;
6999 pass =
7000 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
7001 ASSERT_TRUE(pass);
7002 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
7003 ASSERT_VK_SUCCESS(err);
7004 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
7005 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007006
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007007 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06007008 VkClearColorValue ccv;
7009 ccv.float32[0] = 1.0f;
7010 ccv.float32[1] = 1.0f;
7011 ccv.float32[2] = 1.0f;
7012 ccv.float32[3] = 1.0f;
7013 VkImageSubresourceRange isr = {};
7014 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007015 isr.baseArrayLayer = 0;
7016 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06007017 isr.layerCount = 1;
7018 isr.levelCount = 1;
7019 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
7020 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007021 m_commandBuffer->EndCommandBuffer();
7022
7023 m_errorMonitor->SetDesiredFailureMsg(
7024 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
7025 // Destroy image dependency prior to submit to cause ERROR
7026 vkDestroyImage(m_device->device(), image, NULL);
7027
7028 VkSubmitInfo submit_info = {};
7029 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7030 submit_info.commandBufferCount = 1;
7031 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7032 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7033
7034 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007035 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007036}
7037
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007038TEST_F(VkLayerTest, ImageMemoryNotBound) {
7039 TEST_DESCRIPTION(
7040 "Attempt to draw with an image which has not had memory bound to it.");
7041 ASSERT_NO_FATAL_FAILURE(InitState());
7042
7043 VkImage image;
7044 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7045 VkImageCreateInfo image_create_info = {};
7046 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7047 image_create_info.pNext = NULL;
7048 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7049 image_create_info.format = tex_format;
7050 image_create_info.extent.width = 32;
7051 image_create_info.extent.height = 32;
7052 image_create_info.extent.depth = 1;
7053 image_create_info.mipLevels = 1;
7054 image_create_info.arrayLayers = 1;
7055 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7056 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7057 image_create_info.usage =
7058 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7059 image_create_info.flags = 0;
7060 VkResult err =
7061 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7062 ASSERT_VK_SUCCESS(err);
7063 // Have to bind memory to image before recording cmd in cmd buffer using it
7064 VkMemoryRequirements mem_reqs;
7065 VkDeviceMemory image_mem;
7066 bool pass;
7067 VkMemoryAllocateInfo mem_alloc = {};
7068 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7069 mem_alloc.pNext = NULL;
7070 mem_alloc.memoryTypeIndex = 0;
7071 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
7072 mem_alloc.allocationSize = mem_reqs.size;
7073 pass =
7074 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
7075 ASSERT_TRUE(pass);
7076 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
7077 ASSERT_VK_SUCCESS(err);
7078
7079 // Introduce error, do not call vkBindImageMemory(m_device->device(), image,
7080 // image_mem, 0);
7081 m_errorMonitor->SetDesiredFailureMsg(
7082 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7083 "used without first calling vkBindImageMemory");
7084
7085 m_commandBuffer->BeginCommandBuffer();
7086 VkClearColorValue ccv;
7087 ccv.float32[0] = 1.0f;
7088 ccv.float32[1] = 1.0f;
7089 ccv.float32[2] = 1.0f;
7090 ccv.float32[3] = 1.0f;
7091 VkImageSubresourceRange isr = {};
7092 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7093 isr.baseArrayLayer = 0;
7094 isr.baseMipLevel = 0;
7095 isr.layerCount = 1;
7096 isr.levelCount = 1;
7097 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
7098 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
7099 m_commandBuffer->EndCommandBuffer();
7100
7101 m_errorMonitor->VerifyFound();
7102 vkDestroyImage(m_device->device(), image, NULL);
7103 vkFreeMemory(m_device->device(), image_mem, nullptr);
7104}
7105
7106TEST_F(VkLayerTest, BufferMemoryNotBound) {
7107 TEST_DESCRIPTION(
7108 "Attempt to copy from a buffer which has not had memory bound to it.");
7109 ASSERT_NO_FATAL_FAILURE(InitState());
7110
7111 VkImageObj image(m_device);
7112 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
7113 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
7114 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
7115 VK_IMAGE_TILING_OPTIMAL, 0);
7116 ASSERT_TRUE(image.initialized());
7117
7118 VkBuffer buffer;
7119 VkDeviceMemory mem;
7120 VkMemoryRequirements mem_reqs;
7121
7122 VkBufferCreateInfo buf_info = {};
7123 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7124 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7125 buf_info.size = 256;
7126 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7127 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
7128 ASSERT_VK_SUCCESS(err);
7129
7130 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
7131
7132 VkMemoryAllocateInfo alloc_info = {};
7133 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7134 alloc_info.allocationSize = 256;
7135 bool pass = false;
7136 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
7137 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
7138 if (!pass) {
7139 vkDestroyBuffer(m_device->device(), buffer, NULL);
7140 return;
7141 }
7142 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
7143 ASSERT_VK_SUCCESS(err);
7144
7145 // Introduce failure by not calling vkBindBufferMemory(m_device->device(),
7146 // buffer, mem, 0);
7147 m_errorMonitor->SetDesiredFailureMsg(
7148 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7149 "used without first calling vkBindBufferMemory");
7150 VkBufferImageCopy region = {};
7151 region.bufferRowLength = 128;
7152 region.bufferImageHeight = 128;
7153 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7154
7155 region.imageSubresource.layerCount = 1;
7156 region.imageExtent.height = 4;
7157 region.imageExtent.width = 4;
7158 region.imageExtent.depth = 1;
7159 m_commandBuffer->BeginCommandBuffer();
7160 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
7161 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
7162 1, &region);
7163 m_commandBuffer->EndCommandBuffer();
7164
7165 m_errorMonitor->VerifyFound();
7166
7167 vkDestroyBuffer(m_device->device(), buffer, NULL);
7168 vkFreeMemory(m_device->handle(), mem, NULL);
7169}
7170
Tobin Ehlis85940f52016-07-07 16:57:21 -06007171TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
7172 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7173 "due to an event dependency being destroyed.");
7174 ASSERT_NO_FATAL_FAILURE(InitState());
7175
7176 VkEvent event;
7177 VkEventCreateInfo evci = {};
7178 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
7179 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
7180 ASSERT_VK_SUCCESS(result);
7181
7182 m_commandBuffer->BeginCommandBuffer();
7183 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event,
7184 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
7185 m_commandBuffer->EndCommandBuffer();
7186
7187 m_errorMonitor->SetDesiredFailureMsg(
7188 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
7189 // Destroy event dependency prior to submit to cause ERROR
7190 vkDestroyEvent(m_device->device(), event, NULL);
7191
7192 VkSubmitInfo submit_info = {};
7193 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7194 submit_info.commandBufferCount = 1;
7195 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7196 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7197
7198 m_errorMonitor->VerifyFound();
7199}
7200
Tobin Ehlisdbea7552016-07-08 14:33:31 -06007201TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
7202 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7203 "due to a query pool dependency being destroyed.");
7204 ASSERT_NO_FATAL_FAILURE(InitState());
7205
7206 VkQueryPool query_pool;
7207 VkQueryPoolCreateInfo qpci{};
7208 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
7209 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
7210 qpci.queryCount = 1;
7211 VkResult result =
7212 vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
7213 ASSERT_VK_SUCCESS(result);
7214
7215 m_commandBuffer->BeginCommandBuffer();
7216 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
7217 m_commandBuffer->EndCommandBuffer();
7218
7219 m_errorMonitor->SetDesiredFailureMsg(
7220 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7221 " that is invalid because bound query pool ");
7222 // Destroy query pool dependency prior to submit to cause ERROR
7223 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
7224
7225 VkSubmitInfo submit_info = {};
7226 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7227 submit_info.commandBufferCount = 1;
7228 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7229 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7230
7231 m_errorMonitor->VerifyFound();
7232}
7233
Tobin Ehlis24130d92016-07-08 15:50:53 -06007234TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
7235 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7236 "due to a pipeline dependency being destroyed.");
7237 ASSERT_NO_FATAL_FAILURE(InitState());
7238 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7239
7240 VkResult err;
7241
7242 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7243 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7244
7245 VkPipelineLayout pipeline_layout;
7246 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7247 &pipeline_layout);
7248 ASSERT_VK_SUCCESS(err);
7249
7250 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7251 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7252 vp_state_ci.viewportCount = 1;
7253 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06007254 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06007255 vp_state_ci.scissorCount = 1;
7256 VkRect2D scissors = {}; // Dummy scissors to point to
7257 vp_state_ci.pScissors = &scissors;
7258 // No dynamic state
7259 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
7260 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7261
7262 VkPipelineShaderStageCreateInfo shaderStages[2];
7263 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7264
7265 VkShaderObj vs(m_device, bindStateVertShaderText,
7266 VK_SHADER_STAGE_VERTEX_BIT, this);
7267 VkShaderObj fs(m_device, bindStateFragShaderText,
7268 VK_SHADER_STAGE_FRAGMENT_BIT,
7269 this); // We shouldn't need a fragment shader
7270 // but add it to be able to run on more devices
7271 shaderStages[0] = vs.GetStageCreateInfo();
7272 shaderStages[1] = fs.GetStageCreateInfo();
7273
7274 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7275 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7276
7277 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7278 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7279 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7280
7281 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7282 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7283
7284 VkPipelineColorBlendAttachmentState att = {};
7285 att.blendEnable = VK_FALSE;
7286 att.colorWriteMask = 0xf;
7287
7288 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7289 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7290 cb_ci.attachmentCount = 1;
7291 cb_ci.pAttachments = &att;
7292
7293 VkGraphicsPipelineCreateInfo gp_ci = {};
7294 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7295 gp_ci.stageCount = 2;
7296 gp_ci.pStages = shaderStages;
7297 gp_ci.pVertexInputState = &vi_ci;
7298 gp_ci.pInputAssemblyState = &ia_ci;
7299 gp_ci.pViewportState = &vp_state_ci;
7300 gp_ci.pRasterizationState = &rs_ci;
7301 gp_ci.pColorBlendState = &cb_ci;
7302 gp_ci.pDynamicState = &dyn_state_ci;
7303 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7304 gp_ci.layout = pipeline_layout;
7305 gp_ci.renderPass = renderPass();
7306
7307 VkPipelineCacheCreateInfo pc_ci = {};
7308 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7309
7310 VkPipeline pipeline;
7311 VkPipelineCache pipelineCache;
7312 err =
7313 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
7314 ASSERT_VK_SUCCESS(err);
7315
7316 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7317 &gp_ci, NULL, &pipeline);
7318 ASSERT_VK_SUCCESS(err);
7319
7320 m_commandBuffer->BeginCommandBuffer();
7321 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7322 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
7323 m_commandBuffer->EndCommandBuffer();
7324 // Now destroy pipeline in order to cause error when submitting
7325 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
7326
7327 m_errorMonitor->SetDesiredFailureMsg(
7328 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7329 " that is invalid because bound pipeline ");
7330
7331 VkSubmitInfo submit_info = {};
7332 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7333 submit_info.commandBufferCount = 1;
7334 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7335 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7336
7337 m_errorMonitor->VerifyFound();
7338 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7339 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7340}
7341
Karl Schultz6addd812016-02-02 17:17:23 -07007342TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06007343 // Attempt to bind an invalid Pipeline to a valid Command Buffer
7344 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007345 // Create a valid cmd buffer
7346 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06007347 uint64_t fake_pipeline_handle = 0xbaad6001;
7348 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06007349 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06007350 "Invalid Pipeline Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06007351 ASSERT_NO_FATAL_FAILURE(InitState());
7352 BeginCommandBuffer();
7353 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7354 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
7355 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06007356 // Now issue a draw call with no pipeline bound
7357 m_errorMonitor->SetDesiredFailureMsg(
7358 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7359 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tony Barbourdf4c0042016-06-01 15:55:43 -06007360
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06007361 BeginCommandBuffer();
7362 Draw(1, 0, 0, 0);
7363 m_errorMonitor->VerifyFound();
7364 // Finally same check once more but with Dispatch/Compute
7365 m_errorMonitor->SetDesiredFailureMsg(
7366 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7367 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06007368 BeginCommandBuffer();
7369 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
7370 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007371}
7372
Karl Schultz6addd812016-02-02 17:17:23 -07007373TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
7374 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
7375 // CommandBuffer
7376 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007377
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007378 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007379 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007380
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007381 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06007382 ASSERT_NO_FATAL_FAILURE(InitViewport());
7383 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007384 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007385 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7386 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007387
7388 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007389 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7390 ds_pool_ci.pNext = NULL;
7391 ds_pool_ci.maxSets = 1;
7392 ds_pool_ci.poolSizeCount = 1;
7393 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06007394
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007395 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007396 err =
7397 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007398 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007399
Tony Barboureb254902015-07-15 12:50:33 -06007400 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007401 dsl_binding.binding = 0;
7402 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7403 dsl_binding.descriptorCount = 1;
7404 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7405 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007406
Tony Barboureb254902015-07-15 12:50:33 -06007407 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007408 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7409 ds_layout_ci.pNext = NULL;
7410 ds_layout_ci.bindingCount = 1;
7411 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007412 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007413 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7414 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007415 ASSERT_VK_SUCCESS(err);
7416
7417 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007418 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007419 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007420 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007421 alloc_info.descriptorPool = ds_pool;
7422 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007423 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7424 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007425 ASSERT_VK_SUCCESS(err);
7426
Tony Barboureb254902015-07-15 12:50:33 -06007427 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007428 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7429 pipeline_layout_ci.pNext = NULL;
7430 pipeline_layout_ci.setLayoutCount = 1;
7431 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007432
7433 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007434 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7435 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007436 ASSERT_VK_SUCCESS(err);
7437
Karl Schultz6addd812016-02-02 17:17:23 -07007438 VkShaderObj vs(m_device, bindStateVertShaderText,
7439 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06007440 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07007441 // on more devices
7442 VkShaderObj fs(m_device, bindStateFragShaderText,
7443 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007444
Tony Barbourc95e4ac2015-08-04 17:05:26 -06007445 VkPipelineObj pipe(m_device);
7446 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007447 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06007448 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06007449 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06007450
7451 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007452 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7453 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7454 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7455 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7456 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007457
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007458 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007459
Chia-I Wuf7458c52015-10-26 21:10:41 +08007460 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7461 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7462 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007463}
7464
Karl Schultz6addd812016-02-02 17:17:23 -07007465TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007466 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07007467 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007468
Karl Schultz6addd812016-02-02 17:17:23 -07007469 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007470 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
7471 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007472
7473 ASSERT_NO_FATAL_FAILURE(InitState());
7474 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007475 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7476 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007477
7478 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007479 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7480 ds_pool_ci.pNext = NULL;
7481 ds_pool_ci.maxSets = 1;
7482 ds_pool_ci.poolSizeCount = 1;
7483 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007484
7485 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007486 err =
7487 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007488 ASSERT_VK_SUCCESS(err);
7489
7490 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007491 dsl_binding.binding = 0;
7492 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7493 dsl_binding.descriptorCount = 1;
7494 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7495 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007496
7497 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007498 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7499 ds_layout_ci.pNext = NULL;
7500 ds_layout_ci.bindingCount = 1;
7501 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007502 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007503 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7504 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007505 ASSERT_VK_SUCCESS(err);
7506
7507 VkDescriptorSet descriptorSet;
7508 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007509 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007510 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007511 alloc_info.descriptorPool = ds_pool;
7512 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007513 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7514 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007515 ASSERT_VK_SUCCESS(err);
7516
Karl Schultz6addd812016-02-02 17:17:23 -07007517 VkBufferView view =
7518 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007519 VkWriteDescriptorSet descriptor_write;
7520 memset(&descriptor_write, 0, sizeof(descriptor_write));
7521 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7522 descriptor_write.dstSet = descriptorSet;
7523 descriptor_write.dstBinding = 0;
7524 descriptor_write.descriptorCount = 1;
7525 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7526 descriptor_write.pTexelBufferView = &view;
7527
7528 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7529
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007530 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007531
7532 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7533 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7534}
7535
Mark Youngd339ba32016-05-30 13:28:35 -06007536TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
7537 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has"
7538 " no memory bound to it.");
7539
7540 VkResult err;
7541 m_errorMonitor->SetDesiredFailureMsg(
7542 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -06007543 "used without first calling vkBindBufferMemory");
Mark Youngd339ba32016-05-30 13:28:35 -06007544
7545 ASSERT_NO_FATAL_FAILURE(InitState());
7546
7547 // Create a buffer with no bound memory and then attempt to create
7548 // a buffer view.
7549 VkBufferCreateInfo buff_ci = {};
7550 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7551 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7552 buff_ci.size = 256;
7553 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7554 VkBuffer buffer;
7555 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
7556 ASSERT_VK_SUCCESS(err);
7557
7558 VkBufferViewCreateInfo buff_view_ci = {};
7559 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
7560 buff_view_ci.buffer = buffer;
7561 buff_view_ci.format = VK_FORMAT_R8_UNORM;
7562 buff_view_ci.range = VK_WHOLE_SIZE;
7563 VkBufferView buff_view;
7564 err =
7565 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
7566
7567 m_errorMonitor->VerifyFound();
7568 vkDestroyBuffer(m_device->device(), buffer, NULL);
7569 // If last error is success, it still created the view, so delete it.
7570 if (err == VK_SUCCESS) {
7571 vkDestroyBufferView(m_device->device(), buff_view, NULL);
7572 }
7573}
7574
Karl Schultz6addd812016-02-02 17:17:23 -07007575TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
7576 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
7577 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07007578 // 1. No dynamicOffset supplied
7579 // 2. Too many dynamicOffsets supplied
7580 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07007581 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007582 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007583 " requires 1 dynamicOffsets, but only "
7584 "0 dynamicOffsets are left in "
7585 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007586
7587 ASSERT_NO_FATAL_FAILURE(InitState());
7588 ASSERT_NO_FATAL_FAILURE(InitViewport());
7589 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7590
7591 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007592 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7593 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007594
7595 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007596 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7597 ds_pool_ci.pNext = NULL;
7598 ds_pool_ci.maxSets = 1;
7599 ds_pool_ci.poolSizeCount = 1;
7600 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007601
7602 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007603 err =
7604 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007605 ASSERT_VK_SUCCESS(err);
7606
7607 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007608 dsl_binding.binding = 0;
7609 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7610 dsl_binding.descriptorCount = 1;
7611 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7612 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007613
7614 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007615 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7616 ds_layout_ci.pNext = NULL;
7617 ds_layout_ci.bindingCount = 1;
7618 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007619 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007620 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7621 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007622 ASSERT_VK_SUCCESS(err);
7623
7624 VkDescriptorSet descriptorSet;
7625 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007626 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007627 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007628 alloc_info.descriptorPool = ds_pool;
7629 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007630 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7631 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007632 ASSERT_VK_SUCCESS(err);
7633
7634 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007635 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7636 pipeline_layout_ci.pNext = NULL;
7637 pipeline_layout_ci.setLayoutCount = 1;
7638 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007639
7640 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007641 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7642 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007643 ASSERT_VK_SUCCESS(err);
7644
7645 // Create a buffer to update the descriptor with
7646 uint32_t qfi = 0;
7647 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007648 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7649 buffCI.size = 1024;
7650 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7651 buffCI.queueFamilyIndexCount = 1;
7652 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007653
7654 VkBuffer dyub;
7655 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7656 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007657 // Allocate memory and bind to buffer so we can make it to the appropriate
7658 // error
7659 VkMemoryAllocateInfo mem_alloc = {};
7660 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7661 mem_alloc.pNext = NULL;
7662 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12007663 mem_alloc.memoryTypeIndex = 0;
7664
7665 VkMemoryRequirements memReqs;
7666 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
7667 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
7668 0);
7669 if (!pass) {
7670 vkDestroyBuffer(m_device->device(), dyub, NULL);
7671 return;
7672 }
7673
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007674 VkDeviceMemory mem;
7675 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
7676 ASSERT_VK_SUCCESS(err);
7677 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
7678 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007679 // Correctly update descriptor to avoid "NOT_UPDATED" error
7680 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007681 buffInfo.buffer = dyub;
7682 buffInfo.offset = 0;
7683 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007684
7685 VkWriteDescriptorSet descriptor_write;
7686 memset(&descriptor_write, 0, sizeof(descriptor_write));
7687 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7688 descriptor_write.dstSet = descriptorSet;
7689 descriptor_write.dstBinding = 0;
7690 descriptor_write.descriptorCount = 1;
7691 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7692 descriptor_write.pBufferInfo = &buffInfo;
7693
7694 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7695
7696 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007697 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7698 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7699 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007700 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007701 uint32_t pDynOff[2] = {512, 756};
7702 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07007703 m_errorMonitor->SetDesiredFailureMsg(
7704 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07007705 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07007706 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7707 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7708 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12007709 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007710 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007711 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7712 " dynamic offset 512 combined with "
7713 "offset 0 and range 1024 that "
7714 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07007715 // Create PSO to be used for draw-time errors below
7716 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007717 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007718 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007719 "out gl_PerVertex { \n"
7720 " vec4 gl_Position;\n"
7721 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007722 "void main(){\n"
7723 " gl_Position = vec4(1);\n"
7724 "}\n";
7725 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007726 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007727 "\n"
7728 "layout(location=0) out vec4 x;\n"
7729 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7730 "void main(){\n"
7731 " x = vec4(bar.y);\n"
7732 "}\n";
7733 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7734 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7735 VkPipelineObj pipe(m_device);
7736 pipe.AddShader(&vs);
7737 pipe.AddShader(&fs);
7738 pipe.AddColorAttachment();
7739 pipe.CreateVKPipeline(pipeline_layout, renderPass());
7740
Karl Schultz6addd812016-02-02 17:17:23 -07007741 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7742 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7743 // This update should succeed, but offset size of 512 will overstep buffer
7744 // /w range 1024 & size 1024
7745 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7746 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7747 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07007748 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007749 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007750
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007751 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06007752 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007753
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007754 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007755 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007756 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7757}
7758
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007759TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
7760 TEST_DESCRIPTION("Attempt to update a descriptor with a non-sparse buffer "
7761 "that doesn't have memory bound");
7762 VkResult err;
7763 m_errorMonitor->SetDesiredFailureMsg(
7764 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7765 " used without first calling vkBindBufferMemory.");
7766
7767 ASSERT_NO_FATAL_FAILURE(InitState());
7768 ASSERT_NO_FATAL_FAILURE(InitViewport());
7769 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7770
7771 VkDescriptorPoolSize ds_type_count = {};
7772 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7773 ds_type_count.descriptorCount = 1;
7774
7775 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7776 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7777 ds_pool_ci.pNext = NULL;
7778 ds_pool_ci.maxSets = 1;
7779 ds_pool_ci.poolSizeCount = 1;
7780 ds_pool_ci.pPoolSizes = &ds_type_count;
7781
7782 VkDescriptorPool ds_pool;
7783 err =
7784 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
7785 ASSERT_VK_SUCCESS(err);
7786
7787 VkDescriptorSetLayoutBinding dsl_binding = {};
7788 dsl_binding.binding = 0;
7789 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7790 dsl_binding.descriptorCount = 1;
7791 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7792 dsl_binding.pImmutableSamplers = NULL;
7793
7794 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7795 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7796 ds_layout_ci.pNext = NULL;
7797 ds_layout_ci.bindingCount = 1;
7798 ds_layout_ci.pBindings = &dsl_binding;
7799 VkDescriptorSetLayout ds_layout;
7800 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7801 &ds_layout);
7802 ASSERT_VK_SUCCESS(err);
7803
7804 VkDescriptorSet descriptorSet;
7805 VkDescriptorSetAllocateInfo alloc_info = {};
7806 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7807 alloc_info.descriptorSetCount = 1;
7808 alloc_info.descriptorPool = ds_pool;
7809 alloc_info.pSetLayouts = &ds_layout;
7810 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7811 &descriptorSet);
7812 ASSERT_VK_SUCCESS(err);
7813
7814 // Create a buffer to update the descriptor with
7815 uint32_t qfi = 0;
7816 VkBufferCreateInfo buffCI = {};
7817 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7818 buffCI.size = 1024;
7819 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7820 buffCI.queueFamilyIndexCount = 1;
7821 buffCI.pQueueFamilyIndices = &qfi;
7822
7823 VkBuffer dyub;
7824 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7825 ASSERT_VK_SUCCESS(err);
7826
7827 // Attempt to update descriptor without binding memory to it
7828 VkDescriptorBufferInfo buffInfo = {};
7829 buffInfo.buffer = dyub;
7830 buffInfo.offset = 0;
7831 buffInfo.range = 1024;
7832
7833 VkWriteDescriptorSet descriptor_write;
7834 memset(&descriptor_write, 0, sizeof(descriptor_write));
7835 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7836 descriptor_write.dstSet = descriptorSet;
7837 descriptor_write.dstBinding = 0;
7838 descriptor_write.descriptorCount = 1;
7839 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7840 descriptor_write.pBufferInfo = &buffInfo;
7841
7842 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7843 m_errorMonitor->VerifyFound();
7844
7845 vkDestroyBuffer(m_device->device(), dyub, NULL);
7846 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7847 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7848}
7849
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007850TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007851 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007852 ASSERT_NO_FATAL_FAILURE(InitState());
7853 ASSERT_NO_FATAL_FAILURE(InitViewport());
7854 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7855
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007856 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007857 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007858 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7859 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7860 pipeline_layout_ci.pushConstantRangeCount = 1;
7861 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7862
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007863 //
7864 // Check for invalid push constant ranges in pipeline layouts.
7865 //
7866 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007867 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007868 char const *msg;
7869 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007870
Karl Schultzc81037d2016-05-12 08:11:23 -06007871 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7872 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7873 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7874 "vkCreatePipelineLayout() call has push constants index 0 with "
7875 "size 0."},
7876 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7877 "vkCreatePipelineLayout() call has push constants index 0 with "
7878 "size 1."},
7879 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
7880 "vkCreatePipelineLayout() call has push constants index 0 with "
7881 "size 1."},
7882 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
7883 "vkCreatePipelineLayout() call has push constants index 0 with "
7884 "size 0."},
7885 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7886 "vkCreatePipelineLayout() call has push constants index 0 with "
7887 "offset 1. Offset must"},
7888 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7889 "vkCreatePipelineLayout() call has push constants index 0 "
7890 "with offset "},
7891 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7892 "vkCreatePipelineLayout() call has push constants "
7893 "index 0 with offset "},
7894 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
7895 "vkCreatePipelineLayout() call has push constants index 0 "
7896 "with offset "},
7897 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7898 "vkCreatePipelineLayout() call has push "
7899 "constants index 0 with offset "},
7900 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7901 "vkCreatePipelineLayout() call has push "
7902 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007903 }};
7904
7905 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007906 for (const auto &iter : range_tests) {
7907 pc_range = iter.range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007908 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7909 iter.msg);
7910 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7911 NULL, &pipeline_layout);
7912 m_errorMonitor->VerifyFound();
7913 if (VK_SUCCESS == err) {
7914 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7915 }
7916 }
7917
7918 // Check for invalid stage flag
7919 pc_range.offset = 0;
7920 pc_range.size = 16;
7921 pc_range.stageFlags = 0;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007922 m_errorMonitor->SetDesiredFailureMsg(
7923 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007924 "vkCreatePipelineLayout() call has no stageFlags set.");
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007925 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7926 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007927 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007928 if (VK_SUCCESS == err) {
7929 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7930 }
7931
7932 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06007933 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007934 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007935 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007936 char const *msg;
7937 };
7938
Karl Schultzc81037d2016-05-12 08:11:23 -06007939 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007940 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7941 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7942 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7943 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7944 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7945 "vkCreatePipelineLayout() call has push constants with overlapping "
7946 "ranges: 0:[0, 4), 1:[0, 4)"},
7947 {
7948 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7949 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7950 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7951 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7952 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
7953 "vkCreatePipelineLayout() call has push constants with "
7954 "overlapping "
7955 "ranges: 3:[12, 20), 4:[16, 20)",
7956 },
7957 {
7958 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7959 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7960 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7961 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7962 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7963 "vkCreatePipelineLayout() call has push constants with "
7964 "overlapping "
7965 "ranges: 0:[16, 20), 1:[12, 20)",
7966 },
7967 {
7968 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7969 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7970 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7971 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7972 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7973 "vkCreatePipelineLayout() call has push constants with "
7974 "overlapping "
7975 "ranges: 0:[16, 20), 3:[12, 20)",
7976 },
7977 {
7978 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7979 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
7980 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
7981 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
7982 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
7983 "vkCreatePipelineLayout() call has push constants with "
7984 "overlapping "
7985 "ranges: 0:[16, 20), 2:[4, 100)",
7986 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007987
Karl Schultzc81037d2016-05-12 08:11:23 -06007988 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007989 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007990 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
7991 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007992 iter.msg);
7993 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7994 NULL, &pipeline_layout);
7995 m_errorMonitor->VerifyFound();
7996 if (VK_SUCCESS == err) {
7997 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7998 }
7999 }
8000
8001 // Run some positive tests to make sure overlap checking in the layer is OK
Karl Schultzc81037d2016-05-12 08:11:23 -06008002 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos =
8003 {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8004 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
8005 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
8006 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
8007 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
8008 ""},
8009 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
8010 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
8011 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
8012 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
8013 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
8014 ""}}};
8015 for (const auto &iter : overlapping_range_tests_pos) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008016 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
8017 m_errorMonitor->ExpectSuccess();
8018 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
8019 NULL, &pipeline_layout);
8020 m_errorMonitor->VerifyNotFound();
8021 if (VK_SUCCESS == err) {
8022 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8023 }
8024 }
8025
8026 //
8027 // CmdPushConstants tests
8028 //
Karl Schultzc81037d2016-05-12 08:11:23 -06008029 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008030
8031 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzc81037d2016-05-12 08:11:23 -06008032 const std::array<PipelineLayoutTestCase, 16> cmd_range_tests = {{
8033 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
8034 "vkCmdPushConstants() call has push constants with size 0. Size "
8035 "must be greater than zero and a multiple of 4."},
8036 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
8037 "vkCmdPushConstants() call has push constants with size 1. Size "
8038 "must be greater than zero and a multiple of 4."},
8039 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
8040 "vkCmdPushConstants() call has push constants with size 1. Size "
8041 "must be greater than zero and a multiple of 4."},
8042 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
8043 "vkCmdPushConstants() call has push constants with offset 1. "
8044 "Offset must be a multiple of 4."},
8045 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
8046 "vkCmdPushConstants() call has push constants with offset 1. "
8047 "Offset must be a multiple of 4."},
8048 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
8049 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
8050 "0x1 not within flag-matching ranges in pipeline layout"},
8051 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
8052 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
8053 "0x1 not within flag-matching ranges in pipeline layout"},
8054 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
8055 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
8056 "0x1 not within flag-matching ranges in pipeline layout"},
8057 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
8058 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
8059 "0x1 not within flag-matching ranges in pipeline layout"},
8060 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
8061 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
8062 "any of the ranges in pipeline layout"},
8063 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
8064 0, 16},
8065 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
8066 "any of the ranges in pipeline layout"},
8067 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008068 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06008069 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008070 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06008071 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008072 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06008073 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008074 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06008075 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008076 "vkCmdPushConstants() call has push constants with offset "},
8077 }};
8078
8079 // Two ranges for testing robustness
Karl Schultzc81037d2016-05-12 08:11:23 -06008080 const VkPushConstantRange pc_range2[] = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008081 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06008082 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008083 };
Karl Schultzc81037d2016-05-12 08:11:23 -06008084 pipeline_layout_ci.pushConstantRangeCount =
8085 sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008086 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008087 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8088 &pipeline_layout);
8089 ASSERT_VK_SUCCESS(err);
8090 BeginCommandBuffer();
Karl Schultzc81037d2016-05-12 08:11:23 -06008091 for (const auto &iter : cmd_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8093 iter.msg);
8094 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
Karl Schultzc81037d2016-05-12 08:11:23 -06008095 iter.range.stageFlags, iter.range.offset,
8096 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008097 m_errorMonitor->VerifyFound();
8098 }
8099
8100 // Check for invalid stage flag
8101 m_errorMonitor->SetDesiredFailureMsg(
8102 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8103 "vkCmdPushConstants() call has no stageFlags set.");
8104 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0,
Karl Schultzc81037d2016-05-12 08:11:23 -06008105 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008106 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06008107 EndCommandBuffer();
8108 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
8109 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008110
Karl Schultzc81037d2016-05-12 08:11:23 -06008111 // overlapping range tests with cmd
8112 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
8113 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
8114 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
8115 "0x1 not within flag-matching ranges in pipeline layout"},
8116 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
8117 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
8118 "0x1 not within flag-matching ranges in pipeline layout"},
8119 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
8120 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
8121 "0x1 not within flag-matching ranges in pipeline layout"},
8122 }};
8123 const VkPushConstantRange pc_range3[] = {
8124 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
8125 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
8126 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8127 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
8128 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
8129 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
8130 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
8131 };
8132 pipeline_layout_ci.pushConstantRangeCount =
8133 sizeof(pc_range3) / sizeof(VkPushConstantRange);
8134 pipeline_layout_ci.pPushConstantRanges = pc_range3;
8135 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8136 &pipeline_layout);
8137 ASSERT_VK_SUCCESS(err);
8138 BeginCommandBuffer();
8139 for (const auto &iter : cmd_overlap_tests) {
8140 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8141 iter.msg);
8142 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
8143 iter.range.stageFlags, iter.range.offset,
8144 iter.range.size, dummy_values);
8145 m_errorMonitor->VerifyFound();
8146 }
8147 EndCommandBuffer();
8148 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
8149 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8150
8151 // positive overlapping range tests with cmd
8152 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
8153 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
8154 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
8155 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
8156 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
8157 }};
8158 const VkPushConstantRange pc_range4[] = {
8159 {VK_SHADER_STAGE_VERTEX_BIT, 0, 64},
8160 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
8161 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
8162 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8163 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
8164 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
8165 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
8166 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
8167 };
8168 pipeline_layout_ci.pushConstantRangeCount =
8169 sizeof(pc_range4) / sizeof(VkPushConstantRange);
8170 pipeline_layout_ci.pPushConstantRanges = pc_range4;
8171 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8172 &pipeline_layout);
8173 ASSERT_VK_SUCCESS(err);
8174 BeginCommandBuffer();
8175 for (const auto &iter : cmd_overlap_tests_pos) {
8176 m_errorMonitor->ExpectSuccess();
8177 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
8178 iter.range.stageFlags, iter.range.offset,
8179 iter.range.size, dummy_values);
8180 m_errorMonitor->VerifyNotFound();
8181 }
8182 EndCommandBuffer();
8183 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008184 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8185}
8186
Karl Schultz6addd812016-02-02 17:17:23 -07008187TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07008188 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07008189 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008190
8191 ASSERT_NO_FATAL_FAILURE(InitState());
8192 ASSERT_NO_FATAL_FAILURE(InitViewport());
8193 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8194
Mike Stroyanb8a61002016-06-20 16:00:28 -06008195 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
8196 VkImageTiling tiling;
8197 VkFormatProperties format_properties;
8198 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
8199 if (format_properties.linearTilingFeatures &
8200 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
8201 tiling = VK_IMAGE_TILING_LINEAR;
8202 } else if (format_properties.optimalTilingFeatures &
8203 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
8204 tiling = VK_IMAGE_TILING_OPTIMAL;
8205 } else {
8206 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
8207 "skipped.\n");
8208 return;
8209 }
8210
Tobin Ehlis559c6382015-11-05 09:52:49 -07008211 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
8212 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008213 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8214 ds_type_count[0].descriptorCount = 10;
8215 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8216 ds_type_count[1].descriptorCount = 2;
8217 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
8218 ds_type_count[2].descriptorCount = 2;
8219 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
8220 ds_type_count[3].descriptorCount = 5;
8221 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
8222 // type
8223 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8224 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
8225 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008226
8227 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008228 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8229 ds_pool_ci.pNext = NULL;
8230 ds_pool_ci.maxSets = 5;
8231 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
8232 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008233
8234 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008235 err =
8236 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008237 ASSERT_VK_SUCCESS(err);
8238
8239 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
8240 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008241 dsl_binding[0].binding = 0;
8242 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8243 dsl_binding[0].descriptorCount = 5;
8244 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
8245 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008246
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008247 // Create layout identical to set0 layout but w/ different stageFlags
8248 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008249 dsl_fs_stage_only.binding = 0;
8250 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8251 dsl_fs_stage_only.descriptorCount = 5;
8252 dsl_fs_stage_only.stageFlags =
8253 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
8254 // bind time
8255 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008256 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008257 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8258 ds_layout_ci.pNext = NULL;
8259 ds_layout_ci.bindingCount = 1;
8260 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008261 static const uint32_t NUM_LAYOUTS = 4;
8262 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008263 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008264 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
8265 // layout for error case
8266 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8267 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008268 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008269 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07008270 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8271 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008272 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008273 dsl_binding[0].binding = 0;
8274 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008275 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008276 dsl_binding[1].binding = 1;
8277 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
8278 dsl_binding[1].descriptorCount = 2;
8279 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
8280 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008281 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008282 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07008283 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8284 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008285 ASSERT_VK_SUCCESS(err);
8286 dsl_binding[0].binding = 0;
8287 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008288 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008289 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008290 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8291 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008292 ASSERT_VK_SUCCESS(err);
8293 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008294 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07008295 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8296 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008297 ASSERT_VK_SUCCESS(err);
8298
8299 static const uint32_t NUM_SETS = 4;
8300 VkDescriptorSet descriptorSet[NUM_SETS] = {};
8301 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008302 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008303 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008304 alloc_info.descriptorPool = ds_pool;
8305 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008306 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8307 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008308 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008309 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008310 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008311 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07008312 err =
8313 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008314 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008315
8316 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008317 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8318 pipeline_layout_ci.pNext = NULL;
8319 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
8320 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008321
8322 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008323 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8324 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008325 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008326 // Create pipelineLayout with only one setLayout
8327 pipeline_layout_ci.setLayoutCount = 1;
8328 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008329 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8330 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008331 ASSERT_VK_SUCCESS(err);
8332 // Create pipelineLayout with 2 descriptor setLayout at index 0
8333 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
8334 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07008335 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8336 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008337 ASSERT_VK_SUCCESS(err);
8338 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
8339 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
8340 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07008341 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8342 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008343 ASSERT_VK_SUCCESS(err);
8344 // Create pipelineLayout with UB type, but stageFlags for FS only
8345 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
8346 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07008347 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8348 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008349 ASSERT_VK_SUCCESS(err);
8350 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
8351 VkDescriptorSetLayout pl_bad_s0[2] = {};
8352 pl_bad_s0[0] = ds_layout_fs_only;
8353 pl_bad_s0[1] = ds_layout[1];
8354 pipeline_layout_ci.setLayoutCount = 2;
8355 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
8356 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07008357 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8358 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008359 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008360
8361 // Create a buffer to update the descriptor with
8362 uint32_t qfi = 0;
8363 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008364 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8365 buffCI.size = 1024;
8366 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
8367 buffCI.queueFamilyIndexCount = 1;
8368 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008369
8370 VkBuffer dyub;
8371 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
8372 ASSERT_VK_SUCCESS(err);
8373 // Correctly update descriptor to avoid "NOT_UPDATED" error
8374 static const uint32_t NUM_BUFFS = 5;
8375 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008376 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07008377 buffInfo[i].buffer = dyub;
8378 buffInfo[i].offset = 0;
8379 buffInfo[i].range = 1024;
8380 }
Karl Schultz6addd812016-02-02 17:17:23 -07008381 VkImage image;
Karl Schultz6addd812016-02-02 17:17:23 -07008382 const int32_t tex_width = 32;
8383 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008384 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008385 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8386 image_create_info.pNext = NULL;
8387 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8388 image_create_info.format = tex_format;
8389 image_create_info.extent.width = tex_width;
8390 image_create_info.extent.height = tex_height;
8391 image_create_info.extent.depth = 1;
8392 image_create_info.mipLevels = 1;
8393 image_create_info.arrayLayers = 1;
8394 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyanb8a61002016-06-20 16:00:28 -06008395 image_create_info.tiling = tiling;
8396 image_create_info.usage =
8397 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07008398 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008399 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
8400 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008401
Karl Schultz6addd812016-02-02 17:17:23 -07008402 VkMemoryRequirements memReqs;
8403 VkDeviceMemory imageMem;
8404 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008405 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008406 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8407 memAlloc.pNext = NULL;
8408 memAlloc.allocationSize = 0;
8409 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008410 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
8411 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008412 pass =
8413 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008414 ASSERT_TRUE(pass);
8415 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
8416 ASSERT_VK_SUCCESS(err);
8417 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
8418 ASSERT_VK_SUCCESS(err);
8419
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008420 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008421 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8422 image_view_create_info.image = image;
8423 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8424 image_view_create_info.format = tex_format;
8425 image_view_create_info.subresourceRange.layerCount = 1;
8426 image_view_create_info.subresourceRange.baseMipLevel = 0;
8427 image_view_create_info.subresourceRange.levelCount = 1;
8428 image_view_create_info.subresourceRange.aspectMask =
8429 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008430
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008431 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008432 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8433 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008434 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008435 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008436 imageInfo[0].imageView = view;
8437 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
8438 imageInfo[1].imageView = view;
8439 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008440 imageInfo[2].imageView = view;
8441 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
8442 imageInfo[3].imageView = view;
8443 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008444
8445 static const uint32_t NUM_SET_UPDATES = 3;
8446 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
8447 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8448 descriptor_write[0].dstSet = descriptorSet[0];
8449 descriptor_write[0].dstBinding = 0;
8450 descriptor_write[0].descriptorCount = 5;
8451 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8452 descriptor_write[0].pBufferInfo = buffInfo;
8453 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8454 descriptor_write[1].dstSet = descriptorSet[1];
8455 descriptor_write[1].dstBinding = 0;
8456 descriptor_write[1].descriptorCount = 2;
8457 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8458 descriptor_write[1].pImageInfo = imageInfo;
8459 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8460 descriptor_write[2].dstSet = descriptorSet[1];
8461 descriptor_write[2].dstBinding = 1;
8462 descriptor_write[2].descriptorCount = 2;
8463 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008464 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008465
8466 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008467
Tobin Ehlis88452832015-12-03 09:40:56 -07008468 // Create PSO to be used for draw-time errors below
8469 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12008470 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07008471 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008472 "out gl_PerVertex {\n"
8473 " vec4 gl_Position;\n"
8474 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07008475 "void main(){\n"
8476 " gl_Position = vec4(1);\n"
8477 "}\n";
8478 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12008479 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07008480 "\n"
8481 "layout(location=0) out vec4 x;\n"
8482 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
8483 "void main(){\n"
8484 " x = vec4(bar.y);\n"
8485 "}\n";
8486 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8487 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008488 VkPipelineObj pipe(m_device);
8489 pipe.AddShader(&vs);
8490 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07008491 pipe.AddColorAttachment();
8492 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07008493
8494 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07008495
Karl Schultz6addd812016-02-02 17:17:23 -07008496 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8497 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8498 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
8499 // of PSO
8500 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
8501 // cmd_pipeline.c
8502 // due to the fact that cmd_alloc_dset_data() has not been called in
8503 // cmd_bind_graphics_pipeline()
8504 // TODO : Want to cause various binding incompatibility issues here to test
8505 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07008506 // First cause various verify_layout_compatibility() fails
8507 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008508 // verify_set_layout_compatibility fail cases:
8509 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07008510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06008511 "Invalid Pipeline Layout Object ");
Karl Schultz6addd812016-02-02 17:17:23 -07008512 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8513 VK_PIPELINE_BIND_POINT_GRAPHICS,
8514 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
8515 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008516 m_errorMonitor->VerifyFound();
8517
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008518 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07008519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8520 " attempting to bind set to index 1");
8521 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8522 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
8523 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008524 m_errorMonitor->VerifyFound();
8525
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008526 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008527 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
8528 // descriptors
8529 m_errorMonitor->SetDesiredFailureMsg(
8530 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008531 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07008532 vkCmdBindDescriptorSets(
8533 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8534 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008535 m_errorMonitor->VerifyFound();
8536
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008537 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
8538 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07008539 m_errorMonitor->SetDesiredFailureMsg(
8540 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008541 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07008542 vkCmdBindDescriptorSets(
8543 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8544 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008545 m_errorMonitor->VerifyFound();
8546
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008547 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
8548 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07008549 m_errorMonitor->SetDesiredFailureMsg(
8550 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008551 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07008552 vkCmdBindDescriptorSets(
8553 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8554 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008555 m_errorMonitor->VerifyFound();
8556
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008557 // Cause INFO messages due to disturbing previously bound Sets
8558 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07008559 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8560 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8561 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008562 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07008563 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008564 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008565 " previously bound as set #0 was disturbed ");
8566 vkCmdBindDescriptorSets(
8567 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8568 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008569 m_errorMonitor->VerifyFound();
8570
Karl Schultz6addd812016-02-02 17:17:23 -07008571 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8572 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8573 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008574 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008576 " newly bound as set #0 so set #1 and "
8577 "any subsequent sets were disturbed ");
8578 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8579 VK_PIPELINE_BIND_POINT_GRAPHICS,
8580 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008581 m_errorMonitor->VerifyFound();
8582
Tobin Ehlis10fad692016-07-07 12:00:36 -06008583 // Now that we're done actively using the pipelineLayout that gfx pipeline
8584 // was created with, we should be able to delete it. Do that now to verify
8585 // that validation obeys pipelineLayout lifetime
8586 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
8587
Tobin Ehlis88452832015-12-03 09:40:56 -07008588 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07008589 // 1. Error due to not binding required set (we actually use same code as
8590 // above to disturb set0)
8591 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8592 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8593 2, &descriptorSet[0], 0, NULL);
8594 vkCmdBindDescriptorSets(
8595 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8596 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
8597 m_errorMonitor->SetDesiredFailureMsg(
8598 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8599 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07008600 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008601 m_errorMonitor->VerifyFound();
8602
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008603 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008604 // 2. Error due to bound set not being compatible with PSO's
8605 // VkPipelineLayout (diff stageFlags in this case)
8606 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8607 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8608 2, &descriptorSet[0], 0, NULL);
8609 m_errorMonitor->SetDesiredFailureMsg(
8610 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8611 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07008612 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008613 m_errorMonitor->VerifyFound();
8614
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008615 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07008616 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008617 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
8618 }
8619 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06008620 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
8621 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008622 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008623 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8624 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008625 vkFreeMemory(m_device->device(), imageMem, NULL);
8626 vkDestroyImage(m_device->device(), image, NULL);
8627 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008628}
Tobin Ehlis559c6382015-11-05 09:52:49 -07008629
Karl Schultz6addd812016-02-02 17:17:23 -07008630TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008631
Karl Schultz6addd812016-02-02 17:17:23 -07008632 m_errorMonitor->SetDesiredFailureMsg(
8633 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008634 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008635
8636 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008637 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008638 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008639 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008640
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008641 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008642}
8643
Karl Schultz6addd812016-02-02 17:17:23 -07008644TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
8645 VkResult err;
8646 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008647
Karl Schultz6addd812016-02-02 17:17:23 -07008648 m_errorMonitor->SetDesiredFailureMsg(
8649 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07008650 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008651
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008652 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008653
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008654 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008655 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06008656 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008657 cmd.commandPool = m_commandPool;
8658 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008659 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06008660
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008661 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06008662 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008663
8664 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008665 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008666 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008667 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06008668 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008669 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
8670 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008671 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008672
8673 // The error should be caught by validation of the BeginCommandBuffer call
8674 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
8675
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008676 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008677 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008678}
8679
Karl Schultz6addd812016-02-02 17:17:23 -07008680TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008681 // Cause error due to Begin while recording CB
8682 // Then cause 2 errors for attempting to reset CB w/o having
8683 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
8684 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008685 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008686 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008687
8688 ASSERT_NO_FATAL_FAILURE(InitState());
8689
8690 // Calls AllocateCommandBuffers
8691 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
8692
Karl Schultz6addd812016-02-02 17:17:23 -07008693 // Force the failure by setting the Renderpass and Framebuffer fields with
8694 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008695 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008696 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008697 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8698 cmd_buf_info.pNext = NULL;
8699 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008700 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008701
8702 // Begin CB to transition to recording state
8703 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
8704 // Can't re-begin. This should trigger error
8705 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008706 m_errorMonitor->VerifyFound();
8707
Karl Schultz6addd812016-02-02 17:17:23 -07008708 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8709 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008710 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
8711 // Reset attempt will trigger error due to incorrect CommandPool state
8712 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008713 m_errorMonitor->VerifyFound();
8714
Karl Schultz6addd812016-02-02 17:17:23 -07008715 m_errorMonitor->SetDesiredFailureMsg(
8716 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8717 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008718 // Transition CB to RECORDED state
8719 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
8720 // Now attempting to Begin will implicitly reset, which triggers error
8721 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008722 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008723}
8724
Karl Schultz6addd812016-02-02 17:17:23 -07008725TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008726 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07008727 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008728
Karl Schultz6addd812016-02-02 17:17:23 -07008729 m_errorMonitor->SetDesiredFailureMsg(
8730 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008731 "Invalid Pipeline CreateInfo State: Vtx Shader required");
8732
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008733 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008734 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008735
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008736 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008737 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8738 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06008739
8740 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008741 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8742 ds_pool_ci.pNext = NULL;
8743 ds_pool_ci.maxSets = 1;
8744 ds_pool_ci.poolSizeCount = 1;
8745 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008746
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008747 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008748 err =
8749 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008750 ASSERT_VK_SUCCESS(err);
8751
Tony Barboureb254902015-07-15 12:50:33 -06008752 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008753 dsl_binding.binding = 0;
8754 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8755 dsl_binding.descriptorCount = 1;
8756 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8757 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008758
Tony Barboureb254902015-07-15 12:50:33 -06008759 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008760 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8761 ds_layout_ci.pNext = NULL;
8762 ds_layout_ci.bindingCount = 1;
8763 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06008764
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008765 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008766 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8767 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008768 ASSERT_VK_SUCCESS(err);
8769
8770 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008771 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008772 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008773 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008774 alloc_info.descriptorPool = ds_pool;
8775 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008776 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8777 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008778 ASSERT_VK_SUCCESS(err);
8779
Tony Barboureb254902015-07-15 12:50:33 -06008780 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008781 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8782 pipeline_layout_ci.setLayoutCount = 1;
8783 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008784
8785 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008786 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8787 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008788 ASSERT_VK_SUCCESS(err);
8789
Tobin Ehlise68360f2015-10-01 11:15:13 -06008790 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008791 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06008792
8793 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008794 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8795 vp_state_ci.scissorCount = 1;
8796 vp_state_ci.pScissors = &sc;
8797 vp_state_ci.viewportCount = 1;
8798 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008799
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008800 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8801 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8802 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8803 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8804 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8805 rs_state_ci.depthClampEnable = VK_FALSE;
8806 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8807 rs_state_ci.depthBiasEnable = VK_FALSE;
8808
Tony Barboureb254902015-07-15 12:50:33 -06008809 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008810 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8811 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008812 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008813 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8814 gp_ci.layout = pipeline_layout;
8815 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06008816
8817 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008818 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8819 pc_ci.initialDataSize = 0;
8820 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008821
8822 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06008823 VkPipelineCache pipelineCache;
8824
Karl Schultz6addd812016-02-02 17:17:23 -07008825 err =
8826 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06008827 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008828 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8829 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008830
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008831 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008832
Chia-I Wuf7458c52015-10-26 21:10:41 +08008833 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8834 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8835 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8836 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008837}
Tobin Ehlis912df022015-09-17 08:46:18 -06008838/*// TODO : This test should be good, but needs Tess support in compiler to run
8839TEST_F(VkLayerTest, InvalidPatchControlPoints)
8840{
8841 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06008842 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008843
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008845 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
8846primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008847
Tobin Ehlis912df022015-09-17 08:46:18 -06008848 ASSERT_NO_FATAL_FAILURE(InitState());
8849 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06008850
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008851 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06008852 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008853 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008854
8855 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8856 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8857 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008858 ds_pool_ci.poolSizeCount = 1;
8859 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06008860
8861 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008862 err = vkCreateDescriptorPool(m_device->device(),
8863VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06008864 ASSERT_VK_SUCCESS(err);
8865
8866 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08008867 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06008868 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08008869 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008870 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8871 dsl_binding.pImmutableSamplers = NULL;
8872
8873 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008874 ds_layout_ci.sType =
8875VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008876 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008877 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008878 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06008879
8880 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008881 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8882&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008883 ASSERT_VK_SUCCESS(err);
8884
8885 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07008886 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
8887VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06008888 ASSERT_VK_SUCCESS(err);
8889
8890 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008891 pipeline_layout_ci.sType =
8892VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008893 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008894 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008895 pipeline_layout_ci.pSetLayouts = &ds_layout;
8896
8897 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008898 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8899&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008900 ASSERT_VK_SUCCESS(err);
8901
8902 VkPipelineShaderStageCreateInfo shaderStages[3];
8903 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
8904
Karl Schultz6addd812016-02-02 17:17:23 -07008905 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
8906this);
Tobin Ehlis912df022015-09-17 08:46:18 -06008907 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07008908 VkShaderObj
8909tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
8910this);
8911 VkShaderObj
8912te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
8913this);
Tobin Ehlis912df022015-09-17 08:46:18 -06008914
Karl Schultz6addd812016-02-02 17:17:23 -07008915 shaderStages[0].sType =
8916VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008917 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008918 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07008919 shaderStages[1].sType =
8920VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008921 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008922 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07008923 shaderStages[2].sType =
8924VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008925 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008926 shaderStages[2].shader = te.handle();
8927
8928 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008929 iaCI.sType =
8930VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08008931 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06008932
8933 VkPipelineTessellationStateCreateInfo tsCI = {};
8934 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
8935 tsCI.patchControlPoints = 0; // This will cause an error
8936
8937 VkGraphicsPipelineCreateInfo gp_ci = {};
8938 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8939 gp_ci.pNext = NULL;
8940 gp_ci.stageCount = 3;
8941 gp_ci.pStages = shaderStages;
8942 gp_ci.pVertexInputState = NULL;
8943 gp_ci.pInputAssemblyState = &iaCI;
8944 gp_ci.pTessellationState = &tsCI;
8945 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008946 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06008947 gp_ci.pMultisampleState = NULL;
8948 gp_ci.pDepthStencilState = NULL;
8949 gp_ci.pColorBlendState = NULL;
8950 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8951 gp_ci.layout = pipeline_layout;
8952 gp_ci.renderPass = renderPass();
8953
8954 VkPipelineCacheCreateInfo pc_ci = {};
8955 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8956 pc_ci.pNext = NULL;
8957 pc_ci.initialSize = 0;
8958 pc_ci.initialData = 0;
8959 pc_ci.maxSize = 0;
8960
8961 VkPipeline pipeline;
8962 VkPipelineCache pipelineCache;
8963
Karl Schultz6addd812016-02-02 17:17:23 -07008964 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
8965&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06008966 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008967 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8968&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06008969
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008970 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008971
Chia-I Wuf7458c52015-10-26 21:10:41 +08008972 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8973 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8974 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8975 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06008976}
8977*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06008978// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07008979TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008980 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008981
Karl Schultz6addd812016-02-02 17:17:23 -07008982 m_errorMonitor->SetDesiredFailureMsg(
8983 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008984 "Gfx Pipeline viewport count (1) must match scissor count (0).");
8985
Tobin Ehlise68360f2015-10-01 11:15:13 -06008986 ASSERT_NO_FATAL_FAILURE(InitState());
8987 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008988
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008989 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008990 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8991 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008992
8993 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008994 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8995 ds_pool_ci.maxSets = 1;
8996 ds_pool_ci.poolSizeCount = 1;
8997 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008998
8999 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009000 err =
9001 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009002 ASSERT_VK_SUCCESS(err);
9003
9004 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009005 dsl_binding.binding = 0;
9006 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9007 dsl_binding.descriptorCount = 1;
9008 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009009
9010 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009011 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9012 ds_layout_ci.bindingCount = 1;
9013 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009014
9015 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009016 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9017 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009018 ASSERT_VK_SUCCESS(err);
9019
9020 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009021 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009022 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009023 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009024 alloc_info.descriptorPool = ds_pool;
9025 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009026 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9027 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009028 ASSERT_VK_SUCCESS(err);
9029
9030 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009031 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9032 pipeline_layout_ci.setLayoutCount = 1;
9033 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009034
9035 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009036 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9037 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009038 ASSERT_VK_SUCCESS(err);
9039
9040 VkViewport vp = {}; // Just need dummy vp to point to
9041
9042 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009043 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9044 vp_state_ci.scissorCount = 0;
9045 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
9046 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009047
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009048 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
9049 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9050 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
9051 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
9052 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9053 rs_state_ci.depthClampEnable = VK_FALSE;
9054 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
9055 rs_state_ci.depthBiasEnable = VK_FALSE;
9056
Cody Northropeb3a6c12015-10-05 14:44:45 -06009057 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07009058 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06009059
Karl Schultz6addd812016-02-02 17:17:23 -07009060 VkShaderObj vs(m_device, bindStateVertShaderText,
9061 VK_SHADER_STAGE_VERTEX_BIT, this);
9062 VkShaderObj fs(m_device, bindStateFragShaderText,
9063 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009064 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009065 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08009066 shaderStages[0] = vs.GetStageCreateInfo();
9067 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009068
9069 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009070 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9071 gp_ci.stageCount = 2;
9072 gp_ci.pStages = shaderStages;
9073 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009074 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07009075 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9076 gp_ci.layout = pipeline_layout;
9077 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009078
9079 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009080 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009081
9082 VkPipeline pipeline;
9083 VkPipelineCache pipelineCache;
9084
Karl Schultz6addd812016-02-02 17:17:23 -07009085 err =
9086 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009087 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009088 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9089 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009090
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009091 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009092
Chia-I Wuf7458c52015-10-26 21:10:41 +08009093 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9094 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9095 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9096 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009097}
Karl Schultz6addd812016-02-02 17:17:23 -07009098// Don't set viewport state in PSO. This is an error b/c we always need this
9099// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06009100// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07009101TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06009102 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07009103 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009104
Karl Schultz6addd812016-02-02 17:17:23 -07009105 m_errorMonitor->SetDesiredFailureMsg(
9106 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009107 "Gfx Pipeline pViewportState is null. Even if ");
9108
Tobin Ehlise68360f2015-10-01 11:15:13 -06009109 ASSERT_NO_FATAL_FAILURE(InitState());
9110 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06009111
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009112 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009113 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9114 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009115
9116 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009117 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9118 ds_pool_ci.maxSets = 1;
9119 ds_pool_ci.poolSizeCount = 1;
9120 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009121
9122 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009123 err =
9124 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009125 ASSERT_VK_SUCCESS(err);
9126
9127 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009128 dsl_binding.binding = 0;
9129 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9130 dsl_binding.descriptorCount = 1;
9131 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009132
9133 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009134 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9135 ds_layout_ci.bindingCount = 1;
9136 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009137
9138 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009139 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9140 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009141 ASSERT_VK_SUCCESS(err);
9142
9143 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009144 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009145 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009146 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009147 alloc_info.descriptorPool = ds_pool;
9148 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009149 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9150 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009151 ASSERT_VK_SUCCESS(err);
9152
9153 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009154 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9155 pipeline_layout_ci.setLayoutCount = 1;
9156 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009157
9158 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009159 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9160 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009161 ASSERT_VK_SUCCESS(err);
9162
9163 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
9164 // Set scissor as dynamic to avoid second error
9165 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009166 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9167 dyn_state_ci.dynamicStateCount = 1;
9168 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009169
Cody Northropeb3a6c12015-10-05 14:44:45 -06009170 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07009171 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06009172
Karl Schultz6addd812016-02-02 17:17:23 -07009173 VkShaderObj vs(m_device, bindStateVertShaderText,
9174 VK_SHADER_STAGE_VERTEX_BIT, this);
9175 VkShaderObj fs(m_device, bindStateFragShaderText,
9176 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009177 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009178 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08009179 shaderStages[0] = vs.GetStageCreateInfo();
9180 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009181
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009182
9183 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
9184 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9185 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
9186 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
9187 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9188 rs_state_ci.depthClampEnable = VK_FALSE;
9189 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
9190 rs_state_ci.depthBiasEnable = VK_FALSE;
9191
Tobin Ehlise68360f2015-10-01 11:15:13 -06009192 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009193 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9194 gp_ci.stageCount = 2;
9195 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009196 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07009197 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
9198 // should cause validation error
9199 gp_ci.pDynamicState = &dyn_state_ci;
9200 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9201 gp_ci.layout = pipeline_layout;
9202 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009203
9204 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009205 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009206
9207 VkPipeline pipeline;
9208 VkPipelineCache pipelineCache;
9209
Karl Schultz6addd812016-02-02 17:17:23 -07009210 err =
9211 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009212 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009213 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9214 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009215
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009216 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009217
Chia-I Wuf7458c52015-10-26 21:10:41 +08009218 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9219 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9220 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9221 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009222}
9223// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07009224// Then run second test where dynamic scissor count doesn't match PSO scissor
9225// count
9226TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
9227 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009228
Karl Schultz6addd812016-02-02 17:17:23 -07009229 m_errorMonitor->SetDesiredFailureMsg(
9230 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009231 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
9232
Tobin Ehlise68360f2015-10-01 11:15:13 -06009233 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009234
9235 if (!m_device->phy().features().multiViewport) {
9236 printf("Device does not support multiple viewports/scissors; skipped.\n");
9237 return;
9238 }
9239
Tobin Ehlise68360f2015-10-01 11:15:13 -06009240 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06009241
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009242 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009243 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9244 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009245
9246 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009247 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9248 ds_pool_ci.maxSets = 1;
9249 ds_pool_ci.poolSizeCount = 1;
9250 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009251
9252 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009253 err =
9254 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009255 ASSERT_VK_SUCCESS(err);
9256
9257 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009258 dsl_binding.binding = 0;
9259 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9260 dsl_binding.descriptorCount = 1;
9261 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009262
9263 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009264 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9265 ds_layout_ci.bindingCount = 1;
9266 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009267
9268 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009269 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9270 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009271 ASSERT_VK_SUCCESS(err);
9272
9273 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009274 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009275 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009276 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009277 alloc_info.descriptorPool = ds_pool;
9278 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009279 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9280 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009281 ASSERT_VK_SUCCESS(err);
9282
9283 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009284 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9285 pipeline_layout_ci.setLayoutCount = 1;
9286 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009287
9288 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009289 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9290 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009291 ASSERT_VK_SUCCESS(err);
9292
9293 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009294 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9295 vp_state_ci.viewportCount = 1;
9296 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
9297 vp_state_ci.scissorCount = 1;
9298 vp_state_ci.pScissors =
9299 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06009300
9301 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
9302 // Set scissor as dynamic to avoid that error
9303 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009304 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9305 dyn_state_ci.dynamicStateCount = 1;
9306 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009307
Cody Northropeb3a6c12015-10-05 14:44:45 -06009308 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07009309 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06009310
Karl Schultz6addd812016-02-02 17:17:23 -07009311 VkShaderObj vs(m_device, bindStateVertShaderText,
9312 VK_SHADER_STAGE_VERTEX_BIT, this);
9313 VkShaderObj fs(m_device, bindStateFragShaderText,
9314 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009315 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009316 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08009317 shaderStages[0] = vs.GetStageCreateInfo();
9318 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009319
Cody Northropf6622dc2015-10-06 10:33:21 -06009320 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9321 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9322 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009323 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06009324 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009325 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06009326 vi_ci.pVertexAttributeDescriptions = nullptr;
9327
9328 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9329 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9330 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9331
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009332 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009333 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06009334 rs_ci.pNext = nullptr;
9335
Mark Youngc89c6312016-03-31 16:03:20 -06009336 VkPipelineColorBlendAttachmentState att = {};
9337 att.blendEnable = VK_FALSE;
9338 att.colorWriteMask = 0xf;
9339
Cody Northropf6622dc2015-10-06 10:33:21 -06009340 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9341 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9342 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06009343 cb_ci.attachmentCount = 1;
9344 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06009345
Tobin Ehlise68360f2015-10-01 11:15:13 -06009346 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009347 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9348 gp_ci.stageCount = 2;
9349 gp_ci.pStages = shaderStages;
9350 gp_ci.pVertexInputState = &vi_ci;
9351 gp_ci.pInputAssemblyState = &ia_ci;
9352 gp_ci.pViewportState = &vp_state_ci;
9353 gp_ci.pRasterizationState = &rs_ci;
9354 gp_ci.pColorBlendState = &cb_ci;
9355 gp_ci.pDynamicState = &dyn_state_ci;
9356 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9357 gp_ci.layout = pipeline_layout;
9358 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009359
9360 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009361 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009362
9363 VkPipeline pipeline;
9364 VkPipelineCache pipelineCache;
9365
Karl Schultz6addd812016-02-02 17:17:23 -07009366 err =
9367 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009368 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009369 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9370 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009371
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009372 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009373
Tobin Ehlisd332f282015-10-02 11:00:56 -06009374 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07009375 // First need to successfully create the PSO from above by setting
9376 // pViewports
9377 m_errorMonitor->SetDesiredFailureMsg(
9378 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009379 "Dynamic scissor(s) 0 are used by PSO, ");
Karl Schultz6addd812016-02-02 17:17:23 -07009380
9381 VkViewport vp = {}; // Just need dummy vp to point to
9382 vp_state_ci.pViewports = &vp;
9383 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9384 &gp_ci, NULL, &pipeline);
9385 ASSERT_VK_SUCCESS(err);
9386 BeginCommandBuffer();
9387 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9388 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009389 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07009390 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009391 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07009392 Draw(1, 0, 0, 0);
9393
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009394 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07009395
9396 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9397 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9398 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9399 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009400 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07009401}
9402// Create PSO w/o non-zero scissorCount but no scissor data
9403// Then run second test where dynamic viewportCount doesn't match PSO
9404// viewportCount
9405TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
9406 VkResult err;
9407
9408 m_errorMonitor->SetDesiredFailureMsg(
9409 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9410 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
9411
9412 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009413
9414 if (!m_device->phy().features().multiViewport) {
9415 printf("Device does not support multiple viewports/scissors; skipped.\n");
9416 return;
9417 }
9418
Karl Schultz6addd812016-02-02 17:17:23 -07009419 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9420
9421 VkDescriptorPoolSize ds_type_count = {};
9422 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9423 ds_type_count.descriptorCount = 1;
9424
9425 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9426 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9427 ds_pool_ci.maxSets = 1;
9428 ds_pool_ci.poolSizeCount = 1;
9429 ds_pool_ci.pPoolSizes = &ds_type_count;
9430
9431 VkDescriptorPool ds_pool;
9432 err =
9433 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9434 ASSERT_VK_SUCCESS(err);
9435
9436 VkDescriptorSetLayoutBinding dsl_binding = {};
9437 dsl_binding.binding = 0;
9438 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9439 dsl_binding.descriptorCount = 1;
9440 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9441
9442 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9443 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9444 ds_layout_ci.bindingCount = 1;
9445 ds_layout_ci.pBindings = &dsl_binding;
9446
9447 VkDescriptorSetLayout ds_layout;
9448 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9449 &ds_layout);
9450 ASSERT_VK_SUCCESS(err);
9451
9452 VkDescriptorSet descriptorSet;
9453 VkDescriptorSetAllocateInfo alloc_info = {};
9454 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9455 alloc_info.descriptorSetCount = 1;
9456 alloc_info.descriptorPool = ds_pool;
9457 alloc_info.pSetLayouts = &ds_layout;
9458 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9459 &descriptorSet);
9460 ASSERT_VK_SUCCESS(err);
9461
9462 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9463 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9464 pipeline_layout_ci.setLayoutCount = 1;
9465 pipeline_layout_ci.pSetLayouts = &ds_layout;
9466
9467 VkPipelineLayout pipeline_layout;
9468 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9469 &pipeline_layout);
9470 ASSERT_VK_SUCCESS(err);
9471
9472 VkPipelineViewportStateCreateInfo vp_state_ci = {};
9473 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9474 vp_state_ci.scissorCount = 1;
9475 vp_state_ci.pScissors =
9476 NULL; // Null scissor w/ count of 1 should cause error
9477 vp_state_ci.viewportCount = 1;
9478 vp_state_ci.pViewports =
9479 NULL; // vp is dynamic (below) so this won't cause error
9480
9481 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
9482 // Set scissor as dynamic to avoid that error
9483 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
9484 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9485 dyn_state_ci.dynamicStateCount = 1;
9486 dyn_state_ci.pDynamicStates = &vp_state;
9487
9488 VkPipelineShaderStageCreateInfo shaderStages[2];
9489 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
9490
9491 VkShaderObj vs(m_device, bindStateVertShaderText,
9492 VK_SHADER_STAGE_VERTEX_BIT, this);
9493 VkShaderObj fs(m_device, bindStateFragShaderText,
9494 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009495 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009496 // but add it to be able to run on more devices
9497 shaderStages[0] = vs.GetStageCreateInfo();
9498 shaderStages[1] = fs.GetStageCreateInfo();
9499
9500 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9501 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9502 vi_ci.pNext = nullptr;
9503 vi_ci.vertexBindingDescriptionCount = 0;
9504 vi_ci.pVertexBindingDescriptions = nullptr;
9505 vi_ci.vertexAttributeDescriptionCount = 0;
9506 vi_ci.pVertexAttributeDescriptions = nullptr;
9507
9508 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9509 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9510 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9511
9512 VkPipelineRasterizationStateCreateInfo rs_ci = {};
9513 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9514 rs_ci.pNext = nullptr;
9515
Mark Youngc89c6312016-03-31 16:03:20 -06009516 VkPipelineColorBlendAttachmentState att = {};
9517 att.blendEnable = VK_FALSE;
9518 att.colorWriteMask = 0xf;
9519
Karl Schultz6addd812016-02-02 17:17:23 -07009520 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9521 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9522 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06009523 cb_ci.attachmentCount = 1;
9524 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07009525
9526 VkGraphicsPipelineCreateInfo gp_ci = {};
9527 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9528 gp_ci.stageCount = 2;
9529 gp_ci.pStages = shaderStages;
9530 gp_ci.pVertexInputState = &vi_ci;
9531 gp_ci.pInputAssemblyState = &ia_ci;
9532 gp_ci.pViewportState = &vp_state_ci;
9533 gp_ci.pRasterizationState = &rs_ci;
9534 gp_ci.pColorBlendState = &cb_ci;
9535 gp_ci.pDynamicState = &dyn_state_ci;
9536 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9537 gp_ci.layout = pipeline_layout;
9538 gp_ci.renderPass = renderPass();
9539
9540 VkPipelineCacheCreateInfo pc_ci = {};
9541 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9542
9543 VkPipeline pipeline;
9544 VkPipelineCache pipelineCache;
9545
9546 err =
9547 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9548 ASSERT_VK_SUCCESS(err);
9549 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9550 &gp_ci, NULL, &pipeline);
9551
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009552 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07009553
9554 // Now hit second fail case where we set scissor w/ different count than PSO
9555 // First need to successfully create the PSO from above by setting
9556 // pViewports
9557 m_errorMonitor->SetDesiredFailureMsg(
9558 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009559 "Dynamic viewport(s) 0 are used by PSO, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009560
Tobin Ehlisd332f282015-10-02 11:00:56 -06009561 VkRect2D sc = {}; // Just need dummy vp to point to
9562 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07009563 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9564 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06009565 ASSERT_VK_SUCCESS(err);
9566 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009567 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9568 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009569 VkViewport viewports[1] = {}; // don't care about data
Tobin Ehlisd332f282015-10-02 11:00:56 -06009570 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009571 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06009572 Draw(1, 0, 0, 0);
9573
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009574 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009575
Chia-I Wuf7458c52015-10-26 21:10:41 +08009576 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9577 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9578 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9579 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009580 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009581}
9582
Mark Young7394fdd2016-03-31 14:56:43 -06009583TEST_F(VkLayerTest, PSOLineWidthInvalid) {
9584 VkResult err;
9585
9586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06009587 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06009588
9589 ASSERT_NO_FATAL_FAILURE(InitState());
9590 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9591
9592 VkDescriptorPoolSize ds_type_count = {};
9593 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9594 ds_type_count.descriptorCount = 1;
9595
9596 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9597 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9598 ds_pool_ci.maxSets = 1;
9599 ds_pool_ci.poolSizeCount = 1;
9600 ds_pool_ci.pPoolSizes = &ds_type_count;
9601
9602 VkDescriptorPool ds_pool;
9603 err =
9604 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9605 ASSERT_VK_SUCCESS(err);
9606
9607 VkDescriptorSetLayoutBinding dsl_binding = {};
9608 dsl_binding.binding = 0;
9609 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9610 dsl_binding.descriptorCount = 1;
9611 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9612
9613 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9614 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9615 ds_layout_ci.bindingCount = 1;
9616 ds_layout_ci.pBindings = &dsl_binding;
9617
9618 VkDescriptorSetLayout ds_layout;
9619 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9620 &ds_layout);
9621 ASSERT_VK_SUCCESS(err);
9622
9623 VkDescriptorSet descriptorSet;
9624 VkDescriptorSetAllocateInfo alloc_info = {};
9625 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9626 alloc_info.descriptorSetCount = 1;
9627 alloc_info.descriptorPool = ds_pool;
9628 alloc_info.pSetLayouts = &ds_layout;
9629 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9630 &descriptorSet);
9631 ASSERT_VK_SUCCESS(err);
9632
9633 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9634 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9635 pipeline_layout_ci.setLayoutCount = 1;
9636 pipeline_layout_ci.pSetLayouts = &ds_layout;
9637
9638 VkPipelineLayout pipeline_layout;
9639 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9640 &pipeline_layout);
9641 ASSERT_VK_SUCCESS(err);
9642
9643 VkPipelineViewportStateCreateInfo vp_state_ci = {};
9644 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9645 vp_state_ci.scissorCount = 1;
9646 vp_state_ci.pScissors = NULL;
9647 vp_state_ci.viewportCount = 1;
9648 vp_state_ci.pViewports = NULL;
9649
9650 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
9651 VK_DYNAMIC_STATE_SCISSOR,
9652 VK_DYNAMIC_STATE_LINE_WIDTH};
9653 // Set scissor as dynamic to avoid that error
9654 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
9655 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9656 dyn_state_ci.dynamicStateCount = 2;
9657 dyn_state_ci.pDynamicStates = dynamic_states;
9658
9659 VkPipelineShaderStageCreateInfo shaderStages[2];
9660 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
9661
9662 VkShaderObj vs(m_device, bindStateVertShaderText,
9663 VK_SHADER_STAGE_VERTEX_BIT, this);
9664 VkShaderObj fs(m_device, bindStateFragShaderText,
9665 VK_SHADER_STAGE_FRAGMENT_BIT,
9666 this); // TODO - We shouldn't need a fragment shader
9667 // but add it to be able to run on more devices
9668 shaderStages[0] = vs.GetStageCreateInfo();
9669 shaderStages[1] = fs.GetStageCreateInfo();
9670
9671 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9672 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9673 vi_ci.pNext = nullptr;
9674 vi_ci.vertexBindingDescriptionCount = 0;
9675 vi_ci.pVertexBindingDescriptions = nullptr;
9676 vi_ci.vertexAttributeDescriptionCount = 0;
9677 vi_ci.pVertexAttributeDescriptions = nullptr;
9678
9679 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9680 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9681 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9682
9683 VkPipelineRasterizationStateCreateInfo rs_ci = {};
9684 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9685 rs_ci.pNext = nullptr;
9686
Mark Young47107952016-05-02 15:59:55 -06009687 // Check too low (line width of -1.0f).
9688 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06009689
9690 VkPipelineColorBlendAttachmentState att = {};
9691 att.blendEnable = VK_FALSE;
9692 att.colorWriteMask = 0xf;
9693
9694 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9695 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9696 cb_ci.pNext = nullptr;
9697 cb_ci.attachmentCount = 1;
9698 cb_ci.pAttachments = &att;
9699
9700 VkGraphicsPipelineCreateInfo gp_ci = {};
9701 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9702 gp_ci.stageCount = 2;
9703 gp_ci.pStages = shaderStages;
9704 gp_ci.pVertexInputState = &vi_ci;
9705 gp_ci.pInputAssemblyState = &ia_ci;
9706 gp_ci.pViewportState = &vp_state_ci;
9707 gp_ci.pRasterizationState = &rs_ci;
9708 gp_ci.pColorBlendState = &cb_ci;
9709 gp_ci.pDynamicState = &dyn_state_ci;
9710 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9711 gp_ci.layout = pipeline_layout;
9712 gp_ci.renderPass = renderPass();
9713
9714 VkPipelineCacheCreateInfo pc_ci = {};
9715 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9716
9717 VkPipeline pipeline;
9718 VkPipelineCache pipelineCache;
9719
9720 err =
9721 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9722 ASSERT_VK_SUCCESS(err);
9723 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9724 &gp_ci, NULL, &pipeline);
9725
9726 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009727 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009728
9729 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9730 "Attempt to set lineWidth to 65536");
9731
9732 // Check too high (line width of 65536.0f).
9733 rs_ci.lineWidth = 65536.0f;
9734
9735 err =
9736 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9737 ASSERT_VK_SUCCESS(err);
9738 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9739 &gp_ci, NULL, &pipeline);
9740
9741 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009742 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009743
9744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06009745 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06009746
9747 dyn_state_ci.dynamicStateCount = 3;
9748
9749 rs_ci.lineWidth = 1.0f;
9750
9751 err =
9752 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9753 ASSERT_VK_SUCCESS(err);
9754 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9755 &gp_ci, NULL, &pipeline);
9756 BeginCommandBuffer();
9757 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9758 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
9759
9760 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06009761 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06009762 m_errorMonitor->VerifyFound();
9763
9764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9765 "Attempt to set lineWidth to 65536");
9766
9767 // Check too high with dynamic setting.
9768 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
9769 m_errorMonitor->VerifyFound();
9770 EndCommandBuffer();
9771
9772 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9773 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9774 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9775 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009776 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009777}
9778
Karl Schultz6addd812016-02-02 17:17:23 -07009779TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009780 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009781 m_errorMonitor->SetDesiredFailureMsg(
9782 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009783 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009784
9785 ASSERT_NO_FATAL_FAILURE(InitState());
9786 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009787
Tony Barbourfe3351b2015-07-28 10:17:20 -06009788 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009789 // Don't care about RenderPass handle b/c error should be flagged before
9790 // that
9791 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
9792 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009793
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009794 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009795}
9796
Karl Schultz6addd812016-02-02 17:17:23 -07009797TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009798 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009799 m_errorMonitor->SetDesiredFailureMsg(
9800 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009801 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009802
9803 ASSERT_NO_FATAL_FAILURE(InitState());
9804 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009805
Tony Barbourfe3351b2015-07-28 10:17:20 -06009806 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009807 // Just create a dummy Renderpass that's non-NULL so we can get to the
9808 // proper error
Chris Forbes38ae7c42016-06-21 20:51:44 +12009809 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
Karl Schultz6addd812016-02-02 17:17:23 -07009810 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009811
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009812 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009813}
9814
Chris Forbes2eeabe32016-06-21 20:52:34 +12009815TEST_F(VkLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
9816 m_errorMonitor->ExpectSuccess();
9817
9818 ASSERT_NO_FATAL_FAILURE(InitState());
9819 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9820
9821 BeginCommandBuffer(); // framework implicitly begins the renderpass.
9822 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // end implicit.
9823
9824 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
9825 VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9826 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9827 m_errorMonitor->VerifyNotFound();
9828 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
9829 VK_SUBPASS_CONTENTS_INLINE);
9830 m_errorMonitor->VerifyNotFound();
9831 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9832 m_errorMonitor->VerifyNotFound();
9833
9834 m_commandBuffer->EndCommandBuffer();
9835 m_errorMonitor->VerifyNotFound();
9836}
9837
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009838TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
9839 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
9840 "the number of renderPass attachments that use loadOp"
9841 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
9842
9843 ASSERT_NO_FATAL_FAILURE(InitState());
9844 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9845
9846 // Create a renderPass with a single attachment that uses loadOp CLEAR
9847 VkAttachmentReference attach = {};
9848 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9849 VkSubpassDescription subpass = {};
9850 subpass.inputAttachmentCount = 1;
9851 subpass.pInputAttachments = &attach;
9852 VkRenderPassCreateInfo rpci = {};
9853 rpci.subpassCount = 1;
9854 rpci.pSubpasses = &subpass;
9855 rpci.attachmentCount = 1;
9856 VkAttachmentDescription attach_desc = {};
9857 attach_desc.format = VK_FORMAT_UNDEFINED;
9858 // Set loadOp to CLEAR
9859 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9860 rpci.pAttachments = &attach_desc;
9861 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9862 VkRenderPass rp;
9863 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9864
9865 VkCommandBufferInheritanceInfo hinfo = {};
9866 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9867 hinfo.renderPass = VK_NULL_HANDLE;
9868 hinfo.subpass = 0;
9869 hinfo.framebuffer = VK_NULL_HANDLE;
9870 hinfo.occlusionQueryEnable = VK_FALSE;
9871 hinfo.queryFlags = 0;
9872 hinfo.pipelineStatistics = 0;
9873 VkCommandBufferBeginInfo info = {};
9874 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9875 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9876 info.pInheritanceInfo = &hinfo;
9877
9878 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9879 VkRenderPassBeginInfo rp_begin = {};
9880 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9881 rp_begin.pNext = NULL;
9882 rp_begin.renderPass = renderPass();
9883 rp_begin.framebuffer = framebuffer();
9884 rp_begin.clearValueCount = 0; // Should be 1
9885
9886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7f0416c2016-07-15 16:01:13 -06009887 " has a clearValueCount of 0 but "
9888 "there must be at least 1 entries in "
9889 "pClearValues array to account for ");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009890
9891 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
9892 VK_SUBPASS_CONTENTS_INLINE);
9893
9894 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06009895
9896 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009897}
9898
Cody Northrop3bb4d962016-05-09 16:15:57 -06009899TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
9900
9901 TEST_DESCRIPTION("End a command buffer with an active render pass");
9902
9903 m_errorMonitor->SetDesiredFailureMsg(
9904 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9905 "It is invalid to issue this call inside an active render pass");
9906
9907 ASSERT_NO_FATAL_FAILURE(InitState());
9908 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9909
9910 // The framework's BeginCommandBuffer calls CreateRenderPass
9911 BeginCommandBuffer();
9912
9913 // Call directly into vkEndCommandBuffer instead of the
9914 // the framework's EndCommandBuffer, which inserts a
9915 // vkEndRenderPass
9916 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
9917
9918 m_errorMonitor->VerifyFound();
9919
9920 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
9921 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
9922}
9923
Karl Schultz6addd812016-02-02 17:17:23 -07009924TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009925 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07009926 m_errorMonitor->SetDesiredFailureMsg(
9927 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009928 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009929
9930 ASSERT_NO_FATAL_FAILURE(InitState());
9931 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009932
9933 // Renderpass is started here
9934 BeginCommandBuffer();
9935
9936 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009937 vk_testing::Buffer dstBuffer;
9938 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009939
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009940 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009941
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009942 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009943}
9944
Karl Schultz6addd812016-02-02 17:17:23 -07009945TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009946 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07009947 m_errorMonitor->SetDesiredFailureMsg(
9948 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009949 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009950
9951 ASSERT_NO_FATAL_FAILURE(InitState());
9952 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009953
9954 // Renderpass is started here
9955 BeginCommandBuffer();
9956
9957 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009958 vk_testing::Buffer dstBuffer;
9959 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009960
Karl Schultz6addd812016-02-02 17:17:23 -07009961 VkDeviceSize dstOffset = 0;
9962 VkDeviceSize dataSize = 1024;
Karl Schultzee344492016-07-11 15:09:57 -06009963 const void *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009964
Karl Schultz6addd812016-02-02 17:17:23 -07009965 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
9966 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009967
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009968 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009969}
9970
Karl Schultz6addd812016-02-02 17:17:23 -07009971TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009972 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009973 m_errorMonitor->SetDesiredFailureMsg(
9974 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009975 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009976
9977 ASSERT_NO_FATAL_FAILURE(InitState());
9978 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009979
9980 // Renderpass is started here
9981 BeginCommandBuffer();
9982
Michael Lentine0a369f62016-02-03 16:51:46 -06009983 VkClearColorValue clear_color;
9984 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07009985 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9986 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9987 const int32_t tex_width = 32;
9988 const int32_t tex_height = 32;
9989 VkImageCreateInfo image_create_info = {};
9990 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9991 image_create_info.pNext = NULL;
9992 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9993 image_create_info.format = tex_format;
9994 image_create_info.extent.width = tex_width;
9995 image_create_info.extent.height = tex_height;
9996 image_create_info.extent.depth = 1;
9997 image_create_info.mipLevels = 1;
9998 image_create_info.arrayLayers = 1;
9999 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10000 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
10001 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010002
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010003 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -070010004 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
10005 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010006
Karl Schultz6addd812016-02-02 17:17:23 -070010007 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
10008 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010009
Karl Schultz6addd812016-02-02 17:17:23 -070010010 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
10011 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010012
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010013 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010014}
10015
Karl Schultz6addd812016-02-02 17:17:23 -070010016TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010017 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010018 m_errorMonitor->SetDesiredFailureMsg(
10019 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010020 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010021
10022 ASSERT_NO_FATAL_FAILURE(InitState());
10023 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010024
10025 // Renderpass is started here
10026 BeginCommandBuffer();
10027
10028 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -070010029 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070010030 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
10031 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10032 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
10033 image_create_info.extent.width = 64;
10034 image_create_info.extent.height = 64;
10035 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10036 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010037
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010038 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -070010039 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
10040 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010041
Karl Schultz6addd812016-02-02 17:17:23 -070010042 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
10043 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010044
Karl Schultz6addd812016-02-02 17:17:23 -070010045 vkCmdClearDepthStencilImage(
10046 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
10047 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
10048 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010049
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010050 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010051}
10052
Karl Schultz6addd812016-02-02 17:17:23 -070010053TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060010054 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010055 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010056
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -060010058 "vkCmdClearAttachments(): This call "
Karl Schultz6addd812016-02-02 17:17:23 -070010059 "must be issued inside an active "
10060 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010061
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010062 ASSERT_NO_FATAL_FAILURE(InitState());
10063 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010064
10065 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010066 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010067 ASSERT_VK_SUCCESS(err);
10068
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060010069 VkClearAttachment color_attachment;
10070 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10071 color_attachment.clearValue.color.float32[0] = 0;
10072 color_attachment.clearValue.color.float32[1] = 0;
10073 color_attachment.clearValue.color.float32[2] = 0;
10074 color_attachment.clearValue.color.float32[3] = 0;
10075 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070010076 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
10077 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
10078 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010079
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010080 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010081}
10082
Karl Schultz9e66a292016-04-21 15:57:51 -060010083TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
10084 // Try to add a buffer memory barrier with no buffer.
10085 m_errorMonitor->SetDesiredFailureMsg(
10086 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10087 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
10088
10089 ASSERT_NO_FATAL_FAILURE(InitState());
10090 BeginCommandBuffer();
10091
10092 VkBufferMemoryBarrier buf_barrier = {};
10093 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
10094 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10095 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10096 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10097 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10098 buf_barrier.buffer = VK_NULL_HANDLE;
10099 buf_barrier.offset = 0;
10100 buf_barrier.size = VK_WHOLE_SIZE;
10101 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10102 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
10103 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
10104
10105 m_errorMonitor->VerifyFound();
10106}
10107
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010108TEST_F(VkLayerTest, InvalidBarriers) {
10109 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
10110
10111 m_errorMonitor->SetDesiredFailureMsg(
10112 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
10113
10114 ASSERT_NO_FATAL_FAILURE(InitState());
10115 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10116
10117 VkMemoryBarrier mem_barrier = {};
10118 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
10119 mem_barrier.pNext = NULL;
10120 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10121 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10122 BeginCommandBuffer();
10123 // BeginCommandBuffer() starts a render pass
10124 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10125 VK_PIPELINE_STAGE_HOST_BIT,
10126 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
10127 &mem_barrier, 0, nullptr, 0, nullptr);
10128 m_errorMonitor->VerifyFound();
10129
10130 m_errorMonitor->SetDesiredFailureMsg(
10131 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10132 "Image Layout cannot be transitioned to UNDEFINED");
10133 VkImageObj image(m_device);
10134 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
10135 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10136 ASSERT_TRUE(image.initialized());
10137 VkImageMemoryBarrier img_barrier = {};
10138 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
10139 img_barrier.pNext = NULL;
10140 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10141 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10142 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10143 // New layout can't be UNDEFINED
10144 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
10145 img_barrier.image = image.handle();
10146 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10147 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10148 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10149 img_barrier.subresourceRange.baseArrayLayer = 0;
10150 img_barrier.subresourceRange.baseMipLevel = 0;
10151 img_barrier.subresourceRange.layerCount = 1;
10152 img_barrier.subresourceRange.levelCount = 1;
10153 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10154 VK_PIPELINE_STAGE_HOST_BIT,
10155 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10156 nullptr, 1, &img_barrier);
10157 m_errorMonitor->VerifyFound();
10158 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10159
10160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10161 "Subresource must have the sum of the "
10162 "baseArrayLayer");
10163 // baseArrayLayer + layerCount must be <= image's arrayLayers
10164 img_barrier.subresourceRange.baseArrayLayer = 1;
10165 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10166 VK_PIPELINE_STAGE_HOST_BIT,
10167 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10168 nullptr, 1, &img_barrier);
10169 m_errorMonitor->VerifyFound();
10170 img_barrier.subresourceRange.baseArrayLayer = 0;
10171
10172 m_errorMonitor->SetDesiredFailureMsg(
10173 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10174 "Subresource must have the sum of the baseMipLevel");
10175 // baseMipLevel + levelCount must be <= image's mipLevels
10176 img_barrier.subresourceRange.baseMipLevel = 1;
10177 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10178 VK_PIPELINE_STAGE_HOST_BIT,
10179 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10180 nullptr, 1, &img_barrier);
10181 m_errorMonitor->VerifyFound();
10182 img_barrier.subresourceRange.baseMipLevel = 0;
10183
10184 m_errorMonitor->SetDesiredFailureMsg(
10185 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10186 "Buffer Barriers cannot be used during a render pass");
10187 vk_testing::Buffer buffer;
10188 buffer.init(*m_device, 256);
10189 VkBufferMemoryBarrier buf_barrier = {};
10190 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
10191 buf_barrier.pNext = NULL;
10192 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10193 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10194 buf_barrier.buffer = buffer.handle();
10195 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10196 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10197 buf_barrier.offset = 0;
10198 buf_barrier.size = VK_WHOLE_SIZE;
10199 // Can't send buffer barrier during a render pass
10200 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10201 VK_PIPELINE_STAGE_HOST_BIT,
10202 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
10203 &buf_barrier, 0, nullptr);
10204 m_errorMonitor->VerifyFound();
10205 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
10206
10207 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10208 "which is not less than total size");
10209 buf_barrier.offset = 257;
10210 // Offset greater than total size
10211 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10212 VK_PIPELINE_STAGE_HOST_BIT,
10213 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
10214 &buf_barrier, 0, nullptr);
10215 m_errorMonitor->VerifyFound();
10216 buf_barrier.offset = 0;
10217
10218 m_errorMonitor->SetDesiredFailureMsg(
10219 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
10220 buf_barrier.size = 257;
10221 // Size greater than total size
10222 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10223 VK_PIPELINE_STAGE_HOST_BIT,
10224 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
10225 &buf_barrier, 0, nullptr);
10226 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010227
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010228 // Now exercise barrier aspect bit errors, first DS
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010229 m_errorMonitor->SetDesiredFailureMsg(
10230 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10231 "Image is a depth and stencil format and thus must "
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010232 "have either one or both of VK_IMAGE_ASPECT_DEPTH_BIT and "
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010233 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
10234 VkDepthStencilObj ds_image(m_device);
10235 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
10236 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -060010237 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
10238 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010239 img_barrier.image = ds_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060010240 // Use of COLOR aspect on DS image is error
10241 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010242 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10243 VK_PIPELINE_STAGE_HOST_BIT,
10244 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10245 nullptr, 1, &img_barrier);
10246 m_errorMonitor->VerifyFound();
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010247 // Now test depth-only
10248 VkFormatProperties format_props;
10249
10250 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(),
10251 VK_FORMAT_D16_UNORM, &format_props);
10252 if (format_props.optimalTilingFeatures &
10253 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
10254 m_errorMonitor->SetDesiredFailureMsg(
10255 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10256 "Image is a depth-only format and thus must "
10257 "have VK_IMAGE_ASPECT_DEPTH_BIT set.");
10258 VkDepthStencilObj d_image(m_device);
10259 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
10260 ASSERT_TRUE(d_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -060010261 img_barrier.oldLayout =
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010262 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -060010263 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010264 img_barrier.image = d_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060010265 // Use of COLOR aspect on depth image is error
10266 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010267 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10268 VK_PIPELINE_STAGE_HOST_BIT,
10269 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
10270 0, nullptr, 1, &img_barrier);
10271 m_errorMonitor->VerifyFound();
10272 }
10273 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(),
10274 VK_FORMAT_S8_UINT, &format_props);
10275 if (format_props.optimalTilingFeatures &
10276 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
10277 // Now test stencil-only
10278 m_errorMonitor->SetDesiredFailureMsg(
10279 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10280 "Image is a stencil-only format and thus must "
10281 "have VK_IMAGE_ASPECT_STENCIL_BIT set.");
10282 VkDepthStencilObj s_image(m_device);
10283 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
10284 ASSERT_TRUE(s_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -060010285 img_barrier.oldLayout =
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010286 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -060010287 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010288 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060010289 // Use of COLOR aspect on depth image is error
10290 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010291 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10292 VK_PIPELINE_STAGE_HOST_BIT,
10293 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
10294 0, nullptr, 1, &img_barrier);
10295 m_errorMonitor->VerifyFound();
10296 }
10297 // Finally test color
10298 m_errorMonitor->SetDesiredFailureMsg(
10299 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image is a color format and thus must "
10300 "have VK_IMAGE_ASPECT_COLOR_BIT set.");
10301 VkImageObj c_image(m_device);
10302 c_image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
10303 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10304 0);
10305 ASSERT_TRUE(c_image.initialized());
10306 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10307 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
10308 img_barrier.image = c_image.handle();
10309 // Set aspect to depth (non-color)
10310 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
10311 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10312 VK_PIPELINE_STAGE_HOST_BIT,
10313 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10314 nullptr, 1, &img_barrier);
10315 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010316}
10317
Karl Schultz6addd812016-02-02 17:17:23 -070010318TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010319 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010320 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010321
Karl Schultz6addd812016-02-02 17:17:23 -070010322 m_errorMonitor->SetDesiredFailureMsg(
10323 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010324 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
10325
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010326 ASSERT_NO_FATAL_FAILURE(InitState());
10327 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010328 uint32_t qfi = 0;
10329 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010330 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10331 buffCI.size = 1024;
10332 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
10333 buffCI.queueFamilyIndexCount = 1;
10334 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010335
10336 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010337 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010338 ASSERT_VK_SUCCESS(err);
10339
10340 BeginCommandBuffer();
10341 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -070010342 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10343 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010344 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -070010345 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
10346 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010347
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010348 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010349
Chia-I Wuf7458c52015-10-26 21:10:41 +080010350 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010351}
10352
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010353TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
10354 // Create an out-of-range queueFamilyIndex
10355 m_errorMonitor->SetDesiredFailureMsg(
10356 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -060010357 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
10358 "of the indices specified when the device was created, via the "
10359 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010360
10361 ASSERT_NO_FATAL_FAILURE(InitState());
10362 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10363 VkBufferCreateInfo buffCI = {};
10364 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10365 buffCI.size = 1024;
10366 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
10367 buffCI.queueFamilyIndexCount = 1;
10368 // Introduce failure by specifying invalid queue_family_index
10369 uint32_t qfi = 777;
10370 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -060010371 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010372
10373 VkBuffer ib;
10374 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
10375
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010376 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060010377 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010378}
10379
Karl Schultz6addd812016-02-02 17:17:23 -070010380TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Tobin Ehlis0c94db02016-07-19 10:49:32 -060010381 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands w/ a primary cmd buffer"
10382 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010383
Karl Schultz6addd812016-02-02 17:17:23 -070010384 m_errorMonitor->SetDesiredFailureMsg(
10385 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010386 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010387
10388 ASSERT_NO_FATAL_FAILURE(InitState());
10389 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010390
10391 BeginCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -060010392
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010393 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
10394 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010395
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010396 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010397}
10398
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010399TEST_F(VkLayerTest, DSUsageBitsErrors) {
10400 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
10401 "that do not have correct usage bits sets.");
10402 VkResult err;
10403
10404 ASSERT_NO_FATAL_FAILURE(InitState());
10405 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10406 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10407 ds_type_count[i].type = VkDescriptorType(i);
10408 ds_type_count[i].descriptorCount = 1;
10409 }
10410 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10411 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10412 ds_pool_ci.pNext = NULL;
10413 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10414 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10415 ds_pool_ci.pPoolSizes = ds_type_count;
10416
10417 VkDescriptorPool ds_pool;
10418 err =
10419 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10420 ASSERT_VK_SUCCESS(err);
10421
10422 // Create 10 layouts where each has a single descriptor of different type
10423 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] =
10424 {};
10425 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10426 dsl_binding[i].binding = 0;
10427 dsl_binding[i].descriptorType = VkDescriptorType(i);
10428 dsl_binding[i].descriptorCount = 1;
10429 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
10430 dsl_binding[i].pImmutableSamplers = NULL;
10431 }
10432
10433 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10434 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10435 ds_layout_ci.pNext = NULL;
10436 ds_layout_ci.bindingCount = 1;
10437 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
10438 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10439 ds_layout_ci.pBindings = dsl_binding + i;
10440 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
10441 NULL, ds_layouts + i);
10442 ASSERT_VK_SUCCESS(err);
10443 }
10444 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10445 VkDescriptorSetAllocateInfo alloc_info = {};
10446 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10447 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10448 alloc_info.descriptorPool = ds_pool;
10449 alloc_info.pSetLayouts = ds_layouts;
10450 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10451 descriptor_sets);
10452 ASSERT_VK_SUCCESS(err);
10453
10454 // Create a buffer & bufferView to be used for invalid updates
10455 VkBufferCreateInfo buff_ci = {};
10456 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10457 // This usage is not valid for any descriptor type
10458 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
10459 buff_ci.size = 256;
10460 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10461 VkBuffer buffer;
10462 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10463 ASSERT_VK_SUCCESS(err);
10464
10465 VkBufferViewCreateInfo buff_view_ci = {};
10466 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
10467 buff_view_ci.buffer = buffer;
10468 buff_view_ci.format = VK_FORMAT_R8_UNORM;
10469 buff_view_ci.range = VK_WHOLE_SIZE;
10470 VkBufferView buff_view;
10471 err =
10472 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
10473 ASSERT_VK_SUCCESS(err);
10474
10475 // Create an image to be used for invalid updates
10476 VkImageCreateInfo image_ci = {};
10477 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10478 image_ci.imageType = VK_IMAGE_TYPE_2D;
10479 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
10480 image_ci.extent.width = 64;
10481 image_ci.extent.height = 64;
10482 image_ci.extent.depth = 1;
10483 image_ci.mipLevels = 1;
10484 image_ci.arrayLayers = 1;
10485 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
10486 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10487 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10488 // This usage is not valid for any descriptor type
10489 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
10490 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10491 VkImage image;
10492 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10493 ASSERT_VK_SUCCESS(err);
10494 // Bind memory to image
10495 VkMemoryRequirements mem_reqs;
10496 VkDeviceMemory image_mem;
10497 bool pass;
10498 VkMemoryAllocateInfo mem_alloc = {};
10499 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10500 mem_alloc.pNext = NULL;
10501 mem_alloc.allocationSize = 0;
10502 mem_alloc.memoryTypeIndex = 0;
10503 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10504 mem_alloc.allocationSize = mem_reqs.size;
10505 pass =
10506 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10507 ASSERT_TRUE(pass);
10508 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10509 ASSERT_VK_SUCCESS(err);
10510 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10511 ASSERT_VK_SUCCESS(err);
10512 // Now create view for image
10513 VkImageViewCreateInfo image_view_ci = {};
10514 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10515 image_view_ci.image = image;
10516 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
10517 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10518 image_view_ci.subresourceRange.layerCount = 1;
10519 image_view_ci.subresourceRange.baseArrayLayer = 0;
10520 image_view_ci.subresourceRange.levelCount = 1;
10521 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10522 VkImageView image_view;
10523 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
10524 &image_view);
10525 ASSERT_VK_SUCCESS(err);
10526
10527 VkDescriptorBufferInfo buff_info = {};
10528 buff_info.buffer = buffer;
10529 VkDescriptorImageInfo img_info = {};
10530 img_info.imageView = image_view;
10531 VkWriteDescriptorSet descriptor_write = {};
10532 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10533 descriptor_write.dstBinding = 0;
10534 descriptor_write.descriptorCount = 1;
10535 descriptor_write.pTexelBufferView = &buff_view;
10536 descriptor_write.pBufferInfo = &buff_info;
10537 descriptor_write.pImageInfo = &img_info;
10538
10539 // These error messages align with VkDescriptorType struct
10540 const char *error_msgs[] = {
10541 "", // placeholder, no error for SAMPLER descriptor
10542 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
10543 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
10544 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
10545 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
10546 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
10547 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
10548 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
10549 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
10550 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
10551 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
10552 // Start loop at 1 as SAMPLER desc type has no usage bit error
10553 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10554 descriptor_write.descriptorType = VkDescriptorType(i);
10555 descriptor_write.dstSet = descriptor_sets[i];
10556 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10557 error_msgs[i]);
10558
10559 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
10560 NULL);
10561
10562 m_errorMonitor->VerifyFound();
10563 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
10564 }
10565 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
10566 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060010567 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010568 vkDestroyImageView(m_device->device(), image_view, NULL);
10569 vkDestroyBuffer(m_device->device(), buffer, NULL);
10570 vkDestroyBufferView(m_device->device(), buff_view, NULL);
10571 vkFreeDescriptorSets(m_device->device(), ds_pool,
10572 VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
10573 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10574}
10575
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010576TEST_F(VkLayerTest, DSBufferInfoErrors) {
10577 TEST_DESCRIPTION(
10578 "Attempt to update buffer descriptor set that has incorrect "
10579 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
10580 "1. offset value greater than buffer size\n"
10581 "2. range value of 0\n"
10582 "3. range value greater than buffer (size - offset)");
10583 VkResult err;
10584
10585 ASSERT_NO_FATAL_FAILURE(InitState());
10586 VkDescriptorPoolSize ds_type_count = {};
10587 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10588 ds_type_count.descriptorCount = 1;
10589
10590 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10591 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10592 ds_pool_ci.pNext = NULL;
10593 ds_pool_ci.maxSets = 1;
10594 ds_pool_ci.poolSizeCount = 1;
10595 ds_pool_ci.pPoolSizes = &ds_type_count;
10596
10597 VkDescriptorPool ds_pool;
10598 err =
10599 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10600 ASSERT_VK_SUCCESS(err);
10601
10602 // Create layout with single uniform buffer descriptor
10603 VkDescriptorSetLayoutBinding dsl_binding = {};
10604 dsl_binding.binding = 0;
10605 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10606 dsl_binding.descriptorCount = 1;
10607 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10608 dsl_binding.pImmutableSamplers = NULL;
10609
10610 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10611 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10612 ds_layout_ci.pNext = NULL;
10613 ds_layout_ci.bindingCount = 1;
10614 ds_layout_ci.pBindings = &dsl_binding;
10615 VkDescriptorSetLayout ds_layout;
10616 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10617 &ds_layout);
10618 ASSERT_VK_SUCCESS(err);
10619
10620 VkDescriptorSet descriptor_set = {};
10621 VkDescriptorSetAllocateInfo alloc_info = {};
10622 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10623 alloc_info.descriptorSetCount = 1;
10624 alloc_info.descriptorPool = ds_pool;
10625 alloc_info.pSetLayouts = &ds_layout;
10626 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10627 &descriptor_set);
10628 ASSERT_VK_SUCCESS(err);
10629
10630 // Create a buffer to be used for invalid updates
10631 VkBufferCreateInfo buff_ci = {};
10632 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10633 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10634 buff_ci.size = 256;
10635 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10636 VkBuffer buffer;
10637 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10638 ASSERT_VK_SUCCESS(err);
10639 // Have to bind memory to buffer before descriptor update
10640 VkMemoryAllocateInfo mem_alloc = {};
10641 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10642 mem_alloc.pNext = NULL;
10643 mem_alloc.allocationSize = 256;
10644 mem_alloc.memoryTypeIndex = 0;
10645
10646 VkMemoryRequirements mem_reqs;
10647 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
10648 bool pass =
10649 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10650 if (!pass) {
10651 vkDestroyBuffer(m_device->device(), buffer, NULL);
10652 return;
10653 }
10654
10655 VkDeviceMemory mem;
10656 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
10657 ASSERT_VK_SUCCESS(err);
10658 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10659 ASSERT_VK_SUCCESS(err);
10660
10661 VkDescriptorBufferInfo buff_info = {};
10662 buff_info.buffer = buffer;
10663 // First make offset 1 larger than buffer size
10664 buff_info.offset = 257;
10665 buff_info.range = VK_WHOLE_SIZE;
10666 VkWriteDescriptorSet descriptor_write = {};
10667 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10668 descriptor_write.dstBinding = 0;
10669 descriptor_write.descriptorCount = 1;
10670 descriptor_write.pTexelBufferView = nullptr;
10671 descriptor_write.pBufferInfo = &buff_info;
10672 descriptor_write.pImageInfo = nullptr;
10673
10674 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10675 descriptor_write.dstSet = descriptor_set;
10676 m_errorMonitor->SetDesiredFailureMsg(
10677 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10678 " offset of 257 is greater than buffer ");
10679
10680 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10681
10682 m_errorMonitor->VerifyFound();
10683 // Now cause error due to range of 0
10684 buff_info.offset = 0;
10685 buff_info.range = 0;
10686 m_errorMonitor->SetDesiredFailureMsg(
10687 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10688 " range is not VK_WHOLE_SIZE and is zero, which is not allowed.");
10689
10690 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10691
10692 m_errorMonitor->VerifyFound();
10693 // Now cause error due to range exceeding buffer size - offset
10694 buff_info.offset = 128;
10695 buff_info.range = 200;
10696 m_errorMonitor->SetDesiredFailureMsg(
10697 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10698 " range is 200 which is greater than buffer size ");
10699
10700 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10701
10702 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010703 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010704 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10705 vkDestroyBuffer(m_device->device(), buffer, NULL);
10706 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10707 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10708}
10709
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010710TEST_F(VkLayerTest, DSAspectBitsErrors) {
10711 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10712 // are set, but could expand this test to hit more cases.
10713 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
10714 "that do not have correct aspect bits sets.");
10715 VkResult err;
10716
10717 ASSERT_NO_FATAL_FAILURE(InitState());
10718 VkDescriptorPoolSize ds_type_count = {};
10719 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10720 ds_type_count.descriptorCount = 1;
10721
10722 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10723 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10724 ds_pool_ci.pNext = NULL;
10725 ds_pool_ci.maxSets = 5;
10726 ds_pool_ci.poolSizeCount = 1;
10727 ds_pool_ci.pPoolSizes = &ds_type_count;
10728
10729 VkDescriptorPool ds_pool;
10730 err =
10731 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10732 ASSERT_VK_SUCCESS(err);
10733
10734 VkDescriptorSetLayoutBinding dsl_binding = {};
10735 dsl_binding.binding = 0;
10736 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10737 dsl_binding.descriptorCount = 1;
10738 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10739 dsl_binding.pImmutableSamplers = NULL;
10740
10741 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10742 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10743 ds_layout_ci.pNext = NULL;
10744 ds_layout_ci.bindingCount = 1;
10745 ds_layout_ci.pBindings = &dsl_binding;
10746 VkDescriptorSetLayout ds_layout;
10747 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10748 &ds_layout);
10749 ASSERT_VK_SUCCESS(err);
10750
10751 VkDescriptorSet descriptor_set = {};
10752 VkDescriptorSetAllocateInfo alloc_info = {};
10753 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10754 alloc_info.descriptorSetCount = 1;
10755 alloc_info.descriptorPool = ds_pool;
10756 alloc_info.pSetLayouts = &ds_layout;
10757 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10758 &descriptor_set);
10759 ASSERT_VK_SUCCESS(err);
10760
10761 // Create an image to be used for invalid updates
10762 VkImageCreateInfo image_ci = {};
10763 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10764 image_ci.imageType = VK_IMAGE_TYPE_2D;
10765 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10766 image_ci.extent.width = 64;
10767 image_ci.extent.height = 64;
10768 image_ci.extent.depth = 1;
10769 image_ci.mipLevels = 1;
10770 image_ci.arrayLayers = 1;
10771 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
10772 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10773 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10774 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10775 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10776 VkImage image;
10777 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10778 ASSERT_VK_SUCCESS(err);
10779 // Bind memory to image
10780 VkMemoryRequirements mem_reqs;
10781 VkDeviceMemory image_mem;
10782 bool pass;
10783 VkMemoryAllocateInfo mem_alloc = {};
10784 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10785 mem_alloc.pNext = NULL;
10786 mem_alloc.allocationSize = 0;
10787 mem_alloc.memoryTypeIndex = 0;
10788 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10789 mem_alloc.allocationSize = mem_reqs.size;
10790 pass =
10791 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10792 ASSERT_TRUE(pass);
10793 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10794 ASSERT_VK_SUCCESS(err);
10795 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10796 ASSERT_VK_SUCCESS(err);
10797 // Now create view for image
10798 VkImageViewCreateInfo image_view_ci = {};
10799 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10800 image_view_ci.image = image;
10801 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10802 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10803 image_view_ci.subresourceRange.layerCount = 1;
10804 image_view_ci.subresourceRange.baseArrayLayer = 0;
10805 image_view_ci.subresourceRange.levelCount = 1;
10806 // Setting both depth & stencil aspect bits is illegal for descriptor
10807 image_view_ci.subresourceRange.aspectMask =
10808 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
10809
10810 VkImageView image_view;
10811 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
10812 &image_view);
10813 ASSERT_VK_SUCCESS(err);
10814
10815 VkDescriptorImageInfo img_info = {};
10816 img_info.imageView = image_view;
10817 VkWriteDescriptorSet descriptor_write = {};
10818 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10819 descriptor_write.dstBinding = 0;
10820 descriptor_write.descriptorCount = 1;
10821 descriptor_write.pTexelBufferView = NULL;
10822 descriptor_write.pBufferInfo = NULL;
10823 descriptor_write.pImageInfo = &img_info;
10824 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10825 descriptor_write.dstSet = descriptor_set;
10826 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10827 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
10828 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10829 error_msg);
10830
10831 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10832
10833 m_errorMonitor->VerifyFound();
10834 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10835 vkDestroyImage(m_device->device(), image, NULL);
10836 vkFreeMemory(m_device->device(), image_mem, NULL);
10837 vkDestroyImageView(m_device->device(), image_view, NULL);
10838 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10839 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10840}
10841
Karl Schultz6addd812016-02-02 17:17:23 -070010842TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010843 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010844 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010845
Karl Schultz6addd812016-02-02 17:17:23 -070010846 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010847 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10848 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10849 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010850
Tobin Ehlis3b780662015-05-28 12:11:26 -060010851 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010852 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010853 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010854 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10855 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010856
10857 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010858 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10859 ds_pool_ci.pNext = NULL;
10860 ds_pool_ci.maxSets = 1;
10861 ds_pool_ci.poolSizeCount = 1;
10862 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010863
Tobin Ehlis3b780662015-05-28 12:11:26 -060010864 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010865 err =
10866 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010867 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010868 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010869 dsl_binding.binding = 0;
10870 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10871 dsl_binding.descriptorCount = 1;
10872 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10873 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010874
Tony Barboureb254902015-07-15 12:50:33 -060010875 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010876 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10877 ds_layout_ci.pNext = NULL;
10878 ds_layout_ci.bindingCount = 1;
10879 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010880
Tobin Ehlis3b780662015-05-28 12:11:26 -060010881 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010882 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10883 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010884 ASSERT_VK_SUCCESS(err);
10885
10886 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010887 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010888 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010889 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010890 alloc_info.descriptorPool = ds_pool;
10891 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010892 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10893 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010894 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010895
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010896 VkSamplerCreateInfo sampler_ci = {};
10897 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10898 sampler_ci.pNext = NULL;
10899 sampler_ci.magFilter = VK_FILTER_NEAREST;
10900 sampler_ci.minFilter = VK_FILTER_NEAREST;
10901 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10902 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10903 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10904 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10905 sampler_ci.mipLodBias = 1.0;
10906 sampler_ci.anisotropyEnable = VK_FALSE;
10907 sampler_ci.maxAnisotropy = 1;
10908 sampler_ci.compareEnable = VK_FALSE;
10909 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10910 sampler_ci.minLod = 1.0;
10911 sampler_ci.maxLod = 1.0;
10912 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10913 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10914 VkSampler sampler;
10915 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10916 ASSERT_VK_SUCCESS(err);
10917
10918 VkDescriptorImageInfo info = {};
10919 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010920
10921 VkWriteDescriptorSet descriptor_write;
10922 memset(&descriptor_write, 0, sizeof(descriptor_write));
10923 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010924 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010925 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010926 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010927 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010928 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010929
10930 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10931
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010932 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010933
Chia-I Wuf7458c52015-10-26 21:10:41 +080010934 vkDestroySampler(m_device->device(), sampler, NULL);
10935 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10936 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010937}
10938
Karl Schultz6addd812016-02-02 17:17:23 -070010939TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010940 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010941 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010942
Karl Schultz6addd812016-02-02 17:17:23 -070010943 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010944 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10945 " binding #0 with 1 total descriptors but update of 1 descriptors "
10946 "starting at binding offset of 0 combined with update array element "
10947 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010948
Tobin Ehlis3b780662015-05-28 12:11:26 -060010949 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010950 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010951 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010952 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10953 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010954
10955 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010956 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10957 ds_pool_ci.pNext = NULL;
10958 ds_pool_ci.maxSets = 1;
10959 ds_pool_ci.poolSizeCount = 1;
10960 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010961
Tobin Ehlis3b780662015-05-28 12:11:26 -060010962 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010963 err =
10964 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010965 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010966
Tony Barboureb254902015-07-15 12:50:33 -060010967 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010968 dsl_binding.binding = 0;
10969 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10970 dsl_binding.descriptorCount = 1;
10971 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10972 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010973
10974 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010975 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10976 ds_layout_ci.pNext = NULL;
10977 ds_layout_ci.bindingCount = 1;
10978 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010979
Tobin Ehlis3b780662015-05-28 12:11:26 -060010980 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010981 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10982 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010983 ASSERT_VK_SUCCESS(err);
10984
10985 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010986 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010987 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010988 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010989 alloc_info.descriptorPool = ds_pool;
10990 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010991 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10992 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010993 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010994
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010995 // Correctly update descriptor to avoid "NOT_UPDATED" error
10996 VkDescriptorBufferInfo buff_info = {};
10997 buff_info.buffer =
10998 VkBuffer(0); // Don't care about buffer handle for this test
10999 buff_info.offset = 0;
11000 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011001
11002 VkWriteDescriptorSet descriptor_write;
11003 memset(&descriptor_write, 0, sizeof(descriptor_write));
11004 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011005 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011006 descriptor_write.dstArrayElement =
11007 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080011008 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011009 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11010 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011011
11012 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11013
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011014 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011015
Chia-I Wuf7458c52015-10-26 21:10:41 +080011016 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11017 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011018}
11019
Karl Schultz6addd812016-02-02 17:17:23 -070011020TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
11021 // Create layout w/ count of 1 and attempt update to that layout w/ binding
11022 // index 2
11023 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011024
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011025 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11026 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011027
Tobin Ehlis3b780662015-05-28 12:11:26 -060011028 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011029 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011030 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011031 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11032 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011033
11034 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011035 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11036 ds_pool_ci.pNext = NULL;
11037 ds_pool_ci.maxSets = 1;
11038 ds_pool_ci.poolSizeCount = 1;
11039 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011040
Tobin Ehlis3b780662015-05-28 12:11:26 -060011041 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011042 err =
11043 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011044 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011045
Tony Barboureb254902015-07-15 12:50:33 -060011046 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011047 dsl_binding.binding = 0;
11048 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11049 dsl_binding.descriptorCount = 1;
11050 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11051 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060011052
11053 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011054 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11055 ds_layout_ci.pNext = NULL;
11056 ds_layout_ci.bindingCount = 1;
11057 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011058 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011059 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11060 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011061 ASSERT_VK_SUCCESS(err);
11062
11063 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011064 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011065 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011066 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011067 alloc_info.descriptorPool = ds_pool;
11068 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011069 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11070 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011071 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011072
Tony Barboureb254902015-07-15 12:50:33 -060011073 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011074 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11075 sampler_ci.pNext = NULL;
11076 sampler_ci.magFilter = VK_FILTER_NEAREST;
11077 sampler_ci.minFilter = VK_FILTER_NEAREST;
11078 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11079 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11080 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11081 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11082 sampler_ci.mipLodBias = 1.0;
11083 sampler_ci.anisotropyEnable = VK_FALSE;
11084 sampler_ci.maxAnisotropy = 1;
11085 sampler_ci.compareEnable = VK_FALSE;
11086 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11087 sampler_ci.minLod = 1.0;
11088 sampler_ci.maxLod = 1.0;
11089 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11090 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060011091
Tobin Ehlis3b780662015-05-28 12:11:26 -060011092 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011093 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011094 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011095
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011096 VkDescriptorImageInfo info = {};
11097 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011098
11099 VkWriteDescriptorSet descriptor_write;
11100 memset(&descriptor_write, 0, sizeof(descriptor_write));
11101 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011102 descriptor_write.dstSet = descriptorSet;
11103 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011104 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011105 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011106 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011107 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011108
11109 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11110
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011111 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011112
Chia-I Wuf7458c52015-10-26 21:10:41 +080011113 vkDestroySampler(m_device->device(), sampler, NULL);
11114 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11115 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011116}
11117
Karl Schultz6addd812016-02-02 17:17:23 -070011118TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
11119 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
11120 // types
11121 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011122
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis660bcdc2016-05-17 10:39:46 -060011124 ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011125
Tobin Ehlis3b780662015-05-28 12:11:26 -060011126 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011127
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011128 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011129 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11130 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011131
11132 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011133 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11134 ds_pool_ci.pNext = NULL;
11135 ds_pool_ci.maxSets = 1;
11136 ds_pool_ci.poolSizeCount = 1;
11137 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011138
Tobin Ehlis3b780662015-05-28 12:11:26 -060011139 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011140 err =
11141 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011142 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060011143 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011144 dsl_binding.binding = 0;
11145 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11146 dsl_binding.descriptorCount = 1;
11147 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11148 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011149
Tony Barboureb254902015-07-15 12:50:33 -060011150 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011151 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11152 ds_layout_ci.pNext = NULL;
11153 ds_layout_ci.bindingCount = 1;
11154 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011155
Tobin Ehlis3b780662015-05-28 12:11:26 -060011156 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011157 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11158 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011159 ASSERT_VK_SUCCESS(err);
11160
11161 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011162 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011163 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011164 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011165 alloc_info.descriptorPool = ds_pool;
11166 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011167 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11168 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011169 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011170
Tony Barboureb254902015-07-15 12:50:33 -060011171 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011172 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11173 sampler_ci.pNext = NULL;
11174 sampler_ci.magFilter = VK_FILTER_NEAREST;
11175 sampler_ci.minFilter = VK_FILTER_NEAREST;
11176 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11177 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11178 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11179 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11180 sampler_ci.mipLodBias = 1.0;
11181 sampler_ci.anisotropyEnable = VK_FALSE;
11182 sampler_ci.maxAnisotropy = 1;
11183 sampler_ci.compareEnable = VK_FALSE;
11184 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11185 sampler_ci.minLod = 1.0;
11186 sampler_ci.maxLod = 1.0;
11187 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11188 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011189 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011190 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011191 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011192
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011193 VkDescriptorImageInfo info = {};
11194 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011195
11196 VkWriteDescriptorSet descriptor_write;
11197 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -070011198 descriptor_write.sType =
11199 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011200 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011201 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011202 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011203 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011204 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011205
11206 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11207
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011208 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011209
Chia-I Wuf7458c52015-10-26 21:10:41 +080011210 vkDestroySampler(m_device->device(), sampler, NULL);
11211 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, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011216 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070011217 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011218
Karl Schultz6addd812016-02-02 17:17:23 -070011219 m_errorMonitor->SetDesiredFailureMsg(
11220 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011221 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011222
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011223 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011224 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
11225 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011226 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011227 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
11228 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011229
11230 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011231 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11232 ds_pool_ci.pNext = NULL;
11233 ds_pool_ci.maxSets = 1;
11234 ds_pool_ci.poolSizeCount = 1;
11235 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011236
11237 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011238 err =
11239 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011240 ASSERT_VK_SUCCESS(err);
11241
11242 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011243 dsl_binding.binding = 0;
11244 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11245 dsl_binding.descriptorCount = 1;
11246 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11247 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011248
11249 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011250 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11251 ds_layout_ci.pNext = NULL;
11252 ds_layout_ci.bindingCount = 1;
11253 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011254 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011255 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11256 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011257 ASSERT_VK_SUCCESS(err);
11258
11259 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011260 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011261 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011262 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011263 alloc_info.descriptorPool = ds_pool;
11264 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011265 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11266 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011267 ASSERT_VK_SUCCESS(err);
11268
Karl Schultz6addd812016-02-02 17:17:23 -070011269 VkSampler sampler =
11270 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011271
11272 VkDescriptorImageInfo descriptor_info;
11273 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11274 descriptor_info.sampler = sampler;
11275
11276 VkWriteDescriptorSet descriptor_write;
11277 memset(&descriptor_write, 0, sizeof(descriptor_write));
11278 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011279 descriptor_write.dstSet = descriptorSet;
11280 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011281 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011282 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11283 descriptor_write.pImageInfo = &descriptor_info;
11284
11285 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11286
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011287 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011288
Chia-I Wuf7458c52015-10-26 21:10:41 +080011289 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11290 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011291}
11292
Karl Schultz6addd812016-02-02 17:17:23 -070011293TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
11294 // Create a single combined Image/Sampler descriptor and send it an invalid
11295 // imageView
11296 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011297
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011298 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11299 "Attempted write update to combined "
11300 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -060011301 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011302
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011303 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011304 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011305 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11306 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011307
11308 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011309 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11310 ds_pool_ci.pNext = NULL;
11311 ds_pool_ci.maxSets = 1;
11312 ds_pool_ci.poolSizeCount = 1;
11313 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011314
11315 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011316 err =
11317 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011318 ASSERT_VK_SUCCESS(err);
11319
11320 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011321 dsl_binding.binding = 0;
11322 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11323 dsl_binding.descriptorCount = 1;
11324 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11325 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011326
11327 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011328 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11329 ds_layout_ci.pNext = NULL;
11330 ds_layout_ci.bindingCount = 1;
11331 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011332 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011333 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11334 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011335 ASSERT_VK_SUCCESS(err);
11336
11337 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011338 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011339 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011340 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011341 alloc_info.descriptorPool = ds_pool;
11342 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011343 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11344 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011345 ASSERT_VK_SUCCESS(err);
11346
11347 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011348 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11349 sampler_ci.pNext = NULL;
11350 sampler_ci.magFilter = VK_FILTER_NEAREST;
11351 sampler_ci.minFilter = VK_FILTER_NEAREST;
11352 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11353 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11354 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11355 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11356 sampler_ci.mipLodBias = 1.0;
11357 sampler_ci.anisotropyEnable = VK_FALSE;
11358 sampler_ci.maxAnisotropy = 1;
11359 sampler_ci.compareEnable = VK_FALSE;
11360 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11361 sampler_ci.minLod = 1.0;
11362 sampler_ci.maxLod = 1.0;
11363 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11364 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011365
11366 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011367 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011368 ASSERT_VK_SUCCESS(err);
11369
Karl Schultz6addd812016-02-02 17:17:23 -070011370 VkImageView view =
11371 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011372
11373 VkDescriptorImageInfo descriptor_info;
11374 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11375 descriptor_info.sampler = sampler;
11376 descriptor_info.imageView = view;
11377
11378 VkWriteDescriptorSet descriptor_write;
11379 memset(&descriptor_write, 0, sizeof(descriptor_write));
11380 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011381 descriptor_write.dstSet = descriptorSet;
11382 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011383 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011384 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11385 descriptor_write.pImageInfo = &descriptor_info;
11386
11387 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11388
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011389 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011390
Chia-I Wuf7458c52015-10-26 21:10:41 +080011391 vkDestroySampler(m_device->device(), sampler, NULL);
11392 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11393 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011394}
11395
Karl Schultz6addd812016-02-02 17:17:23 -070011396TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
11397 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
11398 // into the other
11399 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011400
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011401 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11402 " binding #1 with type "
11403 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
11404 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011405
Tobin Ehlis04356f92015-10-27 16:35:27 -060011406 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011407 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011408 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011409 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11410 ds_type_count[0].descriptorCount = 1;
11411 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
11412 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011413
11414 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011415 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11416 ds_pool_ci.pNext = NULL;
11417 ds_pool_ci.maxSets = 1;
11418 ds_pool_ci.poolSizeCount = 2;
11419 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011420
11421 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011422 err =
11423 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011424 ASSERT_VK_SUCCESS(err);
11425 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011426 dsl_binding[0].binding = 0;
11427 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11428 dsl_binding[0].descriptorCount = 1;
11429 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
11430 dsl_binding[0].pImmutableSamplers = NULL;
11431 dsl_binding[1].binding = 1;
11432 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11433 dsl_binding[1].descriptorCount = 1;
11434 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
11435 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011436
11437 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011438 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11439 ds_layout_ci.pNext = NULL;
11440 ds_layout_ci.bindingCount = 2;
11441 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011442
11443 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011444 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11445 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011446 ASSERT_VK_SUCCESS(err);
11447
11448 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011449 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011450 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011451 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011452 alloc_info.descriptorPool = ds_pool;
11453 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011454 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11455 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011456 ASSERT_VK_SUCCESS(err);
11457
11458 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011459 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11460 sampler_ci.pNext = NULL;
11461 sampler_ci.magFilter = VK_FILTER_NEAREST;
11462 sampler_ci.minFilter = VK_FILTER_NEAREST;
11463 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11464 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11465 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11466 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11467 sampler_ci.mipLodBias = 1.0;
11468 sampler_ci.anisotropyEnable = VK_FALSE;
11469 sampler_ci.maxAnisotropy = 1;
11470 sampler_ci.compareEnable = VK_FALSE;
11471 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11472 sampler_ci.minLod = 1.0;
11473 sampler_ci.maxLod = 1.0;
11474 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11475 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011476
11477 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011478 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011479 ASSERT_VK_SUCCESS(err);
11480
11481 VkDescriptorImageInfo info = {};
11482 info.sampler = sampler;
11483
11484 VkWriteDescriptorSet descriptor_write;
11485 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
11486 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011487 descriptor_write.dstSet = descriptorSet;
11488 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080011489 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011490 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11491 descriptor_write.pImageInfo = &info;
11492 // This write update should succeed
11493 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11494 // Now perform a copy update that fails due to type mismatch
11495 VkCopyDescriptorSet copy_ds_update;
11496 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11497 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11498 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -060011499 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011500 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011501 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +080011502 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011503 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11504
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011505 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011506 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070011507 m_errorMonitor->SetDesiredFailureMsg(
11508 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011509 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -060011510 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11511 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11512 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011513 copy_ds_update.srcBinding =
11514 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011515 copy_ds_update.dstSet = descriptorSet;
11516 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -060011517 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011518 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11519
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011520 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011521
Tobin Ehlis04356f92015-10-27 16:35:27 -060011522 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070011523 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011524 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
11525 "update array offset of 0 and update of "
11526 "5 descriptors oversteps total number "
11527 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011528
Tobin Ehlis04356f92015-10-27 16:35:27 -060011529 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11530 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11531 copy_ds_update.srcSet = descriptorSet;
11532 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011533 copy_ds_update.dstSet = descriptorSet;
11534 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070011535 copy_ds_update.descriptorCount =
11536 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060011537 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11538
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011539 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011540
Chia-I Wuf7458c52015-10-26 21:10:41 +080011541 vkDestroySampler(m_device->device(), sampler, NULL);
11542 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11543 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011544}
11545
Karl Schultz6addd812016-02-02 17:17:23 -070011546TEST_F(VkLayerTest, NumSamplesMismatch) {
11547 // Create CommandBuffer where MSAA samples doesn't match RenderPass
11548 // sampleCount
11549 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011550
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011552 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011553
Tobin Ehlis3b780662015-05-28 12:11:26 -060011554 ASSERT_NO_FATAL_FAILURE(InitState());
11555 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011556 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060011557 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011558 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011559
11560 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011561 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11562 ds_pool_ci.pNext = NULL;
11563 ds_pool_ci.maxSets = 1;
11564 ds_pool_ci.poolSizeCount = 1;
11565 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011566
Tobin Ehlis3b780662015-05-28 12:11:26 -060011567 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011568 err =
11569 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011570 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011571
Tony Barboureb254902015-07-15 12:50:33 -060011572 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080011573 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060011574 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080011575 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011576 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11577 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011578
Tony Barboureb254902015-07-15 12:50:33 -060011579 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11580 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11581 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011582 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011583 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011584
Tobin Ehlis3b780662015-05-28 12:11:26 -060011585 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011586 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11587 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011588 ASSERT_VK_SUCCESS(err);
11589
11590 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011591 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011592 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011593 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011594 alloc_info.descriptorPool = ds_pool;
11595 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011596 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11597 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011598 ASSERT_VK_SUCCESS(err);
11599
Tony Barboureb254902015-07-15 12:50:33 -060011600 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011601 pipe_ms_state_ci.sType =
11602 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11603 pipe_ms_state_ci.pNext = NULL;
11604 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11605 pipe_ms_state_ci.sampleShadingEnable = 0;
11606 pipe_ms_state_ci.minSampleShading = 1.0;
11607 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011608
Tony Barboureb254902015-07-15 12:50:33 -060011609 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011610 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11611 pipeline_layout_ci.pNext = NULL;
11612 pipeline_layout_ci.setLayoutCount = 1;
11613 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011614
11615 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011616 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11617 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011618 ASSERT_VK_SUCCESS(err);
11619
Karl Schultz6addd812016-02-02 17:17:23 -070011620 VkShaderObj vs(m_device, bindStateVertShaderText,
11621 VK_SHADER_STAGE_VERTEX_BIT, this);
11622 VkShaderObj fs(m_device, bindStateFragShaderText,
11623 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011624 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070011625 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011626 VkPipelineObj pipe(m_device);
11627 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011628 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011629 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011630 pipe.SetMSAA(&pipe_ms_state_ci);
11631 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011632
Tony Barbourfe3351b2015-07-28 10:17:20 -060011633 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070011634 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11635 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011636
Mark Young29927482016-05-04 14:38:51 -060011637 // Render triangle (the error should trigger on the attempt to draw).
11638 Draw(3, 1, 0, 0);
11639
11640 // Finalize recording of the command buffer
11641 EndCommandBuffer();
11642
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011643 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011644
Chia-I Wuf7458c52015-10-26 21:10:41 +080011645 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11646 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11647 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011648}
Mark Young29927482016-05-04 14:38:51 -060011649
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011650TEST_F(VkLayerTest, RenderPassIncompatible) {
11651 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
11652 "Initial case is drawing with an active renderpass that's "
11653 "not compatible with the bound PSO's creation renderpass");
11654 VkResult err;
11655
11656 ASSERT_NO_FATAL_FAILURE(InitState());
11657 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11658
11659 VkDescriptorSetLayoutBinding dsl_binding = {};
11660 dsl_binding.binding = 0;
11661 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11662 dsl_binding.descriptorCount = 1;
11663 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11664 dsl_binding.pImmutableSamplers = NULL;
11665
11666 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11667 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11668 ds_layout_ci.pNext = NULL;
11669 ds_layout_ci.bindingCount = 1;
11670 ds_layout_ci.pBindings = &dsl_binding;
11671
11672 VkDescriptorSetLayout ds_layout;
11673 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11674 &ds_layout);
11675 ASSERT_VK_SUCCESS(err);
11676
11677 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11678 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11679 pipeline_layout_ci.pNext = NULL;
11680 pipeline_layout_ci.setLayoutCount = 1;
11681 pipeline_layout_ci.pSetLayouts = &ds_layout;
11682
11683 VkPipelineLayout pipeline_layout;
11684 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11685 &pipeline_layout);
11686 ASSERT_VK_SUCCESS(err);
11687
11688 VkShaderObj vs(m_device, bindStateVertShaderText,
11689 VK_SHADER_STAGE_VERTEX_BIT, this);
11690 VkShaderObj fs(m_device, bindStateFragShaderText,
11691 VK_SHADER_STAGE_FRAGMENT_BIT,
11692 this); // We shouldn't need a fragment shader
11693 // but add it to be able to run on more devices
11694 // Create a renderpass that will be incompatible with default renderpass
11695 VkAttachmentReference attach = {};
11696 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11697 VkAttachmentReference color_att = {};
11698 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11699 VkSubpassDescription subpass = {};
11700 subpass.inputAttachmentCount = 1;
11701 subpass.pInputAttachments = &attach;
11702 subpass.colorAttachmentCount = 1;
11703 subpass.pColorAttachments = &color_att;
11704 VkRenderPassCreateInfo rpci = {};
11705 rpci.subpassCount = 1;
11706 rpci.pSubpasses = &subpass;
11707 rpci.attachmentCount = 1;
11708 VkAttachmentDescription attach_desc = {};
11709 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011710 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11711 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011712 rpci.pAttachments = &attach_desc;
11713 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11714 VkRenderPass rp;
11715 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11716 VkPipelineObj pipe(m_device);
11717 pipe.AddShader(&vs);
11718 pipe.AddShader(&fs);
11719 pipe.AddColorAttachment();
11720 VkViewport view_port = {};
11721 m_viewports.push_back(view_port);
11722 pipe.SetViewport(m_viewports);
11723 VkRect2D rect = {};
11724 m_scissors.push_back(rect);
11725 pipe.SetScissor(m_scissors);
11726 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11727
11728 VkCommandBufferInheritanceInfo cbii = {};
11729 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11730 cbii.renderPass = rp;
11731 cbii.subpass = 0;
11732 VkCommandBufferBeginInfo cbbi = {};
11733 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11734 cbbi.pInheritanceInfo = &cbii;
11735 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11736 VkRenderPassBeginInfo rpbi = {};
11737 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11738 rpbi.framebuffer = m_framebuffer;
11739 rpbi.renderPass = rp;
11740 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi,
11741 VK_SUBPASS_CONTENTS_INLINE);
11742 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11743 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11744
11745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11746 " is incompatible w/ gfx pipeline ");
11747 // Render triangle (the error should trigger on the attempt to draw).
11748 Draw(3, 1, 0, 0);
11749
11750 // Finalize recording of the command buffer
11751 EndCommandBuffer();
11752
11753 m_errorMonitor->VerifyFound();
11754
11755 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11756 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11757 vkDestroyRenderPass(m_device->device(), rp, NULL);
11758}
11759
Mark Youngc89c6312016-03-31 16:03:20 -060011760TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11761 // Create Pipeline where the number of blend attachments doesn't match the
11762 // number of color attachments. In this case, we don't add any color
11763 // blend attachments even though we have a color attachment.
11764 VkResult err;
11765
11766 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -060011767 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -060011768
11769 ASSERT_NO_FATAL_FAILURE(InitState());
11770 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11771 VkDescriptorPoolSize ds_type_count = {};
11772 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11773 ds_type_count.descriptorCount = 1;
11774
11775 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11776 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11777 ds_pool_ci.pNext = NULL;
11778 ds_pool_ci.maxSets = 1;
11779 ds_pool_ci.poolSizeCount = 1;
11780 ds_pool_ci.pPoolSizes = &ds_type_count;
11781
11782 VkDescriptorPool ds_pool;
11783 err =
11784 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11785 ASSERT_VK_SUCCESS(err);
11786
11787 VkDescriptorSetLayoutBinding dsl_binding = {};
11788 dsl_binding.binding = 0;
11789 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11790 dsl_binding.descriptorCount = 1;
11791 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11792 dsl_binding.pImmutableSamplers = NULL;
11793
11794 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11795 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11796 ds_layout_ci.pNext = NULL;
11797 ds_layout_ci.bindingCount = 1;
11798 ds_layout_ci.pBindings = &dsl_binding;
11799
11800 VkDescriptorSetLayout ds_layout;
11801 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11802 &ds_layout);
11803 ASSERT_VK_SUCCESS(err);
11804
11805 VkDescriptorSet descriptorSet;
11806 VkDescriptorSetAllocateInfo alloc_info = {};
11807 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11808 alloc_info.descriptorSetCount = 1;
11809 alloc_info.descriptorPool = ds_pool;
11810 alloc_info.pSetLayouts = &ds_layout;
11811 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11812 &descriptorSet);
11813 ASSERT_VK_SUCCESS(err);
11814
11815 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
11816 pipe_ms_state_ci.sType =
11817 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11818 pipe_ms_state_ci.pNext = NULL;
11819 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11820 pipe_ms_state_ci.sampleShadingEnable = 0;
11821 pipe_ms_state_ci.minSampleShading = 1.0;
11822 pipe_ms_state_ci.pSampleMask = NULL;
11823
11824 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11825 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11826 pipeline_layout_ci.pNext = NULL;
11827 pipeline_layout_ci.setLayoutCount = 1;
11828 pipeline_layout_ci.pSetLayouts = &ds_layout;
11829
11830 VkPipelineLayout pipeline_layout;
11831 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11832 &pipeline_layout);
11833 ASSERT_VK_SUCCESS(err);
11834
11835 VkShaderObj vs(m_device, bindStateVertShaderText,
11836 VK_SHADER_STAGE_VERTEX_BIT, this);
11837 VkShaderObj fs(m_device, bindStateFragShaderText,
11838 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011839 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -060011840 // but add it to be able to run on more devices
11841 VkPipelineObj pipe(m_device);
11842 pipe.AddShader(&vs);
11843 pipe.AddShader(&fs);
11844 pipe.SetMSAA(&pipe_ms_state_ci);
11845 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11846
11847 BeginCommandBuffer();
11848 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11849 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11850
Mark Young29927482016-05-04 14:38:51 -060011851 // Render triangle (the error should trigger on the attempt to draw).
11852 Draw(3, 1, 0, 0);
11853
11854 // Finalize recording of the command buffer
11855 EndCommandBuffer();
11856
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011857 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011858
11859 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11860 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11861 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11862}
Mark Young29927482016-05-04 14:38:51 -060011863
Mark Muellerd4914412016-06-13 17:52:06 -060011864TEST_F(VkLayerTest, MissingClearAttachment) {
11865 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
11866 "structure passed to vkCmdClearAttachments");
11867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11868 "vkCmdClearAttachments() attachment index 1 not found in attachment "
11869 "reference array of active subpass 0");
11870
11871 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11872 m_errorMonitor->VerifyFound();
11873}
11874
Karl Schultz6addd812016-02-02 17:17:23 -070011875TEST_F(VkLayerTest, ClearCmdNoDraw) {
11876 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
11877 // to issuing a Draw
11878 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011879
Karl Schultz6addd812016-02-02 17:17:23 -070011880 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -070011881 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011882 "vkCmdClearAttachments() issued on CB object ");
11883
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011884 ASSERT_NO_FATAL_FAILURE(InitState());
11885 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011886
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011887 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011888 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11889 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011890
11891 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011892 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11893 ds_pool_ci.pNext = NULL;
11894 ds_pool_ci.maxSets = 1;
11895 ds_pool_ci.poolSizeCount = 1;
11896 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011897
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011898 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011899 err =
11900 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011901 ASSERT_VK_SUCCESS(err);
11902
Tony Barboureb254902015-07-15 12:50:33 -060011903 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011904 dsl_binding.binding = 0;
11905 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11906 dsl_binding.descriptorCount = 1;
11907 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11908 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011909
Tony Barboureb254902015-07-15 12:50:33 -060011910 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011911 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11912 ds_layout_ci.pNext = NULL;
11913 ds_layout_ci.bindingCount = 1;
11914 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011915
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011916 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011917 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11918 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011919 ASSERT_VK_SUCCESS(err);
11920
11921 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011922 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011923 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011924 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011925 alloc_info.descriptorPool = ds_pool;
11926 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011927 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11928 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011929 ASSERT_VK_SUCCESS(err);
11930
Tony Barboureb254902015-07-15 12:50:33 -060011931 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011932 pipe_ms_state_ci.sType =
11933 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11934 pipe_ms_state_ci.pNext = NULL;
11935 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11936 pipe_ms_state_ci.sampleShadingEnable = 0;
11937 pipe_ms_state_ci.minSampleShading = 1.0;
11938 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011939
Tony Barboureb254902015-07-15 12:50:33 -060011940 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011941 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11942 pipeline_layout_ci.pNext = NULL;
11943 pipeline_layout_ci.setLayoutCount = 1;
11944 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011945
11946 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011947 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11948 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011949 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011950
Karl Schultz6addd812016-02-02 17:17:23 -070011951 VkShaderObj vs(m_device, bindStateVertShaderText,
11952 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011953 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011954 // on more devices
11955 VkShaderObj fs(m_device, bindStateFragShaderText,
11956 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011957
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011958 VkPipelineObj pipe(m_device);
11959 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011960 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011961 pipe.SetMSAA(&pipe_ms_state_ci);
11962 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011963
11964 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011965
Karl Schultz6addd812016-02-02 17:17:23 -070011966 // Main thing we care about for this test is that the VkImage obj we're
11967 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011968 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011969 VkClearAttachment color_attachment;
11970 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11971 color_attachment.clearValue.color.float32[0] = 1.0;
11972 color_attachment.clearValue.color.float32[1] = 1.0;
11973 color_attachment.clearValue.color.float32[2] = 1.0;
11974 color_attachment.clearValue.color.float32[3] = 1.0;
11975 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070011976 VkClearRect clear_rect = {
11977 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011978
Karl Schultz6addd812016-02-02 17:17:23 -070011979 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
11980 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011981
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011982 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011983
Chia-I Wuf7458c52015-10-26 21:10:41 +080011984 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11985 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11986 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011987}
11988
Karl Schultz6addd812016-02-02 17:17:23 -070011989TEST_F(VkLayerTest, VtxBufferBadIndex) {
11990 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011991
Karl Schultz6addd812016-02-02 17:17:23 -070011992 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070011993 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -070011994 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011995
Tobin Ehlis502480b2015-06-24 15:53:07 -060011996 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011997 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011998 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011999
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012000 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012001 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12002 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012003
12004 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012005 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12006 ds_pool_ci.pNext = NULL;
12007 ds_pool_ci.maxSets = 1;
12008 ds_pool_ci.poolSizeCount = 1;
12009 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060012010
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060012011 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070012012 err =
12013 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012014 ASSERT_VK_SUCCESS(err);
12015
Tony Barboureb254902015-07-15 12:50:33 -060012016 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012017 dsl_binding.binding = 0;
12018 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12019 dsl_binding.descriptorCount = 1;
12020 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12021 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012022
Tony Barboureb254902015-07-15 12:50:33 -060012023 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012024 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12025 ds_layout_ci.pNext = NULL;
12026 ds_layout_ci.bindingCount = 1;
12027 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060012028
Tobin Ehlis502480b2015-06-24 15:53:07 -060012029 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012030 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
12031 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012032 ASSERT_VK_SUCCESS(err);
12033
12034 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012035 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012036 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012037 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012038 alloc_info.descriptorPool = ds_pool;
12039 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070012040 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
12041 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012042 ASSERT_VK_SUCCESS(err);
12043
Tony Barboureb254902015-07-15 12:50:33 -060012044 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012045 pipe_ms_state_ci.sType =
12046 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
12047 pipe_ms_state_ci.pNext = NULL;
12048 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12049 pipe_ms_state_ci.sampleShadingEnable = 0;
12050 pipe_ms_state_ci.minSampleShading = 1.0;
12051 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012052
Tony Barboureb254902015-07-15 12:50:33 -060012053 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012054 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12055 pipeline_layout_ci.pNext = NULL;
12056 pipeline_layout_ci.setLayoutCount = 1;
12057 pipeline_layout_ci.pSetLayouts = &ds_layout;
12058 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012059
Karl Schultz6addd812016-02-02 17:17:23 -070012060 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
12061 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012062 ASSERT_VK_SUCCESS(err);
12063
Karl Schultz6addd812016-02-02 17:17:23 -070012064 VkShaderObj vs(m_device, bindStateVertShaderText,
12065 VK_SHADER_STAGE_VERTEX_BIT, this);
12066 VkShaderObj fs(m_device, bindStateFragShaderText,
12067 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060012068 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070012069 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012070 VkPipelineObj pipe(m_device);
12071 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012072 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060012073 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012074 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060012075 pipe.SetViewport(m_viewports);
12076 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012077 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060012078
12079 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070012080 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
12081 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060012082 // Don't care about actual data, just need to get to draw to flag error
12083 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -070012084 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
12085 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060012086 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060012087 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012088
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012089 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012090
Chia-I Wuf7458c52015-10-26 21:10:41 +080012091 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12092 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12093 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012094}
Mark Muellerdfe37552016-07-07 14:47:42 -060012095
12096TEST_F(VkLayerTest, VertexBufferInvalid) {
12097 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
12098 "delete a buffer twice, use an invalid offset for each "
12099 "buffer type, and attempt to bind a null buffer");
12100
12101 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
12102 "using deleted buffer ";
12103 const char *double_destroy_message = "Cannot free buffer 0x";
12104 const char *invalid_offset_message = "vkBindBufferMemory(): "
12105 "memoryOffset is 0x";
12106 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
12107 "storage memoryOffset "
12108 "is 0x";
12109 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
12110 "texel memoryOffset "
12111 "is 0x";
12112 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
12113 "uniform memoryOffset "
12114 "is 0x";
12115 const char *bind_null_buffer_message = "In vkBindBufferMemory, attempting"
12116 " to Bind Obj(0x";
12117 const char *free_invalid_buffer_message = "Request to delete memory "
12118 "object 0x";
12119
12120 ASSERT_NO_FATAL_FAILURE(InitState());
12121 ASSERT_NO_FATAL_FAILURE(InitViewport());
12122 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12123
12124 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
12125 pipe_ms_state_ci.sType =
12126 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
12127 pipe_ms_state_ci.pNext = NULL;
12128 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12129 pipe_ms_state_ci.sampleShadingEnable = 0;
12130 pipe_ms_state_ci.minSampleShading = 1.0;
12131 pipe_ms_state_ci.pSampleMask = nullptr;
12132
12133 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12134 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12135 VkPipelineLayout pipeline_layout;
12136
12137 VkResult err = vkCreatePipelineLayout(m_device->device(),
12138 &pipeline_layout_ci, nullptr,
12139 &pipeline_layout);
12140 ASSERT_VK_SUCCESS(err);
12141
12142 VkShaderObj vs(m_device, bindStateVertShaderText,
12143 VK_SHADER_STAGE_VERTEX_BIT, this);
12144 VkShaderObj fs(m_device, bindStateFragShaderText,
12145 VK_SHADER_STAGE_FRAGMENT_BIT,
12146 this);
12147 VkPipelineObj pipe(m_device);
12148 pipe.AddShader(&vs);
12149 pipe.AddShader(&fs);
12150 pipe.AddColorAttachment();
12151 pipe.SetMSAA(&pipe_ms_state_ci);
12152 pipe.SetViewport(m_viewports);
12153 pipe.SetScissor(m_scissors);
12154 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12155
12156 BeginCommandBuffer();
12157 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
12158 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12159
12160 {
12161 // Create and bind a vertex buffer in a reduced scope, which will cause
12162 // it to be deleted upon leaving this scope
12163 const float vbo_data[3] = {1.f, 0.f, 1.f};
12164 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data),
12165 3, vbo_data);
12166 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
12167 draw_verticies.AddVertexInputToPipe(pipe);
12168 }
12169
12170 Draw(1, 0, 0, 0);
12171
12172 EndCommandBuffer();
12173
12174 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12175 deleted_buffer_in_command_buffer);
12176 QueueCommandBuffer(false);
12177 m_errorMonitor->VerifyFound();
12178
12179 {
12180 // Create and bind a vertex buffer in a reduced scope, and delete it
12181 // twice, the second through the destructor
12182 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12183 VkBufferTest::eDoubleDelete);
12184 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12185 double_destroy_message);
12186 buffer_test.TestDoubleDestroy();
12187 }
12188 m_errorMonitor->VerifyFound();
12189
12190 if (VkBufferTest::
12191 GetTestConditionValid(m_device,
12192 VkBufferTest::eInvalidMemoryOffset)) {
12193 // Create and bind a memory buffer with an invalid offset.
12194 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12195 invalid_offset_message);
12196 VkBufferTest buffer_test(m_device,
12197 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
12198 VkBufferTest::eInvalidMemoryOffset);
12199 (void) buffer_test;
12200 m_errorMonitor->VerifyFound();
12201 }
12202
12203 if (VkBufferTest::
12204 GetTestConditionValid(m_device,
12205 VkBufferTest::eInvalidDeviceOffset,
12206 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
12207 // Create and bind a memory buffer with an invalid offset again,
12208 // but look for a texel buffer message.
12209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12210 invalid_texel_buffer_offset_message);
12211 VkBufferTest buffer_test(m_device,
12212 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
12213 VkBufferTest::eInvalidDeviceOffset);
12214 (void) buffer_test;
12215 m_errorMonitor->VerifyFound();
12216 }
12217
12218 if (VkBufferTest::
12219 GetTestConditionValid(m_device,
12220 VkBufferTest::eInvalidDeviceOffset,
12221 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
12222 // Create and bind a memory buffer with an invalid offset again, but
12223 // look for a uniform buffer message.
12224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12225 invalid_uniform_buffer_offset_message);
12226 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
12227 VkBufferTest::eInvalidDeviceOffset);
12228 (void) buffer_test;
12229 m_errorMonitor->VerifyFound();
12230 }
12231
12232 if (VkBufferTest::
12233 GetTestConditionValid(m_device,
12234 VkBufferTest::eInvalidDeviceOffset,
12235 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
12236 // Create and bind a memory buffer with an invalid offset again, but
12237 // look for a storage buffer message.
12238 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12239 invalid_storage_buffer_offset_message);
12240 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12241 VkBufferTest::eInvalidDeviceOffset);
12242 (void) buffer_test;
12243 m_errorMonitor->VerifyFound();
12244 }
12245
12246 {
12247 // Attempt to bind a null buffer.
12248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12249 bind_null_buffer_message);
12250 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12251 VkBufferTest::eBindNullBuffer);
12252 (void) buffer_test;
12253 m_errorMonitor->VerifyFound();
12254 }
12255
12256 {
12257 // Attempt to use an invalid handle to delete a buffer.
12258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12259 free_invalid_buffer_message);
12260 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
12261 VkBufferTest::eFreeInvalidHandle);
12262 (void) buffer_test;
12263 }
12264 m_errorMonitor->VerifyFound();
12265
12266 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12267}
12268
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012269// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
12270TEST_F(VkLayerTest, InvalidImageLayout) {
12271 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
12272 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
12273 "images in the wrong layout when they're copied or transitioned.");
12274 // 3 in ValidateCmdBufImageLayouts
12275 // * -1 Attempt to submit cmd buf w/ deleted image
12276 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
12277 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
12278 m_errorMonitor->SetDesiredFailureMsg(
12279 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12280 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12281
12282 ASSERT_NO_FATAL_FAILURE(InitState());
12283 // Create src & dst images to use for copy operations
12284 VkImage src_image;
12285 VkImage dst_image;
12286
12287 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
12288 const int32_t tex_width = 32;
12289 const int32_t tex_height = 32;
12290
12291 VkImageCreateInfo image_create_info = {};
12292 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12293 image_create_info.pNext = NULL;
12294 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12295 image_create_info.format = tex_format;
12296 image_create_info.extent.width = tex_width;
12297 image_create_info.extent.height = tex_height;
12298 image_create_info.extent.depth = 1;
12299 image_create_info.mipLevels = 1;
12300 image_create_info.arrayLayers = 4;
12301 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
12302 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
12303 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
12304 image_create_info.flags = 0;
12305
12306 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
12307 ASSERT_VK_SUCCESS(err);
12308 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
12309 ASSERT_VK_SUCCESS(err);
12310
12311 BeginCommandBuffer();
12312 VkImageCopy copyRegion;
12313 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12314 copyRegion.srcSubresource.mipLevel = 0;
12315 copyRegion.srcSubresource.baseArrayLayer = 0;
12316 copyRegion.srcSubresource.layerCount = 1;
12317 copyRegion.srcOffset.x = 0;
12318 copyRegion.srcOffset.y = 0;
12319 copyRegion.srcOffset.z = 0;
12320 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12321 copyRegion.dstSubresource.mipLevel = 0;
12322 copyRegion.dstSubresource.baseArrayLayer = 0;
12323 copyRegion.dstSubresource.layerCount = 1;
12324 copyRegion.dstOffset.x = 0;
12325 copyRegion.dstOffset.y = 0;
12326 copyRegion.dstOffset.z = 0;
12327 copyRegion.extent.width = 1;
12328 copyRegion.extent.height = 1;
12329 copyRegion.extent.depth = 1;
12330 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12331 m_errorMonitor->VerifyFound();
12332 // Now cause error due to src image layout changing
12333 m_errorMonitor->SetDesiredFailureMsg(
12334 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12335 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
12336 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12337 m_errorMonitor->VerifyFound();
12338 // Final src error is due to bad layout type
12339 m_errorMonitor->SetDesiredFailureMsg(
12340 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12341 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
12342 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12343 m_errorMonitor->VerifyFound();
12344 // Now verify same checks for dst
12345 m_errorMonitor->SetDesiredFailureMsg(
12346 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12347 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
12348 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12349 m_errorMonitor->VerifyFound();
12350 // Now cause error due to src image layout changing
12351 m_errorMonitor->SetDesiredFailureMsg(
12352 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12353 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
12354 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
12355 m_errorMonitor->VerifyFound();
12356 m_errorMonitor->SetDesiredFailureMsg(
12357 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12358 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
12359 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
12360 m_errorMonitor->VerifyFound();
12361 // Now cause error due to bad image layout transition in PipelineBarrier
12362 VkImageMemoryBarrier image_barrier[1] = {};
12363 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12364 image_barrier[0].image = src_image;
12365 image_barrier[0].subresourceRange.layerCount = 2;
12366 image_barrier[0].subresourceRange.levelCount = 2;
12367 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12368 m_errorMonitor->SetDesiredFailureMsg(
12369 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12370 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
12371 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
12372 m_errorMonitor->VerifyFound();
12373
12374 // Finally some layout errors at RenderPass create time
12375 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
12376 VkAttachmentReference attach = {};
12377 // perf warning for GENERAL layout w/ non-DS input attachment
12378 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12379 VkSubpassDescription subpass = {};
12380 subpass.inputAttachmentCount = 1;
12381 subpass.pInputAttachments = &attach;
12382 VkRenderPassCreateInfo rpci = {};
12383 rpci.subpassCount = 1;
12384 rpci.pSubpasses = &subpass;
12385 rpci.attachmentCount = 1;
12386 VkAttachmentDescription attach_desc = {};
12387 attach_desc.format = VK_FORMAT_UNDEFINED;
12388 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012389 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012390 VkRenderPass rp;
12391 m_errorMonitor->SetDesiredFailureMsg(
12392 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12393 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
12394 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12395 m_errorMonitor->VerifyFound();
12396 // error w/ non-general layout
12397 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12398
12399 m_errorMonitor->SetDesiredFailureMsg(
12400 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12401 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
12402 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12403 m_errorMonitor->VerifyFound();
12404 subpass.inputAttachmentCount = 0;
12405 subpass.colorAttachmentCount = 1;
12406 subpass.pColorAttachments = &attach;
12407 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12408 // perf warning for GENERAL layout on color attachment
12409 m_errorMonitor->SetDesiredFailureMsg(
12410 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12411 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
12412 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12413 m_errorMonitor->VerifyFound();
12414 // error w/ non-color opt or GENERAL layout for color attachment
12415 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12416 m_errorMonitor->SetDesiredFailureMsg(
12417 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12418 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12419 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12420 m_errorMonitor->VerifyFound();
12421 subpass.colorAttachmentCount = 0;
12422 subpass.pDepthStencilAttachment = &attach;
12423 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12424 // perf warning for GENERAL layout on DS attachment
12425 m_errorMonitor->SetDesiredFailureMsg(
12426 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Chris Forbesc5dd9bc2016-08-09 08:17:14 +120012427 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012428 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12429 m_errorMonitor->VerifyFound();
12430 // error w/ non-ds opt or GENERAL layout for color attachment
12431 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12432 m_errorMonitor->SetDesiredFailureMsg(
12433 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesc5dd9bc2016-08-09 08:17:14 +120012434 "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 -060012435 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12436 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012437 // For this error we need a valid renderpass so create default one
12438 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12439 attach.attachment = 0;
12440 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
12441 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12442 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12443 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12444 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12445 // Can't do a CLEAR load on READ_ONLY initialLayout
12446 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12447 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12448 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12450 " with invalid first layout "
12451 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
12452 "ONLY_OPTIMAL");
12453 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12454 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012455
12456 vkDestroyImage(m_device->device(), src_image, NULL);
12457 vkDestroyImage(m_device->device(), dst_image, NULL);
12458}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012459
12460TEST_F(VkLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
12461 TEST_DESCRIPTION("Positive test where we create a renderpass with an "
12462 "attachment that uses LOAD_OP_CLEAR, the first subpass "
12463 "has a valid layout, and a second subpass then uses a "
12464 "valid *READ_ONLY* layout.");
12465 m_errorMonitor->ExpectSuccess();
12466 ASSERT_NO_FATAL_FAILURE(InitState());
12467
12468 VkAttachmentReference attach[2] = {};
12469 attach[0].attachment = 0;
12470 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
12471 attach[1].attachment = 0;
12472 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12473 VkSubpassDescription subpasses[2] = {};
12474 // First subpass clears DS attach on load
12475 subpasses[0].pDepthStencilAttachment = &attach[0];
12476 // 2nd subpass reads in DS as input attachment
12477 subpasses[1].inputAttachmentCount = 1;
12478 subpasses[1].pInputAttachments = &attach[1];
12479 VkAttachmentDescription attach_desc = {};
12480 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
12481 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12482 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12483 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12484 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12485 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12486 attach_desc.initialLayout =
12487 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
12488 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12489 VkRenderPassCreateInfo rpci = {};
12490 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
12491 rpci.attachmentCount = 1;
12492 rpci.pAttachments = &attach_desc;
12493 rpci.subpassCount = 2;
12494 rpci.pSubpasses = subpasses;
12495
12496 // Now create RenderPass and verify no errors
12497 VkRenderPass rp;
12498 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12499 m_errorMonitor->VerifyNotFound();
12500
12501 vkDestroyRenderPass(m_device->device(), rp, NULL);
12502}
Tobin Ehlis4af23302016-07-19 10:50:30 -060012503
12504TEST_F(VkLayerTest, FramebufferIncompatible) {
12505 TEST_DESCRIPTION("Bind a secondary command buffer with with a framebuffer "
12506 "that does not match the framebuffer for the active "
12507 "renderpass.");
12508 ASSERT_NO_FATAL_FAILURE(InitState());
12509 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12510
12511 // A renderpass with one color attachment.
12512 VkAttachmentDescription attachment = {
12513 0,
12514 VK_FORMAT_B8G8R8A8_UNORM,
12515 VK_SAMPLE_COUNT_1_BIT,
12516 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12517 VK_ATTACHMENT_STORE_OP_STORE,
12518 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12519 VK_ATTACHMENT_STORE_OP_DONT_CARE,
12520 VK_IMAGE_LAYOUT_UNDEFINED,
12521 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
12522
12523 VkAttachmentReference att_ref = {0,
12524 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
12525
12526 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS,
12527 0, nullptr,
12528 1, &att_ref,
12529 nullptr, nullptr,
12530 0, nullptr};
12531
12532 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
12533 nullptr,
12534 0,
12535 1,
12536 &attachment,
12537 1,
12538 &subpass,
12539 0,
12540 nullptr};
12541
12542 VkRenderPass rp;
12543 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
12544 ASSERT_VK_SUCCESS(err);
12545
12546 // A compatible framebuffer.
12547 VkImageObj image(m_device);
12548 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM,
12549 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12550 ASSERT_TRUE(image.initialized());
12551
12552 VkImageViewCreateInfo ivci = {
12553 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
12554 nullptr,
12555 0,
12556 image.handle(),
12557 VK_IMAGE_VIEW_TYPE_2D,
12558 VK_FORMAT_B8G8R8A8_UNORM,
12559 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
12560 VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
12561 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
12562 };
12563 VkImageView view;
12564 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
12565 ASSERT_VK_SUCCESS(err);
12566
12567 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
12568 nullptr,
12569 0,
12570 rp,
12571 1,
12572 &view,
12573 32,
12574 32,
12575 1};
12576 VkFramebuffer fb;
12577 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
12578 ASSERT_VK_SUCCESS(err);
12579
12580 VkCommandBufferAllocateInfo cbai = {};
12581 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12582 cbai.commandPool = m_commandPool;
12583 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12584 cbai.commandBufferCount = 1;
12585
12586 VkCommandBuffer sec_cb;
12587 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
12588 ASSERT_VK_SUCCESS(err);
12589 VkCommandBufferBeginInfo cbbi = {};
12590 VkCommandBufferInheritanceInfo cbii = {};
12591 cbii.renderPass = renderPass();
12592 cbii.framebuffer = fb;
12593 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12594 cbbi.pNext = NULL;
12595 cbbi.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
12596 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
12597 cbbi.pInheritanceInfo = &cbii;
12598 vkBeginCommandBuffer(sec_cb, &cbbi);
12599 vkEndCommandBuffer(sec_cb);
12600
12601 BeginCommandBuffer();
12602
12603 m_errorMonitor->SetDesiredFailureMsg(
12604 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12605 " that is not the same as the primaryCB's current active framebuffer ");
12606 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
12607 m_errorMonitor->VerifyFound();
12608 // Cleanup
12609 vkDestroyImageView(m_device->device(), view, NULL);
12610 vkDestroyRenderPass(m_device->device(), rp, NULL);
12611 vkDestroyFramebuffer(m_device->device(), fb, NULL);
12612}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012613
12614TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
12615 TEST_DESCRIPTION("If logicOp is available on the device, set it to an "
12616 "invalid value. If logicOp is not available, attempt to "
12617 "use it and verify that we see the correct error.");
12618 ASSERT_NO_FATAL_FAILURE(InitState());
12619 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12620
12621 auto features = m_device->phy().features();
12622 // Set the expected error depending on whether or not logicOp available
12623 if (VK_FALSE == features.logicOp) {
12624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12625 "If logic operations feature not "
12626 "enabled, logicOpEnable must be "
12627 "VK_FALSE");
12628 } else {
12629 m_errorMonitor->SetDesiredFailureMsg(
12630 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12631 ", logicOp must be a valid VkLogicOp value");
12632 }
12633 // Create a pipeline using logicOp
12634 VkResult err;
12635
12636 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12637 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12638
12639 VkPipelineLayout pipeline_layout;
12640 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
12641 &pipeline_layout);
12642 ASSERT_VK_SUCCESS(err);
12643
12644 VkPipelineViewportStateCreateInfo vp_state_ci = {};
12645 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
12646 vp_state_ci.viewportCount = 1;
12647 VkViewport vp = {}; // Just need dummy vp to point to
12648 vp_state_ci.pViewports = &vp;
12649 vp_state_ci.scissorCount = 1;
12650 VkRect2D scissors = {}; // Dummy scissors to point to
12651 vp_state_ci.pScissors = &scissors;
12652 // No dynamic state
12653 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
12654 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
12655
12656 VkPipelineShaderStageCreateInfo shaderStages[2];
12657 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
12658
12659 VkShaderObj vs(m_device, bindStateVertShaderText,
12660 VK_SHADER_STAGE_VERTEX_BIT, this);
12661 VkShaderObj fs(m_device, bindStateFragShaderText,
12662 VK_SHADER_STAGE_FRAGMENT_BIT,
12663 this);
12664 shaderStages[0] = vs.GetStageCreateInfo();
12665 shaderStages[1] = fs.GetStageCreateInfo();
12666
12667 VkPipelineVertexInputStateCreateInfo vi_ci = {};
12668 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
12669
12670 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
12671 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
12672 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
12673
12674 VkPipelineRasterizationStateCreateInfo rs_ci = {};
12675 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
12676
12677 VkPipelineColorBlendAttachmentState att = {};
12678 att.blendEnable = VK_FALSE;
12679 att.colorWriteMask = 0xf;
12680
12681 VkPipelineColorBlendStateCreateInfo cb_ci = {};
12682 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
12683 // Enable logicOp & set logicOp to value 1 beyond allowed entries
12684 cb_ci.logicOpEnable = VK_TRUE;
12685 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
12686 cb_ci.attachmentCount = 1;
12687 cb_ci.pAttachments = &att;
12688
12689 VkGraphicsPipelineCreateInfo gp_ci = {};
12690 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
12691 gp_ci.stageCount = 2;
12692 gp_ci.pStages = shaderStages;
12693 gp_ci.pVertexInputState = &vi_ci;
12694 gp_ci.pInputAssemblyState = &ia_ci;
12695 gp_ci.pViewportState = &vp_state_ci;
12696 gp_ci.pRasterizationState = &rs_ci;
12697 gp_ci.pColorBlendState = &cb_ci;
12698 gp_ci.pDynamicState = &dyn_state_ci;
12699 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
12700 gp_ci.layout = pipeline_layout;
12701 gp_ci.renderPass = renderPass();
12702
12703 VkPipelineCacheCreateInfo pc_ci = {};
12704 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
12705
12706 VkPipeline pipeline;
12707 VkPipelineCache pipelineCache;
12708 err =
12709 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
12710 ASSERT_VK_SUCCESS(err);
12711
12712 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
12713 &gp_ci, NULL, &pipeline);
12714 m_errorMonitor->VerifyFound();
12715 if (VK_SUCCESS == err) {
12716 vkDestroyPipeline(m_device->device(), pipeline, NULL);
12717 }
12718 m_errorMonitor->VerifyFound();
12719 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
12720 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12721}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012722#endif // DRAW_STATE_TESTS
12723
Tobin Ehlis0788f522015-05-26 16:11:58 -060012724#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060012725#if GTEST_IS_THREADSAFE
12726struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012727 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012728 VkEvent event;
12729 bool bailout;
12730};
12731
Karl Schultz6addd812016-02-02 17:17:23 -070012732extern "C" void *AddToCommandBuffer(void *arg) {
12733 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012734
Mike Stroyana6d14942016-07-13 15:10:05 -060012735 for (int i = 0; i < 80000; i++) {
Karl Schultz6addd812016-02-02 17:17:23 -070012736 vkCmdSetEvent(data->commandBuffer, data->event,
12737 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012738 if (data->bailout) {
12739 break;
12740 }
12741 }
12742 return NULL;
12743}
12744
Karl Schultz6addd812016-02-02 17:17:23 -070012745TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012746 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012747
Karl Schultz6addd812016-02-02 17:17:23 -070012748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12749 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012750
Mike Stroyanaccf7692015-05-12 16:00:45 -060012751 ASSERT_NO_FATAL_FAILURE(InitState());
12752 ASSERT_NO_FATAL_FAILURE(InitViewport());
12753 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12754
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012755 // Calls AllocateCommandBuffers
12756 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012757
12758 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012759 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012760
12761 VkEventCreateInfo event_info;
12762 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012763 VkResult err;
12764
12765 memset(&event_info, 0, sizeof(event_info));
12766 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12767
Chia-I Wuf7458c52015-10-26 21:10:41 +080012768 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012769 ASSERT_VK_SUCCESS(err);
12770
Mike Stroyanaccf7692015-05-12 16:00:45 -060012771 err = vkResetEvent(device(), event);
12772 ASSERT_VK_SUCCESS(err);
12773
12774 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012775 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012776 data.event = event;
12777 data.bailout = false;
12778 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060012779
12780 // First do some correct operations using multiple threads.
12781 // Add many entries to command buffer from another thread.
12782 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
12783 // Make non-conflicting calls from this thread at the same time.
12784 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060012785 uint32_t count;
12786 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060012787 }
12788 test_platform_thread_join(thread, NULL);
12789
12790 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060012791 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012792 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012793 // Add many entries to command buffer from this thread at the same time.
12794 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012795
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012796 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012797 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012798
Mike Stroyan10b8cb72016-01-22 15:22:03 -070012799 m_errorMonitor->SetBailout(NULL);
12800
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012801 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012802
Chia-I Wuf7458c52015-10-26 21:10:41 +080012803 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012804}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012805#endif // GTEST_IS_THREADSAFE
12806#endif // THREADING_TESTS
12807
Chris Forbes9f7ff632015-05-25 11:13:08 +120012808#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070012809TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012810 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
12811 "with an impossible code size");
12812
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012813 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012814 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012815
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012816 ASSERT_NO_FATAL_FAILURE(InitState());
12817 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12818
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012819 VkShaderModule module;
12820 VkShaderModuleCreateInfo moduleCreateInfo;
12821 struct icd_spv_header spv;
12822
12823 spv.magic = ICD_SPV_MAGIC;
12824 spv.version = ICD_SPV_VERSION;
12825 spv.gen_magic = 0;
12826
12827 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12828 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012829 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012830 moduleCreateInfo.codeSize = 4;
12831 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012832 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012833
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012834 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012835}
12836
Karl Schultz6addd812016-02-02 17:17:23 -070012837TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012838 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
12839 "with a bad magic number");
12840
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012841 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012842 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012843
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012844 ASSERT_NO_FATAL_FAILURE(InitState());
12845 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12846
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012847 VkShaderModule module;
12848 VkShaderModuleCreateInfo moduleCreateInfo;
12849 struct icd_spv_header spv;
12850
12851 spv.magic = ~ICD_SPV_MAGIC;
12852 spv.version = ICD_SPV_VERSION;
12853 spv.gen_magic = 0;
12854
12855 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12856 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012857 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012858 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12859 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012860 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012861
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012862 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012863}
12864
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012865#if 0
12866// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070012867TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012869 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012870
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012871 ASSERT_NO_FATAL_FAILURE(InitState());
12872 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12873
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012874 VkShaderModule module;
12875 VkShaderModuleCreateInfo moduleCreateInfo;
12876 struct icd_spv_header spv;
12877
12878 spv.magic = ICD_SPV_MAGIC;
12879 spv.version = ~ICD_SPV_VERSION;
12880 spv.gen_magic = 0;
12881
12882 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12883 moduleCreateInfo.pNext = NULL;
12884
Karl Schultz6addd812016-02-02 17:17:23 -070012885 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012886 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12887 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012888 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012889
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012890 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012891}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012892#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012893
Karl Schultz6addd812016-02-02 17:17:23 -070012894TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012895 TEST_DESCRIPTION("Test that a warning is produced for a vertex output that "
12896 "is not consumed by the fragment stage");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012898 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012899
Chris Forbes9f7ff632015-05-25 11:13:08 +120012900 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012901 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012902
12903 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012904 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120012905 "\n"
12906 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012907 "out gl_PerVertex {\n"
12908 " vec4 gl_Position;\n"
12909 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120012910 "void main(){\n"
12911 " gl_Position = vec4(1);\n"
12912 " x = 0;\n"
12913 "}\n";
12914 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012915 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120012916 "\n"
12917 "layout(location=0) out vec4 color;\n"
12918 "void main(){\n"
12919 " color = vec4(1);\n"
12920 "}\n";
12921
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012922 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12923 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012924
12925 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012926 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012927 pipe.AddShader(&vs);
12928 pipe.AddShader(&fs);
12929
Chris Forbes9f7ff632015-05-25 11:13:08 +120012930 VkDescriptorSetObj descriptorSet(m_device);
12931 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012932 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012933
Tony Barbour5781e8f2015-08-04 16:23:11 -060012934 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012935
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012936 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012937}
Chris Forbes9f7ff632015-05-25 11:13:08 +120012938
Karl Schultz6addd812016-02-02 17:17:23 -070012939TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012940 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
12941 "which is not present in the outputs of the previous stage");
12942
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012944 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012945
Chris Forbes59cb88d2015-05-25 11:13:13 +120012946 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012947 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012948
12949 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012950 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120012951 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012952 "out gl_PerVertex {\n"
12953 " vec4 gl_Position;\n"
12954 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120012955 "void main(){\n"
12956 " gl_Position = vec4(1);\n"
12957 "}\n";
12958 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012959 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120012960 "\n"
12961 "layout(location=0) in float x;\n"
12962 "layout(location=0) out vec4 color;\n"
12963 "void main(){\n"
12964 " color = vec4(x);\n"
12965 "}\n";
12966
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012967 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12968 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012969
12970 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012971 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012972 pipe.AddShader(&vs);
12973 pipe.AddShader(&fs);
12974
Chris Forbes59cb88d2015-05-25 11:13:13 +120012975 VkDescriptorSetObj descriptorSet(m_device);
12976 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012977 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012978
Tony Barbour5781e8f2015-08-04 16:23:11 -060012979 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012980
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012981 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012982}
12983
Karl Schultz6addd812016-02-02 17:17:23 -070012984TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012985 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
12986 "within an interace block, which is not present in the outputs "
12987 "of the previous stage.");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012988 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012989 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012990
12991 ASSERT_NO_FATAL_FAILURE(InitState());
12992 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12993
12994 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012995 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012996 "\n"
12997 "out gl_PerVertex {\n"
12998 " vec4 gl_Position;\n"
12999 "};\n"
13000 "void main(){\n"
13001 " gl_Position = vec4(1);\n"
13002 "}\n";
13003 char const *fsSource =
13004 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130013005 "\n"
13006 "in block { layout(location=0) float x; } ins;\n"
13007 "layout(location=0) out vec4 color;\n"
13008 "void main(){\n"
13009 " color = vec4(ins.x);\n"
13010 "}\n";
13011
13012 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13013 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13014
13015 VkPipelineObj pipe(m_device);
13016 pipe.AddColorAttachment();
13017 pipe.AddShader(&vs);
13018 pipe.AddShader(&fs);
13019
13020 VkDescriptorSetObj descriptorSet(m_device);
13021 descriptorSet.AppendDummy();
13022 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13023
13024 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13025
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013026 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013027}
13028
Karl Schultz6addd812016-02-02 17:17:23 -070013029TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013030 TEST_DESCRIPTION("Test that an error is produced for mismatched array sizes "
13031 "across the VS->FS interface");
Chris Forbes0036fd12016-01-26 14:19:49 +130013032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +130013033 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -070013034 "output arr[2] of float32' vs 'ptr to "
13035 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130013036
13037 ASSERT_NO_FATAL_FAILURE(InitState());
13038 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13039
13040 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013041 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130013042 "\n"
13043 "layout(location=0) out float x[2];\n"
13044 "out gl_PerVertex {\n"
13045 " vec4 gl_Position;\n"
13046 "};\n"
13047 "void main(){\n"
13048 " x[0] = 0; x[1] = 0;\n"
13049 " gl_Position = vec4(1);\n"
13050 "}\n";
13051 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013052 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130013053 "\n"
13054 "layout(location=0) in float x[3];\n"
13055 "layout(location=0) out vec4 color;\n"
13056 "void main(){\n"
13057 " color = vec4(x[0] + x[1] + x[2]);\n"
13058 "}\n";
13059
13060 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13061 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13062
13063 VkPipelineObj pipe(m_device);
13064 pipe.AddColorAttachment();
13065 pipe.AddShader(&vs);
13066 pipe.AddShader(&fs);
13067
13068 VkDescriptorSetObj descriptorSet(m_device);
13069 descriptorSet.AppendDummy();
13070 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13071
13072 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13073
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013074 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130013075}
13076
Karl Schultz6addd812016-02-02 17:17:23 -070013077TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013078 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
13079 "the VS->FS interface");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013080 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013081 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013082
Chris Forbesb56af562015-05-25 11:13:17 +120013083 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013084 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120013085
13086 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013087 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120013088 "\n"
13089 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070013090 "out gl_PerVertex {\n"
13091 " vec4 gl_Position;\n"
13092 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +120013093 "void main(){\n"
13094 " x = 0;\n"
13095 " gl_Position = vec4(1);\n"
13096 "}\n";
13097 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013098 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120013099 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013100 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +120013101 "layout(location=0) out vec4 color;\n"
13102 "void main(){\n"
13103 " color = vec4(x);\n"
13104 "}\n";
13105
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013106 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13107 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120013108
13109 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013110 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120013111 pipe.AddShader(&vs);
13112 pipe.AddShader(&fs);
13113
Chris Forbesb56af562015-05-25 11:13:17 +120013114 VkDescriptorSetObj descriptorSet(m_device);
13115 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013116 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120013117
Tony Barbour5781e8f2015-08-04 16:23:11 -060013118 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120013119
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013120 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120013121}
13122
Karl Schultz6addd812016-02-02 17:17:23 -070013123TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013124 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
13125 "the VS->FS interface, when the variable is contained within "
13126 "an interface block");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013127 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013128 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013129
13130 ASSERT_NO_FATAL_FAILURE(InitState());
13131 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13132
13133 char const *vsSource =
13134 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130013135 "\n"
13136 "out block { layout(location=0) int x; } outs;\n"
13137 "out gl_PerVertex {\n"
13138 " vec4 gl_Position;\n"
13139 "};\n"
13140 "void main(){\n"
13141 " outs.x = 0;\n"
13142 " gl_Position = vec4(1);\n"
13143 "}\n";
13144 char const *fsSource =
13145 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130013146 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013147 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +130013148 "layout(location=0) out vec4 color;\n"
13149 "void main(){\n"
13150 " color = vec4(ins.x);\n"
13151 "}\n";
13152
13153 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13154 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13155
13156 VkPipelineObj pipe(m_device);
13157 pipe.AddColorAttachment();
13158 pipe.AddShader(&vs);
13159 pipe.AddShader(&fs);
13160
13161 VkDescriptorSetObj descriptorSet(m_device);
13162 descriptorSet.AppendDummy();
13163 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13164
13165 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13166
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013167 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013168}
13169
13170TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013171 TEST_DESCRIPTION("Test that an error is produced for location mismatches across "
13172 "the VS->FS interface; This should manifest as a not-written/not-consumed "
13173 "pair, but flushes out broken walking of the interfaces");
Chris Forbese9928822016-02-17 14:44:52 +130013174 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13175 "location 0.0 which is not written by vertex shader");
13176
13177 ASSERT_NO_FATAL_FAILURE(InitState());
13178 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13179
13180 char const *vsSource =
13181 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013182 "\n"
13183 "out block { layout(location=1) float x; } outs;\n"
13184 "out gl_PerVertex {\n"
13185 " vec4 gl_Position;\n"
13186 "};\n"
13187 "void main(){\n"
13188 " outs.x = 0;\n"
13189 " gl_Position = vec4(1);\n"
13190 "}\n";
13191 char const *fsSource =
13192 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013193 "\n"
13194 "in block { layout(location=0) float x; } ins;\n"
13195 "layout(location=0) out vec4 color;\n"
13196 "void main(){\n"
13197 " color = vec4(ins.x);\n"
13198 "}\n";
13199
13200 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13201 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13202
13203 VkPipelineObj pipe(m_device);
13204 pipe.AddColorAttachment();
13205 pipe.AddShader(&vs);
13206 pipe.AddShader(&fs);
13207
13208 VkDescriptorSetObj descriptorSet(m_device);
13209 descriptorSet.AppendDummy();
13210 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13211
13212 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13213
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013214 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013215}
13216
13217TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013218 TEST_DESCRIPTION("Test that an error is produced for component mismatches across the "
13219 "VS->FS interface. It's not enough to have the same set of locations in "
13220 "use; matching is defined in terms of spirv variables.");
Chris Forbese9928822016-02-17 14:44:52 +130013221 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13222 "location 0.1 which is not written by vertex shader");
13223
13224 ASSERT_NO_FATAL_FAILURE(InitState());
13225 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13226
13227 char const *vsSource =
13228 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013229 "\n"
13230 "out block { layout(location=0, component=0) float x; } outs;\n"
13231 "out gl_PerVertex {\n"
13232 " vec4 gl_Position;\n"
13233 "};\n"
13234 "void main(){\n"
13235 " outs.x = 0;\n"
13236 " gl_Position = vec4(1);\n"
13237 "}\n";
13238 char const *fsSource =
13239 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130013240 "\n"
13241 "in block { layout(location=0, component=1) float x; } ins;\n"
13242 "layout(location=0) out vec4 color;\n"
13243 "void main(){\n"
13244 " color = vec4(ins.x);\n"
13245 "}\n";
13246
13247 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13248 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13249
13250 VkPipelineObj pipe(m_device);
13251 pipe.AddColorAttachment();
13252 pipe.AddShader(&vs);
13253 pipe.AddShader(&fs);
13254
13255 VkDescriptorSetObj descriptorSet(m_device);
13256 descriptorSet.AppendDummy();
13257 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13258
13259 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13260
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013261 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013262}
13263
Karl Schultz6addd812016-02-02 17:17:23 -070013264TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013265 TEST_DESCRIPTION("Test that a warning is produced for a vertex attribute which is "
13266 "not consumed by the vertex shader");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013267 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013268 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013269
Chris Forbesde136e02015-05-25 11:13:28 +120013270 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013271 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120013272
13273 VkVertexInputBindingDescription input_binding;
13274 memset(&input_binding, 0, sizeof(input_binding));
13275
13276 VkVertexInputAttributeDescription input_attrib;
13277 memset(&input_attrib, 0, sizeof(input_attrib));
13278 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13279
13280 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013281 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120013282 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013283 "out gl_PerVertex {\n"
13284 " vec4 gl_Position;\n"
13285 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +120013286 "void main(){\n"
13287 " gl_Position = vec4(1);\n"
13288 "}\n";
13289 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013290 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120013291 "\n"
13292 "layout(location=0) out vec4 color;\n"
13293 "void main(){\n"
13294 " color = vec4(1);\n"
13295 "}\n";
13296
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013297 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13298 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120013299
13300 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013301 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120013302 pipe.AddShader(&vs);
13303 pipe.AddShader(&fs);
13304
13305 pipe.AddVertexInputBindings(&input_binding, 1);
13306 pipe.AddVertexInputAttribs(&input_attrib, 1);
13307
Chris Forbesde136e02015-05-25 11:13:28 +120013308 VkDescriptorSetObj descriptorSet(m_device);
13309 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013310 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120013311
Tony Barbour5781e8f2015-08-04 16:23:11 -060013312 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120013313
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013314 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120013315}
13316
Karl Schultz6addd812016-02-02 17:17:23 -070013317TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013318 TEST_DESCRIPTION("Test that a warning is produced for a location mismatch on "
13319 "vertex attributes. This flushes out bad behavior in the interface walker");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013321 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +130013322
13323 ASSERT_NO_FATAL_FAILURE(InitState());
13324 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13325
13326 VkVertexInputBindingDescription input_binding;
13327 memset(&input_binding, 0, sizeof(input_binding));
13328
13329 VkVertexInputAttributeDescription input_attrib;
13330 memset(&input_attrib, 0, sizeof(input_attrib));
13331 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13332
13333 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013334 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130013335 "\n"
13336 "layout(location=1) in float x;\n"
13337 "out gl_PerVertex {\n"
13338 " vec4 gl_Position;\n"
13339 "};\n"
13340 "void main(){\n"
13341 " gl_Position = vec4(x);\n"
13342 "}\n";
13343 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013344 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130013345 "\n"
13346 "layout(location=0) out vec4 color;\n"
13347 "void main(){\n"
13348 " color = vec4(1);\n"
13349 "}\n";
13350
13351 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13352 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13353
13354 VkPipelineObj pipe(m_device);
13355 pipe.AddColorAttachment();
13356 pipe.AddShader(&vs);
13357 pipe.AddShader(&fs);
13358
13359 pipe.AddVertexInputBindings(&input_binding, 1);
13360 pipe.AddVertexInputAttribs(&input_attrib, 1);
13361
13362 VkDescriptorSetObj descriptorSet(m_device);
13363 descriptorSet.AppendDummy();
13364 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13365
13366 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13367
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013368 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130013369}
13370
Karl Schultz6addd812016-02-02 17:17:23 -070013371TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013372 TEST_DESCRIPTION("Test that an error is produced for a VS input which is not "
13373 "provided by a vertex attribute");
Karl Schultz6addd812016-02-02 17:17:23 -070013374 m_errorMonitor->SetDesiredFailureMsg(
13375 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013376 "VS consumes input at location 0 but not provided");
13377
Chris Forbes62e8e502015-05-25 11:13:29 +120013378 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013379 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120013380
13381 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013382 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120013383 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013384 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -070013385 "out gl_PerVertex {\n"
13386 " vec4 gl_Position;\n"
13387 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120013388 "void main(){\n"
13389 " gl_Position = x;\n"
13390 "}\n";
13391 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013392 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120013393 "\n"
13394 "layout(location=0) out vec4 color;\n"
13395 "void main(){\n"
13396 " color = vec4(1);\n"
13397 "}\n";
13398
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013399 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13400 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120013401
13402 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013403 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120013404 pipe.AddShader(&vs);
13405 pipe.AddShader(&fs);
13406
Chris Forbes62e8e502015-05-25 11:13:29 +120013407 VkDescriptorSetObj descriptorSet(m_device);
13408 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013409 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120013410
Tony Barbour5781e8f2015-08-04 16:23:11 -060013411 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120013412
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013413 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120013414}
13415
Karl Schultz6addd812016-02-02 17:17:23 -070013416TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013417 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the "
13418 "fundamental type (float/int/uint) of an attribute and the "
13419 "VS input that consumes it");
Karl Schultz6addd812016-02-02 17:17:23 -070013420 m_errorMonitor->SetDesiredFailureMsg(
13421 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013422 "location 0 does not match VS input type");
13423
Chris Forbesc97d98e2015-05-25 11:13:31 +120013424 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013425 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013426
13427 VkVertexInputBindingDescription input_binding;
13428 memset(&input_binding, 0, sizeof(input_binding));
13429
13430 VkVertexInputAttributeDescription input_attrib;
13431 memset(&input_attrib, 0, sizeof(input_attrib));
13432 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13433
13434 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013435 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120013436 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013437 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070013438 "out gl_PerVertex {\n"
13439 " vec4 gl_Position;\n"
13440 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120013441 "void main(){\n"
13442 " gl_Position = vec4(x);\n"
13443 "}\n";
13444 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013445 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120013446 "\n"
13447 "layout(location=0) out vec4 color;\n"
13448 "void main(){\n"
13449 " color = vec4(1);\n"
13450 "}\n";
13451
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013452 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13453 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013454
13455 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013456 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013457 pipe.AddShader(&vs);
13458 pipe.AddShader(&fs);
13459
13460 pipe.AddVertexInputBindings(&input_binding, 1);
13461 pipe.AddVertexInputAttribs(&input_attrib, 1);
13462
Chris Forbesc97d98e2015-05-25 11:13:31 +120013463 VkDescriptorSetObj descriptorSet(m_device);
13464 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013465 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013466
Tony Barbour5781e8f2015-08-04 16:23:11 -060013467 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013468
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013469 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013470}
13471
Chris Forbesc68b43c2016-04-06 11:18:47 +120013472TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013473 TEST_DESCRIPTION("Test that an error is produced for a pipeline containing multiple "
13474 "shaders for the same stage");
Chris Forbesc68b43c2016-04-06 11:18:47 +120013475 m_errorMonitor->SetDesiredFailureMsg(
13476 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13477 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
13478
13479 ASSERT_NO_FATAL_FAILURE(InitState());
13480 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13481
13482 char const *vsSource =
13483 "#version 450\n"
13484 "\n"
13485 "out gl_PerVertex {\n"
13486 " vec4 gl_Position;\n"
13487 "};\n"
13488 "void main(){\n"
13489 " gl_Position = vec4(1);\n"
13490 "}\n";
13491 char const *fsSource =
13492 "#version 450\n"
13493 "\n"
13494 "layout(location=0) out vec4 color;\n"
13495 "void main(){\n"
13496 " color = vec4(1);\n"
13497 "}\n";
13498
13499 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13500 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13501
13502 VkPipelineObj pipe(m_device);
13503 pipe.AddColorAttachment();
13504 pipe.AddShader(&vs);
13505 pipe.AddShader(&vs);
13506 pipe.AddShader(&fs);
13507
13508 VkDescriptorSetObj descriptorSet(m_device);
13509 descriptorSet.AppendDummy();
13510 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13511
13512 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13513
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013514 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120013515}
13516
Karl Schultz6addd812016-02-02 17:17:23 -070013517TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013518 TEST_DESCRIPTION("Test that pipeline validation accepts matrices passed "
13519 "as vertex attributes");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013520 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130013521
13522 ASSERT_NO_FATAL_FAILURE(InitState());
13523 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13524
13525 VkVertexInputBindingDescription input_binding;
13526 memset(&input_binding, 0, sizeof(input_binding));
13527
13528 VkVertexInputAttributeDescription input_attribs[2];
13529 memset(input_attribs, 0, sizeof(input_attribs));
13530
13531 for (int i = 0; i < 2; i++) {
13532 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
13533 input_attribs[i].location = i;
13534 }
13535
13536 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013537 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013538 "\n"
13539 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070013540 "out gl_PerVertex {\n"
13541 " vec4 gl_Position;\n"
13542 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013543 "void main(){\n"
13544 " gl_Position = x[0] + x[1];\n"
13545 "}\n";
13546 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013547 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013548 "\n"
13549 "layout(location=0) out vec4 color;\n"
13550 "void main(){\n"
13551 " color = vec4(1);\n"
13552 "}\n";
13553
13554 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13555 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13556
13557 VkPipelineObj pipe(m_device);
13558 pipe.AddColorAttachment();
13559 pipe.AddShader(&vs);
13560 pipe.AddShader(&fs);
13561
13562 pipe.AddVertexInputBindings(&input_binding, 1);
13563 pipe.AddVertexInputAttribs(input_attribs, 2);
13564
13565 VkDescriptorSetObj descriptorSet(m_device);
13566 descriptorSet.AppendDummy();
13567 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13568
13569 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13570
13571 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013572 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130013573}
13574
Chris Forbes2682b242015-11-24 11:13:14 +130013575TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
13576{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013577 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130013578
13579 ASSERT_NO_FATAL_FAILURE(InitState());
13580 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13581
13582 VkVertexInputBindingDescription input_binding;
13583 memset(&input_binding, 0, sizeof(input_binding));
13584
13585 VkVertexInputAttributeDescription input_attribs[2];
13586 memset(input_attribs, 0, sizeof(input_attribs));
13587
13588 for (int i = 0; i < 2; i++) {
13589 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
13590 input_attribs[i].location = i;
13591 }
13592
13593 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013594 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013595 "\n"
13596 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -070013597 "out gl_PerVertex {\n"
13598 " vec4 gl_Position;\n"
13599 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013600 "void main(){\n"
13601 " gl_Position = x[0] + x[1];\n"
13602 "}\n";
13603 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013604 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130013605 "\n"
13606 "layout(location=0) out vec4 color;\n"
13607 "void main(){\n"
13608 " color = vec4(1);\n"
13609 "}\n";
13610
13611 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13612 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13613
13614 VkPipelineObj pipe(m_device);
13615 pipe.AddColorAttachment();
13616 pipe.AddShader(&vs);
13617 pipe.AddShader(&fs);
13618
13619 pipe.AddVertexInputBindings(&input_binding, 1);
13620 pipe.AddVertexInputAttribs(input_attribs, 2);
13621
13622 VkDescriptorSetObj descriptorSet(m_device);
13623 descriptorSet.AppendDummy();
13624 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13625
13626 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13627
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013628 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130013629}
Chris Forbes2682b242015-11-24 11:13:14 +130013630
Chris Forbesbc290ce2016-07-06 12:01:49 +120013631TEST_F(VkLayerTest, CreatePipelineAttribComponents)
13632{
Chris Forbes1cc79542016-07-20 11:13:44 +120013633 TEST_DESCRIPTION("Test that pipeline validation accepts consuming a vertex attribute "
13634 "through multiple VS inputs, each consuming a different subset of the "
13635 "components.");
Chris Forbesbc290ce2016-07-06 12:01:49 +120013636 m_errorMonitor->ExpectSuccess();
13637
13638 ASSERT_NO_FATAL_FAILURE(InitState());
13639 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13640
13641 VkVertexInputBindingDescription input_binding;
13642 memset(&input_binding, 0, sizeof(input_binding));
13643
13644 VkVertexInputAttributeDescription input_attribs[3];
13645 memset(input_attribs, 0, sizeof(input_attribs));
13646
13647 for (int i = 0; i < 3; i++) {
13648 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
13649 input_attribs[i].location = i;
13650 }
13651
13652 char const *vsSource =
13653 "#version 450\n"
13654 "\n"
13655 "layout(location=0) in vec4 x;\n"
13656 "layout(location=1) in vec3 y1;\n"
13657 "layout(location=1, component=3) in float y2;\n"
13658 "layout(location=2) in vec4 z;\n"
13659 "out gl_PerVertex {\n"
13660 " vec4 gl_Position;\n"
13661 "};\n"
13662 "void main(){\n"
13663 " gl_Position = x + vec4(y1, y2) + z;\n"
13664 "}\n";
13665 char const *fsSource =
13666 "#version 450\n"
13667 "\n"
13668 "layout(location=0) out vec4 color;\n"
13669 "void main(){\n"
13670 " color = vec4(1);\n"
13671 "}\n";
13672
13673 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13674 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13675
13676 VkPipelineObj pipe(m_device);
13677 pipe.AddColorAttachment();
13678 pipe.AddShader(&vs);
13679 pipe.AddShader(&fs);
13680
13681 pipe.AddVertexInputBindings(&input_binding, 1);
13682 pipe.AddVertexInputAttribs(input_attribs, 3);
13683
13684 VkDescriptorSetObj descriptorSet(m_device);
13685 descriptorSet.AppendDummy();
13686 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13687
13688 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13689
13690 m_errorMonitor->VerifyNotFound();
13691}
13692
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013693TEST_F(VkLayerTest, CreatePipelineSimplePositive)
13694{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013695 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013696
13697 ASSERT_NO_FATAL_FAILURE(InitState());
13698 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13699
13700 char const *vsSource =
13701 "#version 450\n"
13702 "out gl_PerVertex {\n"
13703 " vec4 gl_Position;\n"
13704 "};\n"
13705 "void main(){\n"
13706 " gl_Position = vec4(0);\n"
13707 "}\n";
13708 char const *fsSource =
13709 "#version 450\n"
13710 "\n"
13711 "layout(location=0) out vec4 color;\n"
13712 "void main(){\n"
13713 " color = vec4(1);\n"
13714 "}\n";
13715
13716 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13717 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13718
13719 VkPipelineObj pipe(m_device);
13720 pipe.AddColorAttachment();
13721 pipe.AddShader(&vs);
13722 pipe.AddShader(&fs);
13723
13724 VkDescriptorSetObj descriptorSet(m_device);
13725 descriptorSet.AppendDummy();
13726 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13727
13728 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13729
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013730 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013731}
13732
Chris Forbes912c9192016-04-05 17:50:35 +120013733TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
13734{
Chris Forbes1cc79542016-07-20 11:13:44 +120013735 TEST_DESCRIPTION("Test that pipeline validation accepts the relaxed type matching rules "
13736 "set out in 14.1.3: fundamental type must match, and producer side must "
13737 "have at least as many components");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013738 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +120013739
13740 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
13741
13742 ASSERT_NO_FATAL_FAILURE(InitState());
13743 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13744
13745 char const *vsSource =
13746 "#version 450\n"
13747 "out gl_PerVertex {\n"
13748 " vec4 gl_Position;\n"
13749 "};\n"
13750 "layout(location=0) out vec3 x;\n"
13751 "layout(location=1) out ivec3 y;\n"
13752 "layout(location=2) out vec3 z;\n"
13753 "void main(){\n"
13754 " gl_Position = vec4(0);\n"
13755 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
13756 "}\n";
13757 char const *fsSource =
13758 "#version 450\n"
13759 "\n"
13760 "layout(location=0) out vec4 color;\n"
13761 "layout(location=0) in float x;\n"
13762 "layout(location=1) flat in int y;\n"
13763 "layout(location=2) in vec2 z;\n"
13764 "void main(){\n"
13765 " color = vec4(1 + x + y + z.x);\n"
13766 "}\n";
13767
13768 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13769 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13770
13771 VkPipelineObj pipe(m_device);
13772 pipe.AddColorAttachment();
13773 pipe.AddShader(&vs);
13774 pipe.AddShader(&fs);
13775
13776 VkDescriptorSetObj descriptorSet(m_device);
13777 descriptorSet.AppendDummy();
13778 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13779
Mike Stroyan255e9582016-06-24 09:49:32 -060013780 VkResult err = VK_SUCCESS;
13781 err =
13782 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13783 ASSERT_VK_SUCCESS(err);
13784
Chris Forbes912c9192016-04-05 17:50:35 +120013785
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013786 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +120013787}
13788
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013789TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
13790{
Chris Forbes1cc79542016-07-20 11:13:44 +120013791 TEST_DESCRIPTION("Test that pipeline validation accepts per-vertex variables "
13792 "passed between the TCS and TES stages");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013793 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013794
13795 ASSERT_NO_FATAL_FAILURE(InitState());
13796 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13797
Chris Forbesc1e852d2016-04-04 19:26:42 +120013798 if (!m_device->phy().features().tessellationShader) {
13799 printf("Device does not support tessellation shaders; skipped.\n");
13800 return;
13801 }
13802
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013803 char const *vsSource =
13804 "#version 450\n"
13805 "void main(){}\n";
13806 char const *tcsSource =
13807 "#version 450\n"
13808 "layout(location=0) out int x[];\n"
13809 "layout(vertices=3) out;\n"
13810 "void main(){\n"
13811 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
13812 " gl_TessLevelInner[0] = 1;\n"
13813 " x[gl_InvocationID] = gl_InvocationID;\n"
13814 "}\n";
13815 char const *tesSource =
13816 "#version 450\n"
13817 "layout(triangles, equal_spacing, cw) in;\n"
13818 "layout(location=0) in int x[];\n"
13819 "out gl_PerVertex { vec4 gl_Position; };\n"
13820 "void main(){\n"
13821 " gl_Position.xyz = gl_TessCoord;\n"
13822 " gl_Position.w = x[0] + x[1] + x[2];\n"
13823 "}\n";
13824 char const *fsSource =
13825 "#version 450\n"
13826 "layout(location=0) out vec4 color;\n"
13827 "void main(){\n"
13828 " color = vec4(1);\n"
13829 "}\n";
13830
13831 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13832 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
13833 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
13834 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13835
13836 VkPipelineInputAssemblyStateCreateInfo iasci{
13837 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
13838 nullptr,
13839 0,
13840 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
13841 VK_FALSE};
13842
Chris Forbesb4cacb62016-04-04 19:15:00 +120013843 VkPipelineTessellationStateCreateInfo tsci{
13844 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
13845 nullptr,
13846 0,
13847 3};
13848
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013849 VkPipelineObj pipe(m_device);
13850 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +120013851 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013852 pipe.AddColorAttachment();
13853 pipe.AddShader(&vs);
13854 pipe.AddShader(&tcs);
13855 pipe.AddShader(&tes);
13856 pipe.AddShader(&fs);
13857
13858 VkDescriptorSetObj descriptorSet(m_device);
13859 descriptorSet.AppendDummy();
13860 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13861
13862 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13863
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013864 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013865}
13866
Chris Forbesa0ab8152016-04-20 13:34:27 +120013867TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
13868{
Chris Forbes1cc79542016-07-20 11:13:44 +120013869 TEST_DESCRIPTION("Test that pipeline validation accepts a user-defined "
13870 "interface block passed into the geometry shader. This "
13871 "is interesting because the 'extra' array level is not "
13872 "present on the member type, but on the block instance.");
Chris Forbesa0ab8152016-04-20 13:34:27 +120013873 m_errorMonitor->ExpectSuccess();
13874
13875 ASSERT_NO_FATAL_FAILURE(InitState());
13876 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13877
13878 if (!m_device->phy().features().geometryShader) {
13879 printf("Device does not support geometry shaders; skipped.\n");
13880 return;
13881 }
13882
13883 char const *vsSource =
13884 "#version 450\n"
13885 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
13886 "void main(){\n"
13887 " vs_out.x = vec4(1);\n"
13888 "}\n";
13889 char const *gsSource =
13890 "#version 450\n"
13891 "layout(triangles) in;\n"
13892 "layout(triangle_strip, max_vertices=3) out;\n"
13893 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
13894 "out gl_PerVertex { vec4 gl_Position; };\n"
13895 "void main() {\n"
13896 " gl_Position = gs_in[0].x;\n"
13897 " EmitVertex();\n"
13898 "}\n";
13899 char const *fsSource =
13900 "#version 450\n"
13901 "layout(location=0) out vec4 color;\n"
13902 "void main(){\n"
13903 " color = vec4(1);\n"
13904 "}\n";
13905
13906 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13907 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
13908 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13909
13910 VkPipelineObj pipe(m_device);
13911 pipe.AddColorAttachment();
13912 pipe.AddShader(&vs);
13913 pipe.AddShader(&gs);
13914 pipe.AddShader(&fs);
13915
13916 VkDescriptorSetObj descriptorSet(m_device);
13917 descriptorSet.AppendDummy();
13918 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13919
13920 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13921
13922 m_errorMonitor->VerifyNotFound();
13923}
13924
Chris Forbesa0193bc2016-04-04 19:19:47 +120013925TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
13926{
Chris Forbes1cc79542016-07-20 11:13:44 +120013927 TEST_DESCRIPTION("Test that an error is produced for a variable output from "
13928 "the TCS without the patch decoration, but consumed in the TES "
13929 "with the decoration.");
Chris Forbesa0193bc2016-04-04 19:19:47 +120013930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13931 "is per-vertex in tessellation control shader stage "
13932 "but per-patch in tessellation evaluation shader stage");
13933
13934 ASSERT_NO_FATAL_FAILURE(InitState());
13935 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13936
Chris Forbesc1e852d2016-04-04 19:26:42 +120013937 if (!m_device->phy().features().tessellationShader) {
13938 printf("Device does not support tessellation shaders; skipped.\n");
13939 return;
13940 }
13941
Chris Forbesa0193bc2016-04-04 19:19:47 +120013942 char const *vsSource =
13943 "#version 450\n"
13944 "void main(){}\n";
13945 char const *tcsSource =
13946 "#version 450\n"
13947 "layout(location=0) out int x[];\n"
13948 "layout(vertices=3) out;\n"
13949 "void main(){\n"
13950 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
13951 " gl_TessLevelInner[0] = 1;\n"
13952 " x[gl_InvocationID] = gl_InvocationID;\n"
13953 "}\n";
13954 char const *tesSource =
13955 "#version 450\n"
13956 "layout(triangles, equal_spacing, cw) in;\n"
13957 "layout(location=0) patch in int x;\n"
13958 "out gl_PerVertex { vec4 gl_Position; };\n"
13959 "void main(){\n"
13960 " gl_Position.xyz = gl_TessCoord;\n"
13961 " gl_Position.w = x;\n"
13962 "}\n";
13963 char const *fsSource =
13964 "#version 450\n"
13965 "layout(location=0) out vec4 color;\n"
13966 "void main(){\n"
13967 " color = vec4(1);\n"
13968 "}\n";
13969
13970 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13971 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
13972 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
13973 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13974
13975 VkPipelineInputAssemblyStateCreateInfo iasci{
13976 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
13977 nullptr,
13978 0,
13979 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
13980 VK_FALSE};
13981
13982 VkPipelineTessellationStateCreateInfo tsci{
13983 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
13984 nullptr,
13985 0,
13986 3};
13987
13988 VkPipelineObj pipe(m_device);
13989 pipe.SetInputAssembly(&iasci);
13990 pipe.SetTessellation(&tsci);
13991 pipe.AddColorAttachment();
13992 pipe.AddShader(&vs);
13993 pipe.AddShader(&tcs);
13994 pipe.AddShader(&tes);
13995 pipe.AddShader(&fs);
13996
13997 VkDescriptorSetObj descriptorSet(m_device);
13998 descriptorSet.AppendDummy();
13999 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14000
14001 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14002
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014003 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014004}
14005
Karl Schultz6addd812016-02-02 17:17:23 -070014006TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014007 TEST_DESCRIPTION("Test that an error is produced for a vertex attribute setup where multiple "
14008 "bindings provide the same location");
Karl Schultz6addd812016-02-02 17:17:23 -070014009 m_errorMonitor->SetDesiredFailureMsg(
14010 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014011 "Duplicate vertex input binding descriptions for binding 0");
14012
Chris Forbes280ba2c2015-06-12 11:16:41 +120014013 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014014 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014015
14016 /* Two binding descriptions for binding 0 */
14017 VkVertexInputBindingDescription input_bindings[2];
14018 memset(input_bindings, 0, sizeof(input_bindings));
14019
14020 VkVertexInputAttributeDescription input_attrib;
14021 memset(&input_attrib, 0, sizeof(input_attrib));
14022 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14023
14024 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014025 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120014026 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070014027 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070014028 "out gl_PerVertex {\n"
14029 " vec4 gl_Position;\n"
14030 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120014031 "void main(){\n"
14032 " gl_Position = vec4(x);\n"
14033 "}\n";
14034 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014035 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120014036 "\n"
14037 "layout(location=0) out vec4 color;\n"
14038 "void main(){\n"
14039 " color = vec4(1);\n"
14040 "}\n";
14041
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014042 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14043 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014044
14045 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014046 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014047 pipe.AddShader(&vs);
14048 pipe.AddShader(&fs);
14049
14050 pipe.AddVertexInputBindings(input_bindings, 2);
14051 pipe.AddVertexInputAttribs(&input_attrib, 1);
14052
Chris Forbes280ba2c2015-06-12 11:16:41 +120014053 VkDescriptorSetObj descriptorSet(m_device);
14054 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014055 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014056
Tony Barbour5781e8f2015-08-04 16:23:11 -060014057 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014058
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014059 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014060}
Chris Forbes8f68b562015-05-25 11:13:32 +120014061
Chris Forbes35efec72016-04-21 14:32:08 +120014062TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014063 TEST_DESCRIPTION("Test that pipeline validation accepts basic use of 64bit vertex "
14064 "attributes. This is interesting because they consume multiple "
14065 "locations.");
Chris Forbes35efec72016-04-21 14:32:08 +120014066 m_errorMonitor->ExpectSuccess();
14067
14068 ASSERT_NO_FATAL_FAILURE(InitState());
14069 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14070
Chris Forbes91cf3a82016-06-28 17:51:35 +120014071 if (!m_device->phy().features().shaderFloat64) {
Chris Forbes35efec72016-04-21 14:32:08 +120014072 printf("Device does not support 64bit vertex attributes; skipped.\n");
14073 return;
14074 }
14075
14076 VkVertexInputBindingDescription input_bindings[1];
14077 memset(input_bindings, 0, sizeof(input_bindings));
14078
14079 VkVertexInputAttributeDescription input_attribs[4];
14080 memset(input_attribs, 0, sizeof(input_attribs));
14081 input_attribs[0].location = 0;
14082 input_attribs[0].offset = 0;
14083 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
14084 input_attribs[1].location = 2;
14085 input_attribs[1].offset = 32;
14086 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
14087 input_attribs[2].location = 4;
14088 input_attribs[2].offset = 64;
14089 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
14090 input_attribs[3].location = 6;
14091 input_attribs[3].offset = 96;
14092 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
14093
14094 char const *vsSource =
14095 "#version 450\n"
14096 "\n"
14097 "layout(location=0) in dmat4 x;\n"
14098 "out gl_PerVertex {\n"
14099 " vec4 gl_Position;\n"
14100 "};\n"
14101 "void main(){\n"
14102 " gl_Position = vec4(x[0][0]);\n"
14103 "}\n";
14104 char const *fsSource =
14105 "#version 450\n"
14106 "\n"
14107 "layout(location=0) out vec4 color;\n"
14108 "void main(){\n"
14109 " color = vec4(1);\n"
14110 "}\n";
14111
14112 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14113 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14114
14115 VkPipelineObj pipe(m_device);
14116 pipe.AddColorAttachment();
14117 pipe.AddShader(&vs);
14118 pipe.AddShader(&fs);
14119
14120 pipe.AddVertexInputBindings(input_bindings, 1);
14121 pipe.AddVertexInputAttribs(input_attribs, 4);
14122
14123 VkDescriptorSetObj descriptorSet(m_device);
14124 descriptorSet.AppendDummy();
14125 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14126
14127 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14128
14129 m_errorMonitor->VerifyNotFound();
14130}
14131
Karl Schultz6addd812016-02-02 17:17:23 -070014132TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014133 TEST_DESCRIPTION("Test that an error is produced for a FS which does not "
14134 "provide an output for one of the pipeline's color attachments");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014135 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014136 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014137
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014138 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014139
14140 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014141 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014142 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014143 "out gl_PerVertex {\n"
14144 " vec4 gl_Position;\n"
14145 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014146 "void main(){\n"
14147 " gl_Position = vec4(1);\n"
14148 "}\n";
14149 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014150 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014151 "\n"
14152 "void main(){\n"
14153 "}\n";
14154
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014155 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14156 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014157
14158 VkPipelineObj pipe(m_device);
14159 pipe.AddShader(&vs);
14160 pipe.AddShader(&fs);
14161
Chia-I Wu08accc62015-07-07 11:50:03 +080014162 /* set up CB 0, not written */
14163 pipe.AddColorAttachment();
14164 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014165
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014166 VkDescriptorSetObj descriptorSet(m_device);
14167 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014168 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014169
Tony Barbour5781e8f2015-08-04 16:23:11 -060014170 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014171
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014172 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014173}
14174
Karl Schultz6addd812016-02-02 17:17:23 -070014175TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014176 TEST_DESCRIPTION("Test that a warning is produced for a FS which provides a spurious "
14177 "output with no matching attachment");
Karl Schultz6addd812016-02-02 17:17:23 -070014178 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070014179 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014180 "FS writes to output location 1 with no matching attachment");
14181
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014182 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014183
14184 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014185 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014186 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014187 "out gl_PerVertex {\n"
14188 " vec4 gl_Position;\n"
14189 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014190 "void main(){\n"
14191 " gl_Position = vec4(1);\n"
14192 "}\n";
14193 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014194 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014195 "\n"
14196 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -070014197 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014198 "void main(){\n"
14199 " x = vec4(1);\n"
14200 " y = vec4(1);\n"
14201 "}\n";
14202
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014203 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14204 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014205
14206 VkPipelineObj pipe(m_device);
14207 pipe.AddShader(&vs);
14208 pipe.AddShader(&fs);
14209
Chia-I Wu08accc62015-07-07 11:50:03 +080014210 /* set up CB 0, not written */
14211 pipe.AddColorAttachment();
14212 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014213 /* FS writes CB 1, but we don't configure it */
14214
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014215 VkDescriptorSetObj descriptorSet(m_device);
14216 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014217 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014218
Tony Barbour5781e8f2015-08-04 16:23:11 -060014219 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014220
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014221 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014222}
14223
Karl Schultz6addd812016-02-02 17:17:23 -070014224TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014225 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the fundamental "
14226 "type of an FS output variable, and the format of the corresponding attachment");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014228 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014229
Chris Forbesa36d69e2015-05-25 11:13:44 +120014230 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014231
14232 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014233 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120014234 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014235 "out gl_PerVertex {\n"
14236 " vec4 gl_Position;\n"
14237 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120014238 "void main(){\n"
14239 " gl_Position = vec4(1);\n"
14240 "}\n";
14241 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014242 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120014243 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070014244 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +120014245 "void main(){\n"
14246 " x = ivec4(1);\n"
14247 "}\n";
14248
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014249 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14250 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014251
14252 VkPipelineObj pipe(m_device);
14253 pipe.AddShader(&vs);
14254 pipe.AddShader(&fs);
14255
Chia-I Wu08accc62015-07-07 11:50:03 +080014256 /* set up CB 0; type is UNORM by default */
14257 pipe.AddColorAttachment();
14258 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014259
Chris Forbesa36d69e2015-05-25 11:13:44 +120014260 VkDescriptorSetObj descriptorSet(m_device);
14261 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014262 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014263
Tony Barbour5781e8f2015-08-04 16:23:11 -060014264 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014265
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014266 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120014267}
Chris Forbes7b1b8932015-06-05 14:43:36 +120014268
Karl Schultz6addd812016-02-02 17:17:23 -070014269TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014270 TEST_DESCRIPTION("Test that an error is produced for a shader consuming a uniform "
14271 "block which has no corresponding binding in the pipeline layout");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014272 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014273 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014274
Chris Forbes556c76c2015-08-14 12:04:59 +120014275 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120014276
14277 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014278 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120014279 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070014280 "out gl_PerVertex {\n"
14281 " vec4 gl_Position;\n"
14282 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120014283 "void main(){\n"
14284 " gl_Position = vec4(1);\n"
14285 "}\n";
14286 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120014287 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120014288 "\n"
14289 "layout(location=0) out vec4 x;\n"
14290 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
14291 "void main(){\n"
14292 " x = vec4(bar.y);\n"
14293 "}\n";
14294
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014295 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14296 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120014297
Chris Forbes556c76c2015-08-14 12:04:59 +120014298 VkPipelineObj pipe(m_device);
14299 pipe.AddShader(&vs);
14300 pipe.AddShader(&fs);
14301
14302 /* set up CB 0; type is UNORM by default */
14303 pipe.AddColorAttachment();
14304 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14305
14306 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014307 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120014308
14309 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14310
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014311 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120014312}
14313
Chris Forbes5c59e902016-02-26 16:56:09 +130014314TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014315 TEST_DESCRIPTION("Test that an error is produced for a shader consuming push constants "
14316 "which are not provided in the pipeline layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130014317 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14318 "not declared in layout");
14319
14320 ASSERT_NO_FATAL_FAILURE(InitState());
14321
14322 char const *vsSource =
14323 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130014324 "\n"
14325 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14326 "out gl_PerVertex {\n"
14327 " vec4 gl_Position;\n"
14328 "};\n"
14329 "void main(){\n"
14330 " gl_Position = vec4(consts.x);\n"
14331 "}\n";
14332 char const *fsSource =
14333 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130014334 "\n"
14335 "layout(location=0) out vec4 x;\n"
14336 "void main(){\n"
14337 " x = vec4(1);\n"
14338 "}\n";
14339
14340 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14341 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14342
14343 VkPipelineObj pipe(m_device);
14344 pipe.AddShader(&vs);
14345 pipe.AddShader(&fs);
14346
14347 /* set up CB 0; type is UNORM by default */
14348 pipe.AddColorAttachment();
14349 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14350
14351 VkDescriptorSetObj descriptorSet(m_device);
14352 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14353
14354 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14355
14356 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014357 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130014358}
14359
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014360TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014361 TEST_DESCRIPTION("Test that an error is produced for a compute pipeline consuming a "
14362 "descriptor which is not provided in the pipeline layout");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014363 m_errorMonitor->SetDesiredFailureMsg(
14364 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14365 "Shader uses descriptor slot 0.0");
14366
14367 ASSERT_NO_FATAL_FAILURE(InitState());
14368
14369 char const *csSource =
14370 "#version 450\n"
14371 "\n"
14372 "layout(local_size_x=1) in;\n"
14373 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14374 "void main(){\n"
14375 " x = vec4(1);\n"
14376 "}\n";
14377
14378 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14379
14380 VkDescriptorSetObj descriptorSet(m_device);
14381 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14382
14383 VkComputePipelineCreateInfo cpci = {
14384 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14385 nullptr, 0, {
14386 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14387 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14388 cs.handle(), "main", nullptr
14389 },
14390 descriptorSet.GetPipelineLayout(),
14391 VK_NULL_HANDLE, -1
14392 };
14393
14394 VkPipeline pipe;
14395 VkResult err = vkCreateComputePipelines(
14396 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14397
14398 m_errorMonitor->VerifyFound();
14399
14400 if (err == VK_SUCCESS) {
14401 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14402 }
14403}
14404
14405TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014406 TEST_DESCRIPTION("Test that pipeline validation accepts a compute pipeline which declares a "
14407 "descriptor-backed resource which is not provided, but the shader does not "
14408 "statically use it. This is interesting because it requires compute pipelines "
14409 "to have a proper descriptor use walk, which they didn't for some time.");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014410 m_errorMonitor->ExpectSuccess();
14411
14412 ASSERT_NO_FATAL_FAILURE(InitState());
14413
14414 char const *csSource =
14415 "#version 450\n"
14416 "\n"
14417 "layout(local_size_x=1) in;\n"
14418 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14419 "void main(){\n"
14420 " // x is not used.\n"
14421 "}\n";
14422
14423 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14424
14425 VkDescriptorSetObj descriptorSet(m_device);
14426 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14427
14428 VkComputePipelineCreateInfo cpci = {
14429 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14430 nullptr, 0, {
14431 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14432 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14433 cs.handle(), "main", nullptr
14434 },
14435 descriptorSet.GetPipelineLayout(),
14436 VK_NULL_HANDLE, -1
14437 };
14438
14439 VkPipeline pipe;
14440 VkResult err = vkCreateComputePipelines(
14441 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14442
14443 m_errorMonitor->VerifyNotFound();
14444
14445 if (err == VK_SUCCESS) {
14446 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14447 }
14448}
14449
Chris Forbes22a9b092016-07-19 14:34:05 +120014450TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014451 TEST_DESCRIPTION("Test that an error is produced for a pipeline consuming a "
14452 "descriptor-backed resource of a mismatched type");
Chris Forbes22a9b092016-07-19 14:34:05 +120014453 m_errorMonitor->SetDesiredFailureMsg(
14454 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14455 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
14456
14457 ASSERT_NO_FATAL_FAILURE(InitState());
14458
14459 VkDescriptorSetLayoutBinding binding = {
14460 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14461 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14462 };
14463 VkDescriptorSetLayoutCreateInfo dslci = {
14464 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14465 0, 1, &binding
14466 };
14467 VkDescriptorSetLayout dsl;
14468 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14469 nullptr, &dsl);
14470 ASSERT_VK_SUCCESS(err);
14471
14472 VkPipelineLayoutCreateInfo plci = {
14473 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14474 0, 1, &dsl, 0, nullptr
14475 };
14476 VkPipelineLayout pl;
14477 err = vkCreatePipelineLayout(m_device->device(), &plci,
14478 nullptr, &pl);
14479 ASSERT_VK_SUCCESS(err);
14480
14481 char const *csSource =
14482 "#version 450\n"
14483 "\n"
14484 "layout(local_size_x=1) in;\n"
14485 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14486 "void main() {\n"
14487 " x.x = 1.0f;\n"
14488 "}\n";
14489 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14490
14491 VkComputePipelineCreateInfo cpci = {
14492 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14493 0, {
14494 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14495 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14496 cs.handle(), "main", nullptr
14497 },
14498 pl, VK_NULL_HANDLE, -1
14499 };
14500
14501 VkPipeline pipe;
14502 err = vkCreateComputePipelines(
14503 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14504
14505 m_errorMonitor->VerifyFound();
14506
14507 if (err == VK_SUCCESS) {
14508 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14509 }
14510
14511 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14512 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14513}
14514
Chris Forbese10a51f2016-07-19 14:42:51 +120014515TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014516 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
14517 "sampler portion of a combined image + sampler");
Chris Forbese10a51f2016-07-19 14:42:51 +120014518 m_errorMonitor->ExpectSuccess();
14519
14520 ASSERT_NO_FATAL_FAILURE(InitState());
14521
14522 VkDescriptorSetLayoutBinding bindings[] = {
14523 {
14524 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14525 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14526 },
14527 {
14528 1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
14529 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14530 },
14531 {
14532 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
14533 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14534 },
14535 };
14536 VkDescriptorSetLayoutCreateInfo dslci = {
14537 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14538 0, 3, bindings
14539 };
14540 VkDescriptorSetLayout dsl;
14541 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14542 nullptr, &dsl);
14543 ASSERT_VK_SUCCESS(err);
14544
14545 VkPipelineLayoutCreateInfo plci = {
14546 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14547 0, 1, &dsl, 0, nullptr
14548 };
14549 VkPipelineLayout pl;
14550 err = vkCreatePipelineLayout(m_device->device(), &plci,
14551 nullptr, &pl);
14552 ASSERT_VK_SUCCESS(err);
14553
14554 char const *csSource =
14555 "#version 450\n"
14556 "\n"
14557 "layout(local_size_x=1) in;\n"
14558 "layout(set=0, binding=0) uniform sampler s;\n"
14559 "layout(set=0, binding=1) uniform texture2D t;\n"
14560 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
14561 "void main() {\n"
14562 " x = texture(sampler2D(t, s), vec2(0));\n"
14563 "}\n";
14564 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14565
14566 VkComputePipelineCreateInfo cpci = {
14567 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14568 0, {
14569 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14570 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14571 cs.handle(), "main", nullptr
14572 },
14573 pl, VK_NULL_HANDLE, -1
14574 };
14575
14576 VkPipeline pipe;
14577 err = vkCreateComputePipelines(
14578 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14579
14580 m_errorMonitor->VerifyNotFound();
14581
14582 if (err == VK_SUCCESS) {
14583 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14584 }
14585
14586 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14587 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14588}
14589
Chris Forbes91c3b2a2016-07-19 14:46:38 +120014590TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014591 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
14592 "image portion of a combined image + sampler");
Chris Forbes91c3b2a2016-07-19 14:46:38 +120014593 m_errorMonitor->ExpectSuccess();
14594
14595 ASSERT_NO_FATAL_FAILURE(InitState());
14596
14597 VkDescriptorSetLayoutBinding bindings[] = {
14598 {
14599 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14600 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14601 },
14602 {
14603 1, VK_DESCRIPTOR_TYPE_SAMPLER,
14604 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14605 },
14606 {
14607 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
14608 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14609 },
14610 };
14611 VkDescriptorSetLayoutCreateInfo dslci = {
14612 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14613 0, 3, bindings
14614 };
14615 VkDescriptorSetLayout dsl;
14616 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14617 nullptr, &dsl);
14618 ASSERT_VK_SUCCESS(err);
14619
14620 VkPipelineLayoutCreateInfo plci = {
14621 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14622 0, 1, &dsl, 0, nullptr
14623 };
14624 VkPipelineLayout pl;
14625 err = vkCreatePipelineLayout(m_device->device(), &plci,
14626 nullptr, &pl);
14627 ASSERT_VK_SUCCESS(err);
14628
14629 char const *csSource =
14630 "#version 450\n"
14631 "\n"
14632 "layout(local_size_x=1) in;\n"
14633 "layout(set=0, binding=0) uniform texture2D t;\n"
14634 "layout(set=0, binding=1) uniform sampler s;\n"
14635 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
14636 "void main() {\n"
14637 " x = texture(sampler2D(t, s), vec2(0));\n"
14638 "}\n";
14639 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14640
14641 VkComputePipelineCreateInfo cpci = {
14642 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14643 0, {
14644 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14645 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14646 cs.handle(), "main", nullptr
14647 },
14648 pl, VK_NULL_HANDLE, -1
14649 };
14650
14651 VkPipeline pipe;
14652 err = vkCreateComputePipelines(
14653 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14654
14655 m_errorMonitor->VerifyNotFound();
14656
14657 if (err == VK_SUCCESS) {
14658 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14659 }
14660
14661 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14662 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14663}
14664
Chris Forbes6a4991a2016-07-19 15:07:32 +120014665TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014666 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming "
14667 "both the sampler and the image of a combined image+sampler "
14668 "but via separate variables");
Chris Forbes6a4991a2016-07-19 15:07:32 +120014669 m_errorMonitor->ExpectSuccess();
14670
14671 ASSERT_NO_FATAL_FAILURE(InitState());
14672
14673 VkDescriptorSetLayoutBinding bindings[] = {
14674 {
14675 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14676 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14677 },
14678 {
14679 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
14680 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14681 },
14682 };
14683 VkDescriptorSetLayoutCreateInfo dslci = {
14684 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14685 0, 2, bindings
14686 };
14687 VkDescriptorSetLayout dsl;
14688 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14689 nullptr, &dsl);
14690 ASSERT_VK_SUCCESS(err);
14691
14692 VkPipelineLayoutCreateInfo plci = {
14693 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14694 0, 1, &dsl, 0, nullptr
14695 };
14696 VkPipelineLayout pl;
14697 err = vkCreatePipelineLayout(m_device->device(), &plci,
14698 nullptr, &pl);
14699 ASSERT_VK_SUCCESS(err);
14700
14701 char const *csSource =
14702 "#version 450\n"
14703 "\n"
14704 "layout(local_size_x=1) in;\n"
14705 "layout(set=0, binding=0) uniform texture2D t;\n"
14706 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
14707 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
14708 "void main() {\n"
14709 " x = texture(sampler2D(t, s), vec2(0));\n"
14710 "}\n";
14711 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14712
14713 VkComputePipelineCreateInfo cpci = {
14714 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14715 0, {
14716 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14717 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14718 cs.handle(), "main", nullptr
14719 },
14720 pl, VK_NULL_HANDLE, -1
14721 };
14722
14723 VkPipeline pipe;
14724 err = vkCreateComputePipelines(
14725 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14726
14727 m_errorMonitor->VerifyNotFound();
14728
14729 if (err == VK_SUCCESS) {
14730 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14731 }
14732
14733 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14734 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14735}
14736
Chris Forbes50020592016-07-27 13:52:41 +120014737TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
14738 TEST_DESCRIPTION("Test that an error is produced when an image view type "
14739 "does not match the dimensionality declared in the shader");
14740
14741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14742 "requires an image view of type VK_IMAGE_VIEW_TYPE_3D");
14743
14744 ASSERT_NO_FATAL_FAILURE(InitState());
14745 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14746
14747 char const *vsSource =
14748 "#version 450\n"
14749 "\n"
14750 "out gl_PerVertex { vec4 gl_Position; };\n"
14751 "void main() { gl_Position = vec4(0); }\n";
14752 char const *fsSource =
14753 "#version 450\n"
14754 "\n"
14755 "layout(set=0, binding=0) uniform sampler3D s;\n"
14756 "layout(location=0) out vec4 color;\n"
14757 "void main() {\n"
14758 " color = texture(s, vec3(0));\n"
14759 "}\n";
14760 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14761 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14762
14763 VkPipelineObj pipe(m_device);
14764 pipe.AddShader(&vs);
14765 pipe.AddShader(&fs);
14766 pipe.AddColorAttachment();
14767
14768 VkTextureObj texture(m_device, nullptr);
14769 VkSamplerObj sampler(m_device);
14770
14771 VkDescriptorSetObj descriptorSet(m_device);
14772 descriptorSet.AppendSamplerTexture(&sampler, &texture);
14773 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14774
14775 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14776 ASSERT_VK_SUCCESS(err);
14777
14778 BeginCommandBuffer();
14779
14780 m_commandBuffer->BindPipeline(pipe);
14781 m_commandBuffer->BindDescriptorSet(descriptorSet);
14782
14783 VkViewport viewport = { 0, 0, 16, 16, 0, 1 };
14784 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
14785 VkRect2D scissor = { { 0, 0 }, { 16, 16 } };
14786 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
14787
14788 // error produced here.
14789 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
14790
14791 m_errorMonitor->VerifyFound();
14792
14793 EndCommandBuffer();
14794}
14795
Chris Forbes5533bfc2016-07-27 14:12:34 +120014796TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
14797 TEST_DESCRIPTION("Test that an error is produced when a multisampled images "
14798 "are consumed via singlesample images types in the shader, or vice versa.");
14799
14800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14801 "requires bound image to have multiple samples");
14802
14803 ASSERT_NO_FATAL_FAILURE(InitState());
14804 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14805
14806 char const *vsSource =
14807 "#version 450\n"
14808 "\n"
14809 "out gl_PerVertex { vec4 gl_Position; };\n"
14810 "void main() { gl_Position = vec4(0); }\n";
14811 char const *fsSource =
14812 "#version 450\n"
14813 "\n"
14814 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
14815 "layout(location=0) out vec4 color;\n"
14816 "void main() {\n"
14817 " color = texelFetch(s, ivec2(0), 0);\n"
14818 "}\n";
14819 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14820 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14821
14822 VkPipelineObj pipe(m_device);
14823 pipe.AddShader(&vs);
14824 pipe.AddShader(&fs);
14825 pipe.AddColorAttachment();
14826
14827 VkTextureObj texture(m_device, nullptr);
14828 VkSamplerObj sampler(m_device);
14829
14830 VkDescriptorSetObj descriptorSet(m_device);
14831 descriptorSet.AppendSamplerTexture(&sampler, &texture);
14832 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14833
14834 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14835 ASSERT_VK_SUCCESS(err);
14836
14837 BeginCommandBuffer();
14838
14839 m_commandBuffer->BindPipeline(pipe);
14840 m_commandBuffer->BindDescriptorSet(descriptorSet);
14841
14842 VkViewport viewport = { 0, 0, 16, 16, 0, 1 };
14843 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
14844 VkRect2D scissor = { { 0, 0 }, { 16, 16 } };
14845 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
14846
14847 // error produced here.
14848 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
14849
14850 m_errorMonitor->VerifyFound();
14851
14852 EndCommandBuffer();
14853}
14854
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014855#endif // SHADER_CHECKER_TESTS
14856
14857#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060014858TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -070014859 m_errorMonitor->SetDesiredFailureMsg(
14860 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014861 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014862
14863 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014864
14865 // Create an image
14866 VkImage image;
14867
Karl Schultz6addd812016-02-02 17:17:23 -070014868 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14869 const int32_t tex_width = 32;
14870 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014871
14872 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014873 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14874 image_create_info.pNext = NULL;
14875 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14876 image_create_info.format = tex_format;
14877 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014878 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070014879 image_create_info.extent.depth = 1;
14880 image_create_info.mipLevels = 1;
14881 image_create_info.arrayLayers = 1;
14882 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14883 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14884 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14885 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014886
14887 // Introduce error by sending down a bogus width extent
14888 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014889 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014890
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014891 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014892}
14893
Mark Youngc48c4c12016-04-11 14:26:49 -060014894TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
14895 m_errorMonitor->SetDesiredFailureMsg(
14896 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14897 "CreateImage extents is 0 for at least one required dimension");
14898
14899 ASSERT_NO_FATAL_FAILURE(InitState());
14900
14901 // Create an image
14902 VkImage image;
14903
14904 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14905 const int32_t tex_width = 32;
14906 const int32_t tex_height = 32;
14907
14908 VkImageCreateInfo image_create_info = {};
14909 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14910 image_create_info.pNext = NULL;
14911 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14912 image_create_info.format = tex_format;
14913 image_create_info.extent.width = tex_width;
14914 image_create_info.extent.height = tex_height;
14915 image_create_info.extent.depth = 1;
14916 image_create_info.mipLevels = 1;
14917 image_create_info.arrayLayers = 1;
14918 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14919 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14920 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14921 image_create_info.flags = 0;
14922
14923 // Introduce error by sending down a bogus width extent
14924 image_create_info.extent.width = 0;
14925 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
14926
14927 m_errorMonitor->VerifyFound();
14928}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014929#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120014930
Tobin Ehliscde08892015-09-22 10:11:37 -060014931#if IMAGE_TESTS
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060014932TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
14933 TEST_DESCRIPTION("Create a render pass with an attachment description "
14934 "format set to VK_FORMAT_UNDEFINED");
14935
14936 ASSERT_NO_FATAL_FAILURE(InitState());
14937 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14938
14939 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14940 "format is VK_FORMAT_UNDEFINED");
14941
14942 VkAttachmentReference color_attach = {};
14943 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
14944 color_attach.attachment = 0;
14945 VkSubpassDescription subpass = {};
14946 subpass.colorAttachmentCount = 1;
14947 subpass.pColorAttachments = &color_attach;
14948
14949 VkRenderPassCreateInfo rpci = {};
14950 rpci.subpassCount = 1;
14951 rpci.pSubpasses = &subpass;
14952 rpci.attachmentCount = 1;
14953 VkAttachmentDescription attach_desc = {};
14954 attach_desc.format = VK_FORMAT_UNDEFINED;
14955 rpci.pAttachments = &attach_desc;
14956 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
14957 VkRenderPass rp;
14958 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
14959
14960 m_errorMonitor->VerifyFound();
14961
14962 if (result == VK_SUCCESS) {
14963 vkDestroyRenderPass(m_device->device(), rp, NULL);
14964 }
14965}
14966
Karl Schultz6addd812016-02-02 17:17:23 -070014967TEST_F(VkLayerTest, InvalidImageView) {
14968 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060014969
Karl Schultz6addd812016-02-02 17:17:23 -070014970 m_errorMonitor->SetDesiredFailureMsg(
14971 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014972 "vkCreateImageView called with baseMipLevel 10 ");
14973
Tobin Ehliscde08892015-09-22 10:11:37 -060014974 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060014975
Mike Stroyana3082432015-09-25 13:39:21 -060014976 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070014977 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060014978
Karl Schultz6addd812016-02-02 17:17:23 -070014979 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14980 const int32_t tex_width = 32;
14981 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060014982
14983 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014984 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14985 image_create_info.pNext = NULL;
14986 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14987 image_create_info.format = tex_format;
14988 image_create_info.extent.width = tex_width;
14989 image_create_info.extent.height = tex_height;
14990 image_create_info.extent.depth = 1;
14991 image_create_info.mipLevels = 1;
14992 image_create_info.arrayLayers = 1;
14993 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14994 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14995 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14996 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060014997
Chia-I Wuf7458c52015-10-26 21:10:41 +080014998 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060014999 ASSERT_VK_SUCCESS(err);
15000
15001 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015002 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15003 image_view_create_info.image = image;
15004 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15005 image_view_create_info.format = tex_format;
15006 image_view_create_info.subresourceRange.layerCount = 1;
15007 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
15008 image_view_create_info.subresourceRange.levelCount = 1;
15009 image_view_create_info.subresourceRange.aspectMask =
15010 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015011
15012 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070015013 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
15014 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060015015
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015016 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060015017 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015018}
Mike Stroyana3082432015-09-25 13:39:21 -060015019
Mark Youngd339ba32016-05-30 13:28:35 -060015020TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15021 VkResult err;
15022
15023 m_errorMonitor->SetDesiredFailureMsg(
15024 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -060015025 "used without first calling vkBindImageMemory");
Mark Youngd339ba32016-05-30 13:28:35 -060015026
15027 ASSERT_NO_FATAL_FAILURE(InitState());
15028
15029 // Create an image and try to create a view with no memory backing the image
15030 VkImage image;
15031
15032 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15033 const int32_t tex_width = 32;
15034 const int32_t tex_height = 32;
15035
15036 VkImageCreateInfo image_create_info = {};
15037 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15038 image_create_info.pNext = NULL;
15039 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15040 image_create_info.format = tex_format;
15041 image_create_info.extent.width = tex_width;
15042 image_create_info.extent.height = tex_height;
15043 image_create_info.extent.depth = 1;
15044 image_create_info.mipLevels = 1;
15045 image_create_info.arrayLayers = 1;
15046 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15047 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15048 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15049 image_create_info.flags = 0;
15050
15051 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15052 ASSERT_VK_SUCCESS(err);
15053
15054 VkImageViewCreateInfo image_view_create_info = {};
15055 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15056 image_view_create_info.image = image;
15057 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15058 image_view_create_info.format = tex_format;
15059 image_view_create_info.subresourceRange.layerCount = 1;
15060 image_view_create_info.subresourceRange.baseMipLevel = 0;
15061 image_view_create_info.subresourceRange.levelCount = 1;
15062 image_view_create_info.subresourceRange.aspectMask =
15063 VK_IMAGE_ASPECT_COLOR_BIT;
15064
15065 VkImageView view;
15066 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
15067 &view);
15068
15069 m_errorMonitor->VerifyFound();
15070 vkDestroyImage(m_device->device(), image, NULL);
15071 // If last error is success, it still created the view, so delete it.
15072 if (err == VK_SUCCESS) {
15073 vkDestroyImageView(m_device->device(), view, NULL);
15074 }
15075
15076}
15077
Karl Schultz6addd812016-02-02 17:17:23 -070015078TEST_F(VkLayerTest, InvalidImageViewAspect) {
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015079 TEST_DESCRIPTION(
15080 "Create an image and try to create a view with an invalid aspectMask");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070015081 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070015082 "vkCreateImageView: Color image "
15083 "formats must have ONLY the "
15084 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015085
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015086 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015087
Karl Schultz6addd812016-02-02 17:17:23 -070015088 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015089 VkImageObj image(m_device);
15090 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT,
15091 VK_IMAGE_TILING_LINEAR, 0);
15092 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015093
15094 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015095 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015096 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015097 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15098 image_view_create_info.format = tex_format;
15099 image_view_create_info.subresourceRange.baseMipLevel = 0;
15100 image_view_create_info.subresourceRange.levelCount = 1;
15101 // Cause an error by setting an invalid image aspect
15102 image_view_create_info.subresourceRange.aspectMask =
15103 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015104
15105 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015106 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015107
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015108 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015109}
15110
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015111TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015112 VkResult err;
15113 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015114
Karl Schultz6addd812016-02-02 17:17:23 -070015115 m_errorMonitor->SetDesiredFailureMsg(
15116 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015117 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015118
Mike Stroyana3082432015-09-25 13:39:21 -060015119 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015120
15121 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015122 VkImage srcImage;
15123 VkImage dstImage;
15124 VkDeviceMemory srcMem;
15125 VkDeviceMemory destMem;
15126 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015127
15128 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015129 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15130 image_create_info.pNext = NULL;
15131 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15132 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15133 image_create_info.extent.width = 32;
15134 image_create_info.extent.height = 32;
15135 image_create_info.extent.depth = 1;
15136 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015137 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015138 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15139 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15140 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15141 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015142
Karl Schultz6addd812016-02-02 17:17:23 -070015143 err =
15144 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015145 ASSERT_VK_SUCCESS(err);
15146
Karl Schultz6addd812016-02-02 17:17:23 -070015147 err =
15148 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015149 ASSERT_VK_SUCCESS(err);
15150
15151 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015152 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015153 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15154 memAlloc.pNext = NULL;
15155 memAlloc.allocationSize = 0;
15156 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015157
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015158 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015159 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015160 pass =
15161 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015162 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015163 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015164 ASSERT_VK_SUCCESS(err);
15165
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015166 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015167 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015168 pass =
15169 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015170 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015171 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015172 ASSERT_VK_SUCCESS(err);
15173
15174 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15175 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015176 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015177 ASSERT_VK_SUCCESS(err);
15178
15179 BeginCommandBuffer();
15180 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015181 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015182 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015183 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015184 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015185 copyRegion.srcOffset.x = 0;
15186 copyRegion.srcOffset.y = 0;
15187 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015188 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015189 copyRegion.dstSubresource.mipLevel = 0;
15190 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015191 // Introduce failure by forcing the dst layerCount to differ from src
15192 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015193 copyRegion.dstOffset.x = 0;
15194 copyRegion.dstOffset.y = 0;
15195 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015196 copyRegion.extent.width = 1;
15197 copyRegion.extent.height = 1;
15198 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015199 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15200 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015201 EndCommandBuffer();
15202
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015203 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015204
Chia-I Wuf7458c52015-10-26 21:10:41 +080015205 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015206 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015207 vkFreeMemory(m_device->device(), srcMem, NULL);
15208 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015209}
15210
Tony Barbourd6673642016-05-05 14:46:39 -060015211TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
15212
15213 TEST_DESCRIPTION("Creating images with unsuported formats ");
15214
15215 ASSERT_NO_FATAL_FAILURE(InitState());
15216 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15217 VkImageObj image(m_device);
15218 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
15219 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
15220 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15221 VK_IMAGE_TILING_OPTIMAL, 0);
15222 ASSERT_TRUE(image.initialized());
15223
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015224 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
15225 VkImageCreateInfo image_create_info;
15226 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15227 image_create_info.pNext = NULL;
15228 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15229 image_create_info.format = VK_FORMAT_UNDEFINED;
15230 image_create_info.extent.width = 32;
15231 image_create_info.extent.height = 32;
15232 image_create_info.extent.depth = 1;
15233 image_create_info.mipLevels = 1;
15234 image_create_info.arrayLayers = 1;
15235 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15236 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15237 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15238 image_create_info.flags = 0;
15239
15240 m_errorMonitor->SetDesiredFailureMsg(
15241 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15242 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
15243
15244 VkImage localImage;
15245 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
15246 m_errorMonitor->VerifyFound();
15247
Tony Barbourd6673642016-05-05 14:46:39 -060015248 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015249 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060015250 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15251 VkFormat format = static_cast<VkFormat>(f);
15252 VkFormatProperties fProps = m_device->format_properties(format);
15253 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
15254 fProps.optimalTilingFeatures == 0) {
15255 unsupported = format;
15256 break;
15257 }
15258 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015259
Tony Barbourd6673642016-05-05 14:46:39 -060015260 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015261 image_create_info.format = unsupported;
Tony Barbourd6673642016-05-05 14:46:39 -060015262 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015263 "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015264
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015265 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060015266 m_errorMonitor->VerifyFound();
15267 }
15268}
15269
15270TEST_F(VkLayerTest, ImageLayerViewTests) {
15271 VkResult ret;
15272 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15273
15274 ASSERT_NO_FATAL_FAILURE(InitState());
15275
15276 VkImageObj image(m_device);
15277 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
15278 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
15279 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15280 VK_IMAGE_TILING_OPTIMAL, 0);
15281 ASSERT_TRUE(image.initialized());
15282
15283 VkImageView imgView;
15284 VkImageViewCreateInfo imgViewInfo = {};
15285 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15286 imgViewInfo.image = image.handle();
15287 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
15288 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15289 imgViewInfo.subresourceRange.layerCount = 1;
15290 imgViewInfo.subresourceRange.baseMipLevel = 0;
15291 imgViewInfo.subresourceRange.levelCount = 1;
15292 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15293
15294 m_errorMonitor->SetDesiredFailureMsg(
15295 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15296 "vkCreateImageView called with baseMipLevel");
15297 // View can't have baseMipLevel >= image's mipLevels - Expect
15298 // VIEW_CREATE_ERROR
15299 imgViewInfo.subresourceRange.baseMipLevel = 1;
15300 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15301 m_errorMonitor->VerifyFound();
15302 imgViewInfo.subresourceRange.baseMipLevel = 0;
15303
15304 m_errorMonitor->SetDesiredFailureMsg(
15305 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15306 "vkCreateImageView called with baseArrayLayer");
15307 // View can't have baseArrayLayer >= image's arraySize - Expect
15308 // VIEW_CREATE_ERROR
15309 imgViewInfo.subresourceRange.baseArrayLayer = 1;
15310 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15311 m_errorMonitor->VerifyFound();
15312 imgViewInfo.subresourceRange.baseArrayLayer = 0;
15313
15314 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15315 "vkCreateImageView called with 0 in "
15316 "pCreateInfo->subresourceRange."
15317 "levelCount");
15318 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
15319 imgViewInfo.subresourceRange.levelCount = 0;
15320 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15321 m_errorMonitor->VerifyFound();
15322 imgViewInfo.subresourceRange.levelCount = 1;
15323
15324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15325 "vkCreateImageView called with 0 in "
15326 "pCreateInfo->subresourceRange."
15327 "layerCount");
15328 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
15329 imgViewInfo.subresourceRange.layerCount = 0;
15330 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15331 m_errorMonitor->VerifyFound();
15332 imgViewInfo.subresourceRange.layerCount = 1;
15333
15334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15335 "but both must be color formats");
15336 // Can't use depth format for view into color image - Expect INVALID_FORMAT
15337 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
15338 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15339 m_errorMonitor->VerifyFound();
15340 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15341
15342 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15343 "Formats MUST be IDENTICAL unless "
15344 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
15345 "was set on image creation.");
15346 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
15347 // VIEW_CREATE_ERROR
15348 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
15349 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15350 m_errorMonitor->VerifyFound();
15351 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15352
15353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15354 "can support ImageViews with "
15355 "differing formats but they must be "
15356 "in the same compatibility class.");
15357 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
15358 // VIEW_CREATE_ERROR
15359 VkImageCreateInfo mutImgInfo = image.create_info();
15360 VkImage mutImage;
15361 mutImgInfo.format = VK_FORMAT_R8_UINT;
15362 assert(
15363 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
15364 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
15365 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
15366 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15367 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
15368 ASSERT_VK_SUCCESS(ret);
15369 imgViewInfo.image = mutImage;
15370 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15371 m_errorMonitor->VerifyFound();
15372 imgViewInfo.image = image.handle();
15373 vkDestroyImage(m_device->handle(), mutImage, NULL);
15374}
15375
15376TEST_F(VkLayerTest, MiscImageLayerTests) {
15377
15378 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
15379
15380 ASSERT_NO_FATAL_FAILURE(InitState());
15381
15382 VkImageObj image(m_device);
15383 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
15384 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
15385 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15386 VK_IMAGE_TILING_OPTIMAL, 0);
15387 ASSERT_TRUE(image.initialized());
15388
15389 m_errorMonitor->SetDesiredFailureMsg(
15390 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15391 "number of layers in image subresource is zero");
15392 vk_testing::Buffer buffer;
15393 VkMemoryPropertyFlags reqs = 0;
15394 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
15395 VkBufferImageCopy region = {};
15396 region.bufferRowLength = 128;
15397 region.bufferImageHeight = 128;
15398 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15399 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
15400 region.imageSubresource.layerCount = 0;
15401 region.imageExtent.height = 4;
15402 region.imageExtent.width = 4;
15403 region.imageExtent.depth = 1;
15404 m_commandBuffer->BeginCommandBuffer();
15405 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
15406 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
15407 1, &region);
15408 m_errorMonitor->VerifyFound();
15409 region.imageSubresource.layerCount = 1;
15410
15411 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15412 "aspectMasks for each region must "
15413 "specify only COLOR or DEPTH or "
15414 "STENCIL");
15415 // Expect MISMATCHED_IMAGE_ASPECT
15416 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
15417 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
15418 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
15419 1, &region);
15420 m_errorMonitor->VerifyFound();
15421 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15422
15423 m_errorMonitor->SetDesiredFailureMsg(
15424 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15425 "If the format of srcImage is a depth, stencil, depth stencil or "
15426 "integer-based format then filter must be VK_FILTER_NEAREST");
15427 // Expect INVALID_FILTER
15428 VkImageObj intImage1(m_device);
15429 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
15430 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
15431 0);
15432 VkImageObj intImage2(m_device);
15433 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
15434 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
15435 0);
15436 VkImageBlit blitRegion = {};
15437 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15438 blitRegion.srcSubresource.baseArrayLayer = 0;
15439 blitRegion.srcSubresource.layerCount = 1;
15440 blitRegion.srcSubresource.mipLevel = 0;
15441 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15442 blitRegion.dstSubresource.baseArrayLayer = 0;
15443 blitRegion.dstSubresource.layerCount = 1;
15444 blitRegion.dstSubresource.mipLevel = 0;
15445
15446 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
15447 intImage1.layout(), intImage2.handle(), intImage2.layout(),
15448 16, &blitRegion, VK_FILTER_LINEAR);
15449 m_errorMonitor->VerifyFound();
15450
15451 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15452 "called with 0 in ppMemoryBarriers");
15453 VkImageMemoryBarrier img_barrier;
15454 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
15455 img_barrier.pNext = NULL;
15456 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
15457 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
15458 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15459 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15460 img_barrier.image = image.handle();
15461 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
15462 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
15463 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15464 img_barrier.subresourceRange.baseArrayLayer = 0;
15465 img_barrier.subresourceRange.baseMipLevel = 0;
15466 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
15467 img_barrier.subresourceRange.layerCount = 0;
15468 img_barrier.subresourceRange.levelCount = 1;
15469 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
15470 VK_PIPELINE_STAGE_HOST_BIT,
15471 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
15472 nullptr, 1, &img_barrier);
15473 m_errorMonitor->VerifyFound();
15474 img_barrier.subresourceRange.layerCount = 1;
15475}
15476
15477TEST_F(VkLayerTest, ImageFormatLimits) {
15478
15479 TEST_DESCRIPTION("Exceed the limits of image format ");
15480
15481 m_errorMonitor->SetDesiredFailureMsg(
15482 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15483 "CreateImage extents exceed allowable limits for format");
15484 VkImageCreateInfo image_create_info = {};
15485 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15486 image_create_info.pNext = NULL;
15487 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15488 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15489 image_create_info.extent.width = 32;
15490 image_create_info.extent.height = 32;
15491 image_create_info.extent.depth = 1;
15492 image_create_info.mipLevels = 1;
15493 image_create_info.arrayLayers = 1;
15494 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15495 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15496 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15497 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
15498 image_create_info.flags = 0;
15499
15500 VkImage nullImg;
15501 VkImageFormatProperties imgFmtProps;
15502 vkGetPhysicalDeviceImageFormatProperties(
15503 gpu(), image_create_info.format, image_create_info.imageType,
15504 image_create_info.tiling, image_create_info.usage,
15505 image_create_info.flags, &imgFmtProps);
15506 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
15507 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15508 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15509 m_errorMonitor->VerifyFound();
15510 image_create_info.extent.depth = 1;
15511
15512 m_errorMonitor->SetDesiredFailureMsg(
15513 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15514 "exceeds allowable maximum supported by format of");
15515 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
15516 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15517 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15518 m_errorMonitor->VerifyFound();
15519 image_create_info.mipLevels = 1;
15520
15521 m_errorMonitor->SetDesiredFailureMsg(
15522 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15523 "exceeds allowable maximum supported by format of");
15524 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
15525 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15526 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15527 m_errorMonitor->VerifyFound();
15528 image_create_info.arrayLayers = 1;
15529
15530 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15531 "is not supported by format");
15532 int samples = imgFmtProps.sampleCounts >> 1;
15533 image_create_info.samples = (VkSampleCountFlagBits)samples;
15534 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15535 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15536 m_errorMonitor->VerifyFound();
15537 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15538
15539 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15540 "pCreateInfo->initialLayout, must be "
15541 "VK_IMAGE_LAYOUT_UNDEFINED or "
15542 "VK_IMAGE_LAYOUT_PREINITIALIZED");
15543 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15544 // Expect INVALID_LAYOUT
15545 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15546 m_errorMonitor->VerifyFound();
15547 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
15548}
15549
Karl Schultz6addd812016-02-02 17:17:23 -070015550TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060015551 VkResult err;
15552 bool pass;
15553
15554 // Create color images with different format sizes and try to copy between them
15555 m_errorMonitor->SetDesiredFailureMsg(
15556 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15557 "vkCmdCopyImage called with unmatched source and dest image format sizes");
15558
15559 ASSERT_NO_FATAL_FAILURE(InitState());
15560
15561 // Create two images of different types and try to copy between them
15562 VkImage srcImage;
15563 VkImage dstImage;
15564 VkDeviceMemory srcMem;
15565 VkDeviceMemory destMem;
15566 VkMemoryRequirements memReqs;
15567
15568 VkImageCreateInfo image_create_info = {};
15569 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15570 image_create_info.pNext = NULL;
15571 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15572 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15573 image_create_info.extent.width = 32;
15574 image_create_info.extent.height = 32;
15575 image_create_info.extent.depth = 1;
15576 image_create_info.mipLevels = 1;
15577 image_create_info.arrayLayers = 1;
15578 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15579 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15580 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15581 image_create_info.flags = 0;
15582
15583 err =
15584 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
15585 ASSERT_VK_SUCCESS(err);
15586
15587 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15588 // Introduce failure by creating second image with a different-sized format.
15589 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
15590
15591 err =
15592 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
15593 ASSERT_VK_SUCCESS(err);
15594
15595 // Allocate memory
15596 VkMemoryAllocateInfo memAlloc = {};
15597 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15598 memAlloc.pNext = NULL;
15599 memAlloc.allocationSize = 0;
15600 memAlloc.memoryTypeIndex = 0;
15601
15602 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
15603 memAlloc.allocationSize = memReqs.size;
15604 pass =
15605 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
15606 ASSERT_TRUE(pass);
15607 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
15608 ASSERT_VK_SUCCESS(err);
15609
15610 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
15611 memAlloc.allocationSize = memReqs.size;
15612 pass =
15613 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
15614 ASSERT_TRUE(pass);
15615 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
15616 ASSERT_VK_SUCCESS(err);
15617
15618 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15619 ASSERT_VK_SUCCESS(err);
15620 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
15621 ASSERT_VK_SUCCESS(err);
15622
15623 BeginCommandBuffer();
15624 VkImageCopy copyRegion;
15625 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15626 copyRegion.srcSubresource.mipLevel = 0;
15627 copyRegion.srcSubresource.baseArrayLayer = 0;
15628 copyRegion.srcSubresource.layerCount = 0;
15629 copyRegion.srcOffset.x = 0;
15630 copyRegion.srcOffset.y = 0;
15631 copyRegion.srcOffset.z = 0;
15632 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15633 copyRegion.dstSubresource.mipLevel = 0;
15634 copyRegion.dstSubresource.baseArrayLayer = 0;
15635 copyRegion.dstSubresource.layerCount = 0;
15636 copyRegion.dstOffset.x = 0;
15637 copyRegion.dstOffset.y = 0;
15638 copyRegion.dstOffset.z = 0;
15639 copyRegion.extent.width = 1;
15640 copyRegion.extent.height = 1;
15641 copyRegion.extent.depth = 1;
15642 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15643 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
15644 EndCommandBuffer();
15645
15646 m_errorMonitor->VerifyFound();
15647
15648 vkDestroyImage(m_device->device(), srcImage, NULL);
15649 vkDestroyImage(m_device->device(), dstImage, NULL);
15650 vkFreeMemory(m_device->device(), srcMem, NULL);
15651 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015652}
15653
Karl Schultz6addd812016-02-02 17:17:23 -070015654TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
15655 VkResult err;
15656 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015657
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015658 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015659 m_errorMonitor->SetDesiredFailureMsg(
15660 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015661 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015662
Mike Stroyana3082432015-09-25 13:39:21 -060015663 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015664
15665 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015666 VkImage srcImage;
15667 VkImage dstImage;
15668 VkDeviceMemory srcMem;
15669 VkDeviceMemory destMem;
15670 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015671
15672 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015673 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15674 image_create_info.pNext = NULL;
15675 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15676 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15677 image_create_info.extent.width = 32;
15678 image_create_info.extent.height = 32;
15679 image_create_info.extent.depth = 1;
15680 image_create_info.mipLevels = 1;
15681 image_create_info.arrayLayers = 1;
15682 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15683 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15684 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15685 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015686
Karl Schultz6addd812016-02-02 17:17:23 -070015687 err =
15688 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015689 ASSERT_VK_SUCCESS(err);
15690
Karl Schultzbdb75952016-04-19 11:36:49 -060015691 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15692
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015693 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070015694 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015695 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
15696 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015697
Karl Schultz6addd812016-02-02 17:17:23 -070015698 err =
15699 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015700 ASSERT_VK_SUCCESS(err);
15701
15702 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015703 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015704 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15705 memAlloc.pNext = NULL;
15706 memAlloc.allocationSize = 0;
15707 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015708
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015709 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015710 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015711 pass =
15712 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015713 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015714 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015715 ASSERT_VK_SUCCESS(err);
15716
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015717 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015718 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015719 pass =
15720 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015721 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015722 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015723 ASSERT_VK_SUCCESS(err);
15724
15725 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15726 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015727 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015728 ASSERT_VK_SUCCESS(err);
15729
15730 BeginCommandBuffer();
15731 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015732 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015733 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015734 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015735 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015736 copyRegion.srcOffset.x = 0;
15737 copyRegion.srcOffset.y = 0;
15738 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015739 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015740 copyRegion.dstSubresource.mipLevel = 0;
15741 copyRegion.dstSubresource.baseArrayLayer = 0;
15742 copyRegion.dstSubresource.layerCount = 0;
15743 copyRegion.dstOffset.x = 0;
15744 copyRegion.dstOffset.y = 0;
15745 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015746 copyRegion.extent.width = 1;
15747 copyRegion.extent.height = 1;
15748 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015749 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15750 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015751 EndCommandBuffer();
15752
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015753 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015754
Chia-I Wuf7458c52015-10-26 21:10:41 +080015755 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015756 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015757 vkFreeMemory(m_device->device(), srcMem, NULL);
15758 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015759}
15760
Karl Schultz6addd812016-02-02 17:17:23 -070015761TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
15762 VkResult err;
15763 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015764
Karl Schultz6addd812016-02-02 17:17:23 -070015765 m_errorMonitor->SetDesiredFailureMsg(
15766 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015767 "vkCmdResolveImage called with source sample count less than 2.");
15768
Mike Stroyana3082432015-09-25 13:39:21 -060015769 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015770
15771 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070015772 VkImage srcImage;
15773 VkImage dstImage;
15774 VkDeviceMemory srcMem;
15775 VkDeviceMemory destMem;
15776 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015777
15778 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015779 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15780 image_create_info.pNext = NULL;
15781 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15782 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15783 image_create_info.extent.width = 32;
15784 image_create_info.extent.height = 1;
15785 image_create_info.extent.depth = 1;
15786 image_create_info.mipLevels = 1;
15787 image_create_info.arrayLayers = 1;
15788 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15789 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15790 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15791 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015792
Karl Schultz6addd812016-02-02 17:17:23 -070015793 err =
15794 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015795 ASSERT_VK_SUCCESS(err);
15796
Karl Schultz6addd812016-02-02 17:17:23 -070015797 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015798
Karl Schultz6addd812016-02-02 17:17:23 -070015799 err =
15800 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015801 ASSERT_VK_SUCCESS(err);
15802
15803 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015804 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015805 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15806 memAlloc.pNext = NULL;
15807 memAlloc.allocationSize = 0;
15808 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015809
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015810 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015811 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015812 pass =
15813 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015814 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015815 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015816 ASSERT_VK_SUCCESS(err);
15817
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015818 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015819 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015820 pass =
15821 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015822 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015823 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015824 ASSERT_VK_SUCCESS(err);
15825
15826 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15827 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015828 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015829 ASSERT_VK_SUCCESS(err);
15830
15831 BeginCommandBuffer();
15832 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015833 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15834 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015835 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015836 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015837 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015838 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015839 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015840 resolveRegion.srcOffset.x = 0;
15841 resolveRegion.srcOffset.y = 0;
15842 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015843 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015844 resolveRegion.dstSubresource.mipLevel = 0;
15845 resolveRegion.dstSubresource.baseArrayLayer = 0;
15846 resolveRegion.dstSubresource.layerCount = 0;
15847 resolveRegion.dstOffset.x = 0;
15848 resolveRegion.dstOffset.y = 0;
15849 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015850 resolveRegion.extent.width = 1;
15851 resolveRegion.extent.height = 1;
15852 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015853 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15854 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015855 EndCommandBuffer();
15856
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015857 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015858
Chia-I Wuf7458c52015-10-26 21:10:41 +080015859 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015860 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015861 vkFreeMemory(m_device->device(), srcMem, NULL);
15862 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015863}
15864
Karl Schultz6addd812016-02-02 17:17:23 -070015865TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
15866 VkResult err;
15867 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015868
Karl Schultz6addd812016-02-02 17:17:23 -070015869 m_errorMonitor->SetDesiredFailureMsg(
15870 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015871 "vkCmdResolveImage called with dest sample count greater than 1.");
15872
Mike Stroyana3082432015-09-25 13:39:21 -060015873 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015874
Chris Forbesa7530692016-05-08 12:35:39 +120015875 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070015876 VkImage srcImage;
15877 VkImage dstImage;
15878 VkDeviceMemory srcMem;
15879 VkDeviceMemory destMem;
15880 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015881
15882 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015883 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15884 image_create_info.pNext = NULL;
15885 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15886 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15887 image_create_info.extent.width = 32;
15888 image_create_info.extent.height = 1;
15889 image_create_info.extent.depth = 1;
15890 image_create_info.mipLevels = 1;
15891 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120015892 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015893 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15894 // Note: Some implementations expect color attachment usage for any
15895 // multisample surface
15896 image_create_info.usage =
15897 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15898 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015899
Karl Schultz6addd812016-02-02 17:17:23 -070015900 err =
15901 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015902 ASSERT_VK_SUCCESS(err);
15903
Karl Schultz6addd812016-02-02 17:17:23 -070015904 // Note: Some implementations expect color attachment usage for any
15905 // multisample surface
15906 image_create_info.usage =
15907 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015908
Karl Schultz6addd812016-02-02 17:17:23 -070015909 err =
15910 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015911 ASSERT_VK_SUCCESS(err);
15912
15913 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015914 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015915 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15916 memAlloc.pNext = NULL;
15917 memAlloc.allocationSize = 0;
15918 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015919
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015920 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015921 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015922 pass =
15923 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015924 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015925 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015926 ASSERT_VK_SUCCESS(err);
15927
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015928 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015929 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015930 pass =
15931 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015932 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015933 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015934 ASSERT_VK_SUCCESS(err);
15935
15936 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15937 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015938 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015939 ASSERT_VK_SUCCESS(err);
15940
15941 BeginCommandBuffer();
15942 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015943 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15944 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015945 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015946 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015947 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015948 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015949 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015950 resolveRegion.srcOffset.x = 0;
15951 resolveRegion.srcOffset.y = 0;
15952 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015953 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015954 resolveRegion.dstSubresource.mipLevel = 0;
15955 resolveRegion.dstSubresource.baseArrayLayer = 0;
15956 resolveRegion.dstSubresource.layerCount = 0;
15957 resolveRegion.dstOffset.x = 0;
15958 resolveRegion.dstOffset.y = 0;
15959 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015960 resolveRegion.extent.width = 1;
15961 resolveRegion.extent.height = 1;
15962 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015963 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15964 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015965 EndCommandBuffer();
15966
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015967 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015968
Chia-I Wuf7458c52015-10-26 21:10:41 +080015969 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015970 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015971 vkFreeMemory(m_device->device(), srcMem, NULL);
15972 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015973}
15974
Karl Schultz6addd812016-02-02 17:17:23 -070015975TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
15976 VkResult err;
15977 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015978
Karl Schultz6addd812016-02-02 17:17:23 -070015979 m_errorMonitor->SetDesiredFailureMsg(
15980 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015981 "vkCmdResolveImage called with unmatched source and dest formats.");
15982
Mike Stroyana3082432015-09-25 13:39:21 -060015983 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015984
15985 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015986 VkImage srcImage;
15987 VkImage dstImage;
15988 VkDeviceMemory srcMem;
15989 VkDeviceMemory destMem;
15990 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015991
15992 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015993 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15994 image_create_info.pNext = NULL;
15995 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15996 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15997 image_create_info.extent.width = 32;
15998 image_create_info.extent.height = 1;
15999 image_create_info.extent.depth = 1;
16000 image_create_info.mipLevels = 1;
16001 image_create_info.arrayLayers = 1;
16002 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
16003 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16004 // Note: Some implementations expect color attachment usage for any
16005 // multisample surface
16006 image_create_info.usage =
16007 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16008 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016009
Karl Schultz6addd812016-02-02 17:17:23 -070016010 err =
16011 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016012 ASSERT_VK_SUCCESS(err);
16013
Karl Schultz6addd812016-02-02 17:17:23 -070016014 // Set format to something other than source image
16015 image_create_info.format = VK_FORMAT_R32_SFLOAT;
16016 // Note: Some implementations expect color attachment usage for any
16017 // multisample surface
16018 image_create_info.usage =
16019 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16020 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016021
Karl Schultz6addd812016-02-02 17:17:23 -070016022 err =
16023 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016024 ASSERT_VK_SUCCESS(err);
16025
16026 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016027 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016028 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16029 memAlloc.pNext = NULL;
16030 memAlloc.allocationSize = 0;
16031 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016032
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016033 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016034 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016035 pass =
16036 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016037 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016038 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016039 ASSERT_VK_SUCCESS(err);
16040
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016041 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016042 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016043 pass =
16044 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016045 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016046 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016047 ASSERT_VK_SUCCESS(err);
16048
16049 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16050 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016051 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016052 ASSERT_VK_SUCCESS(err);
16053
16054 BeginCommandBuffer();
16055 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016056 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16057 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016058 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016059 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016060 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016061 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016062 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016063 resolveRegion.srcOffset.x = 0;
16064 resolveRegion.srcOffset.y = 0;
16065 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016066 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016067 resolveRegion.dstSubresource.mipLevel = 0;
16068 resolveRegion.dstSubresource.baseArrayLayer = 0;
16069 resolveRegion.dstSubresource.layerCount = 0;
16070 resolveRegion.dstOffset.x = 0;
16071 resolveRegion.dstOffset.y = 0;
16072 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016073 resolveRegion.extent.width = 1;
16074 resolveRegion.extent.height = 1;
16075 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016076 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16077 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016078 EndCommandBuffer();
16079
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016080 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016081
Chia-I Wuf7458c52015-10-26 21:10:41 +080016082 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016083 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016084 vkFreeMemory(m_device->device(), srcMem, NULL);
16085 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016086}
16087
Karl Schultz6addd812016-02-02 17:17:23 -070016088TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
16089 VkResult err;
16090 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016091
Karl Schultz6addd812016-02-02 17:17:23 -070016092 m_errorMonitor->SetDesiredFailureMsg(
16093 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016094 "vkCmdResolveImage called with unmatched source and dest image types.");
16095
Mike Stroyana3082432015-09-25 13:39:21 -060016096 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016097
16098 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016099 VkImage srcImage;
16100 VkImage dstImage;
16101 VkDeviceMemory srcMem;
16102 VkDeviceMemory destMem;
16103 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016104
16105 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016106 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16107 image_create_info.pNext = NULL;
16108 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16109 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16110 image_create_info.extent.width = 32;
16111 image_create_info.extent.height = 1;
16112 image_create_info.extent.depth = 1;
16113 image_create_info.mipLevels = 1;
16114 image_create_info.arrayLayers = 1;
16115 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
16116 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16117 // Note: Some implementations expect color attachment usage for any
16118 // multisample surface
16119 image_create_info.usage =
16120 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16121 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016122
Karl Schultz6addd812016-02-02 17:17:23 -070016123 err =
16124 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016125 ASSERT_VK_SUCCESS(err);
16126
Karl Schultz6addd812016-02-02 17:17:23 -070016127 image_create_info.imageType = VK_IMAGE_TYPE_1D;
16128 // Note: Some implementations expect color attachment usage for any
16129 // multisample surface
16130 image_create_info.usage =
16131 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16132 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016133
Karl Schultz6addd812016-02-02 17:17:23 -070016134 err =
16135 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016136 ASSERT_VK_SUCCESS(err);
16137
16138 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016139 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016140 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16141 memAlloc.pNext = NULL;
16142 memAlloc.allocationSize = 0;
16143 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016144
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016145 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016146 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016147 pass =
16148 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016149 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016150 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016151 ASSERT_VK_SUCCESS(err);
16152
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016153 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016154 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070016155 pass =
16156 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016157 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016158 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016159 ASSERT_VK_SUCCESS(err);
16160
16161 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16162 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016163 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016164 ASSERT_VK_SUCCESS(err);
16165
16166 BeginCommandBuffer();
16167 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016168 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16169 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016170 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016171 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016172 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016173 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016174 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016175 resolveRegion.srcOffset.x = 0;
16176 resolveRegion.srcOffset.y = 0;
16177 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016178 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016179 resolveRegion.dstSubresource.mipLevel = 0;
16180 resolveRegion.dstSubresource.baseArrayLayer = 0;
16181 resolveRegion.dstSubresource.layerCount = 0;
16182 resolveRegion.dstOffset.x = 0;
16183 resolveRegion.dstOffset.y = 0;
16184 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016185 resolveRegion.extent.width = 1;
16186 resolveRegion.extent.height = 1;
16187 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016188 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
16189 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016190 EndCommandBuffer();
16191
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016192 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016193
Chia-I Wuf7458c52015-10-26 21:10:41 +080016194 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016195 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016196 vkFreeMemory(m_device->device(), srcMem, NULL);
16197 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016198}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016199
Karl Schultz6addd812016-02-02 17:17:23 -070016200TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016201 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070016202 // to using a DS format, then cause it to hit error due to COLOR_BIT not
16203 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016204 // The image format check comes 2nd in validation so we trigger it first,
16205 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070016206 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016207
Karl Schultz6addd812016-02-02 17:17:23 -070016208 m_errorMonitor->SetDesiredFailureMsg(
16209 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016210 "Combination depth/stencil image formats can have only the ");
16211
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016212 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016213
Chia-I Wu1b99bb22015-10-27 19:25:11 +080016214 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016215 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16216 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016217
16218 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016219 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16220 ds_pool_ci.pNext = NULL;
16221 ds_pool_ci.maxSets = 1;
16222 ds_pool_ci.poolSizeCount = 1;
16223 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016224
16225 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070016226 err =
16227 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016228 ASSERT_VK_SUCCESS(err);
16229
16230 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016231 dsl_binding.binding = 0;
16232 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16233 dsl_binding.descriptorCount = 1;
16234 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16235 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016236
16237 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016238 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16239 ds_layout_ci.pNext = NULL;
16240 ds_layout_ci.bindingCount = 1;
16241 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016242 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070016243 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
16244 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016245 ASSERT_VK_SUCCESS(err);
16246
16247 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016248 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080016249 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070016250 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016251 alloc_info.descriptorPool = ds_pool;
16252 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070016253 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
16254 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016255 ASSERT_VK_SUCCESS(err);
16256
Karl Schultz6addd812016-02-02 17:17:23 -070016257 VkImage image_bad;
16258 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016259 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060016260 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016261 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070016262 const int32_t tex_width = 32;
16263 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016264
16265 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016266 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16267 image_create_info.pNext = NULL;
16268 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16269 image_create_info.format = tex_format_bad;
16270 image_create_info.extent.width = tex_width;
16271 image_create_info.extent.height = tex_height;
16272 image_create_info.extent.depth = 1;
16273 image_create_info.mipLevels = 1;
16274 image_create_info.arrayLayers = 1;
16275 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16276 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16277 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
16278 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
16279 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016280
Karl Schultz6addd812016-02-02 17:17:23 -070016281 err =
16282 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016283 ASSERT_VK_SUCCESS(err);
16284 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070016285 image_create_info.usage =
16286 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16287 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
16288 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016289 ASSERT_VK_SUCCESS(err);
16290
16291 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016292 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16293 image_view_create_info.image = image_bad;
16294 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16295 image_view_create_info.format = tex_format_bad;
16296 image_view_create_info.subresourceRange.baseArrayLayer = 0;
16297 image_view_create_info.subresourceRange.baseMipLevel = 0;
16298 image_view_create_info.subresourceRange.layerCount = 1;
16299 image_view_create_info.subresourceRange.levelCount = 1;
16300 image_view_create_info.subresourceRange.aspectMask =
16301 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016302
16303 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070016304 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
16305 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016306
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016307 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016308
Chia-I Wuf7458c52015-10-26 21:10:41 +080016309 vkDestroyImage(m_device->device(), image_bad, NULL);
16310 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016311 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16312 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016313}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016314
16315TEST_F(VkLayerTest, ClearImageErrors) {
16316 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
16317 "ClearDepthStencilImage with a color image.");
16318
16319 ASSERT_NO_FATAL_FAILURE(InitState());
16320 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16321
16322 // Renderpass is started here so end it as Clear cmds can't be in renderpass
16323 BeginCommandBuffer();
16324 m_commandBuffer->EndRenderPass();
16325
16326 // Color image
16327 VkClearColorValue clear_color;
16328 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
16329 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
16330 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
16331 const int32_t img_width = 32;
16332 const int32_t img_height = 32;
16333 VkImageCreateInfo image_create_info = {};
16334 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16335 image_create_info.pNext = NULL;
16336 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16337 image_create_info.format = color_format;
16338 image_create_info.extent.width = img_width;
16339 image_create_info.extent.height = img_height;
16340 image_create_info.extent.depth = 1;
16341 image_create_info.mipLevels = 1;
16342 image_create_info.arrayLayers = 1;
16343 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16344 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16345 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16346
16347 vk_testing::Image color_image;
16348 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info,
16349 reqs);
16350
16351 const VkImageSubresourceRange color_range =
16352 vk_testing::Image::subresource_range(image_create_info,
16353 VK_IMAGE_ASPECT_COLOR_BIT);
16354
16355 // Depth/Stencil image
16356 VkClearDepthStencilValue clear_value = {0};
16357 reqs = 0; // don't need HOST_VISIBLE DS image
16358 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
16359 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
16360 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
16361 ds_image_create_info.extent.width = 64;
16362 ds_image_create_info.extent.height = 64;
16363 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16364 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
16365
16366 vk_testing::Image ds_image;
16367 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info,
16368 reqs);
16369
16370 const VkImageSubresourceRange ds_range =
16371 vk_testing::Image::subresource_range(ds_image_create_info,
16372 VK_IMAGE_ASPECT_DEPTH_BIT);
16373
16374 m_errorMonitor->SetDesiredFailureMsg(
16375 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16376 "vkCmdClearColorImage called with depth/stencil image.");
16377
16378 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
16379 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
16380 &color_range);
16381
16382 m_errorMonitor->VerifyFound();
16383
Tony Barbour26434b92016-06-02 09:43:50 -060016384 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16385 "vkCmdClearColorImage called with "
16386 "image created without "
16387 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
16388
16389 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
16390 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
16391 &color_range);
16392
16393 m_errorMonitor->VerifyFound();
16394
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016395 // Call CmdClearDepthStencilImage with color image
16396 m_errorMonitor->SetDesiredFailureMsg(
16397 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16398 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
16399
16400 vkCmdClearDepthStencilImage(
16401 m_commandBuffer->GetBufferHandle(), color_image.handle(),
16402 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
16403 &ds_range);
16404
16405 m_errorMonitor->VerifyFound();
16406}
Tobin Ehliscde08892015-09-22 10:11:37 -060016407#endif // IMAGE_TESTS
16408
Cody Northrop1242dfd2016-07-13 17:24:59 -060016409#if defined(ANDROID) && defined(VALIDATION_APK)
16410static bool initialized = false;
16411static bool active = false;
16412
16413// Convert Intents to argv
16414// Ported from Hologram sample, only difference is flexible key
16415std::vector<std::string> get_args(android_app &app, const char* intent_extra_data_key)
16416{
16417 std::vector<std::string> args;
16418 JavaVM &vm = *app.activity->vm;
16419 JNIEnv *p_env;
16420 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK)
16421 return args;
16422
16423 JNIEnv &env = *p_env;
16424 jobject activity = app.activity->clazz;
16425 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity),
16426 "getIntent", "()Landroid/content/Intent;");
16427 jobject intent = env.CallObjectMethod(activity, get_intent_method);
16428 jmethodID get_string_extra_method = env.GetMethodID(env.GetObjectClass(intent),
16429 "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
16430 jvalue get_string_extra_args;
16431 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
16432 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent,
16433 get_string_extra_method, &get_string_extra_args));
16434
16435 std::string args_str;
16436 if (extra_str) {
16437 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
16438 args_str = extra_utf;
16439 env.ReleaseStringUTFChars(extra_str, extra_utf);
16440 env.DeleteLocalRef(extra_str);
16441 }
16442
16443 env.DeleteLocalRef(get_string_extra_args.l);
16444 env.DeleteLocalRef(intent);
16445 vm.DetachCurrentThread();
16446
16447 // split args_str
16448 std::stringstream ss(args_str);
16449 std::string arg;
16450 while (std::getline(ss, arg, ' ')) {
16451 if (!arg.empty())
16452 args.push_back(arg);
16453 }
16454
16455 return args;
16456}
16457
16458
16459static int32_t processInput(struct android_app* app, AInputEvent* event) {
16460 return 0;
16461}
16462
16463static void processCommand(struct android_app* app, int32_t cmd) {
16464 switch(cmd) {
16465 case APP_CMD_INIT_WINDOW: {
16466 if (app->window) {
16467 initialized = true;
16468 }
16469 break;
16470 }
16471 case APP_CMD_GAINED_FOCUS: {
16472 active = true;
16473 break;
16474 }
16475 case APP_CMD_LOST_FOCUS: {
16476 active = false;
16477 break;
16478 }
16479 }
16480}
16481
16482void android_main(struct android_app *app)
16483{
16484 app_dummy();
16485
16486 const char* appTag = "VulkanLayerValidationTests";
16487
16488 int vulkanSupport = InitVulkan();
16489 if (vulkanSupport == 0) {
16490 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
16491 return;
16492 }
16493
16494 app->onAppCmd = processCommand;
16495 app->onInputEvent = processInput;
16496
16497 while(1) {
16498 int events;
16499 struct android_poll_source* source;
16500 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void**)&source) >= 0) {
16501 if (source) {
16502 source->process(app, source);
16503 }
16504
16505 if (app->destroyRequested != 0) {
16506 VkTestFramework::Finish();
16507 return;
16508 }
16509 }
16510
16511 if (initialized && active) {
16512 // Use the following key to send arguments to gtest, i.e.
16513 // --es args "--gtest_filter=-VkLayerTest.foo"
16514 const char key[] = "args";
16515 std::vector<std::string> args = get_args(*app, key);
16516
16517 std::string filter = "";
16518 if (args.size() > 0) {
16519 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
16520 filter += args[0];
16521 } else {
16522 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
16523 }
16524
16525 int argc = 2;
16526 char *argv[] = { (char*)"foo", (char*)filter.c_str() };
16527 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
16528
16529 // Route output to files until we can override the gtest output
16530 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
16531 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
16532
16533 ::testing::InitGoogleTest(&argc, argv);
16534 VkTestFramework::InitArgs(&argc, argv);
16535 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
16536
16537 int result = RUN_ALL_TESTS();
16538
16539 if (result != 0) {
16540 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
16541 } else {
16542 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
16543 }
16544
16545 VkTestFramework::Finish();
16546
16547 fclose(stdout);
16548 fclose(stderr);
16549
16550 ANativeActivity_finish(app->activity);
16551
16552 return;
16553 }
16554 }
16555}
16556#endif
16557
Tony Barbour300a6082015-04-07 13:44:53 -060016558int main(int argc, char **argv) {
16559 int result;
16560
Cody Northrop8e54a402016-03-08 22:25:52 -070016561#ifdef ANDROID
16562 int vulkanSupport = InitVulkan();
16563 if (vulkanSupport == 0)
16564 return 1;
16565#endif
16566
Tony Barbour300a6082015-04-07 13:44:53 -060016567 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060016568 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060016569
16570 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
16571
16572 result = RUN_ALL_TESTS();
16573
Tony Barbour6918cd52015-04-09 12:58:51 -060016574 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060016575 return result;
16576}