blob: 2ddf42ec0aaca6a29750889a57220922b25af794 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Michael Lentine0a369f62016-02-03 16:51:46 -06005 * Copyright (c) 2015-2016 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
20 */
Tony Barbour65c48b32015-11-17 10:02:56 -070021
Cody Northrop8e54a402016-03-08 22:25:52 -070022#ifdef ANDROID
23#include "vulkan_wrapper.h"
24#else
David Pinedo9316d3b2015-11-06 12:54:48 -070025#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070026#endif
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060027#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060028#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060029#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070030#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060031
Mark Lobodzinski3780e142015-05-14 15:08:13 -050032#define GLM_FORCE_RADIANS
33#include "glm/glm.hpp"
34#include <glm/gtc/matrix_transform.hpp>
35
Dustin Gravesffa90fa2016-05-06 11:20:38 -060036#define PARAMETER_VALIDATION_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060037#define MEM_TRACKER_TESTS 1
38#define OBJ_TRACKER_TESTS 1
39#define DRAW_STATE_TESTS 1
40#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120041#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060042#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060043#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060044
Mark Lobodzinski3780e142015-05-14 15:08:13 -050045//--------------------------------------------------------------------------------------
46// Mesh and VertexFormat Data
47//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070048struct Vertex {
49 float posX, posY, posZ, posW; // Position data
50 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050051};
52
Karl Schultz6addd812016-02-02 17:17:23 -070053#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050054
55typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070056 BsoFailNone = 0x00000000,
57 BsoFailLineWidth = 0x00000001,
58 BsoFailDepthBias = 0x00000002,
59 BsoFailViewport = 0x00000004,
60 BsoFailScissor = 0x00000008,
61 BsoFailBlend = 0x00000010,
62 BsoFailDepthBounds = 0x00000020,
63 BsoFailStencilReadMask = 0x00000040,
64 BsoFailStencilWriteMask = 0x00000080,
65 BsoFailStencilReference = 0x00000100,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050066} BsoFailSelect;
67
68struct vktriangle_vs_uniform {
69 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070070 float mvp[4][4];
71 float position[3][4];
72 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050073};
74
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050075static const char bindStateVertShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120076 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070077 "vec2 vertices[3];\n"
78 "out gl_PerVertex {\n"
79 " vec4 gl_Position;\n"
80 "};\n"
81 "void main() {\n"
82 " vertices[0] = vec2(-1.0, -1.0);\n"
83 " vertices[1] = vec2( 1.0, -1.0);\n"
84 " vertices[2] = vec2( 0.0, 1.0);\n"
85 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
86 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050087
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050088static const char bindStateFragShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120089 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070090 "\n"
91 "layout(location = 0) out vec4 uFragColor;\n"
92 "void main(){\n"
93 " uFragColor = vec4(0,1,0,1);\n"
94 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050095
Karl Schultz6addd812016-02-02 17:17:23 -070096static VKAPI_ATTR VkBool32 VKAPI_CALL
97myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
98 uint64_t srcObject, size_t location, int32_t msgCode,
99 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -0600100
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600101// ********************************************************
102// ErrorMonitor Usage:
103//
104// Call SetDesiredFailureMsg with a string to be compared against all
105// encountered log messages. Passing NULL will match all log messages.
106// logMsg will return true for skipCall only if msg is matched or NULL.
107//
108// Call DesiredMsgFound to determine if the desired failure message
109// was encountered.
110
Tony Barbour300a6082015-04-07 13:44:53 -0600111class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700112 public:
113 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600114 test_platform_thread_create_mutex(&m_mutex);
115 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700116 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700117 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600118 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600119 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600120
Dustin Graves48458142016-04-29 16:11:55 -0600121 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
122
Karl Schultz6addd812016-02-02 17:17:23 -0700123 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200124 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600125 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600126 m_failureMsg.clear();
127 m_otherMsgs.clear();
128 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700129 m_msgFound = VK_FALSE;
130 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600131 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600132 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600133
Karl Schultz6addd812016-02-02 17:17:23 -0700134 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600135 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600136 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600137 if (m_bailout != NULL) {
138 *m_bailout = true;
139 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600140 string errorString(msgString);
141 if (msgFlags & m_msgFlags) {
142 if (errorString.find(m_desiredMsg) != string::npos) {
Chris Forbesc7b8ad72016-04-04 18:50:38 +1200143 if (m_msgFound) { /* if multiple matches, don't lose all but the last! */
144 m_otherMsgs.push_back(m_failureMsg);
145 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600146 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700147 m_msgFound = VK_TRUE;
148 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600149 } else {
150 m_otherMsgs.push_back(errorString);
151 }
152 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600153 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600154 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600155 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600156
Karl Schultz6addd812016-02-02 17:17:23 -0700157 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600158
Karl Schultz6addd812016-02-02 17:17:23 -0700159 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600160
Karl Schultz6addd812016-02-02 17:17:23 -0700161 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600162
Karl Schultz6addd812016-02-02 17:17:23 -0700163 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600164
Karl Schultz6addd812016-02-02 17:17:23 -0700165 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600166 vector<string> otherMsgs = GetOtherFailureMsgs();
167 cout << "Other error messages logged for this test were:" << endl;
168 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
169 cout << " " << *iter << endl;
170 }
171 }
172
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200173 /* helpers */
174
175 void ExpectSuccess() {
176 // match anything
177 SetDesiredFailureMsg(~0u, "");
178 }
179
180 void VerifyFound() {
181 // Not seeing the desired message is a failure. /Before/ throwing, dump
182 // any other messages.
183 if (!DesiredMsgFound()) {
184 DumpFailureMsgs();
185 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
186 }
187 }
188
189 void VerifyNotFound() {
190 // ExpectSuccess() configured us to match anything. Any error is a
191 // failure.
192 if (DesiredMsgFound()) {
193 DumpFailureMsgs();
194 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
195 }
196 }
197
Karl Schultz6addd812016-02-02 17:17:23 -0700198 private:
199 VkFlags m_msgFlags;
200 string m_desiredMsg;
201 string m_failureMsg;
202 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600203 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700204 bool *m_bailout;
205 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600206};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500207
Karl Schultz6addd812016-02-02 17:17:23 -0700208static VKAPI_ATTR VkBool32 VKAPI_CALL
209myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
210 uint64_t srcObject, size_t location, int32_t msgCode,
211 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
212 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700213 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700214 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600215 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600216 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600217 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600218 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600219}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500220
Karl Schultz6addd812016-02-02 17:17:23 -0700221class VkLayerTest : public VkRenderFramework {
222 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800223 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
224 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700225 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
226 BsoFailSelect failMask);
227 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
228 VkPipelineObj &pipelineobj,
229 VkDescriptorSetObj &descriptorSet,
230 BsoFailSelect failMask);
231 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
232 VkDescriptorSetObj &descriptorSet,
233 BsoFailSelect failMask) {
234 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
235 failMask);
236 }
Tony Barbour300a6082015-04-07 13:44:53 -0600237
Tony Barbourfe3351b2015-07-28 10:17:20 -0600238 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700239 VkResult BeginCommandBuffer() {
240 return BeginCommandBuffer(*m_commandBuffer);
241 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800242 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700243 void Draw(uint32_t vertexCount, uint32_t instanceCount,
244 uint32_t firstVertex, uint32_t firstInstance) {
245 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
246 firstInstance);
247 }
248 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
249 uint32_t firstIndex, int32_t vertexOffset,
250 uint32_t firstInstance) {
251 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
252 vertexOffset, firstInstance);
253 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800254 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); }
Karl Schultz6addd812016-02-02 17:17:23 -0700255 void QueueCommandBuffer(const VkFence &fence) {
256 m_commandBuffer->QueueCommandBuffer(fence);
257 }
258 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
259 VkDeviceSize offset, uint32_t binding) {
260 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
261 }
262 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
263 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
264 }
265
266 protected:
267 ErrorMonitor *m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600268
269 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600270 std::vector<const char *> instance_layer_names;
271 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600272 std::vector<const char *> instance_extension_names;
273 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600274
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700275 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600276 /*
277 * Since CreateDbgMsgCallback is an instance level extension call
278 * any extension / layer that utilizes that feature also needs
279 * to be enabled at create instance time.
280 */
Karl Schultz6addd812016-02-02 17:17:23 -0700281 // Use Threading layer first to protect others from
282 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700283 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600284 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800285 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700286 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800287 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
288 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600289 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700290 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600291
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700292 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600293 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800294 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700295 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800296 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
297 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600298 device_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700299 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600300
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600301 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600302 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800303 this->app_info.pApplicationName = "layer_tests";
304 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600305 this->app_info.pEngineName = "unittest";
306 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600307 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600308
Tony Barbour15524c32015-04-29 17:34:29 -0600309 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600310 InitFramework(instance_layer_names, device_layer_names,
311 instance_extension_names, device_extension_names,
312 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600313 }
314
315 virtual void TearDown() {
316 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600317 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600318 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600319 }
320};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500321
Karl Schultz6addd812016-02-02 17:17:23 -0700322VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600323 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600324
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800325 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600326
327 /*
328 * For render test all drawing happens in a single render pass
329 * on a single command buffer.
330 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200331 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800332 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600333 }
334
335 return result;
336}
337
Karl Schultz6addd812016-02-02 17:17:23 -0700338VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600339 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600340
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200341 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800342 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200343 }
Tony Barbour300a6082015-04-07 13:44:53 -0600344
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800345 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600346
347 return result;
348}
349
Karl Schultz6addd812016-02-02 17:17:23 -0700350void VkLayerTest::VKTriangleTest(const char *vertShaderText,
351 const char *fragShaderText,
352 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500353 // Create identity matrix
354 int i;
355 struct vktriangle_vs_uniform data;
356
357 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700358 glm::mat4 View = glm::mat4(1.0f);
359 glm::mat4 Model = glm::mat4(1.0f);
360 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500361 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700362 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500363
364 memcpy(&data.mvp, &MVP[0][0], matrixSize);
365
Karl Schultz6addd812016-02-02 17:17:23 -0700366 static const Vertex tri_data[] = {
367 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
368 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
369 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500370 };
371
Karl Schultz6addd812016-02-02 17:17:23 -0700372 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500373 data.position[i][0] = tri_data[i].posX;
374 data.position[i][1] = tri_data[i].posY;
375 data.position[i][2] = tri_data[i].posZ;
376 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700377 data.color[i][0] = tri_data[i].r;
378 data.color[i][1] = tri_data[i].g;
379 data.color[i][2] = tri_data[i].b;
380 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500381 }
382
383 ASSERT_NO_FATAL_FAILURE(InitState());
384 ASSERT_NO_FATAL_FAILURE(InitViewport());
385
Karl Schultz6addd812016-02-02 17:17:23 -0700386 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
387 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500388
Karl Schultz6addd812016-02-02 17:17:23 -0700389 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
390 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
391 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500392
393 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800394 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500395 pipelineobj.AddShader(&vs);
396 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600397 if (failMask & BsoFailLineWidth) {
398 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600399 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
400 ia_state.sType =
401 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
402 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
403 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600404 }
405 if (failMask & BsoFailDepthBias) {
406 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600407 VkPipelineRasterizationStateCreateInfo rs_state = {};
408 rs_state.sType =
409 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
410 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600411 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600412 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600413 }
Karl Schultz6addd812016-02-02 17:17:23 -0700414 // Viewport and scissors must stay in synch or other errors will occur than
415 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600416 if (failMask & BsoFailViewport) {
417 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600418 m_viewports.clear();
419 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600420 }
421 if (failMask & BsoFailScissor) {
422 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600423 m_scissors.clear();
424 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600425 }
426 if (failMask & BsoFailBlend) {
427 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600428 VkPipelineColorBlendAttachmentState att_state = {};
429 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
430 att_state.blendEnable = VK_TRUE;
431 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600432 }
433 if (failMask & BsoFailDepthBounds) {
434 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
435 }
436 if (failMask & BsoFailStencilReadMask) {
437 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
438 }
439 if (failMask & BsoFailStencilWriteMask) {
440 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
441 }
442 if (failMask & BsoFailStencilReference) {
443 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
444 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500445
446 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700447 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
448 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500449
450 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600451 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500452
Tony Barbourfe3351b2015-07-28 10:17:20 -0600453 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500454
455 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600456 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500457
458 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600459 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500460
Tony Barbourfe3351b2015-07-28 10:17:20 -0600461 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500462}
463
Karl Schultz6addd812016-02-02 17:17:23 -0700464void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
465 VkPipelineObj &pipelineobj,
466 VkDescriptorSetObj &descriptorSet,
467 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500468 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700469 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
470 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500471 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700472 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
473 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500474 }
475
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800476 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700477 // Make sure depthWriteEnable is set so that Depth fail test will work
478 // correctly
479 // Make sure stencilTestEnable is set so that Stencil fail test will work
480 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600481 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800482 stencil.failOp = VK_STENCIL_OP_KEEP;
483 stencil.passOp = VK_STENCIL_OP_KEEP;
484 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
485 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600486
487 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
488 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600489 ds_ci.pNext = NULL;
490 ds_ci.depthTestEnable = VK_FALSE;
491 ds_ci.depthWriteEnable = VK_TRUE;
492 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
493 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600494 if (failMask & BsoFailDepthBounds) {
495 ds_ci.depthBoundsTestEnable = VK_TRUE;
496 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600497 ds_ci.stencilTestEnable = VK_TRUE;
498 ds_ci.front = stencil;
499 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600500
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600501 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600502 pipelineobj.SetViewport(m_viewports);
503 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800504 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700505 VkResult err = pipelineobj.CreateVKPipeline(
506 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600507 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800508 commandBuffer->BindPipeline(pipelineobj);
509 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500510}
511
512// ********************************************************************************************************************
513// ********************************************************************************************************************
514// ********************************************************************************************************************
515// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600516#if PARAMETER_VALIDATION_TESTS
517TEST_F(VkLayerTest, RequiredParameter) {
518 TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
519 "pointer, array, and array count parameters");
520
521 ASSERT_NO_FATAL_FAILURE(InitState());
522
523 m_errorMonitor->SetDesiredFailureMsg(
524 VK_DEBUG_REPORT_ERROR_BIT_EXT,
525 "required parameter pFeatures specified as NULL");
526 // Specify NULL for a pointer to a handle
527 // Expected to trigger an error with
528 // parameter_validation::validate_required_pointer
529 vkGetPhysicalDeviceFeatures(gpu(), NULL);
530 m_errorMonitor->VerifyFound();
531
532 m_errorMonitor->SetDesiredFailureMsg(
533 VK_DEBUG_REPORT_ERROR_BIT_EXT,
534 "required parameter pPhysicalDeviceCount specified as NULL");
535 // Specify NULL for pointer to array count
536 // Expected to trigger an error with parameter_validation::validate_array
537 vkEnumeratePhysicalDevices(instance(), NULL, NULL);
538 m_errorMonitor->VerifyFound();
539
540 m_errorMonitor->SetDesiredFailureMsg(
541 VK_DEBUG_REPORT_ERROR_BIT_EXT,
542 "parameter viewportCount must be greater than 0");
543 // Specify 0 for a required array count
544 // Expected to trigger an error with parameter_validation::validate_array
545 VkViewport view_port = {};
546 m_commandBuffer->SetViewport(0, 0, &view_port);
547 m_errorMonitor->VerifyFound();
548
549 m_errorMonitor->SetDesiredFailureMsg(
550 VK_DEBUG_REPORT_ERROR_BIT_EXT,
551 "required parameter pViewports specified as NULL");
552 // Specify NULL for a required array
553 // Expected to trigger an error with parameter_validation::validate_array
554 m_commandBuffer->SetViewport(0, 1, NULL);
555 m_errorMonitor->VerifyFound();
556
557 m_errorMonitor->SetDesiredFailureMsg(
558 VK_DEBUG_REPORT_ERROR_BIT_EXT,
559 "required parameter memory specified as VK_NULL_HANDLE");
560 // Specify VK_NULL_HANDLE for a required handle
561 // Expected to trigger an error with
562 // parameter_validation::validate_required_handle
563 vkUnmapMemory(device(), VK_NULL_HANDLE);
564 m_errorMonitor->VerifyFound();
565
566 m_errorMonitor->SetDesiredFailureMsg(
567 VK_DEBUG_REPORT_ERROR_BIT_EXT,
568 "required parameter pFences[0] specified as VK_NULL_HANDLE");
569 // Specify VK_NULL_HANDLE for a required handle array entry
570 // Expected to trigger an error with
571 // parameter_validation::validate_required_handle_array
572 VkFence fence = VK_NULL_HANDLE;
573 vkResetFences(device(), 1, &fence);
574 m_errorMonitor->VerifyFound();
575
576 m_errorMonitor->SetDesiredFailureMsg(
577 VK_DEBUG_REPORT_ERROR_BIT_EXT,
578 "required parameter pAllocateInfo specified as NULL");
579 // Specify NULL for a required struct pointer
580 // Expected to trigger an error with
581 // parameter_validation::validate_struct_type
582 VkDeviceMemory memory = VK_NULL_HANDLE;
583 vkAllocateMemory(device(), NULL, NULL, &memory);
584 m_errorMonitor->VerifyFound();
585
586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
587 "value of faceMask must not be 0");
588 // Specify 0 for a required VkFlags parameter
589 // Expected to trigger an error with parameter_validation::validate_flags
590 m_commandBuffer->SetStencilReference(0, 0);
591 m_errorMonitor->VerifyFound();
592
593 m_errorMonitor->SetDesiredFailureMsg(
594 VK_DEBUG_REPORT_ERROR_BIT_EXT,
595 "value of pSubmits[i].pWaitDstStageMask[0] must not be 0");
596 // Specify 0 for a required VkFlags array entry
597 // Expected to trigger an error with
598 // parameter_validation::validate_flags_array
599 VkSemaphore semaphore = VK_NULL_HANDLE;
600 VkPipelineStageFlags stageFlags = 0;
601 VkSubmitInfo submitInfo = {};
602 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
603 submitInfo.waitSemaphoreCount = 1;
604 submitInfo.pWaitSemaphores = &semaphore;
605 submitInfo.pWaitDstStageMask = &stageFlags;
606 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
607 m_errorMonitor->VerifyFound();
608}
609#endif // PARAMETER_VALIDATION_TESTS
610
Tobin Ehlis0788f522015-05-26 16:11:58 -0600611#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700612#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800613TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500614{
615 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500616 VkFenceCreateInfo fenceInfo = {};
617 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
618 fenceInfo.pNext = NULL;
619 fenceInfo.flags = 0;
620
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700621 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600622
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500623 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600624
625 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
626 vk_testing::Buffer buffer;
627 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500628
Tony Barbourfe3351b2015-07-28 10:17:20 -0600629 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800630 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600631 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500632
633 testFence.init(*m_device, fenceInfo);
634
635 // Bypass framework since it does the waits automatically
636 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600637 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800638 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
639 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800640 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600641 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700642 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800643 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800644 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800645 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600646 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600647
648 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500649 ASSERT_VK_SUCCESS( err );
650
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500651 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800652 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500653
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200654 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500655}
656
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800657TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500658{
659 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500660 VkFenceCreateInfo fenceInfo = {};
661 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
662 fenceInfo.pNext = NULL;
663 fenceInfo.flags = 0;
664
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600666
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500667 ASSERT_NO_FATAL_FAILURE(InitState());
668 ASSERT_NO_FATAL_FAILURE(InitViewport());
669 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
670
Tony Barbourfe3351b2015-07-28 10:17:20 -0600671 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800672 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600673 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500674
675 testFence.init(*m_device, fenceInfo);
676
677 // Bypass framework since it does the waits automatically
678 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600679 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800680 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
681 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800682 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600683 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700684 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800685 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800686 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800687 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600688 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600689
690 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500691 ASSERT_VK_SUCCESS( err );
692
Jon Ashburnf19916e2016-01-11 13:12:43 -0700693 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800694 VkCommandBufferBeginInfo info = {};
695 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
696 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600697 info.renderPass = VK_NULL_HANDLE;
698 info.subpass = 0;
699 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +0800700 info.occlusionQueryEnable = VK_FALSE;
701 info.queryFlags = 0;
702 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600703
704 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800705 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500706
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200707 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500708}
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700709#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200710
Mark Lobodzinski152fe252016-05-03 16:49:15 -0600711// This is a positive test. No failures are expected.
712TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
713 VkResult err;
714 bool pass;
715
716 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
717 "the buffer, create an image, and bind the same memory to "
718 "it");
719
720 m_errorMonitor->ExpectSuccess();
721
722 ASSERT_NO_FATAL_FAILURE(InitState());
723
724 VkBuffer buffer;
725 VkImage image;
726 VkDeviceMemory mem;
727 VkMemoryRequirements mem_reqs;
728
729 VkBufferCreateInfo buf_info = {};
730 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
731 buf_info.pNext = NULL;
732 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
733 buf_info.size = 256;
734 buf_info.queueFamilyIndexCount = 0;
735 buf_info.pQueueFamilyIndices = NULL;
736 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
737 buf_info.flags = 0;
738 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
739 ASSERT_VK_SUCCESS(err);
740
741 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
742
743 VkMemoryAllocateInfo alloc_info = {};
744 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
745 alloc_info.pNext = NULL;
746 alloc_info.memoryTypeIndex = 0;
747
748 // Ensure memory is big enough for both bindings
749 alloc_info.allocationSize = 0x10000;
750
751 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
752 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
753 if (!pass) {
754 vkDestroyBuffer(m_device->device(), buffer, NULL);
755 return;
756 }
757
758 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
759 ASSERT_VK_SUCCESS(err);
760
761 uint8_t *pData;
762 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
763 (void **)&pData);
764 ASSERT_VK_SUCCESS(err);
765
Mark Lobodzinski2abefa92016-05-05 11:45:57 -0600766 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -0600767
768 vkUnmapMemory(m_device->device(), mem);
769
770 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
771 ASSERT_VK_SUCCESS(err);
772
773 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
774 // memory. In fact, it was never used by the GPU.
775 // Just be be sure, wait for idle.
776 vkDestroyBuffer(m_device->device(), buffer, NULL);
777 vkDeviceWaitIdle(m_device->device());
778
779 VkImageCreateInfo image_create_info = {};
780 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
781 image_create_info.pNext = NULL;
782 image_create_info.imageType = VK_IMAGE_TYPE_2D;
783 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
784 image_create_info.extent.width = 64;
785 image_create_info.extent.height = 64;
786 image_create_info.extent.depth = 1;
787 image_create_info.mipLevels = 1;
788 image_create_info.arrayLayers = 1;
789 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
790 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
791 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
792 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
793 image_create_info.queueFamilyIndexCount = 0;
794 image_create_info.pQueueFamilyIndices = NULL;
795 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
796 image_create_info.flags = 0;
797
798 VkMemoryAllocateInfo mem_alloc = {};
799 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
800 mem_alloc.pNext = NULL;
801 mem_alloc.allocationSize = 0;
802 mem_alloc.memoryTypeIndex = 0;
803
804 /* Create a mappable image. It will be the texture if linear images are ok
805 * to be textures or it will be the staging image if they are not.
806 */
807 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
808 ASSERT_VK_SUCCESS(err);
809
810 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
811
812 mem_alloc.allocationSize = mem_reqs.size;
813
814 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
815 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
816 if (!pass) {
817 vkDestroyImage(m_device->device(), image, NULL);
818 return;
819 }
820
821 // VALDIATION FAILURE:
822 err = vkBindImageMemory(m_device->device(), image, mem, 0);
823 ASSERT_VK_SUCCESS(err);
824
825 m_errorMonitor->VerifyNotFound();
826
827 vkDestroyBuffer(m_device->device(), buffer, NULL);
828 vkDestroyImage(m_device->device(), image, NULL);
829}
830
Ian Elliott1c32c772016-04-28 14:47:13 -0600831TEST_F(VkLayerTest, EnableWsiBeforeUse) {
832 VkResult err;
833 bool pass;
834
Ian Elliott489eec02016-05-05 14:12:44 -0600835// FIXME: After we turn on this code for non-Linux platforms, uncomment the
836// following declaration (which is temporarily being moved below):
837// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -0600838 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
839 VkSwapchainCreateInfoKHR swapchain_create_info = {};
840 uint32_t swapchain_image_count = 0;
841// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
842 uint32_t image_index = 0;
843// VkPresentInfoKHR present_info = {};
844
845 ASSERT_NO_FATAL_FAILURE(InitState());
846
Ian Elliott3f06ce52016-04-29 14:46:21 -0600847#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
848#if defined(VK_USE_PLATFORM_ANDROID_KHR)
849 // Use the functions from the VK_KHR_android_surface extension without
850 // enabling that extension:
851
852 // Create a surface:
853 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
854#if 0
855#endif
856 m_errorMonitor->SetDesiredFailureMsg(
857 VK_DEBUG_REPORT_ERROR_BIT_EXT,
858 "extension was not enabled for this");
859 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
860 &surface);
861 pass = (err != VK_SUCCESS);
862 ASSERT_TRUE(pass);
863 m_errorMonitor->VerifyFound();
864#endif // VK_USE_PLATFORM_ANDROID_KHR
865
866
867#if defined(VK_USE_PLATFORM_MIR_KHR)
868 // Use the functions from the VK_KHR_mir_surface extension without enabling
869 // that extension:
870
871 // Create a surface:
872 VkMirSurfaceCreateInfoKHR mir_create_info = {};
873#if 0
874#endif
875 m_errorMonitor->SetDesiredFailureMsg(
876 VK_DEBUG_REPORT_ERROR_BIT_EXT,
877 "extension was not enabled for this");
878 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
879 pass = (err != VK_SUCCESS);
880 ASSERT_TRUE(pass);
881 m_errorMonitor->VerifyFound();
882
883 // Tell whether an mir_connection supports presentation:
884 MirConnection *mir_connection = NULL;
885 m_errorMonitor->SetDesiredFailureMsg(
886 VK_DEBUG_REPORT_ERROR_BIT_EXT,
887 "extension was not enabled for this");
888 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
889 visual_id);
890 m_errorMonitor->VerifyFound();
891#endif // VK_USE_PLATFORM_MIR_KHR
892
893
894#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
895 // Use the functions from the VK_KHR_wayland_surface extension without
896 // enabling that extension:
897
898 // Create a surface:
899 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
900#if 0
901#endif
902 m_errorMonitor->SetDesiredFailureMsg(
903 VK_DEBUG_REPORT_ERROR_BIT_EXT,
904 "extension was not enabled for this");
905 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
906 &surface);
907 pass = (err != VK_SUCCESS);
908 ASSERT_TRUE(pass);
909 m_errorMonitor->VerifyFound();
910
911 // Tell whether an wayland_display supports presentation:
912 struct wl_display wayland_display = {};
913 m_errorMonitor->SetDesiredFailureMsg(
914 VK_DEBUG_REPORT_ERROR_BIT_EXT,
915 "extension was not enabled for this");
916 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
917 &wayland_display);
918 m_errorMonitor->VerifyFound();
919#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -0600920#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -0600921
922
923#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -0600924// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
925// TO NON-LINUX PLATFORMS:
926VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -0600927 // Use the functions from the VK_KHR_win32_surface extension without
928 // enabling that extension:
929
930 // Create a surface:
931 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
932#if 0
933#endif
934 m_errorMonitor->SetDesiredFailureMsg(
935 VK_DEBUG_REPORT_ERROR_BIT_EXT,
936 "extension was not enabled for this");
937 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
938 &surface);
939 pass = (err != VK_SUCCESS);
940 ASSERT_TRUE(pass);
941 m_errorMonitor->VerifyFound();
942
943 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -0600944 m_errorMonitor->SetDesiredFailureMsg(
945 VK_DEBUG_REPORT_ERROR_BIT_EXT,
946 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -0600947 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -0600948 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -0600949// Set this (for now, until all platforms are supported and tested):
950#define NEED_TO_TEST_THIS_ON_PLATFORM
951#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -0600952
953
Ian Elliott1c32c772016-04-28 14:47:13 -0600954#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -0600955// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
956// TO NON-LINUX PLATFORMS:
957VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -0600958 // Use the functions from the VK_KHR_xcb_surface extension without enabling
959 // that extension:
960
961 // Create a surface:
962 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
963#if 0
964#endif
965 m_errorMonitor->SetDesiredFailureMsg(
966 VK_DEBUG_REPORT_ERROR_BIT_EXT,
967 "extension was not enabled for this");
968 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
969 pass = (err != VK_SUCCESS);
970 ASSERT_TRUE(pass);
971 m_errorMonitor->VerifyFound();
972
973 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -0600974 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -0600975 xcb_visualid_t visual_id = 0;
976 m_errorMonitor->SetDesiredFailureMsg(
977 VK_DEBUG_REPORT_ERROR_BIT_EXT,
978 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -0600979 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -0600980 visual_id);
981 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -0600982// Set this (for now, until all platforms are supported and tested):
983#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -0600984#endif // VK_USE_PLATFORM_XCB_KHR
985
986
Ian Elliott12630812016-04-29 14:35:43 -0600987#if defined(VK_USE_PLATFORM_XLIB_KHR)
988 // Use the functions from the VK_KHR_xlib_surface extension without enabling
989 // that extension:
990
991 // Create a surface:
992 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
993#if 0
994#endif
995 m_errorMonitor->SetDesiredFailureMsg(
996 VK_DEBUG_REPORT_ERROR_BIT_EXT,
997 "extension was not enabled for this");
998 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
999 pass = (err != VK_SUCCESS);
1000 ASSERT_TRUE(pass);
1001 m_errorMonitor->VerifyFound();
1002
1003 // Tell whether an Xlib VisualID supports presentation:
1004 Display *dpy = NULL;
1005 VisualID visual = 0;
1006 m_errorMonitor->SetDesiredFailureMsg(
1007 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1008 "extension was not enabled for this");
1009 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1010 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001011// Set this (for now, until all platforms are supported and tested):
1012#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06001013#endif // VK_USE_PLATFORM_XLIB_KHR
1014
1015
Ian Elliott1c32c772016-04-28 14:47:13 -06001016 // Use the functions from the VK_KHR_surface extension without enabling
1017 // that extension:
1018
Ian Elliott489eec02016-05-05 14:12:44 -06001019#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001020 // Destroy a surface:
1021 m_errorMonitor->SetDesiredFailureMsg(
1022 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1023 "extension was not enabled for this");
1024 vkDestroySurfaceKHR(instance(), surface, NULL);
1025 m_errorMonitor->VerifyFound();
1026
1027 // Check if surface supports presentation:
1028 VkBool32 supported = false;
1029 m_errorMonitor->SetDesiredFailureMsg(
1030 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1031 "extension was not enabled for this");
1032 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1033 pass = (err != VK_SUCCESS);
1034 ASSERT_TRUE(pass);
1035 m_errorMonitor->VerifyFound();
1036
1037 // Check surface capabilities:
1038 VkSurfaceCapabilitiesKHR capabilities = {};
1039 m_errorMonitor->SetDesiredFailureMsg(
1040 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1041 "extension was not enabled for this");
1042 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
1043 &capabilities);
1044 pass = (err != VK_SUCCESS);
1045 ASSERT_TRUE(pass);
1046 m_errorMonitor->VerifyFound();
1047
1048 // Check surface formats:
1049 uint32_t format_count = 0;
1050 VkSurfaceFormatKHR *formats = NULL;
1051 m_errorMonitor->SetDesiredFailureMsg(
1052 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1053 "extension was not enabled for this");
1054 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1055 &format_count, formats);
1056 pass = (err != VK_SUCCESS);
1057 ASSERT_TRUE(pass);
1058 m_errorMonitor->VerifyFound();
1059
1060 // Check surface present modes:
1061 uint32_t present_mode_count = 0;
1062 VkSurfaceFormatKHR *present_modes = NULL;
1063 m_errorMonitor->SetDesiredFailureMsg(
1064 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1065 "extension was not enabled for this");
1066 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1067 &present_mode_count, present_modes);
1068 pass = (err != VK_SUCCESS);
1069 ASSERT_TRUE(pass);
1070 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001071#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001072
1073
1074 // Use the functions from the VK_KHR_swapchain extension without enabling
1075 // that extension:
1076
1077 // Create a swapchain:
1078 m_errorMonitor->SetDesiredFailureMsg(
1079 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1080 "extension was not enabled for this");
1081 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1082 swapchain_create_info.pNext = NULL;
1083#if 0
1084 swapchain_create_info.flags = 0;
1085 swapchain_create_info.surface = 0;
1086 swapchain_create_info.minImageCount = 0;
1087 swapchain_create_info.imageFormat = 0;
1088 swapchain_create_info.imageColorSpace = 0;
1089 swapchain_create_info.imageExtent.width = 0;
1090 swapchain_create_info.imageExtent.height = 0;
1091 swapchain_create_info.imageArrayLayers = 0;
1092 swapchain_create_info.imageUsage = 0;
1093 swapchain_create_info.imageSharingMode = 0;
1094 swapchain_create_info.queueFamilyIndexCount = 0;
1095 swapchain_create_info.preTransform = 0;
1096 swapchain_create_info.compositeAlpha = 0;
1097 swapchain_create_info.presentMode = 0;
1098 swapchain_create_info.clipped = 0;
1099 swapchain_create_info.oldSwapchain = NULL;
1100#endif
1101 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1102 NULL, &swapchain);
1103 pass = (err != VK_SUCCESS);
1104 ASSERT_TRUE(pass);
1105 m_errorMonitor->VerifyFound();
1106
1107 // Get the images from the swapchain:
1108 m_errorMonitor->SetDesiredFailureMsg(
1109 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1110 "extension was not enabled for this");
1111 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
1112 &swapchain_image_count, NULL);
1113 pass = (err != VK_SUCCESS);
1114 ASSERT_TRUE(pass);
1115 m_errorMonitor->VerifyFound();
1116
1117 // Try to acquire an image:
1118 m_errorMonitor->SetDesiredFailureMsg(
1119 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1120 "extension was not enabled for this");
1121 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
1122 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
1123 pass = (err != VK_SUCCESS);
1124 ASSERT_TRUE(pass);
1125 m_errorMonitor->VerifyFound();
1126
1127 // Try to present an image:
1128#if 0 // NOTE: Currently can't test this because a real swapchain is needed
1129 // (as opposed to the fake one we created) in order for the layer to
1130 // lookup the VkDevice used to enable the extension:
1131 m_errorMonitor->SetDesiredFailureMsg(
1132 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1133 "extension was not enabled for this");
1134 present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
1135 present_info.pNext = NULL;
1136#if 0
1137#endif
1138 err = vkQueuePresentKHR(m_device->m_queue, &present_info);
1139 pass = (err != VK_SUCCESS);
1140 ASSERT_TRUE(pass);
1141 m_errorMonitor->VerifyFound();
1142#endif
1143
1144 // Destroy the swapchain:
1145 m_errorMonitor->SetDesiredFailureMsg(
1146 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1147 "extension was not enabled for this");
1148 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1149 m_errorMonitor->VerifyFound();
1150}
1151
Karl Schultz6addd812016-02-02 17:17:23 -07001152TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1153 VkResult err;
1154 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001155
Karl Schultz6addd812016-02-02 17:17:23 -07001156 m_errorMonitor->SetDesiredFailureMsg(
1157 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001158 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
1159
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001160 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001161
1162 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001163 VkImage image;
1164 VkDeviceMemory mem;
1165 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001166
Karl Schultz6addd812016-02-02 17:17:23 -07001167 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1168 const int32_t tex_width = 32;
1169 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001170
Tony Barboureb254902015-07-15 12:50:33 -06001171 VkImageCreateInfo image_create_info = {};
1172 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001173 image_create_info.pNext = NULL;
1174 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1175 image_create_info.format = tex_format;
1176 image_create_info.extent.width = tex_width;
1177 image_create_info.extent.height = tex_height;
1178 image_create_info.extent.depth = 1;
1179 image_create_info.mipLevels = 1;
1180 image_create_info.arrayLayers = 1;
1181 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1182 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1183 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1184 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001185
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001186 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001187 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001188 mem_alloc.pNext = NULL;
1189 mem_alloc.allocationSize = 0;
1190 // Introduce failure, do NOT set memProps to
1191 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
1192 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001193
Chia-I Wuf7458c52015-10-26 21:10:41 +08001194 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001195 ASSERT_VK_SUCCESS(err);
1196
Karl Schultz6addd812016-02-02 17:17:23 -07001197 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001198
Mark Lobodzinski23065352015-05-29 09:32:35 -05001199 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001200
Karl Schultz6addd812016-02-02 17:17:23 -07001201 pass =
1202 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
1203 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1204 if (!pass) { // If we can't find any unmappable memory this test doesn't
1205 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08001206 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06001207 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06001208 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06001209
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001210 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001211 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001212 ASSERT_VK_SUCCESS(err);
1213
1214 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06001215 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001216 ASSERT_VK_SUCCESS(err);
1217
1218 // Map memory as if to initialize the image
1219 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07001220 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
1221 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001222
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001223 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001224
Chia-I Wuf7458c52015-10-26 21:10:41 +08001225 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001226}
1227
Karl Schultz6addd812016-02-02 17:17:23 -07001228TEST_F(VkLayerTest, RebindMemory) {
1229 VkResult err;
1230 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001231
Karl Schultz6addd812016-02-02 17:17:23 -07001232 m_errorMonitor->SetDesiredFailureMsg(
1233 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001234 "which has already been bound to mem object");
1235
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001236 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001237
1238 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001239 VkImage image;
1240 VkDeviceMemory mem1;
1241 VkDeviceMemory mem2;
1242 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001243
Karl Schultz6addd812016-02-02 17:17:23 -07001244 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1245 const int32_t tex_width = 32;
1246 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001247
Tony Barboureb254902015-07-15 12:50:33 -06001248 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001249 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1250 image_create_info.pNext = NULL;
1251 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1252 image_create_info.format = tex_format;
1253 image_create_info.extent.width = tex_width;
1254 image_create_info.extent.height = tex_height;
1255 image_create_info.extent.depth = 1;
1256 image_create_info.mipLevels = 1;
1257 image_create_info.arrayLayers = 1;
1258 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1259 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1260 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1261 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001262
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001263 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001264 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1265 mem_alloc.pNext = NULL;
1266 mem_alloc.allocationSize = 0;
1267 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06001268
Karl Schultz6addd812016-02-02 17:17:23 -07001269 // Introduce failure, do NOT set memProps to
1270 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06001271 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08001272 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001273 ASSERT_VK_SUCCESS(err);
1274
Karl Schultz6addd812016-02-02 17:17:23 -07001275 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001276
1277 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001278 pass =
1279 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001280 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001281
1282 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001283 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001284 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001285 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001286 ASSERT_VK_SUCCESS(err);
1287
1288 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06001289 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001290 ASSERT_VK_SUCCESS(err);
1291
Karl Schultz6addd812016-02-02 17:17:23 -07001292 // Introduce validation failure, try to bind a different memory object to
1293 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06001294 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001295
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001296 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001297
Chia-I Wuf7458c52015-10-26 21:10:41 +08001298 vkDestroyImage(m_device->device(), image, NULL);
1299 vkFreeMemory(m_device->device(), mem1, NULL);
1300 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001301}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001302
Karl Schultz6addd812016-02-02 17:17:23 -07001303TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001304 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001305
Karl Schultz6addd812016-02-02 17:17:23 -07001306 m_errorMonitor->SetDesiredFailureMsg(
1307 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
1308 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001309
1310 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001311 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1312 fenceInfo.pNext = NULL;
1313 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06001314
Tony Barbour300a6082015-04-07 13:44:53 -06001315 ASSERT_NO_FATAL_FAILURE(InitState());
1316 ASSERT_NO_FATAL_FAILURE(InitViewport());
1317 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1318
Tony Barbourfe3351b2015-07-28 10:17:20 -06001319 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001320 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
1321 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001322 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06001323
1324 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001325
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001326 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001327 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1328 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001329 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001330 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001331 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001332 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001333 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001334 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001335 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001336
1337 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07001338 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001339
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001340 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001341}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001342// This is a positive test. We used to expect error in this case but spec now
1343// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07001344TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001345 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001346 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001347 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001348 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1349 fenceInfo.pNext = NULL;
1350
Tony Barbour0b4d9562015-04-09 10:48:04 -06001351 ASSERT_NO_FATAL_FAILURE(InitState());
1352 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08001353 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001354 VkResult result = vkResetFences(m_device->device(), 1, fences);
1355 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06001356
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001357 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06001358}
Tobin Ehlis41376e12015-07-03 08:45:14 -06001359
1360TEST_F(VkLayerTest, InvalidUsageBits)
1361{
Tony Barbourf92621a2016-05-02 14:28:12 -06001362 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001363 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06001364 "Initialize buffer with wrong usage then perform copy expecting errors "
1365 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001367 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06001368
1369 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06001370 VkImageObj image(m_device);
1371 // Initialize image with USAGE_INPUT_ATTACHMENT
1372 image.init(128, 128, VK_FORMAT_D32_SFLOAT_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001373 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1374 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06001375
Tony Barbourf92621a2016-05-02 14:28:12 -06001376 VkImageView dsv;
1377 VkImageViewCreateInfo dsvci = {};
1378 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1379 dsvci.image = image.handle();
1380 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
1381 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
1382 dsvci.subresourceRange.layerCount = 1;
1383 dsvci.subresourceRange.baseMipLevel = 0;
1384 dsvci.subresourceRange.levelCount = 1;
1385 dsvci.subresourceRange.aspectMask =
1386 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06001387
Tony Barbourf92621a2016-05-02 14:28:12 -06001388 // Create a view with depth / stencil aspect for image with different usage
1389 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001390
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001391 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06001392
1393 // Initialize buffer with TRANSFER_DST usage
1394 vk_testing::Buffer buffer;
1395 VkMemoryPropertyFlags reqs = 0;
1396 buffer.init_as_dst(*m_device, 128 * 128, reqs);
1397 VkBufferImageCopy region = {};
1398 region.bufferRowLength = 128;
1399 region.bufferImageHeight = 128;
1400 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1401 region.imageSubresource.layerCount = 1;
1402 region.imageExtent.height = 16;
1403 region.imageExtent.width = 16;
1404 region.imageExtent.depth = 1;
1405
1406 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1407 "Invalid usage flag for buffer ");
1408 // Buffer usage not set to TRANSFER_SRC and image usage not set to
1409 // TRANSFER_DST
1410 BeginCommandBuffer();
1411 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1412 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1413 1, &region);
1414 m_errorMonitor->VerifyFound();
1415
1416 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1417 "Invalid usage flag for image ");
1418 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1419 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1420 1, &region);
1421 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06001422}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001423#endif // MEM_TRACKER_TESTS
1424
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06001425#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06001426
1427TEST_F(VkLayerTest, LeakAnObject) {
1428 VkResult err;
1429
1430 TEST_DESCRIPTION(
1431 "Create a fence and destroy its device without first destroying the fence.");
1432
1433 // Note that we have to create a new device since destroying the
1434 // framework's device causes Teardown() to fail and just calling Teardown
1435 // will destroy the errorMonitor.
1436
1437 m_errorMonitor->SetDesiredFailureMsg(
1438 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1439 "OBJ ERROR : VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT object");
1440
1441 ASSERT_NO_FATAL_FAILURE(InitState());
1442
1443 const std::vector<VkQueueFamilyProperties> queue_props =
1444 m_device->queue_props;
1445 std::vector<VkDeviceQueueCreateInfo> queue_info;
1446 queue_info.reserve(queue_props.size());
1447 std::vector<std::vector<float>> queue_priorities;
1448 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
1449 VkDeviceQueueCreateInfo qi = {};
1450 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
1451 qi.pNext = NULL;
1452 qi.queueFamilyIndex = i;
1453 qi.queueCount = queue_props[i].queueCount;
1454 queue_priorities.emplace_back(qi.queueCount, 0.0f);
1455 qi.pQueuePriorities = queue_priorities[i].data();
1456 queue_info.push_back(qi);
1457 }
1458
1459 std::vector<const char *> device_layer_names;
1460 std::vector<const char *> device_extension_names;
1461 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
1462 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
1463 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
1464 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
1465 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
1466 device_layer_names.push_back("VK_LAYER_LUNARG_image");
1467 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
1468
1469 // The sacrificial device object
1470 VkDevice testDevice;
1471 VkDeviceCreateInfo device_create_info = {};
1472 auto features = m_device->phy().features();
1473 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
1474 device_create_info.pNext = NULL;
1475 device_create_info.queueCreateInfoCount = queue_info.size();
1476 device_create_info.pQueueCreateInfos = queue_info.data();
1477 device_create_info.enabledLayerCount = device_layer_names.size();
1478 device_create_info.ppEnabledLayerNames = device_layer_names.data();
1479 device_create_info.pEnabledFeatures = &features;
1480 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
1481 ASSERT_VK_SUCCESS(err);
1482
1483 VkFence fence;
1484 VkFenceCreateInfo fence_create_info = {};
1485 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1486 fence_create_info.pNext = NULL;
1487 fence_create_info.flags = 0;
1488 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
1489 ASSERT_VK_SUCCESS(err);
1490
1491 // Induce failure by not calling vkDestroyFence
1492 vkDestroyDevice(testDevice, NULL);
1493 m_errorMonitor->VerifyFound();
1494}
1495
1496TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
1497
1498 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
1499 "attempt to delete them from another.");
1500
1501 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1502 "FreeCommandBuffers is attempting to free Command Buffer");
1503
1504 VkCommandPool command_pool_one;
1505 VkCommandPool command_pool_two;
1506
1507 VkCommandPoolCreateInfo pool_create_info{};
1508 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1509 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1510 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1511
1512 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1513 &command_pool_one);
1514
1515 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1516 &command_pool_two);
1517
1518 VkCommandBuffer command_buffer[9];
1519 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1520 command_buffer_allocate_info.sType =
1521 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1522 command_buffer_allocate_info.commandPool = command_pool_one;
1523 command_buffer_allocate_info.commandBufferCount = 9;
1524 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1525 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1526 command_buffer);
1527
1528 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
1529 &command_buffer[3]);
1530
1531 m_errorMonitor->VerifyFound();
1532
1533 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
1534 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
1535}
1536
1537TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
1538 VkResult err;
1539
1540 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
1541 "attempt to delete them from another.");
1542
1543 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1544 "FreeDescriptorSets is attempting to free descriptorSet");
1545
1546 ASSERT_NO_FATAL_FAILURE(InitState());
1547 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1548
1549 VkDescriptorPoolSize ds_type_count = {};
1550 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
1551 ds_type_count.descriptorCount = 1;
1552
1553 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1554 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1555 ds_pool_ci.pNext = NULL;
1556 ds_pool_ci.flags = 0;
1557 ds_pool_ci.maxSets = 1;
1558 ds_pool_ci.poolSizeCount = 1;
1559 ds_pool_ci.pPoolSizes = &ds_type_count;
1560
1561 VkDescriptorPool ds_pool_one;
1562 err =
1563 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
1564 ASSERT_VK_SUCCESS(err);
1565
1566 // Create a second descriptor pool
1567 VkDescriptorPool ds_pool_two;
1568 err =
1569 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
1570 ASSERT_VK_SUCCESS(err);
1571
1572 VkDescriptorSetLayoutBinding dsl_binding = {};
1573 dsl_binding.binding = 0;
1574 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1575 dsl_binding.descriptorCount = 1;
1576 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1577 dsl_binding.pImmutableSamplers = NULL;
1578
1579 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1580 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1581 ds_layout_ci.pNext = NULL;
1582 ds_layout_ci.bindingCount = 1;
1583 ds_layout_ci.pBindings = &dsl_binding;
1584
1585 VkDescriptorSetLayout ds_layout;
1586 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1587 &ds_layout);
1588 ASSERT_VK_SUCCESS(err);
1589
1590 VkDescriptorSet descriptorSet;
1591 VkDescriptorSetAllocateInfo alloc_info = {};
1592 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1593 alloc_info.descriptorSetCount = 1;
1594 alloc_info.descriptorPool = ds_pool_one;
1595 alloc_info.pSetLayouts = &ds_layout;
1596 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1597 &descriptorSet);
1598 ASSERT_VK_SUCCESS(err);
1599
1600 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
1601
1602 m_errorMonitor->VerifyFound();
1603
1604 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1605 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
1606 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
1607}
1608
1609TEST_F(VkLayerTest, CreateUnknownObject) {
1610 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1611 "Invalid VkImage Object ");
1612
1613 TEST_DESCRIPTION(
1614 "Pass an invalid image object handle into a Vulkan API call.");
1615
1616 ASSERT_NO_FATAL_FAILURE(InitState());
1617
1618 // Pass bogus handle into GetImageMemoryRequirements
1619 VkMemoryRequirements mem_reqs;
1620 uint64_t fakeImageHandle = 0xCADECADE;
1621 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
1622
1623 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
1624
1625 m_errorMonitor->VerifyFound();
1626}
1627
Karl Schultz6addd812016-02-02 17:17:23 -07001628TEST_F(VkLayerTest, PipelineNotBound) {
1629 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001630
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06001631 TEST_DESCRIPTION(
1632 "Pass in an invalid pipeline object handle into a Vulkan API call.");
1633
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001635 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001636
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001637 ASSERT_NO_FATAL_FAILURE(InitState());
1638 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001639
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001640 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001641 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1642 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001643
1644 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001645 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1646 ds_pool_ci.pNext = NULL;
1647 ds_pool_ci.maxSets = 1;
1648 ds_pool_ci.poolSizeCount = 1;
1649 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001650
1651 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001652 err =
1653 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001654 ASSERT_VK_SUCCESS(err);
1655
1656 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001657 dsl_binding.binding = 0;
1658 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1659 dsl_binding.descriptorCount = 1;
1660 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1661 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001662
1663 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001664 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1665 ds_layout_ci.pNext = NULL;
1666 ds_layout_ci.bindingCount = 1;
1667 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001668
1669 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001670 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1671 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001672 ASSERT_VK_SUCCESS(err);
1673
1674 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001675 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001676 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001677 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001678 alloc_info.descriptorPool = ds_pool;
1679 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001680 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1681 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001682 ASSERT_VK_SUCCESS(err);
1683
1684 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001685 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1686 pipeline_layout_ci.pNext = NULL;
1687 pipeline_layout_ci.setLayoutCount = 1;
1688 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001689
1690 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001691 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1692 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001693 ASSERT_VK_SUCCESS(err);
1694
Mark Youngad779052016-01-06 14:26:04 -07001695 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001696
1697 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001698 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1699 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001700
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001701 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001702
Chia-I Wuf7458c52015-10-26 21:10:41 +08001703 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1704 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1705 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001706}
1707
Karl Schultz6addd812016-02-02 17:17:23 -07001708TEST_F(VkLayerTest, BindInvalidMemory) {
1709 VkResult err;
1710 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001711
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001712 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001713 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001714
Tobin Ehlisec598302015-09-15 15:02:17 -06001715 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001716
1717 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001718 VkImage image;
1719 VkDeviceMemory mem;
1720 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001721
Karl Schultz6addd812016-02-02 17:17:23 -07001722 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1723 const int32_t tex_width = 32;
1724 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001725
1726 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001727 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1728 image_create_info.pNext = NULL;
1729 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1730 image_create_info.format = tex_format;
1731 image_create_info.extent.width = tex_width;
1732 image_create_info.extent.height = tex_height;
1733 image_create_info.extent.depth = 1;
1734 image_create_info.mipLevels = 1;
1735 image_create_info.arrayLayers = 1;
1736 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1737 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1738 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1739 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001740
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001741 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001742 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1743 mem_alloc.pNext = NULL;
1744 mem_alloc.allocationSize = 0;
1745 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001746
Chia-I Wuf7458c52015-10-26 21:10:41 +08001747 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001748 ASSERT_VK_SUCCESS(err);
1749
Karl Schultz6addd812016-02-02 17:17:23 -07001750 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001751
1752 mem_alloc.allocationSize = mem_reqs.size;
1753
Karl Schultz6addd812016-02-02 17:17:23 -07001754 pass =
1755 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001756 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001757
1758 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001759 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001760 ASSERT_VK_SUCCESS(err);
1761
1762 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001763 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001764
1765 // Try to bind free memory that has been freed
1766 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1767 // This may very well return an error.
1768 (void)err;
1769
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001770 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001771
Chia-I Wuf7458c52015-10-26 21:10:41 +08001772 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001773}
1774
Karl Schultz6addd812016-02-02 17:17:23 -07001775TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1776 VkResult err;
1777 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001778
Karl Schultz6addd812016-02-02 17:17:23 -07001779 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1780 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001781
Tobin Ehlisec598302015-09-15 15:02:17 -06001782 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001783
Karl Schultz6addd812016-02-02 17:17:23 -07001784 // Create an image object, allocate memory, destroy the object and then try
1785 // to bind it
1786 VkImage image;
1787 VkDeviceMemory mem;
1788 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001789
Karl Schultz6addd812016-02-02 17:17:23 -07001790 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1791 const int32_t tex_width = 32;
1792 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001793
1794 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001795 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1796 image_create_info.pNext = NULL;
1797 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1798 image_create_info.format = tex_format;
1799 image_create_info.extent.width = tex_width;
1800 image_create_info.extent.height = tex_height;
1801 image_create_info.extent.depth = 1;
1802 image_create_info.mipLevels = 1;
1803 image_create_info.arrayLayers = 1;
1804 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1805 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1806 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1807 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001808
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001809 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001810 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1811 mem_alloc.pNext = NULL;
1812 mem_alloc.allocationSize = 0;
1813 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001814
Chia-I Wuf7458c52015-10-26 21:10:41 +08001815 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001816 ASSERT_VK_SUCCESS(err);
1817
Karl Schultz6addd812016-02-02 17:17:23 -07001818 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001819
1820 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001821 pass =
1822 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001823 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001824
1825 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001826 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001827 ASSERT_VK_SUCCESS(err);
1828
1829 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001830 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001831 ASSERT_VK_SUCCESS(err);
1832
1833 // Now Try to bind memory to this destroyed object
1834 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1835 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001836 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001837
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001838 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001839
Chia-I Wuf7458c52015-10-26 21:10:41 +08001840 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001841}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001842
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001843#endif // OBJ_TRACKER_TESTS
1844
Tobin Ehlis0788f522015-05-26 16:11:58 -06001845#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001846
1847// This is a positive test. No errors should be generated.
1848TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
1849
1850 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1851 "submitted on separate queues followed by a QueueWaitIdle.");
1852
Dustin Graves48458142016-04-29 16:11:55 -06001853 if ((m_device->queue_props.empty()) ||
1854 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001855 return;
1856
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001857 m_errorMonitor->ExpectSuccess();
1858
1859 VkSemaphore semaphore;
1860 VkSemaphoreCreateInfo semaphore_create_info{};
1861 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1862 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1863 &semaphore);
1864
1865 VkCommandPool command_pool;
1866 VkCommandPoolCreateInfo pool_create_info{};
1867 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1868 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1869 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1870 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1871 &command_pool);
1872
1873 VkCommandBuffer command_buffer[2];
1874 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1875 command_buffer_allocate_info.sType =
1876 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1877 command_buffer_allocate_info.commandPool = command_pool;
1878 command_buffer_allocate_info.commandBufferCount = 2;
1879 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1880 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1881 command_buffer);
1882
1883 VkQueue queue = VK_NULL_HANDLE;
1884 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1885 1, &queue);
1886
1887 {
1888 VkCommandBufferBeginInfo begin_info{};
1889 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1890 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1891
1892 vkCmdPipelineBarrier(command_buffer[0],
1893 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1894 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1895 0, nullptr, 0, nullptr);
1896
1897 VkViewport viewport{};
1898 viewport.maxDepth = 1.0f;
1899 viewport.minDepth = 0.0f;
1900 viewport.width = 512;
1901 viewport.height = 512;
1902 viewport.x = 0;
1903 viewport.y = 0;
1904 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1905 vkEndCommandBuffer(command_buffer[0]);
1906 }
1907 {
1908 VkCommandBufferBeginInfo begin_info{};
1909 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1910 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1911
1912 VkViewport viewport{};
1913 viewport.maxDepth = 1.0f;
1914 viewport.minDepth = 0.0f;
1915 viewport.width = 512;
1916 viewport.height = 512;
1917 viewport.x = 0;
1918 viewport.y = 0;
1919 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1920 vkEndCommandBuffer(command_buffer[1]);
1921 }
1922 {
1923 VkSubmitInfo submit_info{};
1924 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1925 submit_info.commandBufferCount = 1;
1926 submit_info.pCommandBuffers = &command_buffer[0];
1927 submit_info.signalSemaphoreCount = 1;
1928 submit_info.pSignalSemaphores = &semaphore;
1929 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1930 }
1931 {
1932 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1933 VkSubmitInfo submit_info{};
1934 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1935 submit_info.commandBufferCount = 1;
1936 submit_info.pCommandBuffers = &command_buffer[1];
1937 submit_info.waitSemaphoreCount = 1;
1938 submit_info.pWaitSemaphores = &semaphore;
1939 submit_info.pWaitDstStageMask = flags;
1940 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1941 }
1942
1943 vkQueueWaitIdle(m_device->m_queue);
1944
1945 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1946 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1947 &command_buffer[0]);
1948 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1949
1950 m_errorMonitor->VerifyNotFound();
1951}
1952
1953// This is a positive test. No errors should be generated.
1954TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
1955
1956 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1957 "submitted on separate queues, the second having a fence"
1958 "followed by a QueueWaitIdle.");
1959
Dustin Graves48458142016-04-29 16:11:55 -06001960 if ((m_device->queue_props.empty()) ||
1961 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001962 return;
1963
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001964 m_errorMonitor->ExpectSuccess();
1965
1966 VkFence fence;
1967 VkFenceCreateInfo fence_create_info{};
1968 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1969 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1970
1971 VkSemaphore semaphore;
1972 VkSemaphoreCreateInfo semaphore_create_info{};
1973 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1974 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1975 &semaphore);
1976
1977 VkCommandPool command_pool;
1978 VkCommandPoolCreateInfo pool_create_info{};
1979 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1980 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1981 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1982 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1983 &command_pool);
1984
1985 VkCommandBuffer command_buffer[2];
1986 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1987 command_buffer_allocate_info.sType =
1988 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1989 command_buffer_allocate_info.commandPool = command_pool;
1990 command_buffer_allocate_info.commandBufferCount = 2;
1991 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1992 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1993 command_buffer);
1994
1995 VkQueue queue = VK_NULL_HANDLE;
1996 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1997 1, &queue);
1998
1999 {
2000 VkCommandBufferBeginInfo begin_info{};
2001 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2002 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2003
2004 vkCmdPipelineBarrier(command_buffer[0],
2005 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2006 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2007 0, nullptr, 0, nullptr);
2008
2009 VkViewport viewport{};
2010 viewport.maxDepth = 1.0f;
2011 viewport.minDepth = 0.0f;
2012 viewport.width = 512;
2013 viewport.height = 512;
2014 viewport.x = 0;
2015 viewport.y = 0;
2016 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2017 vkEndCommandBuffer(command_buffer[0]);
2018 }
2019 {
2020 VkCommandBufferBeginInfo begin_info{};
2021 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2022 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2023
2024 VkViewport viewport{};
2025 viewport.maxDepth = 1.0f;
2026 viewport.minDepth = 0.0f;
2027 viewport.width = 512;
2028 viewport.height = 512;
2029 viewport.x = 0;
2030 viewport.y = 0;
2031 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2032 vkEndCommandBuffer(command_buffer[1]);
2033 }
2034 {
2035 VkSubmitInfo submit_info{};
2036 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2037 submit_info.commandBufferCount = 1;
2038 submit_info.pCommandBuffers = &command_buffer[0];
2039 submit_info.signalSemaphoreCount = 1;
2040 submit_info.pSignalSemaphores = &semaphore;
2041 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2042 }
2043 {
2044 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2045 VkSubmitInfo submit_info{};
2046 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2047 submit_info.commandBufferCount = 1;
2048 submit_info.pCommandBuffers = &command_buffer[1];
2049 submit_info.waitSemaphoreCount = 1;
2050 submit_info.pWaitSemaphores = &semaphore;
2051 submit_info.pWaitDstStageMask = flags;
2052 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2053 }
2054
2055 vkQueueWaitIdle(m_device->m_queue);
2056
2057 vkDestroyFence(m_device->device(), fence, nullptr);
2058 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2059 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2060 &command_buffer[0]);
2061 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2062
2063 m_errorMonitor->VerifyNotFound();
2064}
2065
2066// This is a positive test. No errors should be generated.
2067TEST_F(VkLayerTest,
2068 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
2069
2070 TEST_DESCRIPTION(
2071 "Two command buffers, each in a separate QueueSubmit call "
2072 "submitted on separate queues, the second having a fence"
2073 "followed by two consecutive WaitForFences calls on the same fence.");
2074
Dustin Graves48458142016-04-29 16:11:55 -06002075 if ((m_device->queue_props.empty()) ||
2076 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002077 return;
2078
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002079 m_errorMonitor->ExpectSuccess();
2080
2081 VkFence fence;
2082 VkFenceCreateInfo fence_create_info{};
2083 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2084 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2085
2086 VkSemaphore semaphore;
2087 VkSemaphoreCreateInfo semaphore_create_info{};
2088 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2089 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2090 &semaphore);
2091
2092 VkCommandPool command_pool;
2093 VkCommandPoolCreateInfo pool_create_info{};
2094 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2095 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2096 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2097 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2098 &command_pool);
2099
2100 VkCommandBuffer command_buffer[2];
2101 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2102 command_buffer_allocate_info.sType =
2103 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2104 command_buffer_allocate_info.commandPool = command_pool;
2105 command_buffer_allocate_info.commandBufferCount = 2;
2106 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2107 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2108 command_buffer);
2109
2110 VkQueue queue = VK_NULL_HANDLE;
2111 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2112 1, &queue);
2113
2114 {
2115 VkCommandBufferBeginInfo begin_info{};
2116 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2117 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2118
2119 vkCmdPipelineBarrier(command_buffer[0],
2120 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2121 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2122 0, nullptr, 0, nullptr);
2123
2124 VkViewport viewport{};
2125 viewport.maxDepth = 1.0f;
2126 viewport.minDepth = 0.0f;
2127 viewport.width = 512;
2128 viewport.height = 512;
2129 viewport.x = 0;
2130 viewport.y = 0;
2131 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2132 vkEndCommandBuffer(command_buffer[0]);
2133 }
2134 {
2135 VkCommandBufferBeginInfo begin_info{};
2136 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2137 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2138
2139 VkViewport viewport{};
2140 viewport.maxDepth = 1.0f;
2141 viewport.minDepth = 0.0f;
2142 viewport.width = 512;
2143 viewport.height = 512;
2144 viewport.x = 0;
2145 viewport.y = 0;
2146 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2147 vkEndCommandBuffer(command_buffer[1]);
2148 }
2149 {
2150 VkSubmitInfo submit_info{};
2151 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2152 submit_info.commandBufferCount = 1;
2153 submit_info.pCommandBuffers = &command_buffer[0];
2154 submit_info.signalSemaphoreCount = 1;
2155 submit_info.pSignalSemaphores = &semaphore;
2156 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2157 }
2158 {
2159 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2160 VkSubmitInfo submit_info{};
2161 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2162 submit_info.commandBufferCount = 1;
2163 submit_info.pCommandBuffers = &command_buffer[1];
2164 submit_info.waitSemaphoreCount = 1;
2165 submit_info.pWaitSemaphores = &semaphore;
2166 submit_info.pWaitDstStageMask = flags;
2167 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2168 }
2169
2170 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2171 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2172
2173 vkDestroyFence(m_device->device(), fence, nullptr);
2174 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2175 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2176 &command_buffer[0]);
2177 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2178
2179 m_errorMonitor->VerifyNotFound();
2180}
2181
2182// This is a positive test. No errors should be generated.
2183TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
2184
2185 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2186 "submitted on separate queues, the second having a fence, "
2187 "followed by a WaitForFences call.");
2188
Dustin Graves48458142016-04-29 16:11:55 -06002189 if ((m_device->queue_props.empty()) ||
2190 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002191 return;
2192
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002193 m_errorMonitor->ExpectSuccess();
2194
2195 VkFence fence;
2196 VkFenceCreateInfo fence_create_info{};
2197 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2198 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2199
2200 VkSemaphore semaphore;
2201 VkSemaphoreCreateInfo semaphore_create_info{};
2202 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2203 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2204 &semaphore);
2205
2206 VkCommandPool command_pool;
2207 VkCommandPoolCreateInfo pool_create_info{};
2208 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2209 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2210 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2211 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2212 &command_pool);
2213
2214 VkCommandBuffer command_buffer[2];
2215 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2216 command_buffer_allocate_info.sType =
2217 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2218 command_buffer_allocate_info.commandPool = command_pool;
2219 command_buffer_allocate_info.commandBufferCount = 2;
2220 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2221 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2222 command_buffer);
2223
2224 VkQueue queue = VK_NULL_HANDLE;
2225 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2226 1, &queue);
2227
2228
2229 {
2230 VkCommandBufferBeginInfo begin_info{};
2231 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2232 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2233
2234 vkCmdPipelineBarrier(command_buffer[0],
2235 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2236 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2237 0, nullptr, 0, nullptr);
2238
2239 VkViewport viewport{};
2240 viewport.maxDepth = 1.0f;
2241 viewport.minDepth = 0.0f;
2242 viewport.width = 512;
2243 viewport.height = 512;
2244 viewport.x = 0;
2245 viewport.y = 0;
2246 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2247 vkEndCommandBuffer(command_buffer[0]);
2248 }
2249 {
2250 VkCommandBufferBeginInfo begin_info{};
2251 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2252 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2253
2254 VkViewport viewport{};
2255 viewport.maxDepth = 1.0f;
2256 viewport.minDepth = 0.0f;
2257 viewport.width = 512;
2258 viewport.height = 512;
2259 viewport.x = 0;
2260 viewport.y = 0;
2261 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2262 vkEndCommandBuffer(command_buffer[1]);
2263 }
2264 {
2265 VkSubmitInfo submit_info{};
2266 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2267 submit_info.commandBufferCount = 1;
2268 submit_info.pCommandBuffers = &command_buffer[0];
2269 submit_info.signalSemaphoreCount = 1;
2270 submit_info.pSignalSemaphores = &semaphore;
2271 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2272 }
2273 {
2274 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2275 VkSubmitInfo submit_info{};
2276 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2277 submit_info.commandBufferCount = 1;
2278 submit_info.pCommandBuffers = &command_buffer[1];
2279 submit_info.waitSemaphoreCount = 1;
2280 submit_info.pWaitSemaphores = &semaphore;
2281 submit_info.pWaitDstStageMask = flags;
2282 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2283 }
2284
2285 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2286
2287 vkDestroyFence(m_device->device(), fence, nullptr);
2288 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2289 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2290 &command_buffer[0]);
2291 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2292
2293 m_errorMonitor->VerifyNotFound();
2294}
2295
2296// This is a positive test. No errors should be generated.
2297TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
2298
2299 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2300 "on the same queue, sharing a signal/wait semaphore, the "
2301 "second having a fence, "
2302 "followed by a WaitForFences call.");
2303
2304 m_errorMonitor->ExpectSuccess();
2305
2306 VkFence fence;
2307 VkFenceCreateInfo fence_create_info{};
2308 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2309 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2310
2311 VkSemaphore semaphore;
2312 VkSemaphoreCreateInfo semaphore_create_info{};
2313 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2314 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2315 &semaphore);
2316
2317 VkCommandPool command_pool;
2318 VkCommandPoolCreateInfo pool_create_info{};
2319 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2320 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2321 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2322 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2323 &command_pool);
2324
2325 VkCommandBuffer command_buffer[2];
2326 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2327 command_buffer_allocate_info.sType =
2328 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2329 command_buffer_allocate_info.commandPool = command_pool;
2330 command_buffer_allocate_info.commandBufferCount = 2;
2331 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2332 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2333 command_buffer);
2334
2335 {
2336 VkCommandBufferBeginInfo begin_info{};
2337 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2338 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2339
2340 vkCmdPipelineBarrier(command_buffer[0],
2341 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2342 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2343 0, nullptr, 0, nullptr);
2344
2345 VkViewport viewport{};
2346 viewport.maxDepth = 1.0f;
2347 viewport.minDepth = 0.0f;
2348 viewport.width = 512;
2349 viewport.height = 512;
2350 viewport.x = 0;
2351 viewport.y = 0;
2352 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2353 vkEndCommandBuffer(command_buffer[0]);
2354 }
2355 {
2356 VkCommandBufferBeginInfo begin_info{};
2357 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2358 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2359
2360 VkViewport viewport{};
2361 viewport.maxDepth = 1.0f;
2362 viewport.minDepth = 0.0f;
2363 viewport.width = 512;
2364 viewport.height = 512;
2365 viewport.x = 0;
2366 viewport.y = 0;
2367 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2368 vkEndCommandBuffer(command_buffer[1]);
2369 }
2370 {
2371 VkSubmitInfo submit_info{};
2372 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2373 submit_info.commandBufferCount = 1;
2374 submit_info.pCommandBuffers = &command_buffer[0];
2375 submit_info.signalSemaphoreCount = 1;
2376 submit_info.pSignalSemaphores = &semaphore;
2377 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2378 }
2379 {
2380 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2381 VkSubmitInfo submit_info{};
2382 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2383 submit_info.commandBufferCount = 1;
2384 submit_info.pCommandBuffers = &command_buffer[1];
2385 submit_info.waitSemaphoreCount = 1;
2386 submit_info.pWaitSemaphores = &semaphore;
2387 submit_info.pWaitDstStageMask = flags;
2388 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2389 }
2390
2391 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2392
2393 vkDestroyFence(m_device->device(), fence, nullptr);
2394 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2395 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2396 &command_buffer[0]);
2397 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2398
2399 m_errorMonitor->VerifyNotFound();
2400}
2401
2402// This is a positive test. No errors should be generated.
2403TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
2404
2405 TEST_DESCRIPTION(
2406 "Two command buffers, each in a separate QueueSubmit call "
2407 "on the same queue, no fences, followed by a third QueueSubmit with NO "
2408 "SubmitInfos but with a fence, followed by a WaitForFences call.");
2409
2410 m_errorMonitor->ExpectSuccess();
2411
2412 VkFence fence;
2413 VkFenceCreateInfo fence_create_info{};
2414 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2415 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2416
2417 VkCommandPool command_pool;
2418 VkCommandPoolCreateInfo pool_create_info{};
2419 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2420 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2421 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2422 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2423 &command_pool);
2424
2425 VkCommandBuffer command_buffer[2];
2426 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2427 command_buffer_allocate_info.sType =
2428 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2429 command_buffer_allocate_info.commandPool = command_pool;
2430 command_buffer_allocate_info.commandBufferCount = 2;
2431 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2432 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2433 command_buffer);
2434
2435 {
2436 VkCommandBufferBeginInfo begin_info{};
2437 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2438 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2439
2440 vkCmdPipelineBarrier(command_buffer[0],
2441 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2442 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2443 0, nullptr, 0, nullptr);
2444
2445 VkViewport viewport{};
2446 viewport.maxDepth = 1.0f;
2447 viewport.minDepth = 0.0f;
2448 viewport.width = 512;
2449 viewport.height = 512;
2450 viewport.x = 0;
2451 viewport.y = 0;
2452 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2453 vkEndCommandBuffer(command_buffer[0]);
2454 }
2455 {
2456 VkCommandBufferBeginInfo begin_info{};
2457 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2458 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2459
2460 VkViewport viewport{};
2461 viewport.maxDepth = 1.0f;
2462 viewport.minDepth = 0.0f;
2463 viewport.width = 512;
2464 viewport.height = 512;
2465 viewport.x = 0;
2466 viewport.y = 0;
2467 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2468 vkEndCommandBuffer(command_buffer[1]);
2469 }
2470 {
2471 VkSubmitInfo submit_info{};
2472 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2473 submit_info.commandBufferCount = 1;
2474 submit_info.pCommandBuffers = &command_buffer[0];
2475 submit_info.signalSemaphoreCount = 0;
2476 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2477 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2478 }
2479 {
2480 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2481 VkSubmitInfo submit_info{};
2482 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2483 submit_info.commandBufferCount = 1;
2484 submit_info.pCommandBuffers = &command_buffer[1];
2485 submit_info.waitSemaphoreCount = 0;
2486 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2487 submit_info.pWaitDstStageMask = flags;
2488 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2489 }
2490
2491 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
2492
2493 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2494
2495 vkDestroyFence(m_device->device(), fence, nullptr);
2496 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2497 &command_buffer[0]);
2498 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2499
2500 m_errorMonitor->VerifyNotFound();
2501}
2502
2503// This is a positive test. No errors should be generated.
2504TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
2505
2506 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2507 "on the same queue, the second having a fence, followed "
2508 "by a WaitForFences call.");
2509
2510 m_errorMonitor->ExpectSuccess();
2511
2512 VkFence fence;
2513 VkFenceCreateInfo fence_create_info{};
2514 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2515 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2516
2517 VkCommandPool command_pool;
2518 VkCommandPoolCreateInfo pool_create_info{};
2519 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2520 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2521 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2522 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2523 &command_pool);
2524
2525 VkCommandBuffer command_buffer[2];
2526 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2527 command_buffer_allocate_info.sType =
2528 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2529 command_buffer_allocate_info.commandPool = command_pool;
2530 command_buffer_allocate_info.commandBufferCount = 2;
2531 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2532 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2533 command_buffer);
2534
2535 {
2536 VkCommandBufferBeginInfo begin_info{};
2537 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2538 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2539
2540 vkCmdPipelineBarrier(command_buffer[0],
2541 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2542 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2543 0, nullptr, 0, nullptr);
2544
2545 VkViewport viewport{};
2546 viewport.maxDepth = 1.0f;
2547 viewport.minDepth = 0.0f;
2548 viewport.width = 512;
2549 viewport.height = 512;
2550 viewport.x = 0;
2551 viewport.y = 0;
2552 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2553 vkEndCommandBuffer(command_buffer[0]);
2554 }
2555 {
2556 VkCommandBufferBeginInfo begin_info{};
2557 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2558 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2559
2560 VkViewport viewport{};
2561 viewport.maxDepth = 1.0f;
2562 viewport.minDepth = 0.0f;
2563 viewport.width = 512;
2564 viewport.height = 512;
2565 viewport.x = 0;
2566 viewport.y = 0;
2567 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2568 vkEndCommandBuffer(command_buffer[1]);
2569 }
2570 {
2571 VkSubmitInfo submit_info{};
2572 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2573 submit_info.commandBufferCount = 1;
2574 submit_info.pCommandBuffers = &command_buffer[0];
2575 submit_info.signalSemaphoreCount = 0;
2576 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2577 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2578 }
2579 {
2580 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2581 VkSubmitInfo submit_info{};
2582 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2583 submit_info.commandBufferCount = 1;
2584 submit_info.pCommandBuffers = &command_buffer[1];
2585 submit_info.waitSemaphoreCount = 0;
2586 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2587 submit_info.pWaitDstStageMask = flags;
2588 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2589 }
2590
2591 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2592
2593 vkDestroyFence(m_device->device(), fence, nullptr);
2594 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2595 &command_buffer[0]);
2596 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2597
2598 m_errorMonitor->VerifyNotFound();
2599}
2600
2601// This is a positive test. No errors should be generated.
2602TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
2603
2604 TEST_DESCRIPTION(
2605 "Two command buffers each in a separate SubmitInfo sent in a single "
2606 "QueueSubmit call followed by a WaitForFences call.");
2607
2608 m_errorMonitor->ExpectSuccess();
2609
2610 VkFence fence;
2611 VkFenceCreateInfo fence_create_info{};
2612 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2613 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2614
2615 VkSemaphore semaphore;
2616 VkSemaphoreCreateInfo semaphore_create_info{};
2617 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2618 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2619 &semaphore);
2620
2621 VkCommandPool command_pool;
2622 VkCommandPoolCreateInfo pool_create_info{};
2623 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2624 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2625 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2626 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2627 &command_pool);
2628
2629 VkCommandBuffer command_buffer[2];
2630 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2631 command_buffer_allocate_info.sType =
2632 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2633 command_buffer_allocate_info.commandPool = command_pool;
2634 command_buffer_allocate_info.commandBufferCount = 2;
2635 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2636 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2637 command_buffer);
2638
2639 {
2640 VkCommandBufferBeginInfo begin_info{};
2641 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2642 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2643
2644 vkCmdPipelineBarrier(command_buffer[0],
2645 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2646 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2647 0, nullptr, 0, nullptr);
2648
2649 VkViewport viewport{};
2650 viewport.maxDepth = 1.0f;
2651 viewport.minDepth = 0.0f;
2652 viewport.width = 512;
2653 viewport.height = 512;
2654 viewport.x = 0;
2655 viewport.y = 0;
2656 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2657 vkEndCommandBuffer(command_buffer[0]);
2658 }
2659 {
2660 VkCommandBufferBeginInfo begin_info{};
2661 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2662 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2663
2664 VkViewport viewport{};
2665 viewport.maxDepth = 1.0f;
2666 viewport.minDepth = 0.0f;
2667 viewport.width = 512;
2668 viewport.height = 512;
2669 viewport.x = 0;
2670 viewport.y = 0;
2671 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2672 vkEndCommandBuffer(command_buffer[1]);
2673 }
2674 {
2675 VkSubmitInfo submit_info[2];
2676 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2677
2678 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2679 submit_info[0].pNext = NULL;
2680 submit_info[0].commandBufferCount = 1;
2681 submit_info[0].pCommandBuffers = &command_buffer[0];
2682 submit_info[0].signalSemaphoreCount = 1;
2683 submit_info[0].pSignalSemaphores = &semaphore;
2684 submit_info[0].waitSemaphoreCount = 0;
2685 submit_info[0].pWaitSemaphores = NULL;
2686 submit_info[0].pWaitDstStageMask = 0;
2687
2688 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2689 submit_info[1].pNext = NULL;
2690 submit_info[1].commandBufferCount = 1;
2691 submit_info[1].pCommandBuffers = &command_buffer[1];
2692 submit_info[1].waitSemaphoreCount = 1;
2693 submit_info[1].pWaitSemaphores = &semaphore;
2694 submit_info[1].pWaitDstStageMask = flags;
2695 submit_info[1].signalSemaphoreCount = 0;
2696 submit_info[1].pSignalSemaphores = NULL;
2697 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
2698 }
2699
2700 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2701
2702 vkDestroyFence(m_device->device(), fence, nullptr);
2703 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2704 &command_buffer[0]);
2705 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2706
2707 m_errorMonitor->VerifyNotFound();
2708}
2709
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002710TEST_F(VkLayerTest, DynamicStatesNotBound) {
2711 TEST_DESCRIPTION(
2712 "Run a series of simple draw calls to validate all the different "
2713 "failure cases that can occur when dynamic state is required but not "
2714 "correctly bound."
2715 "Here are the different dynamic state cases verified by this test:\n"
2716 "-Line Width\n-Depth Bias\n-Viewport State\n-Scissor State\n-Blend "
2717 "State\n-Depth Bounds\n-Stencil Read Mask\n-Stencil Write "
2718 "Mask\n-Stencil Reference");
2719
2720 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07002721 m_errorMonitor->SetDesiredFailureMsg(
2722 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002723 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002724 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2725 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002726 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002727 // Dynamic depth bias
Karl Schultz6addd812016-02-02 17:17:23 -07002728 m_errorMonitor->SetDesiredFailureMsg(
2729 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002730 "Dynamic depth bias state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002731 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2732 BsoFailDepthBias);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002733 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002734 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07002735 m_errorMonitor->SetDesiredFailureMsg(
2736 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002737 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002738 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2739 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002740 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002741 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07002742 m_errorMonitor->SetDesiredFailureMsg(
2743 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002744 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002745 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2746 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002747 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002748 // Dynamic blend state
Karl Schultz6addd812016-02-02 17:17:23 -07002749 m_errorMonitor->SetDesiredFailureMsg(
2750 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002751 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002752 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2753 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002754 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002755 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07002756 m_errorMonitor->SetDesiredFailureMsg(
2757 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002758 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002759 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2760 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002761 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002762 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07002763 m_errorMonitor->SetDesiredFailureMsg(
2764 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002765 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002766 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2767 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002768 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002769 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07002770 m_errorMonitor->SetDesiredFailureMsg(
2771 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002772 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002773 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2774 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002775 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002776}
2777
Karl Schultz6addd812016-02-02 17:17:23 -07002778TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002779 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002780
Karl Schultz6addd812016-02-02 17:17:23 -07002781 m_errorMonitor->SetDesiredFailureMsg(
2782 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2783 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
2784 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002785
2786 VkFenceCreateInfo fenceInfo = {};
2787 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2788 fenceInfo.pNext = NULL;
2789 fenceInfo.flags = 0;
2790
2791 ASSERT_NO_FATAL_FAILURE(InitState());
2792 ASSERT_NO_FATAL_FAILURE(InitViewport());
2793 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2794
Karl Schultz6addd812016-02-02 17:17:23 -07002795 // We luck out b/c by default the framework creates CB w/ the
2796 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002797 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002798 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2799 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002800 EndCommandBuffer();
2801
2802 testFence.init(*m_device, fenceInfo);
2803
2804 // Bypass framework since it does the waits automatically
2805 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002806 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002807 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2808 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002809 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002810 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002811 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002812 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002813 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002814 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002815 submit_info.pSignalSemaphores = NULL;
2816
Karl Schultz6addd812016-02-02 17:17:23 -07002817 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
2818 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002819
Karl Schultz6addd812016-02-02 17:17:23 -07002820 // Cause validation error by re-submitting cmd buffer that should only be
2821 // submitted once
2822 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002823
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002824 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002825}
2826
Karl Schultz6addd812016-02-02 17:17:23 -07002827TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002828 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07002829 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002830
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002831 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002832 "Unable to allocate 1 descriptors of "
2833 "type "
2834 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002835
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002836 ASSERT_NO_FATAL_FAILURE(InitState());
2837 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002838
Karl Schultz6addd812016-02-02 17:17:23 -07002839 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
2840 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002841 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002842 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2843 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002844
2845 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002846 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2847 ds_pool_ci.pNext = NULL;
2848 ds_pool_ci.flags = 0;
2849 ds_pool_ci.maxSets = 1;
2850 ds_pool_ci.poolSizeCount = 1;
2851 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002852
2853 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002854 err =
2855 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002856 ASSERT_VK_SUCCESS(err);
2857
2858 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002859 dsl_binding.binding = 0;
2860 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2861 dsl_binding.descriptorCount = 1;
2862 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2863 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002864
2865 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002866 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2867 ds_layout_ci.pNext = NULL;
2868 ds_layout_ci.bindingCount = 1;
2869 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002870
2871 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002872 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2873 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002874 ASSERT_VK_SUCCESS(err);
2875
2876 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002877 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002878 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002879 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002880 alloc_info.descriptorPool = ds_pool;
2881 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002882 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2883 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002884
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002885 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002886
Chia-I Wuf7458c52015-10-26 21:10:41 +08002887 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2888 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002889}
2890
Karl Schultz6addd812016-02-02 17:17:23 -07002891TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
2892 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06002893
Karl Schultz6addd812016-02-02 17:17:23 -07002894 m_errorMonitor->SetDesiredFailureMsg(
2895 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2896 "It is invalid to call vkFreeDescriptorSets() with a pool created "
2897 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002898
Tobin Ehlise735c692015-10-08 13:13:50 -06002899 ASSERT_NO_FATAL_FAILURE(InitState());
2900 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06002901
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002902 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002903 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2904 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06002905
2906 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002907 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2908 ds_pool_ci.pNext = NULL;
2909 ds_pool_ci.maxSets = 1;
2910 ds_pool_ci.poolSizeCount = 1;
2911 ds_pool_ci.flags = 0;
2912 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
2913 // app can only call vkResetDescriptorPool on this pool.;
2914 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06002915
2916 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002917 err =
2918 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06002919 ASSERT_VK_SUCCESS(err);
2920
2921 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002922 dsl_binding.binding = 0;
2923 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2924 dsl_binding.descriptorCount = 1;
2925 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2926 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06002927
2928 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002929 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2930 ds_layout_ci.pNext = NULL;
2931 ds_layout_ci.bindingCount = 1;
2932 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06002933
2934 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002935 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2936 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06002937 ASSERT_VK_SUCCESS(err);
2938
2939 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002940 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002941 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002942 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002943 alloc_info.descriptorPool = ds_pool;
2944 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002945 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2946 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06002947 ASSERT_VK_SUCCESS(err);
2948
2949 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002950 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06002951
Chia-I Wuf7458c52015-10-26 21:10:41 +08002952 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2953 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06002954}
2955
Karl Schultz6addd812016-02-02 17:17:23 -07002956TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002957 // Attempt to clear Descriptor Pool with bad object.
2958 // ObjectTracker should catch this.
2959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2960 "Invalid VkDescriptorPool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06002961 uint64_t fake_pool_handle = 0xbaad6001;
2962 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
2963 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06002964 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002965}
2966
Karl Schultz6addd812016-02-02 17:17:23 -07002967TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002968 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
2969 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002970 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06002971 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06002972
2973 uint64_t fake_set_handle = 0xbaad6001;
2974 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06002975 VkResult err;
2976 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2977 "Invalid VkDescriptorSet Object 0xbaad6001");
2978
2979 ASSERT_NO_FATAL_FAILURE(InitState());
2980
2981 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
2982 layout_bindings[0].binding = 0;
2983 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2984 layout_bindings[0].descriptorCount = 1;
2985 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2986 layout_bindings[0].pImmutableSamplers = NULL;
2987
2988 VkDescriptorSetLayout descriptor_set_layout;
2989 VkDescriptorSetLayoutCreateInfo dslci = {};
2990 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2991 dslci.pNext = NULL;
2992 dslci.bindingCount = 1;
2993 dslci.pBindings = layout_bindings;
2994 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002995 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002996
2997 VkPipelineLayout pipeline_layout;
2998 VkPipelineLayoutCreateInfo plci = {};
2999 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3000 plci.pNext = NULL;
3001 plci.setLayoutCount = 1;
3002 plci.pSetLayouts = &descriptor_set_layout;
3003 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003004 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003005
3006 BeginCommandBuffer();
3007 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003008 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06003009 m_errorMonitor->VerifyFound();
3010 EndCommandBuffer();
3011 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
3012 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003013}
3014
Karl Schultz6addd812016-02-02 17:17:23 -07003015TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003016 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
3017 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003018 uint64_t fake_layout_handle = 0xbaad6001;
3019 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003020 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3021 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
3022
3023 VkPipelineLayout pipeline_layout;
3024 VkPipelineLayoutCreateInfo plci = {};
3025 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3026 plci.pNext = NULL;
3027 plci.setLayoutCount = 1;
3028 plci.pSetLayouts = &bad_layout;
3029 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
3030
3031 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003032}
3033
Karl Schultz6addd812016-02-02 17:17:23 -07003034TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003035 // Attempt to bind an invalid Pipeline to a valid Command Buffer
3036 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003037 // Create a valid cmd buffer
3038 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003039 uint64_t fake_pipeline_handle = 0xbaad6001;
3040 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3042 "Invalid VkPipeline Object 0xbaad6001");
3043 ASSERT_NO_FATAL_FAILURE(InitState());
3044 BeginCommandBuffer();
3045 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3046 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
3047 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06003048
3049 // Now issue a draw call with no pipeline bound
3050 m_errorMonitor->SetDesiredFailureMsg(
3051 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3052 "At Draw/Dispatch time no valid VkPipeline is bound!");
3053 ASSERT_NO_FATAL_FAILURE(InitState());
3054 BeginCommandBuffer();
3055 Draw(1, 0, 0, 0);
3056 m_errorMonitor->VerifyFound();
3057 // Finally same check once more but with Dispatch/Compute
3058 m_errorMonitor->SetDesiredFailureMsg(
3059 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3060 "At Draw/Dispatch time no valid VkPipeline is bound!");
3061 ASSERT_NO_FATAL_FAILURE(InitState());
3062 BeginCommandBuffer();
3063 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
3064 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003065}
3066
Karl Schultz6addd812016-02-02 17:17:23 -07003067TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
3068 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
3069 // CommandBuffer
3070 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003071
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003073 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003074
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003075 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06003076 ASSERT_NO_FATAL_FAILURE(InitViewport());
3077 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003078 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003079 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3080 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003081
3082 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003083 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3084 ds_pool_ci.pNext = NULL;
3085 ds_pool_ci.maxSets = 1;
3086 ds_pool_ci.poolSizeCount = 1;
3087 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06003088
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003089 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003090 err =
3091 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003092 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003093
Tony Barboureb254902015-07-15 12:50:33 -06003094 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003095 dsl_binding.binding = 0;
3096 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3097 dsl_binding.descriptorCount = 1;
3098 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3099 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003100
Tony Barboureb254902015-07-15 12:50:33 -06003101 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003102 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3103 ds_layout_ci.pNext = NULL;
3104 ds_layout_ci.bindingCount = 1;
3105 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003106 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003107 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3108 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003109 ASSERT_VK_SUCCESS(err);
3110
3111 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003112 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003113 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003114 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003115 alloc_info.descriptorPool = ds_pool;
3116 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003117 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3118 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003119 ASSERT_VK_SUCCESS(err);
3120
Tony Barboureb254902015-07-15 12:50:33 -06003121 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003122 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3123 pipeline_layout_ci.pNext = NULL;
3124 pipeline_layout_ci.setLayoutCount = 1;
3125 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003126
3127 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003128 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3129 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003130 ASSERT_VK_SUCCESS(err);
3131
Karl Schultz6addd812016-02-02 17:17:23 -07003132 VkShaderObj vs(m_device, bindStateVertShaderText,
3133 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06003134 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07003135 // on more devices
3136 VkShaderObj fs(m_device, bindStateFragShaderText,
3137 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003138
Tony Barbourc95e4ac2015-08-04 17:05:26 -06003139 VkPipelineObj pipe(m_device);
3140 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06003141 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06003142 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06003143 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06003144
3145 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003146 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3147 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3148 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3149 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3150 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003151
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003152 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003153
Chia-I Wuf7458c52015-10-26 21:10:41 +08003154 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3155 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3156 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003157}
3158
Karl Schultz6addd812016-02-02 17:17:23 -07003159TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003160 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07003161 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003162
Karl Schultz6addd812016-02-02 17:17:23 -07003163 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003164 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
3165 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003166
3167 ASSERT_NO_FATAL_FAILURE(InitState());
3168 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003169 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3170 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003171
3172 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003173 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3174 ds_pool_ci.pNext = NULL;
3175 ds_pool_ci.maxSets = 1;
3176 ds_pool_ci.poolSizeCount = 1;
3177 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003178
3179 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003180 err =
3181 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003182 ASSERT_VK_SUCCESS(err);
3183
3184 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003185 dsl_binding.binding = 0;
3186 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3187 dsl_binding.descriptorCount = 1;
3188 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3189 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003190
3191 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003192 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3193 ds_layout_ci.pNext = NULL;
3194 ds_layout_ci.bindingCount = 1;
3195 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003196 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003197 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3198 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003199 ASSERT_VK_SUCCESS(err);
3200
3201 VkDescriptorSet descriptorSet;
3202 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003203 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003204 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003205 alloc_info.descriptorPool = ds_pool;
3206 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003207 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3208 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003209 ASSERT_VK_SUCCESS(err);
3210
Karl Schultz6addd812016-02-02 17:17:23 -07003211 VkBufferView view =
3212 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003213 VkWriteDescriptorSet descriptor_write;
3214 memset(&descriptor_write, 0, sizeof(descriptor_write));
3215 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3216 descriptor_write.dstSet = descriptorSet;
3217 descriptor_write.dstBinding = 0;
3218 descriptor_write.descriptorCount = 1;
3219 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3220 descriptor_write.pTexelBufferView = &view;
3221
3222 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3223
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003224 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003225
3226 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3227 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3228}
3229
Karl Schultz6addd812016-02-02 17:17:23 -07003230TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
3231 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
3232 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07003233 // 1. No dynamicOffset supplied
3234 // 2. Too many dynamicOffsets supplied
3235 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07003236 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003238 " requires 1 dynamicOffsets, but only "
3239 "0 dynamicOffsets are left in "
3240 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003241
3242 ASSERT_NO_FATAL_FAILURE(InitState());
3243 ASSERT_NO_FATAL_FAILURE(InitViewport());
3244 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3245
3246 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003247 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3248 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003249
3250 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003251 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3252 ds_pool_ci.pNext = NULL;
3253 ds_pool_ci.maxSets = 1;
3254 ds_pool_ci.poolSizeCount = 1;
3255 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003256
3257 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003258 err =
3259 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003260 ASSERT_VK_SUCCESS(err);
3261
3262 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003263 dsl_binding.binding = 0;
3264 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3265 dsl_binding.descriptorCount = 1;
3266 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3267 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003268
3269 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003270 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3271 ds_layout_ci.pNext = NULL;
3272 ds_layout_ci.bindingCount = 1;
3273 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003274 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003275 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3276 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003277 ASSERT_VK_SUCCESS(err);
3278
3279 VkDescriptorSet descriptorSet;
3280 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003281 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003282 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003283 alloc_info.descriptorPool = ds_pool;
3284 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003285 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3286 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003287 ASSERT_VK_SUCCESS(err);
3288
3289 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003290 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3291 pipeline_layout_ci.pNext = NULL;
3292 pipeline_layout_ci.setLayoutCount = 1;
3293 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003294
3295 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003296 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3297 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003298 ASSERT_VK_SUCCESS(err);
3299
3300 // Create a buffer to update the descriptor with
3301 uint32_t qfi = 0;
3302 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003303 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3304 buffCI.size = 1024;
3305 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3306 buffCI.queueFamilyIndexCount = 1;
3307 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003308
3309 VkBuffer dyub;
3310 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3311 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003312 // Allocate memory and bind to buffer so we can make it to the appropriate
3313 // error
3314 VkMemoryAllocateInfo mem_alloc = {};
3315 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3316 mem_alloc.pNext = NULL;
3317 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12003318 mem_alloc.memoryTypeIndex = 0;
3319
3320 VkMemoryRequirements memReqs;
3321 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
3322 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
3323 0);
3324 if (!pass) {
3325 vkDestroyBuffer(m_device->device(), dyub, NULL);
3326 return;
3327 }
3328
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003329 VkDeviceMemory mem;
3330 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3331 ASSERT_VK_SUCCESS(err);
3332 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
3333 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003334 // Correctly update descriptor to avoid "NOT_UPDATED" error
3335 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003336 buffInfo.buffer = dyub;
3337 buffInfo.offset = 0;
3338 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003339
3340 VkWriteDescriptorSet descriptor_write;
3341 memset(&descriptor_write, 0, sizeof(descriptor_write));
3342 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3343 descriptor_write.dstSet = descriptorSet;
3344 descriptor_write.dstBinding = 0;
3345 descriptor_write.descriptorCount = 1;
3346 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3347 descriptor_write.pBufferInfo = &buffInfo;
3348
3349 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3350
3351 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003352 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3353 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3354 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003355 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003356 uint32_t pDynOff[2] = {512, 756};
3357 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07003358 m_errorMonitor->SetDesiredFailureMsg(
3359 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07003360 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07003361 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3362 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3363 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12003364 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003365 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3367 " dynamic offset 512 combined with "
3368 "offset 0 and range 1024 that "
3369 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07003370 // Create PSO to be used for draw-time errors below
3371 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003372 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003373 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003374 "out gl_PerVertex { \n"
3375 " vec4 gl_Position;\n"
3376 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003377 "void main(){\n"
3378 " gl_Position = vec4(1);\n"
3379 "}\n";
3380 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003381 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003382 "\n"
3383 "layout(location=0) out vec4 x;\n"
3384 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3385 "void main(){\n"
3386 " x = vec4(bar.y);\n"
3387 "}\n";
3388 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3389 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3390 VkPipelineObj pipe(m_device);
3391 pipe.AddShader(&vs);
3392 pipe.AddShader(&fs);
3393 pipe.AddColorAttachment();
3394 pipe.CreateVKPipeline(pipeline_layout, renderPass());
3395
Karl Schultz6addd812016-02-02 17:17:23 -07003396 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3397 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3398 // This update should succeed, but offset size of 512 will overstep buffer
3399 // /w range 1024 & size 1024
3400 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3401 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3402 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07003403 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003404 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003405
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003406 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06003407 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003408
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003409 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3410 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3411}
3412
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003413TEST_F(VkLayerTest, InvalidPushConstants) {
3414 // Hit push constant error cases:
3415 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
3416 // 2. Incorrectly set push constant size to 0
3417 // 3. Incorrectly set push constant size to non-multiple of 4
3418 // 4. Attempt push constant update that exceeds maxPushConstantSize
3419 VkResult err;
3420 m_errorMonitor->SetDesiredFailureMsg(
3421 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3422 "vkCreatePipelineLayout() call has push constants with offset ");
3423
3424 ASSERT_NO_FATAL_FAILURE(InitState());
3425 ASSERT_NO_FATAL_FAILURE(InitViewport());
3426 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3427
3428 VkPushConstantRange pc_range = {};
3429 pc_range.size = 0xFFFFFFFFu;
3430 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3431 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3432 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3433 pipeline_layout_ci.pushConstantRangeCount = 1;
3434 pipeline_layout_ci.pPushConstantRanges = &pc_range;
3435
3436 VkPipelineLayout pipeline_layout;
3437 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3438 &pipeline_layout);
3439
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003440 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003441 // Now cause errors due to size 0 and non-4 byte aligned size
3442 pc_range.size = 0;
3443 m_errorMonitor->SetDesiredFailureMsg(
3444 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3445 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
3446 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3447 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003448 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003449 pc_range.size = 1;
3450 m_errorMonitor->SetDesiredFailureMsg(
3451 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3452 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
3453 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3454 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003455 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003456 // Cause error due to bad size in vkCmdPushConstants() call
3457 m_errorMonitor->SetDesiredFailureMsg(
3458 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3459 "vkCmdPushConstants() call has push constants with offset ");
3460 pipeline_layout_ci.pushConstantRangeCount = 0;
3461 pipeline_layout_ci.pPushConstantRanges = NULL;
3462 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3463 &pipeline_layout);
3464 ASSERT_VK_SUCCESS(err);
3465 BeginCommandBuffer();
3466 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
3467 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003468 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003469 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3470}
3471
Karl Schultz6addd812016-02-02 17:17:23 -07003472TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003473 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07003474 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003475
3476 ASSERT_NO_FATAL_FAILURE(InitState());
3477 ASSERT_NO_FATAL_FAILURE(InitViewport());
3478 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3479
3480 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
3481 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003482 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3483 ds_type_count[0].descriptorCount = 10;
3484 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3485 ds_type_count[1].descriptorCount = 2;
3486 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3487 ds_type_count[2].descriptorCount = 2;
3488 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
3489 ds_type_count[3].descriptorCount = 5;
3490 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
3491 // type
3492 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
3493 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
3494 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003495
3496 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003497 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3498 ds_pool_ci.pNext = NULL;
3499 ds_pool_ci.maxSets = 5;
3500 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
3501 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003502
3503 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003504 err =
3505 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003506 ASSERT_VK_SUCCESS(err);
3507
3508 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
3509 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003510 dsl_binding[0].binding = 0;
3511 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3512 dsl_binding[0].descriptorCount = 5;
3513 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
3514 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003515
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003516 // Create layout identical to set0 layout but w/ different stageFlags
3517 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003518 dsl_fs_stage_only.binding = 0;
3519 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3520 dsl_fs_stage_only.descriptorCount = 5;
3521 dsl_fs_stage_only.stageFlags =
3522 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
3523 // bind time
3524 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003525 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003526 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3527 ds_layout_ci.pNext = NULL;
3528 ds_layout_ci.bindingCount = 1;
3529 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003530 static const uint32_t NUM_LAYOUTS = 4;
3531 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003532 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003533 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
3534 // layout for error case
3535 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3536 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003537 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003538 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003539 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3540 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003541 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003542 dsl_binding[0].binding = 0;
3543 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003544 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003545 dsl_binding[1].binding = 1;
3546 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3547 dsl_binding[1].descriptorCount = 2;
3548 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
3549 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003550 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003551 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003552 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3553 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003554 ASSERT_VK_SUCCESS(err);
3555 dsl_binding[0].binding = 0;
3556 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003557 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003558 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07003559 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3560 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003561 ASSERT_VK_SUCCESS(err);
3562 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003563 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003564 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3565 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003566 ASSERT_VK_SUCCESS(err);
3567
3568 static const uint32_t NUM_SETS = 4;
3569 VkDescriptorSet descriptorSet[NUM_SETS] = {};
3570 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003571 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003572 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003573 alloc_info.descriptorPool = ds_pool;
3574 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003575 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3576 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003577 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003578 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003579 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003580 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003581 err =
3582 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003583 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003584
3585 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003586 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3587 pipeline_layout_ci.pNext = NULL;
3588 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
3589 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003590
3591 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003592 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3593 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003594 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003595 // Create pipelineLayout with only one setLayout
3596 pipeline_layout_ci.setLayoutCount = 1;
3597 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003598 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3599 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003600 ASSERT_VK_SUCCESS(err);
3601 // Create pipelineLayout with 2 descriptor setLayout at index 0
3602 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
3603 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07003604 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3605 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003606 ASSERT_VK_SUCCESS(err);
3607 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
3608 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
3609 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07003610 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3611 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003612 ASSERT_VK_SUCCESS(err);
3613 // Create pipelineLayout with UB type, but stageFlags for FS only
3614 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
3615 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003616 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3617 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003618 ASSERT_VK_SUCCESS(err);
3619 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
3620 VkDescriptorSetLayout pl_bad_s0[2] = {};
3621 pl_bad_s0[0] = ds_layout_fs_only;
3622 pl_bad_s0[1] = ds_layout[1];
3623 pipeline_layout_ci.setLayoutCount = 2;
3624 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
3625 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07003626 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3627 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003628 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003629
3630 // Create a buffer to update the descriptor with
3631 uint32_t qfi = 0;
3632 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003633 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3634 buffCI.size = 1024;
3635 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3636 buffCI.queueFamilyIndexCount = 1;
3637 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003638
3639 VkBuffer dyub;
3640 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3641 ASSERT_VK_SUCCESS(err);
3642 // Correctly update descriptor to avoid "NOT_UPDATED" error
3643 static const uint32_t NUM_BUFFS = 5;
3644 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003645 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003646 buffInfo[i].buffer = dyub;
3647 buffInfo[i].offset = 0;
3648 buffInfo[i].range = 1024;
3649 }
Karl Schultz6addd812016-02-02 17:17:23 -07003650 VkImage image;
3651 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3652 const int32_t tex_width = 32;
3653 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003654 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003655 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3656 image_create_info.pNext = NULL;
3657 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3658 image_create_info.format = tex_format;
3659 image_create_info.extent.width = tex_width;
3660 image_create_info.extent.height = tex_height;
3661 image_create_info.extent.depth = 1;
3662 image_create_info.mipLevels = 1;
3663 image_create_info.arrayLayers = 1;
3664 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3665 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3666 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3667 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003668 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3669 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003670
Karl Schultz6addd812016-02-02 17:17:23 -07003671 VkMemoryRequirements memReqs;
3672 VkDeviceMemory imageMem;
3673 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003674 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003675 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3676 memAlloc.pNext = NULL;
3677 memAlloc.allocationSize = 0;
3678 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003679 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
3680 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003681 pass =
3682 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003683 ASSERT_TRUE(pass);
3684 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
3685 ASSERT_VK_SUCCESS(err);
3686 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
3687 ASSERT_VK_SUCCESS(err);
3688
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003689 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003690 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3691 image_view_create_info.image = image;
3692 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
3693 image_view_create_info.format = tex_format;
3694 image_view_create_info.subresourceRange.layerCount = 1;
3695 image_view_create_info.subresourceRange.baseMipLevel = 0;
3696 image_view_create_info.subresourceRange.levelCount = 1;
3697 image_view_create_info.subresourceRange.aspectMask =
3698 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003699
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003700 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07003701 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
3702 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003703 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003704 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003705 imageInfo[0].imageView = view;
3706 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3707 imageInfo[1].imageView = view;
3708 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003709 imageInfo[2].imageView = view;
3710 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3711 imageInfo[3].imageView = view;
3712 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003713
3714 static const uint32_t NUM_SET_UPDATES = 3;
3715 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
3716 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3717 descriptor_write[0].dstSet = descriptorSet[0];
3718 descriptor_write[0].dstBinding = 0;
3719 descriptor_write[0].descriptorCount = 5;
3720 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3721 descriptor_write[0].pBufferInfo = buffInfo;
3722 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3723 descriptor_write[1].dstSet = descriptorSet[1];
3724 descriptor_write[1].dstBinding = 0;
3725 descriptor_write[1].descriptorCount = 2;
3726 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3727 descriptor_write[1].pImageInfo = imageInfo;
3728 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3729 descriptor_write[2].dstSet = descriptorSet[1];
3730 descriptor_write[2].dstBinding = 1;
3731 descriptor_write[2].descriptorCount = 2;
3732 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003733 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003734
3735 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003736
Tobin Ehlis88452832015-12-03 09:40:56 -07003737 // Create PSO to be used for draw-time errors below
3738 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003739 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003740 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003741 "out gl_PerVertex {\n"
3742 " vec4 gl_Position;\n"
3743 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003744 "void main(){\n"
3745 " gl_Position = vec4(1);\n"
3746 "}\n";
3747 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003748 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003749 "\n"
3750 "layout(location=0) out vec4 x;\n"
3751 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3752 "void main(){\n"
3753 " x = vec4(bar.y);\n"
3754 "}\n";
3755 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3756 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003757 VkPipelineObj pipe(m_device);
3758 pipe.AddShader(&vs);
3759 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07003760 pipe.AddColorAttachment();
3761 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07003762
3763 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07003764
Karl Schultz6addd812016-02-02 17:17:23 -07003765 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3766 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3767 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
3768 // of PSO
3769 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
3770 // cmd_pipeline.c
3771 // due to the fact that cmd_alloc_dset_data() has not been called in
3772 // cmd_bind_graphics_pipeline()
3773 // TODO : Want to cause various binding incompatibility issues here to test
3774 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07003775 // First cause various verify_layout_compatibility() fails
3776 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003777 // verify_set_layout_compatibility fail cases:
3778 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07003779 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3780 " due to: invalid VkPipelineLayout ");
3781 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3782 VK_PIPELINE_BIND_POINT_GRAPHICS,
3783 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
3784 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003785 m_errorMonitor->VerifyFound();
3786
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003787 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07003788 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3789 " attempting to bind set to index 1");
3790 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3791 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
3792 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003793 m_errorMonitor->VerifyFound();
3794
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003795 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003796 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
3797 // descriptors
3798 m_errorMonitor->SetDesiredFailureMsg(
3799 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003800 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003801 vkCmdBindDescriptorSets(
3802 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3803 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003804 m_errorMonitor->VerifyFound();
3805
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003806 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
3807 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07003808 m_errorMonitor->SetDesiredFailureMsg(
3809 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003810 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07003811 vkCmdBindDescriptorSets(
3812 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3813 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003814 m_errorMonitor->VerifyFound();
3815
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003816 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
3817 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07003818 m_errorMonitor->SetDesiredFailureMsg(
3819 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003820 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003821 vkCmdBindDescriptorSets(
3822 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3823 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003824 m_errorMonitor->VerifyFound();
3825
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003826 // Cause INFO messages due to disturbing previously bound Sets
3827 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07003828 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3829 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3830 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003831 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07003832 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003833 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003834 " previously bound as set #0 was disturbed ");
3835 vkCmdBindDescriptorSets(
3836 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3837 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003838 m_errorMonitor->VerifyFound();
3839
Karl Schultz6addd812016-02-02 17:17:23 -07003840 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3841 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3842 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003843 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003845 " newly bound as set #0 so set #1 and "
3846 "any subsequent sets were disturbed ");
3847 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3848 VK_PIPELINE_BIND_POINT_GRAPHICS,
3849 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003850 m_errorMonitor->VerifyFound();
3851
Tobin Ehlis88452832015-12-03 09:40:56 -07003852 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07003853 // 1. Error due to not binding required set (we actually use same code as
3854 // above to disturb set0)
3855 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3856 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3857 2, &descriptorSet[0], 0, NULL);
3858 vkCmdBindDescriptorSets(
3859 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3860 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
3861 m_errorMonitor->SetDesiredFailureMsg(
3862 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3863 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07003864 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003865 m_errorMonitor->VerifyFound();
3866
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003867 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003868 // 2. Error due to bound set not being compatible with PSO's
3869 // VkPipelineLayout (diff stageFlags in this case)
3870 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3871 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3872 2, &descriptorSet[0], 0, NULL);
3873 m_errorMonitor->SetDesiredFailureMsg(
3874 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3875 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07003876 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003877 m_errorMonitor->VerifyFound();
3878
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003879 // Remaining clean-up
3880 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003881 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003882 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
3883 }
3884 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06003885 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
3886 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003887 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003888 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3889 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3890}
Tobin Ehlis559c6382015-11-05 09:52:49 -07003891
Karl Schultz6addd812016-02-02 17:17:23 -07003892TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003893
Karl Schultz6addd812016-02-02 17:17:23 -07003894 m_errorMonitor->SetDesiredFailureMsg(
3895 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003896 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003897
3898 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003899 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003900 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003901 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003902
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003903 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003904}
3905
Karl Schultz6addd812016-02-02 17:17:23 -07003906TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
3907 VkResult err;
3908 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003909
Karl Schultz6addd812016-02-02 17:17:23 -07003910 m_errorMonitor->SetDesiredFailureMsg(
3911 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07003912 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003913
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003914 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003915
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003916 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003917 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003918 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003919 cmd.commandPool = m_commandPool;
3920 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003921 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06003922
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003923 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06003924 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003925
3926 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003927 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003928 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003929 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003930 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07003931 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
3932 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003933 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003934
3935 // The error should be caught by validation of the BeginCommandBuffer call
3936 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
3937
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003938 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003939 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003940}
3941
Karl Schultz6addd812016-02-02 17:17:23 -07003942TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003943 // Cause error due to Begin while recording CB
3944 // Then cause 2 errors for attempting to reset CB w/o having
3945 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
3946 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003948 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003949
3950 ASSERT_NO_FATAL_FAILURE(InitState());
3951
3952 // Calls AllocateCommandBuffers
3953 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
3954
Karl Schultz6addd812016-02-02 17:17:23 -07003955 // Force the failure by setting the Renderpass and Framebuffer fields with
3956 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003957 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003958 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003959 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3960 cmd_buf_info.pNext = NULL;
3961 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003962 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003963
3964 // Begin CB to transition to recording state
3965 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
3966 // Can't re-begin. This should trigger error
3967 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003968 m_errorMonitor->VerifyFound();
3969
Karl Schultz6addd812016-02-02 17:17:23 -07003970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3971 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003972 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
3973 // Reset attempt will trigger error due to incorrect CommandPool state
3974 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003975 m_errorMonitor->VerifyFound();
3976
Karl Schultz6addd812016-02-02 17:17:23 -07003977 m_errorMonitor->SetDesiredFailureMsg(
3978 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3979 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003980 // Transition CB to RECORDED state
3981 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
3982 // Now attempting to Begin will implicitly reset, which triggers error
3983 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003984 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003985}
3986
Karl Schultz6addd812016-02-02 17:17:23 -07003987TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003988 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003989 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003990
Karl Schultz6addd812016-02-02 17:17:23 -07003991 m_errorMonitor->SetDesiredFailureMsg(
3992 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003993 "Invalid Pipeline CreateInfo State: Vtx Shader required");
3994
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003995 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003996 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003997
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003998 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003999 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4000 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004001
4002 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004003 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4004 ds_pool_ci.pNext = NULL;
4005 ds_pool_ci.maxSets = 1;
4006 ds_pool_ci.poolSizeCount = 1;
4007 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004008
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004009 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004010 err =
4011 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004012 ASSERT_VK_SUCCESS(err);
4013
Tony Barboureb254902015-07-15 12:50:33 -06004014 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004015 dsl_binding.binding = 0;
4016 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4017 dsl_binding.descriptorCount = 1;
4018 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4019 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004020
Tony Barboureb254902015-07-15 12:50:33 -06004021 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004022 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4023 ds_layout_ci.pNext = NULL;
4024 ds_layout_ci.bindingCount = 1;
4025 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004026
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004027 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004028 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4029 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004030 ASSERT_VK_SUCCESS(err);
4031
4032 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004033 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004034 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004035 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004036 alloc_info.descriptorPool = ds_pool;
4037 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004038 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4039 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004040 ASSERT_VK_SUCCESS(err);
4041
Tony Barboureb254902015-07-15 12:50:33 -06004042 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004043 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4044 pipeline_layout_ci.setLayoutCount = 1;
4045 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004046
4047 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004048 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4049 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004050 ASSERT_VK_SUCCESS(err);
4051
Tobin Ehlise68360f2015-10-01 11:15:13 -06004052 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07004053 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06004054
4055 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004056 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4057 vp_state_ci.scissorCount = 1;
4058 vp_state_ci.pScissors = &sc;
4059 vp_state_ci.viewportCount = 1;
4060 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004061
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004062 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4063 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4064 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4065 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4066 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4067 rs_state_ci.depthClampEnable = VK_FALSE;
4068 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4069 rs_state_ci.depthBiasEnable = VK_FALSE;
4070
Tony Barboureb254902015-07-15 12:50:33 -06004071 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004072 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4073 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004074 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004075 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4076 gp_ci.layout = pipeline_layout;
4077 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06004078
4079 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004080 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4081 pc_ci.initialDataSize = 0;
4082 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004083
4084 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06004085 VkPipelineCache pipelineCache;
4086
Karl Schultz6addd812016-02-02 17:17:23 -07004087 err =
4088 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06004089 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004090 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4091 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004092
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004093 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004094
Chia-I Wuf7458c52015-10-26 21:10:41 +08004095 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4096 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4097 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4098 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004099}
Tobin Ehlis912df022015-09-17 08:46:18 -06004100/*// TODO : This test should be good, but needs Tess support in compiler to run
4101TEST_F(VkLayerTest, InvalidPatchControlPoints)
4102{
4103 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06004104 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004105
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004106 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004107 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
4108primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004109
Tobin Ehlis912df022015-09-17 08:46:18 -06004110 ASSERT_NO_FATAL_FAILURE(InitState());
4111 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06004112
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004113 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06004114 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004115 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004116
4117 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4118 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4119 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004120 ds_pool_ci.poolSizeCount = 1;
4121 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06004122
4123 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004124 err = vkCreateDescriptorPool(m_device->device(),
4125VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06004126 ASSERT_VK_SUCCESS(err);
4127
4128 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08004129 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06004130 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08004131 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004132 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4133 dsl_binding.pImmutableSamplers = NULL;
4134
4135 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004136 ds_layout_ci.sType =
4137VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06004138 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004139 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004140 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06004141
4142 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004143 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4144&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06004145 ASSERT_VK_SUCCESS(err);
4146
4147 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004148 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
4149VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06004150 ASSERT_VK_SUCCESS(err);
4151
4152 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004153 pipeline_layout_ci.sType =
4154VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06004155 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004156 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004157 pipeline_layout_ci.pSetLayouts = &ds_layout;
4158
4159 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004160 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4161&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06004162 ASSERT_VK_SUCCESS(err);
4163
4164 VkPipelineShaderStageCreateInfo shaderStages[3];
4165 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
4166
Karl Schultz6addd812016-02-02 17:17:23 -07004167 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
4168this);
Tobin Ehlis912df022015-09-17 08:46:18 -06004169 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07004170 VkShaderObj
4171tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
4172this);
4173 VkShaderObj
4174te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
4175this);
Tobin Ehlis912df022015-09-17 08:46:18 -06004176
Karl Schultz6addd812016-02-02 17:17:23 -07004177 shaderStages[0].sType =
4178VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004179 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004180 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07004181 shaderStages[1].sType =
4182VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004183 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004184 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07004185 shaderStages[2].sType =
4186VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004187 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004188 shaderStages[2].shader = te.handle();
4189
4190 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004191 iaCI.sType =
4192VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08004193 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06004194
4195 VkPipelineTessellationStateCreateInfo tsCI = {};
4196 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
4197 tsCI.patchControlPoints = 0; // This will cause an error
4198
4199 VkGraphicsPipelineCreateInfo gp_ci = {};
4200 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4201 gp_ci.pNext = NULL;
4202 gp_ci.stageCount = 3;
4203 gp_ci.pStages = shaderStages;
4204 gp_ci.pVertexInputState = NULL;
4205 gp_ci.pInputAssemblyState = &iaCI;
4206 gp_ci.pTessellationState = &tsCI;
4207 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004208 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06004209 gp_ci.pMultisampleState = NULL;
4210 gp_ci.pDepthStencilState = NULL;
4211 gp_ci.pColorBlendState = NULL;
4212 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4213 gp_ci.layout = pipeline_layout;
4214 gp_ci.renderPass = renderPass();
4215
4216 VkPipelineCacheCreateInfo pc_ci = {};
4217 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4218 pc_ci.pNext = NULL;
4219 pc_ci.initialSize = 0;
4220 pc_ci.initialData = 0;
4221 pc_ci.maxSize = 0;
4222
4223 VkPipeline pipeline;
4224 VkPipelineCache pipelineCache;
4225
Karl Schultz6addd812016-02-02 17:17:23 -07004226 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
4227&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06004228 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004229 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4230&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06004231
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004232 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004233
Chia-I Wuf7458c52015-10-26 21:10:41 +08004234 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4235 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4236 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4237 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06004238}
4239*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06004240// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07004241TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07004242 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004243
Karl Schultz6addd812016-02-02 17:17:23 -07004244 m_errorMonitor->SetDesiredFailureMsg(
4245 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004246 "Gfx Pipeline viewport count (1) must match scissor count (0).");
4247
Tobin Ehlise68360f2015-10-01 11:15:13 -06004248 ASSERT_NO_FATAL_FAILURE(InitState());
4249 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004250
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004251 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004252 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4253 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004254
4255 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004256 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4257 ds_pool_ci.maxSets = 1;
4258 ds_pool_ci.poolSizeCount = 1;
4259 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004260
4261 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004262 err =
4263 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004264 ASSERT_VK_SUCCESS(err);
4265
4266 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004267 dsl_binding.binding = 0;
4268 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4269 dsl_binding.descriptorCount = 1;
4270 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004271
4272 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004273 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4274 ds_layout_ci.bindingCount = 1;
4275 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004276
4277 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004278 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4279 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004280 ASSERT_VK_SUCCESS(err);
4281
4282 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004283 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004284 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004285 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004286 alloc_info.descriptorPool = ds_pool;
4287 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004288 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4289 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004290 ASSERT_VK_SUCCESS(err);
4291
4292 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004293 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4294 pipeline_layout_ci.setLayoutCount = 1;
4295 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004296
4297 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004298 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4299 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004300 ASSERT_VK_SUCCESS(err);
4301
4302 VkViewport vp = {}; // Just need dummy vp to point to
4303
4304 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004305 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4306 vp_state_ci.scissorCount = 0;
4307 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
4308 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004309
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004310 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4311 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4312 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4313 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4314 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4315 rs_state_ci.depthClampEnable = VK_FALSE;
4316 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4317 rs_state_ci.depthBiasEnable = VK_FALSE;
4318
Cody Northropeb3a6c12015-10-05 14:44:45 -06004319 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004320 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004321
Karl Schultz6addd812016-02-02 17:17:23 -07004322 VkShaderObj vs(m_device, bindStateVertShaderText,
4323 VK_SHADER_STAGE_VERTEX_BIT, this);
4324 VkShaderObj fs(m_device, bindStateFragShaderText,
4325 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004326 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004327 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004328 shaderStages[0] = vs.GetStageCreateInfo();
4329 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004330
4331 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004332 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4333 gp_ci.stageCount = 2;
4334 gp_ci.pStages = shaderStages;
4335 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004336 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004337 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4338 gp_ci.layout = pipeline_layout;
4339 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004340
4341 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004342 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004343
4344 VkPipeline pipeline;
4345 VkPipelineCache pipelineCache;
4346
Karl Schultz6addd812016-02-02 17:17:23 -07004347 err =
4348 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004349 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004350 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4351 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004352
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004353 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004354
Chia-I Wuf7458c52015-10-26 21:10:41 +08004355 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4356 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4357 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4358 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004359}
Karl Schultz6addd812016-02-02 17:17:23 -07004360// Don't set viewport state in PSO. This is an error b/c we always need this
4361// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06004362// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07004363TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06004364 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07004365 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004366
Karl Schultz6addd812016-02-02 17:17:23 -07004367 m_errorMonitor->SetDesiredFailureMsg(
4368 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004369 "Gfx Pipeline pViewportState is null. Even if ");
4370
Tobin Ehlise68360f2015-10-01 11:15:13 -06004371 ASSERT_NO_FATAL_FAILURE(InitState());
4372 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004373
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004374 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004375 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4376 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004377
4378 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004379 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4380 ds_pool_ci.maxSets = 1;
4381 ds_pool_ci.poolSizeCount = 1;
4382 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004383
4384 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004385 err =
4386 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004387 ASSERT_VK_SUCCESS(err);
4388
4389 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004390 dsl_binding.binding = 0;
4391 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4392 dsl_binding.descriptorCount = 1;
4393 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004394
4395 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004396 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4397 ds_layout_ci.bindingCount = 1;
4398 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004399
4400 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004401 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4402 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004403 ASSERT_VK_SUCCESS(err);
4404
4405 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004406 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004407 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004408 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004409 alloc_info.descriptorPool = ds_pool;
4410 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004411 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4412 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004413 ASSERT_VK_SUCCESS(err);
4414
4415 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004416 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4417 pipeline_layout_ci.setLayoutCount = 1;
4418 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004419
4420 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004421 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4422 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004423 ASSERT_VK_SUCCESS(err);
4424
4425 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4426 // Set scissor as dynamic to avoid second error
4427 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004428 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4429 dyn_state_ci.dynamicStateCount = 1;
4430 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004431
Cody Northropeb3a6c12015-10-05 14:44:45 -06004432 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004433 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004434
Karl Schultz6addd812016-02-02 17:17:23 -07004435 VkShaderObj vs(m_device, bindStateVertShaderText,
4436 VK_SHADER_STAGE_VERTEX_BIT, this);
4437 VkShaderObj fs(m_device, bindStateFragShaderText,
4438 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004439 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004440 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004441 shaderStages[0] = vs.GetStageCreateInfo();
4442 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004443
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004444
4445 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4446 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4447 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4448 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4449 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4450 rs_state_ci.depthClampEnable = VK_FALSE;
4451 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4452 rs_state_ci.depthBiasEnable = VK_FALSE;
4453
Tobin Ehlise68360f2015-10-01 11:15:13 -06004454 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004455 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4456 gp_ci.stageCount = 2;
4457 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004458 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004459 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
4460 // should cause validation error
4461 gp_ci.pDynamicState = &dyn_state_ci;
4462 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4463 gp_ci.layout = pipeline_layout;
4464 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004465
4466 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004467 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004468
4469 VkPipeline pipeline;
4470 VkPipelineCache pipelineCache;
4471
Karl Schultz6addd812016-02-02 17:17:23 -07004472 err =
4473 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004474 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004475 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4476 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004477
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004478 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004479
Chia-I Wuf7458c52015-10-26 21:10:41 +08004480 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4481 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4482 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4483 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004484}
4485// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07004486// Then run second test where dynamic scissor count doesn't match PSO scissor
4487// count
4488TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
4489 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004490
Karl Schultz6addd812016-02-02 17:17:23 -07004491 m_errorMonitor->SetDesiredFailureMsg(
4492 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004493 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
4494
Tobin Ehlise68360f2015-10-01 11:15:13 -06004495 ASSERT_NO_FATAL_FAILURE(InitState());
4496 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004497
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004498 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004499 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4500 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004501
4502 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004503 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4504 ds_pool_ci.maxSets = 1;
4505 ds_pool_ci.poolSizeCount = 1;
4506 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004507
4508 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004509 err =
4510 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004511 ASSERT_VK_SUCCESS(err);
4512
4513 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004514 dsl_binding.binding = 0;
4515 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4516 dsl_binding.descriptorCount = 1;
4517 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004518
4519 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004520 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4521 ds_layout_ci.bindingCount = 1;
4522 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004523
4524 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004525 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4526 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004527 ASSERT_VK_SUCCESS(err);
4528
4529 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004530 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004531 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004532 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004533 alloc_info.descriptorPool = ds_pool;
4534 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004535 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4536 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004537 ASSERT_VK_SUCCESS(err);
4538
4539 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004540 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4541 pipeline_layout_ci.setLayoutCount = 1;
4542 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004543
4544 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004545 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4546 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004547 ASSERT_VK_SUCCESS(err);
4548
4549 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004550 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4551 vp_state_ci.viewportCount = 1;
4552 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
4553 vp_state_ci.scissorCount = 1;
4554 vp_state_ci.pScissors =
4555 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06004556
4557 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4558 // Set scissor as dynamic to avoid that error
4559 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004560 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4561 dyn_state_ci.dynamicStateCount = 1;
4562 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004563
Cody Northropeb3a6c12015-10-05 14:44:45 -06004564 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004565 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004566
Karl Schultz6addd812016-02-02 17:17:23 -07004567 VkShaderObj vs(m_device, bindStateVertShaderText,
4568 VK_SHADER_STAGE_VERTEX_BIT, this);
4569 VkShaderObj fs(m_device, bindStateFragShaderText,
4570 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004571 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004572 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004573 shaderStages[0] = vs.GetStageCreateInfo();
4574 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004575
Cody Northropf6622dc2015-10-06 10:33:21 -06004576 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4577 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4578 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004579 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004580 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004581 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004582 vi_ci.pVertexAttributeDescriptions = nullptr;
4583
4584 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4585 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4586 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4587
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004588 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004589 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06004590 rs_ci.pNext = nullptr;
4591
Mark Youngc89c6312016-03-31 16:03:20 -06004592 VkPipelineColorBlendAttachmentState att = {};
4593 att.blendEnable = VK_FALSE;
4594 att.colorWriteMask = 0xf;
4595
Cody Northropf6622dc2015-10-06 10:33:21 -06004596 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4597 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4598 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004599 cb_ci.attachmentCount = 1;
4600 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06004601
Tobin Ehlise68360f2015-10-01 11:15:13 -06004602 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004603 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4604 gp_ci.stageCount = 2;
4605 gp_ci.pStages = shaderStages;
4606 gp_ci.pVertexInputState = &vi_ci;
4607 gp_ci.pInputAssemblyState = &ia_ci;
4608 gp_ci.pViewportState = &vp_state_ci;
4609 gp_ci.pRasterizationState = &rs_ci;
4610 gp_ci.pColorBlendState = &cb_ci;
4611 gp_ci.pDynamicState = &dyn_state_ci;
4612 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4613 gp_ci.layout = pipeline_layout;
4614 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004615
4616 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004617 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004618
4619 VkPipeline pipeline;
4620 VkPipelineCache pipelineCache;
4621
Karl Schultz6addd812016-02-02 17:17:23 -07004622 err =
4623 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004624 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004625 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4626 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004627
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004628 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004629
Tobin Ehlisd332f282015-10-02 11:00:56 -06004630 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07004631 // First need to successfully create the PSO from above by setting
4632 // pViewports
4633 m_errorMonitor->SetDesiredFailureMsg(
4634 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4635 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
4636 "scissorCount is 1. These counts must match.");
4637
4638 VkViewport vp = {}; // Just need dummy vp to point to
4639 vp_state_ci.pViewports = &vp;
4640 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4641 &gp_ci, NULL, &pipeline);
4642 ASSERT_VK_SUCCESS(err);
4643 BeginCommandBuffer();
4644 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4645 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4646 VkRect2D scissors[2] = {}; // don't care about data
4647 // Count of 2 doesn't match PSO count of 1
4648 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
4649 Draw(1, 0, 0, 0);
4650
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004651 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004652
4653 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4654 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4655 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4656 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4657}
4658// Create PSO w/o non-zero scissorCount but no scissor data
4659// Then run second test where dynamic viewportCount doesn't match PSO
4660// viewportCount
4661TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
4662 VkResult err;
4663
4664 m_errorMonitor->SetDesiredFailureMsg(
4665 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4666 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
4667
4668 ASSERT_NO_FATAL_FAILURE(InitState());
4669 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4670
4671 VkDescriptorPoolSize ds_type_count = {};
4672 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4673 ds_type_count.descriptorCount = 1;
4674
4675 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4676 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4677 ds_pool_ci.maxSets = 1;
4678 ds_pool_ci.poolSizeCount = 1;
4679 ds_pool_ci.pPoolSizes = &ds_type_count;
4680
4681 VkDescriptorPool ds_pool;
4682 err =
4683 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4684 ASSERT_VK_SUCCESS(err);
4685
4686 VkDescriptorSetLayoutBinding dsl_binding = {};
4687 dsl_binding.binding = 0;
4688 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4689 dsl_binding.descriptorCount = 1;
4690 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4691
4692 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4693 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4694 ds_layout_ci.bindingCount = 1;
4695 ds_layout_ci.pBindings = &dsl_binding;
4696
4697 VkDescriptorSetLayout ds_layout;
4698 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4699 &ds_layout);
4700 ASSERT_VK_SUCCESS(err);
4701
4702 VkDescriptorSet descriptorSet;
4703 VkDescriptorSetAllocateInfo alloc_info = {};
4704 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4705 alloc_info.descriptorSetCount = 1;
4706 alloc_info.descriptorPool = ds_pool;
4707 alloc_info.pSetLayouts = &ds_layout;
4708 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4709 &descriptorSet);
4710 ASSERT_VK_SUCCESS(err);
4711
4712 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4713 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4714 pipeline_layout_ci.setLayoutCount = 1;
4715 pipeline_layout_ci.pSetLayouts = &ds_layout;
4716
4717 VkPipelineLayout pipeline_layout;
4718 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4719 &pipeline_layout);
4720 ASSERT_VK_SUCCESS(err);
4721
4722 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4723 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4724 vp_state_ci.scissorCount = 1;
4725 vp_state_ci.pScissors =
4726 NULL; // Null scissor w/ count of 1 should cause error
4727 vp_state_ci.viewportCount = 1;
4728 vp_state_ci.pViewports =
4729 NULL; // vp is dynamic (below) so this won't cause error
4730
4731 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
4732 // Set scissor as dynamic to avoid that error
4733 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4734 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4735 dyn_state_ci.dynamicStateCount = 1;
4736 dyn_state_ci.pDynamicStates = &vp_state;
4737
4738 VkPipelineShaderStageCreateInfo shaderStages[2];
4739 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4740
4741 VkShaderObj vs(m_device, bindStateVertShaderText,
4742 VK_SHADER_STAGE_VERTEX_BIT, this);
4743 VkShaderObj fs(m_device, bindStateFragShaderText,
4744 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004745 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004746 // but add it to be able to run on more devices
4747 shaderStages[0] = vs.GetStageCreateInfo();
4748 shaderStages[1] = fs.GetStageCreateInfo();
4749
4750 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4751 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4752 vi_ci.pNext = nullptr;
4753 vi_ci.vertexBindingDescriptionCount = 0;
4754 vi_ci.pVertexBindingDescriptions = nullptr;
4755 vi_ci.vertexAttributeDescriptionCount = 0;
4756 vi_ci.pVertexAttributeDescriptions = nullptr;
4757
4758 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4759 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4760 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4761
4762 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4763 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4764 rs_ci.pNext = nullptr;
4765
Mark Youngc89c6312016-03-31 16:03:20 -06004766 VkPipelineColorBlendAttachmentState att = {};
4767 att.blendEnable = VK_FALSE;
4768 att.colorWriteMask = 0xf;
4769
Karl Schultz6addd812016-02-02 17:17:23 -07004770 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4771 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4772 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004773 cb_ci.attachmentCount = 1;
4774 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07004775
4776 VkGraphicsPipelineCreateInfo gp_ci = {};
4777 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4778 gp_ci.stageCount = 2;
4779 gp_ci.pStages = shaderStages;
4780 gp_ci.pVertexInputState = &vi_ci;
4781 gp_ci.pInputAssemblyState = &ia_ci;
4782 gp_ci.pViewportState = &vp_state_ci;
4783 gp_ci.pRasterizationState = &rs_ci;
4784 gp_ci.pColorBlendState = &cb_ci;
4785 gp_ci.pDynamicState = &dyn_state_ci;
4786 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4787 gp_ci.layout = pipeline_layout;
4788 gp_ci.renderPass = renderPass();
4789
4790 VkPipelineCacheCreateInfo pc_ci = {};
4791 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4792
4793 VkPipeline pipeline;
4794 VkPipelineCache pipelineCache;
4795
4796 err =
4797 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4798 ASSERT_VK_SUCCESS(err);
4799 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4800 &gp_ci, NULL, &pipeline);
4801
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004802 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004803
4804 // Now hit second fail case where we set scissor w/ different count than PSO
4805 // First need to successfully create the PSO from above by setting
4806 // pViewports
4807 m_errorMonitor->SetDesiredFailureMsg(
4808 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4809 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
4810 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004811
Tobin Ehlisd332f282015-10-02 11:00:56 -06004812 VkRect2D sc = {}; // Just need dummy vp to point to
4813 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07004814 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4815 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004816 ASSERT_VK_SUCCESS(err);
4817 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004818 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4819 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004820 VkViewport viewports[2] = {}; // don't care about data
4821 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07004822 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004823 Draw(1, 0, 0, 0);
4824
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004825 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004826
Chia-I Wuf7458c52015-10-26 21:10:41 +08004827 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4828 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4829 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4830 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004831}
4832
Mark Young7394fdd2016-03-31 14:56:43 -06004833TEST_F(VkLayerTest, PSOLineWidthInvalid) {
4834 VkResult err;
4835
4836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004837 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004838
4839 ASSERT_NO_FATAL_FAILURE(InitState());
4840 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4841
4842 VkDescriptorPoolSize ds_type_count = {};
4843 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4844 ds_type_count.descriptorCount = 1;
4845
4846 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4847 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4848 ds_pool_ci.maxSets = 1;
4849 ds_pool_ci.poolSizeCount = 1;
4850 ds_pool_ci.pPoolSizes = &ds_type_count;
4851
4852 VkDescriptorPool ds_pool;
4853 err =
4854 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4855 ASSERT_VK_SUCCESS(err);
4856
4857 VkDescriptorSetLayoutBinding dsl_binding = {};
4858 dsl_binding.binding = 0;
4859 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4860 dsl_binding.descriptorCount = 1;
4861 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4862
4863 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4864 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4865 ds_layout_ci.bindingCount = 1;
4866 ds_layout_ci.pBindings = &dsl_binding;
4867
4868 VkDescriptorSetLayout ds_layout;
4869 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4870 &ds_layout);
4871 ASSERT_VK_SUCCESS(err);
4872
4873 VkDescriptorSet descriptorSet;
4874 VkDescriptorSetAllocateInfo alloc_info = {};
4875 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4876 alloc_info.descriptorSetCount = 1;
4877 alloc_info.descriptorPool = ds_pool;
4878 alloc_info.pSetLayouts = &ds_layout;
4879 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4880 &descriptorSet);
4881 ASSERT_VK_SUCCESS(err);
4882
4883 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4884 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4885 pipeline_layout_ci.setLayoutCount = 1;
4886 pipeline_layout_ci.pSetLayouts = &ds_layout;
4887
4888 VkPipelineLayout pipeline_layout;
4889 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4890 &pipeline_layout);
4891 ASSERT_VK_SUCCESS(err);
4892
4893 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4894 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4895 vp_state_ci.scissorCount = 1;
4896 vp_state_ci.pScissors = NULL;
4897 vp_state_ci.viewportCount = 1;
4898 vp_state_ci.pViewports = NULL;
4899
4900 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
4901 VK_DYNAMIC_STATE_SCISSOR,
4902 VK_DYNAMIC_STATE_LINE_WIDTH};
4903 // Set scissor as dynamic to avoid that error
4904 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4905 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4906 dyn_state_ci.dynamicStateCount = 2;
4907 dyn_state_ci.pDynamicStates = dynamic_states;
4908
4909 VkPipelineShaderStageCreateInfo shaderStages[2];
4910 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4911
4912 VkShaderObj vs(m_device, bindStateVertShaderText,
4913 VK_SHADER_STAGE_VERTEX_BIT, this);
4914 VkShaderObj fs(m_device, bindStateFragShaderText,
4915 VK_SHADER_STAGE_FRAGMENT_BIT,
4916 this); // TODO - We shouldn't need a fragment shader
4917 // but add it to be able to run on more devices
4918 shaderStages[0] = vs.GetStageCreateInfo();
4919 shaderStages[1] = fs.GetStageCreateInfo();
4920
4921 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4922 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4923 vi_ci.pNext = nullptr;
4924 vi_ci.vertexBindingDescriptionCount = 0;
4925 vi_ci.pVertexBindingDescriptions = nullptr;
4926 vi_ci.vertexAttributeDescriptionCount = 0;
4927 vi_ci.pVertexAttributeDescriptions = nullptr;
4928
4929 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4930 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4931 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4932
4933 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4934 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4935 rs_ci.pNext = nullptr;
4936
Mark Young47107952016-05-02 15:59:55 -06004937 // Check too low (line width of -1.0f).
4938 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06004939
4940 VkPipelineColorBlendAttachmentState att = {};
4941 att.blendEnable = VK_FALSE;
4942 att.colorWriteMask = 0xf;
4943
4944 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4945 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4946 cb_ci.pNext = nullptr;
4947 cb_ci.attachmentCount = 1;
4948 cb_ci.pAttachments = &att;
4949
4950 VkGraphicsPipelineCreateInfo gp_ci = {};
4951 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4952 gp_ci.stageCount = 2;
4953 gp_ci.pStages = shaderStages;
4954 gp_ci.pVertexInputState = &vi_ci;
4955 gp_ci.pInputAssemblyState = &ia_ci;
4956 gp_ci.pViewportState = &vp_state_ci;
4957 gp_ci.pRasterizationState = &rs_ci;
4958 gp_ci.pColorBlendState = &cb_ci;
4959 gp_ci.pDynamicState = &dyn_state_ci;
4960 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4961 gp_ci.layout = pipeline_layout;
4962 gp_ci.renderPass = renderPass();
4963
4964 VkPipelineCacheCreateInfo pc_ci = {};
4965 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4966
4967 VkPipeline pipeline;
4968 VkPipelineCache pipelineCache;
4969
4970 err =
4971 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4972 ASSERT_VK_SUCCESS(err);
4973 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4974 &gp_ci, NULL, &pipeline);
4975
4976 m_errorMonitor->VerifyFound();
4977
4978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4979 "Attempt to set lineWidth to 65536");
4980
4981 // Check too high (line width of 65536.0f).
4982 rs_ci.lineWidth = 65536.0f;
4983
4984 err =
4985 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4986 ASSERT_VK_SUCCESS(err);
4987 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4988 &gp_ci, NULL, &pipeline);
4989
4990 m_errorMonitor->VerifyFound();
4991
4992 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004993 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004994
4995 dyn_state_ci.dynamicStateCount = 3;
4996
4997 rs_ci.lineWidth = 1.0f;
4998
4999 err =
5000 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5001 ASSERT_VK_SUCCESS(err);
5002 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5003 &gp_ci, NULL, &pipeline);
5004 BeginCommandBuffer();
5005 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5006 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5007
5008 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06005009 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06005010 m_errorMonitor->VerifyFound();
5011
5012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5013 "Attempt to set lineWidth to 65536");
5014
5015 // Check too high with dynamic setting.
5016 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
5017 m_errorMonitor->VerifyFound();
5018 EndCommandBuffer();
5019
5020 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5021 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5022 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5023 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5024}
5025
Karl Schultz6addd812016-02-02 17:17:23 -07005026TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005027 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005028 m_errorMonitor->SetDesiredFailureMsg(
5029 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005030 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005031
5032 ASSERT_NO_FATAL_FAILURE(InitState());
5033 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005034
Tony Barbourfe3351b2015-07-28 10:17:20 -06005035 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005036 // Don't care about RenderPass handle b/c error should be flagged before
5037 // that
5038 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
5039 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005040
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005041 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005042}
5043
Karl Schultz6addd812016-02-02 17:17:23 -07005044TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005045 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005046 m_errorMonitor->SetDesiredFailureMsg(
5047 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005048 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005049
5050 ASSERT_NO_FATAL_FAILURE(InitState());
5051 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005052
Tony Barbourfe3351b2015-07-28 10:17:20 -06005053 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005054 // Just create a dummy Renderpass that's non-NULL so we can get to the
5055 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06005056 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005057 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
5058 rp_begin.pNext = NULL;
5059 rp_begin.renderPass = renderPass();
5060 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005061
Karl Schultz6addd812016-02-02 17:17:23 -07005062 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
5063 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005064
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005065 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005066}
5067
Karl Schultz6addd812016-02-02 17:17:23 -07005068TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005069 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07005070 m_errorMonitor->SetDesiredFailureMsg(
5071 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005072 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005073
5074 ASSERT_NO_FATAL_FAILURE(InitState());
5075 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005076
5077 // Renderpass is started here
5078 BeginCommandBuffer();
5079
5080 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005081 vk_testing::Buffer dstBuffer;
5082 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005083
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005084 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005085
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005086 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005087}
5088
Karl Schultz6addd812016-02-02 17:17:23 -07005089TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005090 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07005091 m_errorMonitor->SetDesiredFailureMsg(
5092 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005093 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005094
5095 ASSERT_NO_FATAL_FAILURE(InitState());
5096 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005097
5098 // Renderpass is started here
5099 BeginCommandBuffer();
5100
5101 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005102 vk_testing::Buffer dstBuffer;
5103 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005104
Karl Schultz6addd812016-02-02 17:17:23 -07005105 VkDeviceSize dstOffset = 0;
5106 VkDeviceSize dataSize = 1024;
5107 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005108
Karl Schultz6addd812016-02-02 17:17:23 -07005109 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
5110 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005111
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005112 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005113}
5114
Karl Schultz6addd812016-02-02 17:17:23 -07005115TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005116 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005117 m_errorMonitor->SetDesiredFailureMsg(
5118 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005119 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005120
5121 ASSERT_NO_FATAL_FAILURE(InitState());
5122 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005123
5124 // Renderpass is started here
5125 BeginCommandBuffer();
5126
Michael Lentine0a369f62016-02-03 16:51:46 -06005127 VkClearColorValue clear_color;
5128 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07005129 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
5130 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5131 const int32_t tex_width = 32;
5132 const int32_t tex_height = 32;
5133 VkImageCreateInfo image_create_info = {};
5134 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5135 image_create_info.pNext = NULL;
5136 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5137 image_create_info.format = tex_format;
5138 image_create_info.extent.width = tex_width;
5139 image_create_info.extent.height = tex_height;
5140 image_create_info.extent.depth = 1;
5141 image_create_info.mipLevels = 1;
5142 image_create_info.arrayLayers = 1;
5143 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5144 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
5145 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005146
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005147 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07005148 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
5149 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005150
Karl Schultz6addd812016-02-02 17:17:23 -07005151 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
5152 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005153
Karl Schultz6addd812016-02-02 17:17:23 -07005154 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
5155 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005156
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005157 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005158}
5159
Karl Schultz6addd812016-02-02 17:17:23 -07005160TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005161 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005162 m_errorMonitor->SetDesiredFailureMsg(
5163 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005164 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005165
5166 ASSERT_NO_FATAL_FAILURE(InitState());
5167 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005168
5169 // Renderpass is started here
5170 BeginCommandBuffer();
5171
5172 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07005173 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005174 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
5175 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5176 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
5177 image_create_info.extent.width = 64;
5178 image_create_info.extent.height = 64;
5179 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5180 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005181
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005182 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07005183 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
5184 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005185
Karl Schultz6addd812016-02-02 17:17:23 -07005186 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
5187 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005188
Karl Schultz6addd812016-02-02 17:17:23 -07005189 vkCmdClearDepthStencilImage(
5190 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
5191 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
5192 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005193
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005194 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005195}
5196
Karl Schultz6addd812016-02-02 17:17:23 -07005197TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005198 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005199 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005200
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005202 "vkCmdClearAttachments: This call "
5203 "must be issued inside an active "
5204 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005205
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005206 ASSERT_NO_FATAL_FAILURE(InitState());
5207 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005208
5209 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005210 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005211 ASSERT_VK_SUCCESS(err);
5212
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005213 VkClearAttachment color_attachment;
5214 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5215 color_attachment.clearValue.color.float32[0] = 0;
5216 color_attachment.clearValue.color.float32[1] = 0;
5217 color_attachment.clearValue.color.float32[2] = 0;
5218 color_attachment.clearValue.color.float32[3] = 0;
5219 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005220 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
5221 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
5222 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005223
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005224 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005225}
5226
Karl Schultz9e66a292016-04-21 15:57:51 -06005227TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
5228 // Try to add a buffer memory barrier with no buffer.
5229 m_errorMonitor->SetDesiredFailureMsg(
5230 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5231 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
5232
5233 ASSERT_NO_FATAL_FAILURE(InitState());
5234 BeginCommandBuffer();
5235
5236 VkBufferMemoryBarrier buf_barrier = {};
5237 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5238 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5239 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5240 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5241 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5242 buf_barrier.buffer = VK_NULL_HANDLE;
5243 buf_barrier.offset = 0;
5244 buf_barrier.size = VK_WHOLE_SIZE;
5245 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5246 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
5247 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
5248
5249 m_errorMonitor->VerifyFound();
5250}
5251
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06005252TEST_F(VkLayerTest, InvalidBarriers) {
5253 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
5254
5255 m_errorMonitor->SetDesiredFailureMsg(
5256 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
5257
5258 ASSERT_NO_FATAL_FAILURE(InitState());
5259 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5260
5261 VkMemoryBarrier mem_barrier = {};
5262 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
5263 mem_barrier.pNext = NULL;
5264 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5265 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5266 BeginCommandBuffer();
5267 // BeginCommandBuffer() starts a render pass
5268 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5269 VK_PIPELINE_STAGE_HOST_BIT,
5270 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
5271 &mem_barrier, 0, nullptr, 0, nullptr);
5272 m_errorMonitor->VerifyFound();
5273
5274 m_errorMonitor->SetDesiredFailureMsg(
5275 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5276 "Image Layout cannot be transitioned to UNDEFINED");
5277 VkImageObj image(m_device);
5278 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
5279 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5280 ASSERT_TRUE(image.initialized());
5281 VkImageMemoryBarrier img_barrier = {};
5282 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
5283 img_barrier.pNext = NULL;
5284 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5285 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5286 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5287 // New layout can't be UNDEFINED
5288 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5289 img_barrier.image = image.handle();
5290 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5291 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5292 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5293 img_barrier.subresourceRange.baseArrayLayer = 0;
5294 img_barrier.subresourceRange.baseMipLevel = 0;
5295 img_barrier.subresourceRange.layerCount = 1;
5296 img_barrier.subresourceRange.levelCount = 1;
5297 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5298 VK_PIPELINE_STAGE_HOST_BIT,
5299 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5300 nullptr, 1, &img_barrier);
5301 m_errorMonitor->VerifyFound();
5302 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5303
5304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5305 "Subresource must have the sum of the "
5306 "baseArrayLayer");
5307 // baseArrayLayer + layerCount must be <= image's arrayLayers
5308 img_barrier.subresourceRange.baseArrayLayer = 1;
5309 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5310 VK_PIPELINE_STAGE_HOST_BIT,
5311 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5312 nullptr, 1, &img_barrier);
5313 m_errorMonitor->VerifyFound();
5314 img_barrier.subresourceRange.baseArrayLayer = 0;
5315
5316 m_errorMonitor->SetDesiredFailureMsg(
5317 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5318 "Subresource must have the sum of the baseMipLevel");
5319 // baseMipLevel + levelCount must be <= image's mipLevels
5320 img_barrier.subresourceRange.baseMipLevel = 1;
5321 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5322 VK_PIPELINE_STAGE_HOST_BIT,
5323 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5324 nullptr, 1, &img_barrier);
5325 m_errorMonitor->VerifyFound();
5326 img_barrier.subresourceRange.baseMipLevel = 0;
5327
5328 m_errorMonitor->SetDesiredFailureMsg(
5329 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5330 "Buffer Barriers cannot be used during a render pass");
5331 vk_testing::Buffer buffer;
5332 buffer.init(*m_device, 256);
5333 VkBufferMemoryBarrier buf_barrier = {};
5334 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5335 buf_barrier.pNext = NULL;
5336 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5337 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5338 buf_barrier.buffer = buffer.handle();
5339 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5340 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5341 buf_barrier.offset = 0;
5342 buf_barrier.size = VK_WHOLE_SIZE;
5343 // Can't send buffer barrier during a render pass
5344 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5345 VK_PIPELINE_STAGE_HOST_BIT,
5346 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5347 &buf_barrier, 0, nullptr);
5348 m_errorMonitor->VerifyFound();
5349 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
5350
5351 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5352 "which is not less than total size");
5353 buf_barrier.offset = 257;
5354 // Offset greater than total size
5355 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5356 VK_PIPELINE_STAGE_HOST_BIT,
5357 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5358 &buf_barrier, 0, nullptr);
5359 m_errorMonitor->VerifyFound();
5360 buf_barrier.offset = 0;
5361
5362 m_errorMonitor->SetDesiredFailureMsg(
5363 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
5364 buf_barrier.size = 257;
5365 // Size greater than total size
5366 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5367 VK_PIPELINE_STAGE_HOST_BIT,
5368 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5369 &buf_barrier, 0, nullptr);
5370 m_errorMonitor->VerifyFound();
5371 buf_barrier.size = VK_WHOLE_SIZE;
5372
5373 m_errorMonitor->SetDesiredFailureMsg(
5374 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5375 "Image is a depth and stencil format and thus must "
5376 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
5377 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
5378 VkDepthStencilObj ds_image(m_device);
5379 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
5380 ASSERT_TRUE(ds_image.initialized());
5381 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5382 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
5383 img_barrier.image = ds_image.handle();
5384 // Leave aspectMask at COLOR on purpose
5385 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5386 VK_PIPELINE_STAGE_HOST_BIT,
5387 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5388 nullptr, 1, &img_barrier);
5389 m_errorMonitor->VerifyFound();
5390}
5391
Karl Schultz6addd812016-02-02 17:17:23 -07005392TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005393 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005394 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005395
Karl Schultz6addd812016-02-02 17:17:23 -07005396 m_errorMonitor->SetDesiredFailureMsg(
5397 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005398 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
5399
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005400 ASSERT_NO_FATAL_FAILURE(InitState());
5401 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005402 uint32_t qfi = 0;
5403 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005404 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5405 buffCI.size = 1024;
5406 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5407 buffCI.queueFamilyIndexCount = 1;
5408 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005409
5410 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005411 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005412 ASSERT_VK_SUCCESS(err);
5413
5414 BeginCommandBuffer();
5415 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005416 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5417 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005418 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07005419 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
5420 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005421
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005422 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005423
Chia-I Wuf7458c52015-10-26 21:10:41 +08005424 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005425}
5426
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005427TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
5428 // Create an out-of-range queueFamilyIndex
5429 m_errorMonitor->SetDesiredFailureMsg(
5430 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06005431 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005432
5433 ASSERT_NO_FATAL_FAILURE(InitState());
5434 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5435 VkBufferCreateInfo buffCI = {};
5436 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5437 buffCI.size = 1024;
5438 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5439 buffCI.queueFamilyIndexCount = 1;
5440 // Introduce failure by specifying invalid queue_family_index
5441 uint32_t qfi = 777;
5442 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06005443 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005444
5445 VkBuffer ib;
5446 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
5447
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005448 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005449}
5450
Karl Schultz6addd812016-02-02 17:17:23 -07005451TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
5452 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
5453 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005454
Karl Schultz6addd812016-02-02 17:17:23 -07005455 m_errorMonitor->SetDesiredFailureMsg(
5456 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005457 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005458
5459 ASSERT_NO_FATAL_FAILURE(InitState());
5460 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005461
5462 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005463 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005464 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
5465 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005466
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005467 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005468}
5469
Karl Schultz6addd812016-02-02 17:17:23 -07005470TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005471 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07005472 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005473
Karl Schultz6addd812016-02-02 17:17:23 -07005474 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005475 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5476 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
5477 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005478
Tobin Ehlis3b780662015-05-28 12:11:26 -06005479 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005480 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005481 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005482 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5483 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005484
5485 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005486 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5487 ds_pool_ci.pNext = NULL;
5488 ds_pool_ci.maxSets = 1;
5489 ds_pool_ci.poolSizeCount = 1;
5490 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005491
Tobin Ehlis3b780662015-05-28 12:11:26 -06005492 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005493 err =
5494 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005495 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005496 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005497 dsl_binding.binding = 0;
5498 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5499 dsl_binding.descriptorCount = 1;
5500 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5501 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005502
Tony Barboureb254902015-07-15 12:50:33 -06005503 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005504 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5505 ds_layout_ci.pNext = NULL;
5506 ds_layout_ci.bindingCount = 1;
5507 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005508
Tobin Ehlis3b780662015-05-28 12:11:26 -06005509 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005510 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5511 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005512 ASSERT_VK_SUCCESS(err);
5513
5514 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005515 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005516 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005517 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005518 alloc_info.descriptorPool = ds_pool;
5519 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005520 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5521 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005522 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005523
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005524 VkSamplerCreateInfo sampler_ci = {};
5525 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5526 sampler_ci.pNext = NULL;
5527 sampler_ci.magFilter = VK_FILTER_NEAREST;
5528 sampler_ci.minFilter = VK_FILTER_NEAREST;
5529 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5530 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5531 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5532 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5533 sampler_ci.mipLodBias = 1.0;
5534 sampler_ci.anisotropyEnable = VK_FALSE;
5535 sampler_ci.maxAnisotropy = 1;
5536 sampler_ci.compareEnable = VK_FALSE;
5537 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5538 sampler_ci.minLod = 1.0;
5539 sampler_ci.maxLod = 1.0;
5540 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5541 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5542 VkSampler sampler;
5543 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5544 ASSERT_VK_SUCCESS(err);
5545
5546 VkDescriptorImageInfo info = {};
5547 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005548
5549 VkWriteDescriptorSet descriptor_write;
5550 memset(&descriptor_write, 0, sizeof(descriptor_write));
5551 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005552 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005553 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005554 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005555 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005556 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005557
5558 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5559
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005560 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005561
Chia-I Wuf7458c52015-10-26 21:10:41 +08005562 vkDestroySampler(m_device->device(), sampler, NULL);
5563 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5564 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005565}
5566
Karl Schultz6addd812016-02-02 17:17:23 -07005567TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005568 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07005569 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005570
Karl Schultz6addd812016-02-02 17:17:23 -07005571 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005572 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5573 " binding #0 with 1 total descriptors but update of 1 descriptors "
5574 "starting at binding offset of 0 combined with update array element "
5575 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005576
Tobin Ehlis3b780662015-05-28 12:11:26 -06005577 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005578 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005579 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005580 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5581 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005582
5583 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005584 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5585 ds_pool_ci.pNext = NULL;
5586 ds_pool_ci.maxSets = 1;
5587 ds_pool_ci.poolSizeCount = 1;
5588 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005589
Tobin Ehlis3b780662015-05-28 12:11:26 -06005590 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005591 err =
5592 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005593 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005594
Tony Barboureb254902015-07-15 12:50:33 -06005595 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005596 dsl_binding.binding = 0;
5597 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5598 dsl_binding.descriptorCount = 1;
5599 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5600 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005601
5602 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005603 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5604 ds_layout_ci.pNext = NULL;
5605 ds_layout_ci.bindingCount = 1;
5606 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005607
Tobin Ehlis3b780662015-05-28 12:11:26 -06005608 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005609 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5610 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005611 ASSERT_VK_SUCCESS(err);
5612
5613 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005614 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005615 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005616 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005617 alloc_info.descriptorPool = ds_pool;
5618 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005619 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5620 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005621 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005622
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005623 // Correctly update descriptor to avoid "NOT_UPDATED" error
5624 VkDescriptorBufferInfo buff_info = {};
5625 buff_info.buffer =
5626 VkBuffer(0); // Don't care about buffer handle for this test
5627 buff_info.offset = 0;
5628 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005629
5630 VkWriteDescriptorSet descriptor_write;
5631 memset(&descriptor_write, 0, sizeof(descriptor_write));
5632 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005633 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005634 descriptor_write.dstArrayElement =
5635 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08005636 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005637 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5638 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005639
5640 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5641
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005642 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005643
Chia-I Wuf7458c52015-10-26 21:10:41 +08005644 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5645 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005646}
5647
Karl Schultz6addd812016-02-02 17:17:23 -07005648TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
5649 // Create layout w/ count of 1 and attempt update to that layout w/ binding
5650 // index 2
5651 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005652
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5654 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005655
Tobin Ehlis3b780662015-05-28 12:11:26 -06005656 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005657 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005658 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005659 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5660 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005661
5662 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005663 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5664 ds_pool_ci.pNext = NULL;
5665 ds_pool_ci.maxSets = 1;
5666 ds_pool_ci.poolSizeCount = 1;
5667 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005668
Tobin Ehlis3b780662015-05-28 12:11:26 -06005669 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005670 err =
5671 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005672 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005673
Tony Barboureb254902015-07-15 12:50:33 -06005674 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005675 dsl_binding.binding = 0;
5676 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5677 dsl_binding.descriptorCount = 1;
5678 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5679 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005680
5681 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005682 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5683 ds_layout_ci.pNext = NULL;
5684 ds_layout_ci.bindingCount = 1;
5685 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005686 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005687 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5688 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005689 ASSERT_VK_SUCCESS(err);
5690
5691 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005692 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005693 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005694 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005695 alloc_info.descriptorPool = ds_pool;
5696 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005697 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5698 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005699 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005700
Tony Barboureb254902015-07-15 12:50:33 -06005701 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005702 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5703 sampler_ci.pNext = NULL;
5704 sampler_ci.magFilter = VK_FILTER_NEAREST;
5705 sampler_ci.minFilter = VK_FILTER_NEAREST;
5706 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5707 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5708 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5709 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5710 sampler_ci.mipLodBias = 1.0;
5711 sampler_ci.anisotropyEnable = VK_FALSE;
5712 sampler_ci.maxAnisotropy = 1;
5713 sampler_ci.compareEnable = VK_FALSE;
5714 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5715 sampler_ci.minLod = 1.0;
5716 sampler_ci.maxLod = 1.0;
5717 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5718 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005719
Tobin Ehlis3b780662015-05-28 12:11:26 -06005720 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005721 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005722 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005723
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005724 VkDescriptorImageInfo info = {};
5725 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005726
5727 VkWriteDescriptorSet descriptor_write;
5728 memset(&descriptor_write, 0, sizeof(descriptor_write));
5729 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005730 descriptor_write.dstSet = descriptorSet;
5731 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005732 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005733 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005734 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005735 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005736
5737 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5738
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005739 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005740
Chia-I Wuf7458c52015-10-26 21:10:41 +08005741 vkDestroySampler(m_device->device(), sampler, NULL);
5742 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5743 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005744}
5745
Karl Schultz6addd812016-02-02 17:17:23 -07005746TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
5747 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
5748 // types
5749 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005750
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005751 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005752 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005753
Tobin Ehlis3b780662015-05-28 12:11:26 -06005754 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005755
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005756 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005757 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5758 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005759
5760 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005761 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5762 ds_pool_ci.pNext = NULL;
5763 ds_pool_ci.maxSets = 1;
5764 ds_pool_ci.poolSizeCount = 1;
5765 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005766
Tobin Ehlis3b780662015-05-28 12:11:26 -06005767 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005768 err =
5769 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005770 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005771 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005772 dsl_binding.binding = 0;
5773 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5774 dsl_binding.descriptorCount = 1;
5775 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5776 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005777
Tony Barboureb254902015-07-15 12:50:33 -06005778 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005779 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5780 ds_layout_ci.pNext = NULL;
5781 ds_layout_ci.bindingCount = 1;
5782 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005783
Tobin Ehlis3b780662015-05-28 12:11:26 -06005784 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005785 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5786 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005787 ASSERT_VK_SUCCESS(err);
5788
5789 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005790 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005791 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005792 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005793 alloc_info.descriptorPool = ds_pool;
5794 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005795 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5796 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005797 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005798
Tony Barboureb254902015-07-15 12:50:33 -06005799 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005800 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5801 sampler_ci.pNext = NULL;
5802 sampler_ci.magFilter = VK_FILTER_NEAREST;
5803 sampler_ci.minFilter = VK_FILTER_NEAREST;
5804 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5805 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5806 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5807 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5808 sampler_ci.mipLodBias = 1.0;
5809 sampler_ci.anisotropyEnable = VK_FALSE;
5810 sampler_ci.maxAnisotropy = 1;
5811 sampler_ci.compareEnable = VK_FALSE;
5812 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5813 sampler_ci.minLod = 1.0;
5814 sampler_ci.maxLod = 1.0;
5815 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5816 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005817 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005818 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005819 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005820
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005821 VkDescriptorImageInfo info = {};
5822 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005823
5824 VkWriteDescriptorSet descriptor_write;
5825 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07005826 descriptor_write.sType =
5827 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005828 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005829 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005830 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005831 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005832 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005833
5834 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5835
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005836 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005837
Chia-I Wuf7458c52015-10-26 21:10:41 +08005838 vkDestroySampler(m_device->device(), sampler, NULL);
5839 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5840 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005841}
5842
Karl Schultz6addd812016-02-02 17:17:23 -07005843TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005844 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07005845 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005846
Karl Schultz6addd812016-02-02 17:17:23 -07005847 m_errorMonitor->SetDesiredFailureMsg(
5848 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005849 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005850
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005851 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005852 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
5853 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005854 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005855 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
5856 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005857
5858 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005859 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5860 ds_pool_ci.pNext = NULL;
5861 ds_pool_ci.maxSets = 1;
5862 ds_pool_ci.poolSizeCount = 1;
5863 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005864
5865 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005866 err =
5867 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005868 ASSERT_VK_SUCCESS(err);
5869
5870 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005871 dsl_binding.binding = 0;
5872 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5873 dsl_binding.descriptorCount = 1;
5874 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5875 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005876
5877 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005878 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5879 ds_layout_ci.pNext = NULL;
5880 ds_layout_ci.bindingCount = 1;
5881 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005882 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005883 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5884 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005885 ASSERT_VK_SUCCESS(err);
5886
5887 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005888 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005889 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005890 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005891 alloc_info.descriptorPool = ds_pool;
5892 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005893 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5894 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005895 ASSERT_VK_SUCCESS(err);
5896
Karl Schultz6addd812016-02-02 17:17:23 -07005897 VkSampler sampler =
5898 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005899
5900 VkDescriptorImageInfo descriptor_info;
5901 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5902 descriptor_info.sampler = sampler;
5903
5904 VkWriteDescriptorSet descriptor_write;
5905 memset(&descriptor_write, 0, sizeof(descriptor_write));
5906 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005907 descriptor_write.dstSet = descriptorSet;
5908 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005909 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005910 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5911 descriptor_write.pImageInfo = &descriptor_info;
5912
5913 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5914
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005915 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005916
Chia-I Wuf7458c52015-10-26 21:10:41 +08005917 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5918 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005919}
5920
Karl Schultz6addd812016-02-02 17:17:23 -07005921TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
5922 // Create a single combined Image/Sampler descriptor and send it an invalid
5923 // imageView
5924 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005925
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5927 "Attempted write update to combined "
5928 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -06005929 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005930
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005931 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005932 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005933 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5934 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005935
5936 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005937 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5938 ds_pool_ci.pNext = NULL;
5939 ds_pool_ci.maxSets = 1;
5940 ds_pool_ci.poolSizeCount = 1;
5941 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005942
5943 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005944 err =
5945 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005946 ASSERT_VK_SUCCESS(err);
5947
5948 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005949 dsl_binding.binding = 0;
5950 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5951 dsl_binding.descriptorCount = 1;
5952 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5953 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005954
5955 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005956 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5957 ds_layout_ci.pNext = NULL;
5958 ds_layout_ci.bindingCount = 1;
5959 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005960 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005961 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5962 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005963 ASSERT_VK_SUCCESS(err);
5964
5965 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005966 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005967 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005968 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005969 alloc_info.descriptorPool = ds_pool;
5970 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005971 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5972 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005973 ASSERT_VK_SUCCESS(err);
5974
5975 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005976 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5977 sampler_ci.pNext = NULL;
5978 sampler_ci.magFilter = VK_FILTER_NEAREST;
5979 sampler_ci.minFilter = VK_FILTER_NEAREST;
5980 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5981 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5982 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5983 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5984 sampler_ci.mipLodBias = 1.0;
5985 sampler_ci.anisotropyEnable = VK_FALSE;
5986 sampler_ci.maxAnisotropy = 1;
5987 sampler_ci.compareEnable = VK_FALSE;
5988 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5989 sampler_ci.minLod = 1.0;
5990 sampler_ci.maxLod = 1.0;
5991 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5992 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005993
5994 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005995 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005996 ASSERT_VK_SUCCESS(err);
5997
Karl Schultz6addd812016-02-02 17:17:23 -07005998 VkImageView view =
5999 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006000
6001 VkDescriptorImageInfo descriptor_info;
6002 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
6003 descriptor_info.sampler = sampler;
6004 descriptor_info.imageView = view;
6005
6006 VkWriteDescriptorSet descriptor_write;
6007 memset(&descriptor_write, 0, sizeof(descriptor_write));
6008 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006009 descriptor_write.dstSet = descriptorSet;
6010 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006011 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006012 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6013 descriptor_write.pImageInfo = &descriptor_info;
6014
6015 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6016
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006017 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006018
Chia-I Wuf7458c52015-10-26 21:10:41 +08006019 vkDestroySampler(m_device->device(), sampler, NULL);
6020 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6021 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006022}
6023
Karl Schultz6addd812016-02-02 17:17:23 -07006024TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
6025 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
6026 // into the other
6027 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006028
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6030 " binding #1 with type "
6031 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
6032 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006033
Tobin Ehlis04356f92015-10-27 16:35:27 -06006034 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006035 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006036 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006037 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6038 ds_type_count[0].descriptorCount = 1;
6039 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
6040 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006041
6042 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006043 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6044 ds_pool_ci.pNext = NULL;
6045 ds_pool_ci.maxSets = 1;
6046 ds_pool_ci.poolSizeCount = 2;
6047 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006048
6049 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006050 err =
6051 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006052 ASSERT_VK_SUCCESS(err);
6053 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006054 dsl_binding[0].binding = 0;
6055 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6056 dsl_binding[0].descriptorCount = 1;
6057 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6058 dsl_binding[0].pImmutableSamplers = NULL;
6059 dsl_binding[1].binding = 1;
6060 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6061 dsl_binding[1].descriptorCount = 1;
6062 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
6063 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006064
6065 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006066 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6067 ds_layout_ci.pNext = NULL;
6068 ds_layout_ci.bindingCount = 2;
6069 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006070
6071 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006072 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6073 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006074 ASSERT_VK_SUCCESS(err);
6075
6076 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006077 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006078 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006079 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006080 alloc_info.descriptorPool = ds_pool;
6081 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006082 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6083 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006084 ASSERT_VK_SUCCESS(err);
6085
6086 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006087 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6088 sampler_ci.pNext = NULL;
6089 sampler_ci.magFilter = VK_FILTER_NEAREST;
6090 sampler_ci.minFilter = VK_FILTER_NEAREST;
6091 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6092 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6093 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6094 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6095 sampler_ci.mipLodBias = 1.0;
6096 sampler_ci.anisotropyEnable = VK_FALSE;
6097 sampler_ci.maxAnisotropy = 1;
6098 sampler_ci.compareEnable = VK_FALSE;
6099 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6100 sampler_ci.minLod = 1.0;
6101 sampler_ci.maxLod = 1.0;
6102 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6103 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006104
6105 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006106 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006107 ASSERT_VK_SUCCESS(err);
6108
6109 VkDescriptorImageInfo info = {};
6110 info.sampler = sampler;
6111
6112 VkWriteDescriptorSet descriptor_write;
6113 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
6114 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006115 descriptor_write.dstSet = descriptorSet;
6116 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08006117 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006118 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6119 descriptor_write.pImageInfo = &info;
6120 // This write update should succeed
6121 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6122 // Now perform a copy update that fails due to type mismatch
6123 VkCopyDescriptorSet copy_ds_update;
6124 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6125 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6126 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -06006127 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006128 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006129 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08006130 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06006131 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6132
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006133 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06006134 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006135 m_errorMonitor->SetDesiredFailureMsg(
6136 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006137 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -06006138 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6139 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6140 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006141 copy_ds_update.srcBinding =
6142 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006143 copy_ds_update.dstSet = descriptorSet;
6144 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -06006145 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06006146 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6147
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006148 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006149
Tobin Ehlis04356f92015-10-27 16:35:27 -06006150 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006151 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006152 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
6153 "update array offset of 0 and update of "
6154 "5 descriptors oversteps total number "
6155 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006156
Tobin Ehlis04356f92015-10-27 16:35:27 -06006157 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6158 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6159 copy_ds_update.srcSet = descriptorSet;
6160 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006161 copy_ds_update.dstSet = descriptorSet;
6162 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006163 copy_ds_update.descriptorCount =
6164 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06006165 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6166
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006167 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06006168
Chia-I Wuf7458c52015-10-26 21:10:41 +08006169 vkDestroySampler(m_device->device(), sampler, NULL);
6170 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6171 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006172}
6173
Karl Schultz6addd812016-02-02 17:17:23 -07006174TEST_F(VkLayerTest, NumSamplesMismatch) {
6175 // Create CommandBuffer where MSAA samples doesn't match RenderPass
6176 // sampleCount
6177 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006178
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006179 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006180 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006181
Tobin Ehlis3b780662015-05-28 12:11:26 -06006182 ASSERT_NO_FATAL_FAILURE(InitState());
6183 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006184 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06006185 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006186 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006187
6188 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006189 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6190 ds_pool_ci.pNext = NULL;
6191 ds_pool_ci.maxSets = 1;
6192 ds_pool_ci.poolSizeCount = 1;
6193 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006194
Tobin Ehlis3b780662015-05-28 12:11:26 -06006195 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006196 err =
6197 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006198 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006199
Tony Barboureb254902015-07-15 12:50:33 -06006200 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08006201 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06006202 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08006203 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006204 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6205 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006206
Tony Barboureb254902015-07-15 12:50:33 -06006207 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6208 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6209 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006210 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006211 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006212
Tobin Ehlis3b780662015-05-28 12:11:26 -06006213 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006214 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6215 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006216 ASSERT_VK_SUCCESS(err);
6217
6218 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006219 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006220 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006221 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006222 alloc_info.descriptorPool = ds_pool;
6223 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006224 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6225 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006226 ASSERT_VK_SUCCESS(err);
6227
Tony Barboureb254902015-07-15 12:50:33 -06006228 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006229 pipe_ms_state_ci.sType =
6230 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6231 pipe_ms_state_ci.pNext = NULL;
6232 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6233 pipe_ms_state_ci.sampleShadingEnable = 0;
6234 pipe_ms_state_ci.minSampleShading = 1.0;
6235 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006236
Tony Barboureb254902015-07-15 12:50:33 -06006237 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006238 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6239 pipeline_layout_ci.pNext = NULL;
6240 pipeline_layout_ci.setLayoutCount = 1;
6241 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006242
6243 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006244 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6245 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006246 ASSERT_VK_SUCCESS(err);
6247
Karl Schultz6addd812016-02-02 17:17:23 -07006248 VkShaderObj vs(m_device, bindStateVertShaderText,
6249 VK_SHADER_STAGE_VERTEX_BIT, this);
6250 VkShaderObj fs(m_device, bindStateFragShaderText,
6251 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006252 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006253 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006254 VkPipelineObj pipe(m_device);
6255 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006256 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006257 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006258 pipe.SetMSAA(&pipe_ms_state_ci);
6259 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06006260
Tony Barbourfe3351b2015-07-28 10:17:20 -06006261 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006262 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6263 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06006264
Mark Young29927482016-05-04 14:38:51 -06006265 // Render triangle (the error should trigger on the attempt to draw).
6266 Draw(3, 1, 0, 0);
6267
6268 // Finalize recording of the command buffer
6269 EndCommandBuffer();
6270
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006271 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006272
Chia-I Wuf7458c52015-10-26 21:10:41 +08006273 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6274 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6275 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006276}
Mark Young29927482016-05-04 14:38:51 -06006277
Mark Youngc89c6312016-03-31 16:03:20 -06006278TEST_F(VkLayerTest, NumBlendAttachMismatch) {
6279 // Create Pipeline where the number of blend attachments doesn't match the
6280 // number of color attachments. In this case, we don't add any color
6281 // blend attachments even though we have a color attachment.
6282 VkResult err;
6283
6284 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -06006285 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -06006286
6287 ASSERT_NO_FATAL_FAILURE(InitState());
6288 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6289 VkDescriptorPoolSize ds_type_count = {};
6290 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6291 ds_type_count.descriptorCount = 1;
6292
6293 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6294 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6295 ds_pool_ci.pNext = NULL;
6296 ds_pool_ci.maxSets = 1;
6297 ds_pool_ci.poolSizeCount = 1;
6298 ds_pool_ci.pPoolSizes = &ds_type_count;
6299
6300 VkDescriptorPool ds_pool;
6301 err =
6302 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6303 ASSERT_VK_SUCCESS(err);
6304
6305 VkDescriptorSetLayoutBinding dsl_binding = {};
6306 dsl_binding.binding = 0;
6307 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6308 dsl_binding.descriptorCount = 1;
6309 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6310 dsl_binding.pImmutableSamplers = NULL;
6311
6312 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6313 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6314 ds_layout_ci.pNext = NULL;
6315 ds_layout_ci.bindingCount = 1;
6316 ds_layout_ci.pBindings = &dsl_binding;
6317
6318 VkDescriptorSetLayout ds_layout;
6319 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6320 &ds_layout);
6321 ASSERT_VK_SUCCESS(err);
6322
6323 VkDescriptorSet descriptorSet;
6324 VkDescriptorSetAllocateInfo alloc_info = {};
6325 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6326 alloc_info.descriptorSetCount = 1;
6327 alloc_info.descriptorPool = ds_pool;
6328 alloc_info.pSetLayouts = &ds_layout;
6329 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6330 &descriptorSet);
6331 ASSERT_VK_SUCCESS(err);
6332
6333 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
6334 pipe_ms_state_ci.sType =
6335 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6336 pipe_ms_state_ci.pNext = NULL;
6337 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6338 pipe_ms_state_ci.sampleShadingEnable = 0;
6339 pipe_ms_state_ci.minSampleShading = 1.0;
6340 pipe_ms_state_ci.pSampleMask = NULL;
6341
6342 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6343 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6344 pipeline_layout_ci.pNext = NULL;
6345 pipeline_layout_ci.setLayoutCount = 1;
6346 pipeline_layout_ci.pSetLayouts = &ds_layout;
6347
6348 VkPipelineLayout pipeline_layout;
6349 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6350 &pipeline_layout);
6351 ASSERT_VK_SUCCESS(err);
6352
6353 VkShaderObj vs(m_device, bindStateVertShaderText,
6354 VK_SHADER_STAGE_VERTEX_BIT, this);
6355 VkShaderObj fs(m_device, bindStateFragShaderText,
6356 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006357 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06006358 // but add it to be able to run on more devices
6359 VkPipelineObj pipe(m_device);
6360 pipe.AddShader(&vs);
6361 pipe.AddShader(&fs);
6362 pipe.SetMSAA(&pipe_ms_state_ci);
6363 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6364
6365 BeginCommandBuffer();
6366 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6367 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6368
Mark Young29927482016-05-04 14:38:51 -06006369 // Render triangle (the error should trigger on the attempt to draw).
6370 Draw(3, 1, 0, 0);
6371
6372 // Finalize recording of the command buffer
6373 EndCommandBuffer();
6374
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006375 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06006376
6377 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6378 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6379 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6380}
Mark Young29927482016-05-04 14:38:51 -06006381
Karl Schultz6addd812016-02-02 17:17:23 -07006382TEST_F(VkLayerTest, ClearCmdNoDraw) {
6383 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
6384 // to issuing a Draw
6385 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006386
Karl Schultz6addd812016-02-02 17:17:23 -07006387 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07006388 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006389 "vkCmdClearAttachments() issued on CB object ");
6390
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006391 ASSERT_NO_FATAL_FAILURE(InitState());
6392 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006393
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006394 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006395 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6396 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006397
6398 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006399 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6400 ds_pool_ci.pNext = NULL;
6401 ds_pool_ci.maxSets = 1;
6402 ds_pool_ci.poolSizeCount = 1;
6403 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006404
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006405 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006406 err =
6407 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006408 ASSERT_VK_SUCCESS(err);
6409
Tony Barboureb254902015-07-15 12:50:33 -06006410 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006411 dsl_binding.binding = 0;
6412 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6413 dsl_binding.descriptorCount = 1;
6414 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6415 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006416
Tony Barboureb254902015-07-15 12:50:33 -06006417 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006418 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6419 ds_layout_ci.pNext = NULL;
6420 ds_layout_ci.bindingCount = 1;
6421 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006422
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006423 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006424 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6425 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006426 ASSERT_VK_SUCCESS(err);
6427
6428 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006429 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006430 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006431 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006432 alloc_info.descriptorPool = ds_pool;
6433 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006434 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6435 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006436 ASSERT_VK_SUCCESS(err);
6437
Tony Barboureb254902015-07-15 12:50:33 -06006438 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006439 pipe_ms_state_ci.sType =
6440 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6441 pipe_ms_state_ci.pNext = NULL;
6442 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6443 pipe_ms_state_ci.sampleShadingEnable = 0;
6444 pipe_ms_state_ci.minSampleShading = 1.0;
6445 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006446
Tony Barboureb254902015-07-15 12:50:33 -06006447 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006448 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6449 pipeline_layout_ci.pNext = NULL;
6450 pipeline_layout_ci.setLayoutCount = 1;
6451 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006452
6453 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006454 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6455 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006456 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006457
Karl Schultz6addd812016-02-02 17:17:23 -07006458 VkShaderObj vs(m_device, bindStateVertShaderText,
6459 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006460 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006461 // on more devices
6462 VkShaderObj fs(m_device, bindStateFragShaderText,
6463 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006464
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006465 VkPipelineObj pipe(m_device);
6466 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006467 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006468 pipe.SetMSAA(&pipe_ms_state_ci);
6469 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006470
6471 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006472
Karl Schultz6addd812016-02-02 17:17:23 -07006473 // Main thing we care about for this test is that the VkImage obj we're
6474 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006475 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06006476 VkClearAttachment color_attachment;
6477 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6478 color_attachment.clearValue.color.float32[0] = 1.0;
6479 color_attachment.clearValue.color.float32[1] = 1.0;
6480 color_attachment.clearValue.color.float32[2] = 1.0;
6481 color_attachment.clearValue.color.float32[3] = 1.0;
6482 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006483 VkClearRect clear_rect = {
6484 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006485
Karl Schultz6addd812016-02-02 17:17:23 -07006486 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
6487 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006488
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006489 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006490
Chia-I Wuf7458c52015-10-26 21:10:41 +08006491 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6492 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6493 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006494}
6495
Karl Schultz6addd812016-02-02 17:17:23 -07006496TEST_F(VkLayerTest, VtxBufferBadIndex) {
6497 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006498
Karl Schultz6addd812016-02-02 17:17:23 -07006499 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006500 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07006501 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006502
Tobin Ehlis502480b2015-06-24 15:53:07 -06006503 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06006504 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06006505 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006506
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006507 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006508 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6509 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006510
6511 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006512 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6513 ds_pool_ci.pNext = NULL;
6514 ds_pool_ci.maxSets = 1;
6515 ds_pool_ci.poolSizeCount = 1;
6516 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006517
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006518 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006519 err =
6520 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006521 ASSERT_VK_SUCCESS(err);
6522
Tony Barboureb254902015-07-15 12:50:33 -06006523 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006524 dsl_binding.binding = 0;
6525 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6526 dsl_binding.descriptorCount = 1;
6527 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6528 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006529
Tony Barboureb254902015-07-15 12:50:33 -06006530 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006531 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6532 ds_layout_ci.pNext = NULL;
6533 ds_layout_ci.bindingCount = 1;
6534 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006535
Tobin Ehlis502480b2015-06-24 15:53:07 -06006536 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006537 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6538 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006539 ASSERT_VK_SUCCESS(err);
6540
6541 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006542 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006543 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006544 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006545 alloc_info.descriptorPool = ds_pool;
6546 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006547 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6548 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006549 ASSERT_VK_SUCCESS(err);
6550
Tony Barboureb254902015-07-15 12:50:33 -06006551 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006552 pipe_ms_state_ci.sType =
6553 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6554 pipe_ms_state_ci.pNext = NULL;
6555 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6556 pipe_ms_state_ci.sampleShadingEnable = 0;
6557 pipe_ms_state_ci.minSampleShading = 1.0;
6558 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006559
Tony Barboureb254902015-07-15 12:50:33 -06006560 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006561 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6562 pipeline_layout_ci.pNext = NULL;
6563 pipeline_layout_ci.setLayoutCount = 1;
6564 pipeline_layout_ci.pSetLayouts = &ds_layout;
6565 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006566
Karl Schultz6addd812016-02-02 17:17:23 -07006567 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6568 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006569 ASSERT_VK_SUCCESS(err);
6570
Karl Schultz6addd812016-02-02 17:17:23 -07006571 VkShaderObj vs(m_device, bindStateVertShaderText,
6572 VK_SHADER_STAGE_VERTEX_BIT, this);
6573 VkShaderObj fs(m_device, bindStateFragShaderText,
6574 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006575 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006576 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006577 VkPipelineObj pipe(m_device);
6578 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006579 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006580 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006581 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006582 pipe.SetViewport(m_viewports);
6583 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006584 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006585
6586 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006587 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6588 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006589 // Don't care about actual data, just need to get to draw to flag error
6590 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07006591 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
6592 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006593 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06006594 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006595
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006596 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006597
Chia-I Wuf7458c52015-10-26 21:10:41 +08006598 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6599 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6600 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006601}
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06006602// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
6603TEST_F(VkLayerTest, InvalidImageLayout) {
6604 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
6605 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
6606 "images in the wrong layout when they're copied or transitioned.");
6607 // 3 in ValidateCmdBufImageLayouts
6608 // * -1 Attempt to submit cmd buf w/ deleted image
6609 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
6610 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
6611 m_errorMonitor->SetDesiredFailureMsg(
6612 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6613 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
6614
6615 ASSERT_NO_FATAL_FAILURE(InitState());
6616 // Create src & dst images to use for copy operations
6617 VkImage src_image;
6618 VkImage dst_image;
6619
6620 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6621 const int32_t tex_width = 32;
6622 const int32_t tex_height = 32;
6623
6624 VkImageCreateInfo image_create_info = {};
6625 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6626 image_create_info.pNext = NULL;
6627 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6628 image_create_info.format = tex_format;
6629 image_create_info.extent.width = tex_width;
6630 image_create_info.extent.height = tex_height;
6631 image_create_info.extent.depth = 1;
6632 image_create_info.mipLevels = 1;
6633 image_create_info.arrayLayers = 4;
6634 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6635 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6636 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6637 image_create_info.flags = 0;
6638
6639 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
6640 ASSERT_VK_SUCCESS(err);
6641 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
6642 ASSERT_VK_SUCCESS(err);
6643
6644 BeginCommandBuffer();
6645 VkImageCopy copyRegion;
6646 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6647 copyRegion.srcSubresource.mipLevel = 0;
6648 copyRegion.srcSubresource.baseArrayLayer = 0;
6649 copyRegion.srcSubresource.layerCount = 1;
6650 copyRegion.srcOffset.x = 0;
6651 copyRegion.srcOffset.y = 0;
6652 copyRegion.srcOffset.z = 0;
6653 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6654 copyRegion.dstSubresource.mipLevel = 0;
6655 copyRegion.dstSubresource.baseArrayLayer = 0;
6656 copyRegion.dstSubresource.layerCount = 1;
6657 copyRegion.dstOffset.x = 0;
6658 copyRegion.dstOffset.y = 0;
6659 copyRegion.dstOffset.z = 0;
6660 copyRegion.extent.width = 1;
6661 copyRegion.extent.height = 1;
6662 copyRegion.extent.depth = 1;
6663 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6664 m_errorMonitor->VerifyFound();
6665 // Now cause error due to src image layout changing
6666 m_errorMonitor->SetDesiredFailureMsg(
6667 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6668 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
6669 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6670 m_errorMonitor->VerifyFound();
6671 // Final src error is due to bad layout type
6672 m_errorMonitor->SetDesiredFailureMsg(
6673 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6674 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
6675 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6676 m_errorMonitor->VerifyFound();
6677 // Now verify same checks for dst
6678 m_errorMonitor->SetDesiredFailureMsg(
6679 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6680 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
6681 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6682 m_errorMonitor->VerifyFound();
6683 // Now cause error due to src image layout changing
6684 m_errorMonitor->SetDesiredFailureMsg(
6685 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6686 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
6687 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
6688 m_errorMonitor->VerifyFound();
6689 m_errorMonitor->SetDesiredFailureMsg(
6690 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6691 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
6692 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
6693 m_errorMonitor->VerifyFound();
6694 // Now cause error due to bad image layout transition in PipelineBarrier
6695 VkImageMemoryBarrier image_barrier[1] = {};
6696 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
6697 image_barrier[0].image = src_image;
6698 image_barrier[0].subresourceRange.layerCount = 2;
6699 image_barrier[0].subresourceRange.levelCount = 2;
6700 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6701 m_errorMonitor->SetDesiredFailureMsg(
6702 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6703 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
6704 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
6705 m_errorMonitor->VerifyFound();
6706
6707 // Finally some layout errors at RenderPass create time
6708 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
6709 VkAttachmentReference attach = {};
6710 // perf warning for GENERAL layout w/ non-DS input attachment
6711 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
6712 VkSubpassDescription subpass = {};
6713 subpass.inputAttachmentCount = 1;
6714 subpass.pInputAttachments = &attach;
6715 VkRenderPassCreateInfo rpci = {};
6716 rpci.subpassCount = 1;
6717 rpci.pSubpasses = &subpass;
6718 rpci.attachmentCount = 1;
6719 VkAttachmentDescription attach_desc = {};
6720 attach_desc.format = VK_FORMAT_UNDEFINED;
6721 rpci.pAttachments = &attach_desc;
6722 VkRenderPass rp;
6723 m_errorMonitor->SetDesiredFailureMsg(
6724 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6725 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
6726 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6727 m_errorMonitor->VerifyFound();
6728 // error w/ non-general layout
6729 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
6730
6731 m_errorMonitor->SetDesiredFailureMsg(
6732 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6733 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
6734 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6735 m_errorMonitor->VerifyFound();
6736 subpass.inputAttachmentCount = 0;
6737 subpass.colorAttachmentCount = 1;
6738 subpass.pColorAttachments = &attach;
6739 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
6740 // perf warning for GENERAL layout on color attachment
6741 m_errorMonitor->SetDesiredFailureMsg(
6742 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6743 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
6744 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6745 m_errorMonitor->VerifyFound();
6746 // error w/ non-color opt or GENERAL layout for color attachment
6747 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
6748 m_errorMonitor->SetDesiredFailureMsg(
6749 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6750 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
6751 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6752 m_errorMonitor->VerifyFound();
6753 subpass.colorAttachmentCount = 0;
6754 subpass.pDepthStencilAttachment = &attach;
6755 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
6756 // perf warning for GENERAL layout on DS attachment
6757 m_errorMonitor->SetDesiredFailureMsg(
6758 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6759 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
6760 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6761 m_errorMonitor->VerifyFound();
6762 // error w/ non-ds opt or GENERAL layout for color attachment
6763 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
6764 m_errorMonitor->SetDesiredFailureMsg(
6765 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6766 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
6767 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6768 m_errorMonitor->VerifyFound();
6769
6770 vkDestroyImage(m_device->device(), src_image, NULL);
6771 vkDestroyImage(m_device->device(), dst_image, NULL);
6772}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006773#endif // DRAW_STATE_TESTS
6774
Tobin Ehlis0788f522015-05-26 16:11:58 -06006775#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06006776#if GTEST_IS_THREADSAFE
6777struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006778 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006779 VkEvent event;
6780 bool bailout;
6781};
6782
Karl Schultz6addd812016-02-02 17:17:23 -07006783extern "C" void *AddToCommandBuffer(void *arg) {
6784 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006785
Karl Schultz6addd812016-02-02 17:17:23 -07006786 for (int i = 0; i < 10000; i++) {
6787 vkCmdSetEvent(data->commandBuffer, data->event,
6788 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006789 if (data->bailout) {
6790 break;
6791 }
6792 }
6793 return NULL;
6794}
6795
Karl Schultz6addd812016-02-02 17:17:23 -07006796TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006797 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006798
Karl Schultz6addd812016-02-02 17:17:23 -07006799 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6800 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006801
Mike Stroyanaccf7692015-05-12 16:00:45 -06006802 ASSERT_NO_FATAL_FAILURE(InitState());
6803 ASSERT_NO_FATAL_FAILURE(InitViewport());
6804 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6805
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006806 // Calls AllocateCommandBuffers
6807 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006808
6809 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006810 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006811
6812 VkEventCreateInfo event_info;
6813 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006814 VkResult err;
6815
6816 memset(&event_info, 0, sizeof(event_info));
6817 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
6818
Chia-I Wuf7458c52015-10-26 21:10:41 +08006819 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006820 ASSERT_VK_SUCCESS(err);
6821
Mike Stroyanaccf7692015-05-12 16:00:45 -06006822 err = vkResetEvent(device(), event);
6823 ASSERT_VK_SUCCESS(err);
6824
6825 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006826 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006827 data.event = event;
6828 data.bailout = false;
6829 m_errorMonitor->SetBailout(&data.bailout);
6830 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006831 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006832 // Add many entries to command buffer from this thread at the same time.
6833 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006834
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006835 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006836 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006837
Mike Stroyan10b8cb72016-01-22 15:22:03 -07006838 m_errorMonitor->SetBailout(NULL);
6839
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006840 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006841
Chia-I Wuf7458c52015-10-26 21:10:41 +08006842 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006843}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006844#endif // GTEST_IS_THREADSAFE
6845#endif // THREADING_TESTS
6846
Chris Forbes9f7ff632015-05-25 11:13:08 +12006847#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006848TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006849 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006850 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006851
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006852 ASSERT_NO_FATAL_FAILURE(InitState());
6853 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6854
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006855 VkShaderModule module;
6856 VkShaderModuleCreateInfo moduleCreateInfo;
6857 struct icd_spv_header spv;
6858
6859 spv.magic = ICD_SPV_MAGIC;
6860 spv.version = ICD_SPV_VERSION;
6861 spv.gen_magic = 0;
6862
6863 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6864 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006865 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006866 moduleCreateInfo.codeSize = 4;
6867 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006868 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006869
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006870 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006871}
6872
Karl Schultz6addd812016-02-02 17:17:23 -07006873TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006875 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006876
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006877 ASSERT_NO_FATAL_FAILURE(InitState());
6878 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6879
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006880 VkShaderModule module;
6881 VkShaderModuleCreateInfo moduleCreateInfo;
6882 struct icd_spv_header spv;
6883
6884 spv.magic = ~ICD_SPV_MAGIC;
6885 spv.version = ICD_SPV_VERSION;
6886 spv.gen_magic = 0;
6887
6888 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6889 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006890 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006891 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6892 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006893 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006894
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006895 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006896}
6897
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006898#if 0
6899// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07006900TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006902 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006903
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006904 ASSERT_NO_FATAL_FAILURE(InitState());
6905 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6906
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006907 VkShaderModule module;
6908 VkShaderModuleCreateInfo moduleCreateInfo;
6909 struct icd_spv_header spv;
6910
6911 spv.magic = ICD_SPV_MAGIC;
6912 spv.version = ~ICD_SPV_VERSION;
6913 spv.gen_magic = 0;
6914
6915 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6916 moduleCreateInfo.pNext = NULL;
6917
Karl Schultz6addd812016-02-02 17:17:23 -07006918 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006919 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6920 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006921 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006922
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006923 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006924}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006925#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006926
Karl Schultz6addd812016-02-02 17:17:23 -07006927TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006929 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006930
Chris Forbes9f7ff632015-05-25 11:13:08 +12006931 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006932 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006933
6934 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006935 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006936 "\n"
6937 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006938 "out gl_PerVertex {\n"
6939 " vec4 gl_Position;\n"
6940 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006941 "void main(){\n"
6942 " gl_Position = vec4(1);\n"
6943 " x = 0;\n"
6944 "}\n";
6945 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006946 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006947 "\n"
6948 "layout(location=0) out vec4 color;\n"
6949 "void main(){\n"
6950 " color = vec4(1);\n"
6951 "}\n";
6952
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006953 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6954 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006955
6956 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006957 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006958 pipe.AddShader(&vs);
6959 pipe.AddShader(&fs);
6960
Chris Forbes9f7ff632015-05-25 11:13:08 +12006961 VkDescriptorSetObj descriptorSet(m_device);
6962 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006963 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006964
Tony Barbour5781e8f2015-08-04 16:23:11 -06006965 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006966
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006967 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006968}
Chris Forbes9f7ff632015-05-25 11:13:08 +12006969
Karl Schultz6addd812016-02-02 17:17:23 -07006970TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006972 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006973
Chris Forbes59cb88d2015-05-25 11:13:13 +12006974 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006975 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006976
6977 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006978 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006979 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006980 "out gl_PerVertex {\n"
6981 " vec4 gl_Position;\n"
6982 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006983 "void main(){\n"
6984 " gl_Position = vec4(1);\n"
6985 "}\n";
6986 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006987 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006988 "\n"
6989 "layout(location=0) in float x;\n"
6990 "layout(location=0) out vec4 color;\n"
6991 "void main(){\n"
6992 " color = vec4(x);\n"
6993 "}\n";
6994
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006995 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6996 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006997
6998 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006999 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12007000 pipe.AddShader(&vs);
7001 pipe.AddShader(&fs);
7002
Chris Forbes59cb88d2015-05-25 11:13:13 +12007003 VkDescriptorSetObj descriptorSet(m_device);
7004 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007005 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12007006
Tony Barbour5781e8f2015-08-04 16:23:11 -06007007 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12007008
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007009 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12007010}
7011
Karl Schultz6addd812016-02-02 17:17:23 -07007012TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13007013 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007014 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13007015
7016 ASSERT_NO_FATAL_FAILURE(InitState());
7017 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7018
7019 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007020 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007021 "\n"
7022 "out gl_PerVertex {\n"
7023 " vec4 gl_Position;\n"
7024 "};\n"
7025 "void main(){\n"
7026 " gl_Position = vec4(1);\n"
7027 "}\n";
7028 char const *fsSource =
7029 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007030 "\n"
7031 "in block { layout(location=0) float x; } ins;\n"
7032 "layout(location=0) out vec4 color;\n"
7033 "void main(){\n"
7034 " color = vec4(ins.x);\n"
7035 "}\n";
7036
7037 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7038 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7039
7040 VkPipelineObj pipe(m_device);
7041 pipe.AddColorAttachment();
7042 pipe.AddShader(&vs);
7043 pipe.AddShader(&fs);
7044
7045 VkDescriptorSetObj descriptorSet(m_device);
7046 descriptorSet.AppendDummy();
7047 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7048
7049 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7050
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007051 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13007052}
7053
Karl Schultz6addd812016-02-02 17:17:23 -07007054TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13007055 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13007056 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07007057 "output arr[2] of float32' vs 'ptr to "
7058 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13007059
7060 ASSERT_NO_FATAL_FAILURE(InitState());
7061 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7062
7063 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007064 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13007065 "\n"
7066 "layout(location=0) out float x[2];\n"
7067 "out gl_PerVertex {\n"
7068 " vec4 gl_Position;\n"
7069 "};\n"
7070 "void main(){\n"
7071 " x[0] = 0; x[1] = 0;\n"
7072 " gl_Position = vec4(1);\n"
7073 "}\n";
7074 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007075 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13007076 "\n"
7077 "layout(location=0) in float x[3];\n"
7078 "layout(location=0) out vec4 color;\n"
7079 "void main(){\n"
7080 " color = vec4(x[0] + x[1] + x[2]);\n"
7081 "}\n";
7082
7083 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7084 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7085
7086 VkPipelineObj pipe(m_device);
7087 pipe.AddColorAttachment();
7088 pipe.AddShader(&vs);
7089 pipe.AddShader(&fs);
7090
7091 VkDescriptorSetObj descriptorSet(m_device);
7092 descriptorSet.AppendDummy();
7093 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7094
7095 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7096
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007097 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13007098}
7099
Karl Schultz6addd812016-02-02 17:17:23 -07007100TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007102 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007103
Chris Forbesb56af562015-05-25 11:13:17 +12007104 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007105 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12007106
7107 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007108 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007109 "\n"
7110 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007111 "out gl_PerVertex {\n"
7112 " vec4 gl_Position;\n"
7113 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007114 "void main(){\n"
7115 " x = 0;\n"
7116 " gl_Position = vec4(1);\n"
7117 "}\n";
7118 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007119 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007120 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007121 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12007122 "layout(location=0) out vec4 color;\n"
7123 "void main(){\n"
7124 " color = vec4(x);\n"
7125 "}\n";
7126
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007127 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7128 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12007129
7130 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007131 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12007132 pipe.AddShader(&vs);
7133 pipe.AddShader(&fs);
7134
Chris Forbesb56af562015-05-25 11:13:17 +12007135 VkDescriptorSetObj descriptorSet(m_device);
7136 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007137 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12007138
Tony Barbour5781e8f2015-08-04 16:23:11 -06007139 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12007140
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007141 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12007142}
7143
Karl Schultz6addd812016-02-02 17:17:23 -07007144TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13007145 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007146 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13007147
7148 ASSERT_NO_FATAL_FAILURE(InitState());
7149 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7150
7151 char const *vsSource =
7152 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007153 "\n"
7154 "out block { layout(location=0) int x; } outs;\n"
7155 "out gl_PerVertex {\n"
7156 " vec4 gl_Position;\n"
7157 "};\n"
7158 "void main(){\n"
7159 " outs.x = 0;\n"
7160 " gl_Position = vec4(1);\n"
7161 "}\n";
7162 char const *fsSource =
7163 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007164 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007165 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13007166 "layout(location=0) out vec4 color;\n"
7167 "void main(){\n"
7168 " color = vec4(ins.x);\n"
7169 "}\n";
7170
7171 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7172 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7173
7174 VkPipelineObj pipe(m_device);
7175 pipe.AddColorAttachment();
7176 pipe.AddShader(&vs);
7177 pipe.AddShader(&fs);
7178
7179 VkDescriptorSetObj descriptorSet(m_device);
7180 descriptorSet.AppendDummy();
7181 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7182
7183 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7184
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007185 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13007186}
7187
7188TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
7189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7190 "location 0.0 which is not written by vertex shader");
7191
7192 ASSERT_NO_FATAL_FAILURE(InitState());
7193 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7194
7195 char const *vsSource =
7196 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007197 "\n"
7198 "out block { layout(location=1) float x; } outs;\n"
7199 "out gl_PerVertex {\n"
7200 " vec4 gl_Position;\n"
7201 "};\n"
7202 "void main(){\n"
7203 " outs.x = 0;\n"
7204 " gl_Position = vec4(1);\n"
7205 "}\n";
7206 char const *fsSource =
7207 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007208 "\n"
7209 "in block { layout(location=0) float x; } ins;\n"
7210 "layout(location=0) out vec4 color;\n"
7211 "void main(){\n"
7212 " color = vec4(ins.x);\n"
7213 "}\n";
7214
7215 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7216 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7217
7218 VkPipelineObj pipe(m_device);
7219 pipe.AddColorAttachment();
7220 pipe.AddShader(&vs);
7221 pipe.AddShader(&fs);
7222
7223 VkDescriptorSetObj descriptorSet(m_device);
7224 descriptorSet.AppendDummy();
7225 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7226
7227 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7228
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007229 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13007230}
7231
7232TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
7233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7234 "location 0.1 which is not written by vertex shader");
7235
7236 ASSERT_NO_FATAL_FAILURE(InitState());
7237 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7238
7239 char const *vsSource =
7240 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007241 "\n"
7242 "out block { layout(location=0, component=0) float x; } outs;\n"
7243 "out gl_PerVertex {\n"
7244 " vec4 gl_Position;\n"
7245 "};\n"
7246 "void main(){\n"
7247 " outs.x = 0;\n"
7248 " gl_Position = vec4(1);\n"
7249 "}\n";
7250 char const *fsSource =
7251 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007252 "\n"
7253 "in block { layout(location=0, component=1) float x; } ins;\n"
7254 "layout(location=0) out vec4 color;\n"
7255 "void main(){\n"
7256 " color = vec4(ins.x);\n"
7257 "}\n";
7258
7259 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7260 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7261
7262 VkPipelineObj pipe(m_device);
7263 pipe.AddColorAttachment();
7264 pipe.AddShader(&vs);
7265 pipe.AddShader(&fs);
7266
7267 VkDescriptorSetObj descriptorSet(m_device);
7268 descriptorSet.AppendDummy();
7269 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7270
7271 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7272
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007273 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13007274}
7275
Karl Schultz6addd812016-02-02 17:17:23 -07007276TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007277 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007278 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007279
Chris Forbesde136e02015-05-25 11:13:28 +12007280 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007281 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12007282
7283 VkVertexInputBindingDescription input_binding;
7284 memset(&input_binding, 0, sizeof(input_binding));
7285
7286 VkVertexInputAttributeDescription input_attrib;
7287 memset(&input_attrib, 0, sizeof(input_attrib));
7288 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7289
7290 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007291 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007292 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007293 "out gl_PerVertex {\n"
7294 " vec4 gl_Position;\n"
7295 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007296 "void main(){\n"
7297 " gl_Position = vec4(1);\n"
7298 "}\n";
7299 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007300 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007301 "\n"
7302 "layout(location=0) out vec4 color;\n"
7303 "void main(){\n"
7304 " color = vec4(1);\n"
7305 "}\n";
7306
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007307 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7308 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12007309
7310 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007311 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12007312 pipe.AddShader(&vs);
7313 pipe.AddShader(&fs);
7314
7315 pipe.AddVertexInputBindings(&input_binding, 1);
7316 pipe.AddVertexInputAttribs(&input_attrib, 1);
7317
Chris Forbesde136e02015-05-25 11:13:28 +12007318 VkDescriptorSetObj descriptorSet(m_device);
7319 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007320 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12007321
Tony Barbour5781e8f2015-08-04 16:23:11 -06007322 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12007323
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007324 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12007325}
7326
Karl Schultz6addd812016-02-02 17:17:23 -07007327TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007328 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007329 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13007330
7331 ASSERT_NO_FATAL_FAILURE(InitState());
7332 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7333
7334 VkVertexInputBindingDescription input_binding;
7335 memset(&input_binding, 0, sizeof(input_binding));
7336
7337 VkVertexInputAttributeDescription input_attrib;
7338 memset(&input_attrib, 0, sizeof(input_attrib));
7339 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7340
7341 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007342 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13007343 "\n"
7344 "layout(location=1) in float x;\n"
7345 "out gl_PerVertex {\n"
7346 " vec4 gl_Position;\n"
7347 "};\n"
7348 "void main(){\n"
7349 " gl_Position = vec4(x);\n"
7350 "}\n";
7351 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007352 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13007353 "\n"
7354 "layout(location=0) out vec4 color;\n"
7355 "void main(){\n"
7356 " color = vec4(1);\n"
7357 "}\n";
7358
7359 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7360 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7361
7362 VkPipelineObj pipe(m_device);
7363 pipe.AddColorAttachment();
7364 pipe.AddShader(&vs);
7365 pipe.AddShader(&fs);
7366
7367 pipe.AddVertexInputBindings(&input_binding, 1);
7368 pipe.AddVertexInputAttribs(&input_attrib, 1);
7369
7370 VkDescriptorSetObj descriptorSet(m_device);
7371 descriptorSet.AppendDummy();
7372 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7373
7374 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7375
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007376 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13007377}
7378
Karl Schultz6addd812016-02-02 17:17:23 -07007379TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
7380 m_errorMonitor->SetDesiredFailureMsg(
7381 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007382 "VS consumes input at location 0 but not provided");
7383
Chris Forbes62e8e502015-05-25 11:13:29 +12007384 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007385 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12007386
7387 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007388 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007389 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007390 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07007391 "out gl_PerVertex {\n"
7392 " vec4 gl_Position;\n"
7393 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007394 "void main(){\n"
7395 " gl_Position = x;\n"
7396 "}\n";
7397 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007398 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007399 "\n"
7400 "layout(location=0) out vec4 color;\n"
7401 "void main(){\n"
7402 " color = vec4(1);\n"
7403 "}\n";
7404
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007405 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7406 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12007407
7408 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007409 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12007410 pipe.AddShader(&vs);
7411 pipe.AddShader(&fs);
7412
Chris Forbes62e8e502015-05-25 11:13:29 +12007413 VkDescriptorSetObj descriptorSet(m_device);
7414 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007415 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12007416
Tony Barbour5781e8f2015-08-04 16:23:11 -06007417 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12007418
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007419 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12007420}
7421
Karl Schultz6addd812016-02-02 17:17:23 -07007422TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
7423 m_errorMonitor->SetDesiredFailureMsg(
7424 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007425 "location 0 does not match VS input type");
7426
Chris Forbesc97d98e2015-05-25 11:13:31 +12007427 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12007429
7430 VkVertexInputBindingDescription input_binding;
7431 memset(&input_binding, 0, sizeof(input_binding));
7432
7433 VkVertexInputAttributeDescription input_attrib;
7434 memset(&input_attrib, 0, sizeof(input_attrib));
7435 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7436
7437 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007438 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007439 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007440 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007441 "out gl_PerVertex {\n"
7442 " vec4 gl_Position;\n"
7443 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007444 "void main(){\n"
7445 " gl_Position = vec4(x);\n"
7446 "}\n";
7447 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007448 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007449 "\n"
7450 "layout(location=0) out vec4 color;\n"
7451 "void main(){\n"
7452 " color = vec4(1);\n"
7453 "}\n";
7454
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007455 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7456 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12007457
7458 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007459 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12007460 pipe.AddShader(&vs);
7461 pipe.AddShader(&fs);
7462
7463 pipe.AddVertexInputBindings(&input_binding, 1);
7464 pipe.AddVertexInputAttribs(&input_attrib, 1);
7465
Chris Forbesc97d98e2015-05-25 11:13:31 +12007466 VkDescriptorSetObj descriptorSet(m_device);
7467 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007468 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12007469
Tony Barbour5781e8f2015-08-04 16:23:11 -06007470 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12007471
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007472 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12007473}
7474
Chris Forbesc68b43c2016-04-06 11:18:47 +12007475TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
7476 m_errorMonitor->SetDesiredFailureMsg(
7477 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7478 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
7479
7480 ASSERT_NO_FATAL_FAILURE(InitState());
7481 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7482
7483 char const *vsSource =
7484 "#version 450\n"
7485 "\n"
7486 "out gl_PerVertex {\n"
7487 " vec4 gl_Position;\n"
7488 "};\n"
7489 "void main(){\n"
7490 " gl_Position = vec4(1);\n"
7491 "}\n";
7492 char const *fsSource =
7493 "#version 450\n"
7494 "\n"
7495 "layout(location=0) out vec4 color;\n"
7496 "void main(){\n"
7497 " color = vec4(1);\n"
7498 "}\n";
7499
7500 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7501 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7502
7503 VkPipelineObj pipe(m_device);
7504 pipe.AddColorAttachment();
7505 pipe.AddShader(&vs);
7506 pipe.AddShader(&vs);
7507 pipe.AddShader(&fs);
7508
7509 VkDescriptorSetObj descriptorSet(m_device);
7510 descriptorSet.AppendDummy();
7511 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7512
7513 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7514
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007515 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12007516}
7517
Karl Schultz6addd812016-02-02 17:17:23 -07007518TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007519 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007520
7521 ASSERT_NO_FATAL_FAILURE(InitState());
7522 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7523
7524 VkVertexInputBindingDescription input_binding;
7525 memset(&input_binding, 0, sizeof(input_binding));
7526
7527 VkVertexInputAttributeDescription input_attribs[2];
7528 memset(input_attribs, 0, sizeof(input_attribs));
7529
7530 for (int i = 0; i < 2; i++) {
7531 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7532 input_attribs[i].location = i;
7533 }
7534
7535 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007536 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007537 "\n"
7538 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007539 "out gl_PerVertex {\n"
7540 " vec4 gl_Position;\n"
7541 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007542 "void main(){\n"
7543 " gl_Position = x[0] + x[1];\n"
7544 "}\n";
7545 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007546 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007547 "\n"
7548 "layout(location=0) out vec4 color;\n"
7549 "void main(){\n"
7550 " color = vec4(1);\n"
7551 "}\n";
7552
7553 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7554 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7555
7556 VkPipelineObj pipe(m_device);
7557 pipe.AddColorAttachment();
7558 pipe.AddShader(&vs);
7559 pipe.AddShader(&fs);
7560
7561 pipe.AddVertexInputBindings(&input_binding, 1);
7562 pipe.AddVertexInputAttribs(input_attribs, 2);
7563
7564 VkDescriptorSetObj descriptorSet(m_device);
7565 descriptorSet.AppendDummy();
7566 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7567
7568 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7569
7570 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007571 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007572}
7573
Chris Forbes2682b242015-11-24 11:13:14 +13007574TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
7575{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007576 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007577
7578 ASSERT_NO_FATAL_FAILURE(InitState());
7579 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7580
7581 VkVertexInputBindingDescription input_binding;
7582 memset(&input_binding, 0, sizeof(input_binding));
7583
7584 VkVertexInputAttributeDescription input_attribs[2];
7585 memset(input_attribs, 0, sizeof(input_attribs));
7586
7587 for (int i = 0; i < 2; i++) {
7588 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7589 input_attribs[i].location = i;
7590 }
7591
7592 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007593 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007594 "\n"
7595 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07007596 "out gl_PerVertex {\n"
7597 " vec4 gl_Position;\n"
7598 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007599 "void main(){\n"
7600 " gl_Position = x[0] + x[1];\n"
7601 "}\n";
7602 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007603 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007604 "\n"
7605 "layout(location=0) out vec4 color;\n"
7606 "void main(){\n"
7607 " color = vec4(1);\n"
7608 "}\n";
7609
7610 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7611 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7612
7613 VkPipelineObj pipe(m_device);
7614 pipe.AddColorAttachment();
7615 pipe.AddShader(&vs);
7616 pipe.AddShader(&fs);
7617
7618 pipe.AddVertexInputBindings(&input_binding, 1);
7619 pipe.AddVertexInputAttribs(input_attribs, 2);
7620
7621 VkDescriptorSetObj descriptorSet(m_device);
7622 descriptorSet.AppendDummy();
7623 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7624
7625 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7626
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007627 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007628}
Chris Forbes2682b242015-11-24 11:13:14 +13007629
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007630TEST_F(VkLayerTest, CreatePipelineSimplePositive)
7631{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007632 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007633
7634 ASSERT_NO_FATAL_FAILURE(InitState());
7635 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7636
7637 char const *vsSource =
7638 "#version 450\n"
7639 "out gl_PerVertex {\n"
7640 " vec4 gl_Position;\n"
7641 "};\n"
7642 "void main(){\n"
7643 " gl_Position = vec4(0);\n"
7644 "}\n";
7645 char const *fsSource =
7646 "#version 450\n"
7647 "\n"
7648 "layout(location=0) out vec4 color;\n"
7649 "void main(){\n"
7650 " color = vec4(1);\n"
7651 "}\n";
7652
7653 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7654 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7655
7656 VkPipelineObj pipe(m_device);
7657 pipe.AddColorAttachment();
7658 pipe.AddShader(&vs);
7659 pipe.AddShader(&fs);
7660
7661 VkDescriptorSetObj descriptorSet(m_device);
7662 descriptorSet.AppendDummy();
7663 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7664
7665 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7666
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007667 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007668}
7669
Chris Forbes912c9192016-04-05 17:50:35 +12007670TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
7671{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007672 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12007673
7674 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
7675
7676 ASSERT_NO_FATAL_FAILURE(InitState());
7677 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7678
7679 char const *vsSource =
7680 "#version 450\n"
7681 "out gl_PerVertex {\n"
7682 " vec4 gl_Position;\n"
7683 "};\n"
7684 "layout(location=0) out vec3 x;\n"
7685 "layout(location=1) out ivec3 y;\n"
7686 "layout(location=2) out vec3 z;\n"
7687 "void main(){\n"
7688 " gl_Position = vec4(0);\n"
7689 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
7690 "}\n";
7691 char const *fsSource =
7692 "#version 450\n"
7693 "\n"
7694 "layout(location=0) out vec4 color;\n"
7695 "layout(location=0) in float x;\n"
7696 "layout(location=1) flat in int y;\n"
7697 "layout(location=2) in vec2 z;\n"
7698 "void main(){\n"
7699 " color = vec4(1 + x + y + z.x);\n"
7700 "}\n";
7701
7702 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7703 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7704
7705 VkPipelineObj pipe(m_device);
7706 pipe.AddColorAttachment();
7707 pipe.AddShader(&vs);
7708 pipe.AddShader(&fs);
7709
7710 VkDescriptorSetObj descriptorSet(m_device);
7711 descriptorSet.AppendDummy();
7712 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7713
7714 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7715
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007716 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12007717}
7718
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007719TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
7720{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007721 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007722
7723 ASSERT_NO_FATAL_FAILURE(InitState());
7724 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7725
Chris Forbesc1e852d2016-04-04 19:26:42 +12007726 if (!m_device->phy().features().tessellationShader) {
7727 printf("Device does not support tessellation shaders; skipped.\n");
7728 return;
7729 }
7730
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007731 char const *vsSource =
7732 "#version 450\n"
7733 "void main(){}\n";
7734 char const *tcsSource =
7735 "#version 450\n"
7736 "layout(location=0) out int x[];\n"
7737 "layout(vertices=3) out;\n"
7738 "void main(){\n"
7739 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7740 " gl_TessLevelInner[0] = 1;\n"
7741 " x[gl_InvocationID] = gl_InvocationID;\n"
7742 "}\n";
7743 char const *tesSource =
7744 "#version 450\n"
7745 "layout(triangles, equal_spacing, cw) in;\n"
7746 "layout(location=0) in int x[];\n"
7747 "out gl_PerVertex { vec4 gl_Position; };\n"
7748 "void main(){\n"
7749 " gl_Position.xyz = gl_TessCoord;\n"
7750 " gl_Position.w = x[0] + x[1] + x[2];\n"
7751 "}\n";
7752 char const *fsSource =
7753 "#version 450\n"
7754 "layout(location=0) out vec4 color;\n"
7755 "void main(){\n"
7756 " color = vec4(1);\n"
7757 "}\n";
7758
7759 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7760 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7761 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7762 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7763
7764 VkPipelineInputAssemblyStateCreateInfo iasci{
7765 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7766 nullptr,
7767 0,
7768 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7769 VK_FALSE};
7770
Chris Forbesb4cacb62016-04-04 19:15:00 +12007771 VkPipelineTessellationStateCreateInfo tsci{
7772 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7773 nullptr,
7774 0,
7775 3};
7776
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007777 VkPipelineObj pipe(m_device);
7778 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12007779 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007780 pipe.AddColorAttachment();
7781 pipe.AddShader(&vs);
7782 pipe.AddShader(&tcs);
7783 pipe.AddShader(&tes);
7784 pipe.AddShader(&fs);
7785
7786 VkDescriptorSetObj descriptorSet(m_device);
7787 descriptorSet.AppendDummy();
7788 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7789
7790 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7791
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007792 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007793}
7794
Chris Forbesa0ab8152016-04-20 13:34:27 +12007795TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
7796{
7797 m_errorMonitor->ExpectSuccess();
7798
7799 ASSERT_NO_FATAL_FAILURE(InitState());
7800 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7801
7802 if (!m_device->phy().features().geometryShader) {
7803 printf("Device does not support geometry shaders; skipped.\n");
7804 return;
7805 }
7806
7807 char const *vsSource =
7808 "#version 450\n"
7809 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
7810 "void main(){\n"
7811 " vs_out.x = vec4(1);\n"
7812 "}\n";
7813 char const *gsSource =
7814 "#version 450\n"
7815 "layout(triangles) in;\n"
7816 "layout(triangle_strip, max_vertices=3) out;\n"
7817 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
7818 "out gl_PerVertex { vec4 gl_Position; };\n"
7819 "void main() {\n"
7820 " gl_Position = gs_in[0].x;\n"
7821 " EmitVertex();\n"
7822 "}\n";
7823 char const *fsSource =
7824 "#version 450\n"
7825 "layout(location=0) out vec4 color;\n"
7826 "void main(){\n"
7827 " color = vec4(1);\n"
7828 "}\n";
7829
7830 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7831 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
7832 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7833
7834 VkPipelineObj pipe(m_device);
7835 pipe.AddColorAttachment();
7836 pipe.AddShader(&vs);
7837 pipe.AddShader(&gs);
7838 pipe.AddShader(&fs);
7839
7840 VkDescriptorSetObj descriptorSet(m_device);
7841 descriptorSet.AppendDummy();
7842 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7843
7844 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7845
7846 m_errorMonitor->VerifyNotFound();
7847}
7848
Chris Forbesa0193bc2016-04-04 19:19:47 +12007849TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
7850{
7851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7852 "is per-vertex in tessellation control shader stage "
7853 "but per-patch in tessellation evaluation shader stage");
7854
7855 ASSERT_NO_FATAL_FAILURE(InitState());
7856 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7857
Chris Forbesc1e852d2016-04-04 19:26:42 +12007858 if (!m_device->phy().features().tessellationShader) {
7859 printf("Device does not support tessellation shaders; skipped.\n");
7860 return;
7861 }
7862
Chris Forbesa0193bc2016-04-04 19:19:47 +12007863 char const *vsSource =
7864 "#version 450\n"
7865 "void main(){}\n";
7866 char const *tcsSource =
7867 "#version 450\n"
7868 "layout(location=0) out int x[];\n"
7869 "layout(vertices=3) out;\n"
7870 "void main(){\n"
7871 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7872 " gl_TessLevelInner[0] = 1;\n"
7873 " x[gl_InvocationID] = gl_InvocationID;\n"
7874 "}\n";
7875 char const *tesSource =
7876 "#version 450\n"
7877 "layout(triangles, equal_spacing, cw) in;\n"
7878 "layout(location=0) patch in int x;\n"
7879 "out gl_PerVertex { vec4 gl_Position; };\n"
7880 "void main(){\n"
7881 " gl_Position.xyz = gl_TessCoord;\n"
7882 " gl_Position.w = x;\n"
7883 "}\n";
7884 char const *fsSource =
7885 "#version 450\n"
7886 "layout(location=0) out vec4 color;\n"
7887 "void main(){\n"
7888 " color = vec4(1);\n"
7889 "}\n";
7890
7891 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7892 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7893 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7894 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7895
7896 VkPipelineInputAssemblyStateCreateInfo iasci{
7897 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7898 nullptr,
7899 0,
7900 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7901 VK_FALSE};
7902
7903 VkPipelineTessellationStateCreateInfo tsci{
7904 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7905 nullptr,
7906 0,
7907 3};
7908
7909 VkPipelineObj pipe(m_device);
7910 pipe.SetInputAssembly(&iasci);
7911 pipe.SetTessellation(&tsci);
7912 pipe.AddColorAttachment();
7913 pipe.AddShader(&vs);
7914 pipe.AddShader(&tcs);
7915 pipe.AddShader(&tes);
7916 pipe.AddShader(&fs);
7917
7918 VkDescriptorSetObj descriptorSet(m_device);
7919 descriptorSet.AppendDummy();
7920 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7921
7922 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7923
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007924 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12007925}
7926
Karl Schultz6addd812016-02-02 17:17:23 -07007927TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
7928 m_errorMonitor->SetDesiredFailureMsg(
7929 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007930 "Duplicate vertex input binding descriptions for binding 0");
7931
Chris Forbes280ba2c2015-06-12 11:16:41 +12007932 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007933 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007934
7935 /* Two binding descriptions for binding 0 */
7936 VkVertexInputBindingDescription input_bindings[2];
7937 memset(input_bindings, 0, sizeof(input_bindings));
7938
7939 VkVertexInputAttributeDescription input_attrib;
7940 memset(&input_attrib, 0, sizeof(input_attrib));
7941 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7942
7943 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007944 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007945 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007946 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007947 "out gl_PerVertex {\n"
7948 " vec4 gl_Position;\n"
7949 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007950 "void main(){\n"
7951 " gl_Position = vec4(x);\n"
7952 "}\n";
7953 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007954 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007955 "\n"
7956 "layout(location=0) out vec4 color;\n"
7957 "void main(){\n"
7958 " color = vec4(1);\n"
7959 "}\n";
7960
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007961 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7962 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007963
7964 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007965 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007966 pipe.AddShader(&vs);
7967 pipe.AddShader(&fs);
7968
7969 pipe.AddVertexInputBindings(input_bindings, 2);
7970 pipe.AddVertexInputAttribs(&input_attrib, 1);
7971
Chris Forbes280ba2c2015-06-12 11:16:41 +12007972 VkDescriptorSetObj descriptorSet(m_device);
7973 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007974 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007975
Tony Barbour5781e8f2015-08-04 16:23:11 -06007976 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007977
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007978 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007979}
Chris Forbes8f68b562015-05-25 11:13:32 +12007980
Chris Forbes35efec72016-04-21 14:32:08 +12007981TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
7982 m_errorMonitor->ExpectSuccess();
7983
7984 ASSERT_NO_FATAL_FAILURE(InitState());
7985 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7986
7987 if (!m_device->phy().features().tessellationShader) {
7988 printf("Device does not support 64bit vertex attributes; skipped.\n");
7989 return;
7990 }
7991
7992 VkVertexInputBindingDescription input_bindings[1];
7993 memset(input_bindings, 0, sizeof(input_bindings));
7994
7995 VkVertexInputAttributeDescription input_attribs[4];
7996 memset(input_attribs, 0, sizeof(input_attribs));
7997 input_attribs[0].location = 0;
7998 input_attribs[0].offset = 0;
7999 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8000 input_attribs[1].location = 2;
8001 input_attribs[1].offset = 32;
8002 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8003 input_attribs[2].location = 4;
8004 input_attribs[2].offset = 64;
8005 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8006 input_attribs[3].location = 6;
8007 input_attribs[3].offset = 96;
8008 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8009
8010 char const *vsSource =
8011 "#version 450\n"
8012 "\n"
8013 "layout(location=0) in dmat4 x;\n"
8014 "out gl_PerVertex {\n"
8015 " vec4 gl_Position;\n"
8016 "};\n"
8017 "void main(){\n"
8018 " gl_Position = vec4(x[0][0]);\n"
8019 "}\n";
8020 char const *fsSource =
8021 "#version 450\n"
8022 "\n"
8023 "layout(location=0) out vec4 color;\n"
8024 "void main(){\n"
8025 " color = vec4(1);\n"
8026 "}\n";
8027
8028 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8029 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8030
8031 VkPipelineObj pipe(m_device);
8032 pipe.AddColorAttachment();
8033 pipe.AddShader(&vs);
8034 pipe.AddShader(&fs);
8035
8036 pipe.AddVertexInputBindings(input_bindings, 1);
8037 pipe.AddVertexInputAttribs(input_attribs, 4);
8038
8039 VkDescriptorSetObj descriptorSet(m_device);
8040 descriptorSet.AppendDummy();
8041 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8042
8043 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8044
8045 m_errorMonitor->VerifyNotFound();
8046}
8047
Karl Schultz6addd812016-02-02 17:17:23 -07008048TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008049 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008050 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008051
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008052 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008053
8054 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008055 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008056 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008057 "out gl_PerVertex {\n"
8058 " vec4 gl_Position;\n"
8059 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008060 "void main(){\n"
8061 " gl_Position = vec4(1);\n"
8062 "}\n";
8063 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008064 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008065 "\n"
8066 "void main(){\n"
8067 "}\n";
8068
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008069 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8070 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008071
8072 VkPipelineObj pipe(m_device);
8073 pipe.AddShader(&vs);
8074 pipe.AddShader(&fs);
8075
Chia-I Wu08accc62015-07-07 11:50:03 +08008076 /* set up CB 0, not written */
8077 pipe.AddColorAttachment();
8078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008079
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008080 VkDescriptorSetObj descriptorSet(m_device);
8081 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008082 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008083
Tony Barbour5781e8f2015-08-04 16:23:11 -06008084 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008085
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008086 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008087}
8088
Karl Schultz6addd812016-02-02 17:17:23 -07008089TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07008090 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008091 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008092 "FS writes to output location 1 with no matching attachment");
8093
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008094 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008095
8096 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008097 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008098 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008099 "out gl_PerVertex {\n"
8100 " vec4 gl_Position;\n"
8101 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008102 "void main(){\n"
8103 " gl_Position = vec4(1);\n"
8104 "}\n";
8105 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008106 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008107 "\n"
8108 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008109 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008110 "void main(){\n"
8111 " x = vec4(1);\n"
8112 " y = vec4(1);\n"
8113 "}\n";
8114
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008115 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8116 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008117
8118 VkPipelineObj pipe(m_device);
8119 pipe.AddShader(&vs);
8120 pipe.AddShader(&fs);
8121
Chia-I Wu08accc62015-07-07 11:50:03 +08008122 /* set up CB 0, not written */
8123 pipe.AddColorAttachment();
8124 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008125 /* FS writes CB 1, but we don't configure it */
8126
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008127 VkDescriptorSetObj descriptorSet(m_device);
8128 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008129 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008130
Tony Barbour5781e8f2015-08-04 16:23:11 -06008131 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008132
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008133 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008134}
8135
Karl Schultz6addd812016-02-02 17:17:23 -07008136TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008137 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008138 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008139
Chris Forbesa36d69e2015-05-25 11:13:44 +12008140 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008141
8142 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008143 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008144 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008145 "out gl_PerVertex {\n"
8146 " vec4 gl_Position;\n"
8147 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008148 "void main(){\n"
8149 " gl_Position = vec4(1);\n"
8150 "}\n";
8151 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008152 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008153 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008154 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12008155 "void main(){\n"
8156 " x = ivec4(1);\n"
8157 "}\n";
8158
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008159 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8160 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12008161
8162 VkPipelineObj pipe(m_device);
8163 pipe.AddShader(&vs);
8164 pipe.AddShader(&fs);
8165
Chia-I Wu08accc62015-07-07 11:50:03 +08008166 /* set up CB 0; type is UNORM by default */
8167 pipe.AddColorAttachment();
8168 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008169
Chris Forbesa36d69e2015-05-25 11:13:44 +12008170 VkDescriptorSetObj descriptorSet(m_device);
8171 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008172 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12008173
Tony Barbour5781e8f2015-08-04 16:23:11 -06008174 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008175
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008176 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12008177}
Chris Forbes7b1b8932015-06-05 14:43:36 +12008178
Karl Schultz6addd812016-02-02 17:17:23 -07008179TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008180 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008181 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008182
Chris Forbes556c76c2015-08-14 12:04:59 +12008183 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12008184
8185 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008186 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008187 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008188 "out gl_PerVertex {\n"
8189 " vec4 gl_Position;\n"
8190 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008191 "void main(){\n"
8192 " gl_Position = vec4(1);\n"
8193 "}\n";
8194 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008195 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008196 "\n"
8197 "layout(location=0) out vec4 x;\n"
8198 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
8199 "void main(){\n"
8200 " x = vec4(bar.y);\n"
8201 "}\n";
8202
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008203 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8204 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12008205
Chris Forbes556c76c2015-08-14 12:04:59 +12008206 VkPipelineObj pipe(m_device);
8207 pipe.AddShader(&vs);
8208 pipe.AddShader(&fs);
8209
8210 /* set up CB 0; type is UNORM by default */
8211 pipe.AddColorAttachment();
8212 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8213
8214 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008215 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12008216
8217 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8218
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008219 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12008220}
8221
Chris Forbes5c59e902016-02-26 16:56:09 +13008222TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
8223 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8224 "not declared in layout");
8225
8226 ASSERT_NO_FATAL_FAILURE(InitState());
8227
8228 char const *vsSource =
8229 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13008230 "\n"
8231 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
8232 "out gl_PerVertex {\n"
8233 " vec4 gl_Position;\n"
8234 "};\n"
8235 "void main(){\n"
8236 " gl_Position = vec4(consts.x);\n"
8237 "}\n";
8238 char const *fsSource =
8239 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13008240 "\n"
8241 "layout(location=0) out vec4 x;\n"
8242 "void main(){\n"
8243 " x = vec4(1);\n"
8244 "}\n";
8245
8246 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8247 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8248
8249 VkPipelineObj pipe(m_device);
8250 pipe.AddShader(&vs);
8251 pipe.AddShader(&fs);
8252
8253 /* set up CB 0; type is UNORM by default */
8254 pipe.AddColorAttachment();
8255 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8256
8257 VkDescriptorSetObj descriptorSet(m_device);
8258 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8259
8260 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8261
8262 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008263 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13008264}
8265
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008266#endif // SHADER_CHECKER_TESTS
8267
8268#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06008269TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07008270 m_errorMonitor->SetDesiredFailureMsg(
8271 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008272 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008273
8274 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008275
8276 // Create an image
8277 VkImage image;
8278
Karl Schultz6addd812016-02-02 17:17:23 -07008279 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8280 const int32_t tex_width = 32;
8281 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008282
8283 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008284 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8285 image_create_info.pNext = NULL;
8286 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8287 image_create_info.format = tex_format;
8288 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008289 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07008290 image_create_info.extent.depth = 1;
8291 image_create_info.mipLevels = 1;
8292 image_create_info.arrayLayers = 1;
8293 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8294 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8295 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8296 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008297
8298 // Introduce error by sending down a bogus width extent
8299 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008300 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008301
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008302 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008303}
8304
Mark Youngc48c4c12016-04-11 14:26:49 -06008305TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
8306 m_errorMonitor->SetDesiredFailureMsg(
8307 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8308 "CreateImage extents is 0 for at least one required dimension");
8309
8310 ASSERT_NO_FATAL_FAILURE(InitState());
8311
8312 // Create an image
8313 VkImage image;
8314
8315 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8316 const int32_t tex_width = 32;
8317 const int32_t tex_height = 32;
8318
8319 VkImageCreateInfo image_create_info = {};
8320 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8321 image_create_info.pNext = NULL;
8322 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8323 image_create_info.format = tex_format;
8324 image_create_info.extent.width = tex_width;
8325 image_create_info.extent.height = tex_height;
8326 image_create_info.extent.depth = 1;
8327 image_create_info.mipLevels = 1;
8328 image_create_info.arrayLayers = 1;
8329 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8330 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8331 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8332 image_create_info.flags = 0;
8333
8334 // Introduce error by sending down a bogus width extent
8335 image_create_info.extent.width = 0;
8336 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
8337
8338 m_errorMonitor->VerifyFound();
8339}
8340
Karl Schultz6addd812016-02-02 17:17:23 -07008341TEST_F(VkLayerTest, UpdateBufferAlignment) {
8342 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06008343
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008345 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008346
Mike Stroyana3082432015-09-25 13:39:21 -06008347 ASSERT_NO_FATAL_FAILURE(InitState());
8348
8349 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8350 vk_testing::Buffer buffer;
8351 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
8352
8353 BeginCommandBuffer();
8354 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008355 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008356 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008357
Mike Stroyana3082432015-09-25 13:39:21 -06008358 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008359 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008360 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008361
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008362 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008363 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008364 EndCommandBuffer();
8365}
8366
Karl Schultz6addd812016-02-02 17:17:23 -07008367TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008368 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008369 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06008370
8371 ASSERT_NO_FATAL_FAILURE(InitState());
8372
8373 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8374 vk_testing::Buffer buffer;
8375 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
8376
8377 BeginCommandBuffer();
8378 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008379 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008380 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008381
Mike Stroyana3082432015-09-25 13:39:21 -06008382 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008384 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008385
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008386 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008387
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008388 m_errorMonitor->VerifyFound();
8389
Mike Stroyana3082432015-09-25 13:39:21 -06008390 EndCommandBuffer();
8391}
8392
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008393#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12008394
Tobin Ehliscde08892015-09-22 10:11:37 -06008395#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07008396TEST_F(VkLayerTest, InvalidImageView) {
8397 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06008398
Karl Schultz6addd812016-02-02 17:17:23 -07008399 m_errorMonitor->SetDesiredFailureMsg(
8400 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008401 "vkCreateImageView called with baseMipLevel 10 ");
8402
Tobin Ehliscde08892015-09-22 10:11:37 -06008403 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06008404
Mike Stroyana3082432015-09-25 13:39:21 -06008405 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07008406 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06008407
Karl Schultz6addd812016-02-02 17:17:23 -07008408 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8409 const int32_t tex_width = 32;
8410 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06008411
8412 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008413 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8414 image_create_info.pNext = NULL;
8415 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8416 image_create_info.format = tex_format;
8417 image_create_info.extent.width = tex_width;
8418 image_create_info.extent.height = tex_height;
8419 image_create_info.extent.depth = 1;
8420 image_create_info.mipLevels = 1;
8421 image_create_info.arrayLayers = 1;
8422 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8423 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8424 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8425 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06008426
Chia-I Wuf7458c52015-10-26 21:10:41 +08008427 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06008428 ASSERT_VK_SUCCESS(err);
8429
8430 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008431 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8432 image_view_create_info.image = image;
8433 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8434 image_view_create_info.format = tex_format;
8435 image_view_create_info.subresourceRange.layerCount = 1;
8436 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
8437 image_view_create_info.subresourceRange.levelCount = 1;
8438 image_view_create_info.subresourceRange.aspectMask =
8439 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06008440
8441 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008442 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8443 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06008444
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008445 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06008446}
Mike Stroyana3082432015-09-25 13:39:21 -06008447
Karl Schultz6addd812016-02-02 17:17:23 -07008448TEST_F(VkLayerTest, InvalidImageViewAspect) {
8449 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008450
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008451 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008452 "vkCreateImageView: Color image "
8453 "formats must have ONLY the "
8454 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008455
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008456 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008457
8458 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07008459 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008460
Karl Schultz6addd812016-02-02 17:17:23 -07008461 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8462 const int32_t tex_width = 32;
8463 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008464
8465 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008466 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8467 image_create_info.pNext = NULL;
8468 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8469 image_create_info.format = tex_format;
8470 image_create_info.extent.width = tex_width;
8471 image_create_info.extent.height = tex_height;
8472 image_create_info.extent.depth = 1;
8473 image_create_info.mipLevels = 1;
8474 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8475 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8476 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8477 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008478
Chia-I Wuf7458c52015-10-26 21:10:41 +08008479 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008480 ASSERT_VK_SUCCESS(err);
8481
8482 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008483 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8484 image_view_create_info.image = image;
8485 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8486 image_view_create_info.format = tex_format;
8487 image_view_create_info.subresourceRange.baseMipLevel = 0;
8488 image_view_create_info.subresourceRange.levelCount = 1;
8489 // Cause an error by setting an invalid image aspect
8490 image_view_create_info.subresourceRange.aspectMask =
8491 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008492
8493 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008494 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8495 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008496
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008497 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008498}
8499
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008500TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008501 VkResult err;
8502 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008503
Karl Schultz6addd812016-02-02 17:17:23 -07008504 m_errorMonitor->SetDesiredFailureMsg(
8505 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008506 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008507
Mike Stroyana3082432015-09-25 13:39:21 -06008508 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008509
8510 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008511 VkImage srcImage;
8512 VkImage dstImage;
8513 VkDeviceMemory srcMem;
8514 VkDeviceMemory destMem;
8515 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008516
8517 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008518 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8519 image_create_info.pNext = NULL;
8520 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8521 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8522 image_create_info.extent.width = 32;
8523 image_create_info.extent.height = 32;
8524 image_create_info.extent.depth = 1;
8525 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008526 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07008527 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8528 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8529 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8530 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008531
Karl Schultz6addd812016-02-02 17:17:23 -07008532 err =
8533 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008534 ASSERT_VK_SUCCESS(err);
8535
Karl Schultz6addd812016-02-02 17:17:23 -07008536 err =
8537 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008538 ASSERT_VK_SUCCESS(err);
8539
8540 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008541 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008542 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8543 memAlloc.pNext = NULL;
8544 memAlloc.allocationSize = 0;
8545 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008546
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008547 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008548 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008549 pass =
8550 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008551 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008552 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008553 ASSERT_VK_SUCCESS(err);
8554
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008555 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008556 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008557 pass =
8558 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008559 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008560 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008561 ASSERT_VK_SUCCESS(err);
8562
8563 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8564 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008565 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008566 ASSERT_VK_SUCCESS(err);
8567
8568 BeginCommandBuffer();
8569 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008570 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008571 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008572 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008573 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06008574 copyRegion.srcOffset.x = 0;
8575 copyRegion.srcOffset.y = 0;
8576 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008577 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008578 copyRegion.dstSubresource.mipLevel = 0;
8579 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008580 // Introduce failure by forcing the dst layerCount to differ from src
8581 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008582 copyRegion.dstOffset.x = 0;
8583 copyRegion.dstOffset.y = 0;
8584 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008585 copyRegion.extent.width = 1;
8586 copyRegion.extent.height = 1;
8587 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008588 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8589 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008590 EndCommandBuffer();
8591
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008592 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008593
Chia-I Wuf7458c52015-10-26 21:10:41 +08008594 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008595 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008596 vkFreeMemory(m_device->device(), srcMem, NULL);
8597 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008598}
8599
Tony Barbourd6673642016-05-05 14:46:39 -06008600TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
8601
8602 TEST_DESCRIPTION("Creating images with unsuported formats ");
8603
8604 ASSERT_NO_FATAL_FAILURE(InitState());
8605 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8606 VkImageObj image(m_device);
8607 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
8608 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
8609 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
8610 VK_IMAGE_TILING_OPTIMAL, 0);
8611 ASSERT_TRUE(image.initialized());
8612
8613 VkFormat unsupported = VK_FORMAT_UNDEFINED;
8614 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
8615 VkFormat format = static_cast<VkFormat>(f);
8616 VkFormatProperties fProps = m_device->format_properties(format);
8617 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
8618 fProps.optimalTilingFeatures == 0) {
8619 unsupported = format;
8620 break;
8621 }
8622 }
8623 if (unsupported != VK_FORMAT_UNDEFINED) {
8624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8625 "vkCreateImage parameter, "
8626 "VkFormat pCreateInfo->format, "
8627 "contains unsupported format");
8628 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
8629 VkImageCreateInfo image_create_info;
8630 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8631 image_create_info.pNext = NULL;
8632 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8633 image_create_info.format = unsupported;
8634 image_create_info.extent.width = 32;
8635 image_create_info.extent.height = 32;
8636 image_create_info.extent.depth = 1;
8637 image_create_info.mipLevels = 1;
8638 image_create_info.arrayLayers = 1;
8639 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8640 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8641 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8642 image_create_info.flags = 0;
8643
8644 VkImage localImage;
8645 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
8646 m_errorMonitor->VerifyFound();
8647
8648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8649 "vkCreateRenderPass parameter, "
8650 "VkFormat in "
8651 "pCreateInfo->pAttachments");
8652 // Create renderpass with unsupported format - Expect FORMAT_UNSUPPORTED
8653 VkAttachmentDescription att;
8654 att.format = unsupported;
8655 att.samples = VK_SAMPLE_COUNT_1_BIT;
8656 att.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
8657 att.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
8658 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
8659 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
8660 att.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8661 att.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8662
8663 VkRenderPassCreateInfo rp_info = {};
8664 VkRenderPass rp;
8665 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8666 rp_info.attachmentCount = 1;
8667 rp_info.pAttachments = &att;
8668 rp_info.subpassCount = 0;
8669 rp_info.pSubpasses = NULL;
8670 vkCreateRenderPass(m_device->handle(), &rp_info, NULL, &rp);
8671 m_errorMonitor->VerifyFound();
8672 }
8673}
8674
8675TEST_F(VkLayerTest, ImageLayerViewTests) {
8676 VkResult ret;
8677 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
8678
8679 ASSERT_NO_FATAL_FAILURE(InitState());
8680
8681 VkImageObj image(m_device);
8682 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
8683 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
8684 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
8685 VK_IMAGE_TILING_OPTIMAL, 0);
8686 ASSERT_TRUE(image.initialized());
8687
8688 VkImageView imgView;
8689 VkImageViewCreateInfo imgViewInfo = {};
8690 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8691 imgViewInfo.image = image.handle();
8692 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
8693 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
8694 imgViewInfo.subresourceRange.layerCount = 1;
8695 imgViewInfo.subresourceRange.baseMipLevel = 0;
8696 imgViewInfo.subresourceRange.levelCount = 1;
8697 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8698
8699 m_errorMonitor->SetDesiredFailureMsg(
8700 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8701 "vkCreateImageView called with baseMipLevel");
8702 // View can't have baseMipLevel >= image's mipLevels - Expect
8703 // VIEW_CREATE_ERROR
8704 imgViewInfo.subresourceRange.baseMipLevel = 1;
8705 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
8706 m_errorMonitor->VerifyFound();
8707 imgViewInfo.subresourceRange.baseMipLevel = 0;
8708
8709 m_errorMonitor->SetDesiredFailureMsg(
8710 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8711 "vkCreateImageView called with baseArrayLayer");
8712 // View can't have baseArrayLayer >= image's arraySize - Expect
8713 // VIEW_CREATE_ERROR
8714 imgViewInfo.subresourceRange.baseArrayLayer = 1;
8715 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
8716 m_errorMonitor->VerifyFound();
8717 imgViewInfo.subresourceRange.baseArrayLayer = 0;
8718
8719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8720 "vkCreateImageView called with 0 in "
8721 "pCreateInfo->subresourceRange."
8722 "levelCount");
8723 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
8724 imgViewInfo.subresourceRange.levelCount = 0;
8725 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
8726 m_errorMonitor->VerifyFound();
8727 imgViewInfo.subresourceRange.levelCount = 1;
8728
8729 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8730 "vkCreateImageView called with 0 in "
8731 "pCreateInfo->subresourceRange."
8732 "layerCount");
8733 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
8734 imgViewInfo.subresourceRange.layerCount = 0;
8735 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
8736 m_errorMonitor->VerifyFound();
8737 imgViewInfo.subresourceRange.layerCount = 1;
8738
8739 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8740 "but both must be color formats");
8741 // Can't use depth format for view into color image - Expect INVALID_FORMAT
8742 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
8743 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
8744 m_errorMonitor->VerifyFound();
8745 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
8746
8747 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8748 "Formats MUST be IDENTICAL unless "
8749 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
8750 "was set on image creation.");
8751 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
8752 // VIEW_CREATE_ERROR
8753 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
8754 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
8755 m_errorMonitor->VerifyFound();
8756 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
8757
8758 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8759 "can support ImageViews with "
8760 "differing formats but they must be "
8761 "in the same compatibility class.");
8762 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
8763 // VIEW_CREATE_ERROR
8764 VkImageCreateInfo mutImgInfo = image.create_info();
8765 VkImage mutImage;
8766 mutImgInfo.format = VK_FORMAT_R8_UINT;
8767 assert(
8768 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
8769 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
8770 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
8771 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8772 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
8773 ASSERT_VK_SUCCESS(ret);
8774 imgViewInfo.image = mutImage;
8775 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
8776 m_errorMonitor->VerifyFound();
8777 imgViewInfo.image = image.handle();
8778 vkDestroyImage(m_device->handle(), mutImage, NULL);
8779}
8780
8781TEST_F(VkLayerTest, MiscImageLayerTests) {
8782
8783 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
8784
8785 ASSERT_NO_FATAL_FAILURE(InitState());
8786
8787 VkImageObj image(m_device);
8788 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
8789 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
8790 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
8791 VK_IMAGE_TILING_OPTIMAL, 0);
8792 ASSERT_TRUE(image.initialized());
8793
8794 m_errorMonitor->SetDesiredFailureMsg(
8795 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8796 "number of layers in image subresource is zero");
8797 vk_testing::Buffer buffer;
8798 VkMemoryPropertyFlags reqs = 0;
8799 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
8800 VkBufferImageCopy region = {};
8801 region.bufferRowLength = 128;
8802 region.bufferImageHeight = 128;
8803 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8804 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
8805 region.imageSubresource.layerCount = 0;
8806 region.imageExtent.height = 4;
8807 region.imageExtent.width = 4;
8808 region.imageExtent.depth = 1;
8809 m_commandBuffer->BeginCommandBuffer();
8810 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
8811 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
8812 1, &region);
8813 m_errorMonitor->VerifyFound();
8814 region.imageSubresource.layerCount = 1;
8815
8816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8817 "aspectMasks for each region must "
8818 "specify only COLOR or DEPTH or "
8819 "STENCIL");
8820 // Expect MISMATCHED_IMAGE_ASPECT
8821 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
8822 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
8823 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
8824 1, &region);
8825 m_errorMonitor->VerifyFound();
8826 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8827
8828 m_errorMonitor->SetDesiredFailureMsg(
8829 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8830 "If the format of srcImage is a depth, stencil, depth stencil or "
8831 "integer-based format then filter must be VK_FILTER_NEAREST");
8832 // Expect INVALID_FILTER
8833 VkImageObj intImage1(m_device);
8834 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
8835 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
8836 0);
8837 VkImageObj intImage2(m_device);
8838 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
8839 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
8840 0);
8841 VkImageBlit blitRegion = {};
8842 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8843 blitRegion.srcSubresource.baseArrayLayer = 0;
8844 blitRegion.srcSubresource.layerCount = 1;
8845 blitRegion.srcSubresource.mipLevel = 0;
8846 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8847 blitRegion.dstSubresource.baseArrayLayer = 0;
8848 blitRegion.dstSubresource.layerCount = 1;
8849 blitRegion.dstSubresource.mipLevel = 0;
8850
8851 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
8852 intImage1.layout(), intImage2.handle(), intImage2.layout(),
8853 16, &blitRegion, VK_FILTER_LINEAR);
8854 m_errorMonitor->VerifyFound();
8855
8856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8857 "called with 0 in ppMemoryBarriers");
8858 VkImageMemoryBarrier img_barrier;
8859 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8860 img_barrier.pNext = NULL;
8861 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8862 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8863 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8864 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8865 img_barrier.image = image.handle();
8866 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8867 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8868 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8869 img_barrier.subresourceRange.baseArrayLayer = 0;
8870 img_barrier.subresourceRange.baseMipLevel = 0;
8871 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
8872 img_barrier.subresourceRange.layerCount = 0;
8873 img_barrier.subresourceRange.levelCount = 1;
8874 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
8875 VK_PIPELINE_STAGE_HOST_BIT,
8876 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
8877 nullptr, 1, &img_barrier);
8878 m_errorMonitor->VerifyFound();
8879 img_barrier.subresourceRange.layerCount = 1;
8880}
8881
8882TEST_F(VkLayerTest, ImageFormatLimits) {
8883
8884 TEST_DESCRIPTION("Exceed the limits of image format ");
8885
8886 m_errorMonitor->SetDesiredFailureMsg(
8887 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8888 "CreateImage extents exceed allowable limits for format");
8889 VkImageCreateInfo image_create_info = {};
8890 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8891 image_create_info.pNext = NULL;
8892 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8893 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8894 image_create_info.extent.width = 32;
8895 image_create_info.extent.height = 32;
8896 image_create_info.extent.depth = 1;
8897 image_create_info.mipLevels = 1;
8898 image_create_info.arrayLayers = 1;
8899 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8900 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8901 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8902 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8903 image_create_info.flags = 0;
8904
8905 VkImage nullImg;
8906 VkImageFormatProperties imgFmtProps;
8907 vkGetPhysicalDeviceImageFormatProperties(
8908 gpu(), image_create_info.format, image_create_info.imageType,
8909 image_create_info.tiling, image_create_info.usage,
8910 image_create_info.flags, &imgFmtProps);
8911 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
8912 // Expect INVALID_FORMAT_LIMITS_VIOLATION
8913 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
8914 m_errorMonitor->VerifyFound();
8915 image_create_info.extent.depth = 1;
8916
8917 m_errorMonitor->SetDesiredFailureMsg(
8918 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8919 "exceeds allowable maximum supported by format of");
8920 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
8921 // Expect INVALID_FORMAT_LIMITS_VIOLATION
8922 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
8923 m_errorMonitor->VerifyFound();
8924 image_create_info.mipLevels = 1;
8925
8926 m_errorMonitor->SetDesiredFailureMsg(
8927 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8928 "exceeds allowable maximum supported by format of");
8929 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
8930 // Expect INVALID_FORMAT_LIMITS_VIOLATION
8931 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
8932 m_errorMonitor->VerifyFound();
8933 image_create_info.arrayLayers = 1;
8934
8935 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8936 "is not supported by format");
8937 int samples = imgFmtProps.sampleCounts >> 1;
8938 image_create_info.samples = (VkSampleCountFlagBits)samples;
8939 // Expect INVALID_FORMAT_LIMITS_VIOLATION
8940 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
8941 m_errorMonitor->VerifyFound();
8942 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8943
8944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8945 "pCreateInfo->initialLayout, must be "
8946 "VK_IMAGE_LAYOUT_UNDEFINED or "
8947 "VK_IMAGE_LAYOUT_PREINITIALIZED");
8948 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8949 // Expect INVALID_LAYOUT
8950 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
8951 m_errorMonitor->VerifyFound();
8952 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8953}
8954
Karl Schultz6addd812016-02-02 17:17:23 -07008955TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06008956 VkResult err;
8957 bool pass;
8958
8959 // Create color images with different format sizes and try to copy between them
8960 m_errorMonitor->SetDesiredFailureMsg(
8961 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8962 "vkCmdCopyImage called with unmatched source and dest image format sizes");
8963
8964 ASSERT_NO_FATAL_FAILURE(InitState());
8965
8966 // Create two images of different types and try to copy between them
8967 VkImage srcImage;
8968 VkImage dstImage;
8969 VkDeviceMemory srcMem;
8970 VkDeviceMemory destMem;
8971 VkMemoryRequirements memReqs;
8972
8973 VkImageCreateInfo image_create_info = {};
8974 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8975 image_create_info.pNext = NULL;
8976 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8977 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8978 image_create_info.extent.width = 32;
8979 image_create_info.extent.height = 32;
8980 image_create_info.extent.depth = 1;
8981 image_create_info.mipLevels = 1;
8982 image_create_info.arrayLayers = 1;
8983 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8984 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8985 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8986 image_create_info.flags = 0;
8987
8988 err =
8989 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
8990 ASSERT_VK_SUCCESS(err);
8991
8992 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
8993 // Introduce failure by creating second image with a different-sized format.
8994 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
8995
8996 err =
8997 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
8998 ASSERT_VK_SUCCESS(err);
8999
9000 // Allocate memory
9001 VkMemoryAllocateInfo memAlloc = {};
9002 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9003 memAlloc.pNext = NULL;
9004 memAlloc.allocationSize = 0;
9005 memAlloc.memoryTypeIndex = 0;
9006
9007 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
9008 memAlloc.allocationSize = memReqs.size;
9009 pass =
9010 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
9011 ASSERT_TRUE(pass);
9012 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
9013 ASSERT_VK_SUCCESS(err);
9014
9015 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
9016 memAlloc.allocationSize = memReqs.size;
9017 pass =
9018 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
9019 ASSERT_TRUE(pass);
9020 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
9021 ASSERT_VK_SUCCESS(err);
9022
9023 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9024 ASSERT_VK_SUCCESS(err);
9025 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
9026 ASSERT_VK_SUCCESS(err);
9027
9028 BeginCommandBuffer();
9029 VkImageCopy copyRegion;
9030 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9031 copyRegion.srcSubresource.mipLevel = 0;
9032 copyRegion.srcSubresource.baseArrayLayer = 0;
9033 copyRegion.srcSubresource.layerCount = 0;
9034 copyRegion.srcOffset.x = 0;
9035 copyRegion.srcOffset.y = 0;
9036 copyRegion.srcOffset.z = 0;
9037 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9038 copyRegion.dstSubresource.mipLevel = 0;
9039 copyRegion.dstSubresource.baseArrayLayer = 0;
9040 copyRegion.dstSubresource.layerCount = 0;
9041 copyRegion.dstOffset.x = 0;
9042 copyRegion.dstOffset.y = 0;
9043 copyRegion.dstOffset.z = 0;
9044 copyRegion.extent.width = 1;
9045 copyRegion.extent.height = 1;
9046 copyRegion.extent.depth = 1;
9047 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9048 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
9049 EndCommandBuffer();
9050
9051 m_errorMonitor->VerifyFound();
9052
9053 vkDestroyImage(m_device->device(), srcImage, NULL);
9054 vkDestroyImage(m_device->device(), dstImage, NULL);
9055 vkFreeMemory(m_device->device(), srcMem, NULL);
9056 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009057}
9058
Karl Schultz6addd812016-02-02 17:17:23 -07009059TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
9060 VkResult err;
9061 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009062
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009063 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009064 m_errorMonitor->SetDesiredFailureMsg(
9065 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009066 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009067
Mike Stroyana3082432015-09-25 13:39:21 -06009068 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009069
9070 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009071 VkImage srcImage;
9072 VkImage dstImage;
9073 VkDeviceMemory srcMem;
9074 VkDeviceMemory destMem;
9075 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009076
9077 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009078 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9079 image_create_info.pNext = NULL;
9080 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9081 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9082 image_create_info.extent.width = 32;
9083 image_create_info.extent.height = 32;
9084 image_create_info.extent.depth = 1;
9085 image_create_info.mipLevels = 1;
9086 image_create_info.arrayLayers = 1;
9087 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9088 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9089 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9090 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009091
Karl Schultz6addd812016-02-02 17:17:23 -07009092 err =
9093 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009094 ASSERT_VK_SUCCESS(err);
9095
Karl Schultzbdb75952016-04-19 11:36:49 -06009096 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
9097
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009098 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07009099 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009100 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
9101 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009102
Karl Schultz6addd812016-02-02 17:17:23 -07009103 err =
9104 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009105 ASSERT_VK_SUCCESS(err);
9106
9107 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009108 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009109 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9110 memAlloc.pNext = NULL;
9111 memAlloc.allocationSize = 0;
9112 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009113
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009114 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009115 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009116 pass =
9117 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009118 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009119 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009120 ASSERT_VK_SUCCESS(err);
9121
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009122 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009123 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009124 pass =
9125 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009126 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009127 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009128 ASSERT_VK_SUCCESS(err);
9129
9130 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9131 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009132 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009133 ASSERT_VK_SUCCESS(err);
9134
9135 BeginCommandBuffer();
9136 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009137 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009138 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009139 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009140 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009141 copyRegion.srcOffset.x = 0;
9142 copyRegion.srcOffset.y = 0;
9143 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009144 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009145 copyRegion.dstSubresource.mipLevel = 0;
9146 copyRegion.dstSubresource.baseArrayLayer = 0;
9147 copyRegion.dstSubresource.layerCount = 0;
9148 copyRegion.dstOffset.x = 0;
9149 copyRegion.dstOffset.y = 0;
9150 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009151 copyRegion.extent.width = 1;
9152 copyRegion.extent.height = 1;
9153 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009154 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9155 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009156 EndCommandBuffer();
9157
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009158 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009159
Chia-I Wuf7458c52015-10-26 21:10:41 +08009160 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009161 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009162 vkFreeMemory(m_device->device(), srcMem, NULL);
9163 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009164}
9165
Karl Schultz6addd812016-02-02 17:17:23 -07009166TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
9167 VkResult err;
9168 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009169
Karl Schultz6addd812016-02-02 17:17:23 -07009170 m_errorMonitor->SetDesiredFailureMsg(
9171 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009172 "vkCmdResolveImage called with source sample count less than 2.");
9173
Mike Stroyana3082432015-09-25 13:39:21 -06009174 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009175
9176 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07009177 VkImage srcImage;
9178 VkImage dstImage;
9179 VkDeviceMemory srcMem;
9180 VkDeviceMemory destMem;
9181 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009182
9183 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009184 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9185 image_create_info.pNext = NULL;
9186 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9187 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9188 image_create_info.extent.width = 32;
9189 image_create_info.extent.height = 1;
9190 image_create_info.extent.depth = 1;
9191 image_create_info.mipLevels = 1;
9192 image_create_info.arrayLayers = 1;
9193 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9194 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9195 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9196 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009197
Karl Schultz6addd812016-02-02 17:17:23 -07009198 err =
9199 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009200 ASSERT_VK_SUCCESS(err);
9201
Karl Schultz6addd812016-02-02 17:17:23 -07009202 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009203
Karl Schultz6addd812016-02-02 17:17:23 -07009204 err =
9205 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009206 ASSERT_VK_SUCCESS(err);
9207
9208 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009209 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009210 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9211 memAlloc.pNext = NULL;
9212 memAlloc.allocationSize = 0;
9213 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009214
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009215 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009216 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009217 pass =
9218 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009219 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009220 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009221 ASSERT_VK_SUCCESS(err);
9222
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009223 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009224 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009225 pass =
9226 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009227 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009228 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009229 ASSERT_VK_SUCCESS(err);
9230
9231 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9232 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009233 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009234 ASSERT_VK_SUCCESS(err);
9235
9236 BeginCommandBuffer();
9237 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009238 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9239 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009240 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009241 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009242 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009243 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009244 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009245 resolveRegion.srcOffset.x = 0;
9246 resolveRegion.srcOffset.y = 0;
9247 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009248 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009249 resolveRegion.dstSubresource.mipLevel = 0;
9250 resolveRegion.dstSubresource.baseArrayLayer = 0;
9251 resolveRegion.dstSubresource.layerCount = 0;
9252 resolveRegion.dstOffset.x = 0;
9253 resolveRegion.dstOffset.y = 0;
9254 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009255 resolveRegion.extent.width = 1;
9256 resolveRegion.extent.height = 1;
9257 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009258 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9259 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009260 EndCommandBuffer();
9261
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009262 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009263
Chia-I Wuf7458c52015-10-26 21:10:41 +08009264 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009265 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009266 vkFreeMemory(m_device->device(), srcMem, NULL);
9267 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009268}
9269
Karl Schultz6addd812016-02-02 17:17:23 -07009270TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
9271 VkResult err;
9272 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009273
Karl Schultz6addd812016-02-02 17:17:23 -07009274 m_errorMonitor->SetDesiredFailureMsg(
9275 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009276 "vkCmdResolveImage called with dest sample count greater than 1.");
9277
Mike Stroyana3082432015-09-25 13:39:21 -06009278 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009279
Chris Forbesa7530692016-05-08 12:35:39 +12009280 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07009281 VkImage srcImage;
9282 VkImage dstImage;
9283 VkDeviceMemory srcMem;
9284 VkDeviceMemory destMem;
9285 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009286
9287 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009288 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9289 image_create_info.pNext = NULL;
9290 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9291 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9292 image_create_info.extent.width = 32;
9293 image_create_info.extent.height = 1;
9294 image_create_info.extent.depth = 1;
9295 image_create_info.mipLevels = 1;
9296 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +12009297 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07009298 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9299 // Note: Some implementations expect color attachment usage for any
9300 // multisample surface
9301 image_create_info.usage =
9302 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9303 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009304
Karl Schultz6addd812016-02-02 17:17:23 -07009305 err =
9306 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009307 ASSERT_VK_SUCCESS(err);
9308
Karl Schultz6addd812016-02-02 17:17:23 -07009309 // Note: Some implementations expect color attachment usage for any
9310 // multisample surface
9311 image_create_info.usage =
9312 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009313
Karl Schultz6addd812016-02-02 17:17:23 -07009314 err =
9315 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009316 ASSERT_VK_SUCCESS(err);
9317
9318 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009319 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009320 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9321 memAlloc.pNext = NULL;
9322 memAlloc.allocationSize = 0;
9323 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009324
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009325 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009326 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009327 pass =
9328 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009329 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009330 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009331 ASSERT_VK_SUCCESS(err);
9332
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009333 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009334 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009335 pass =
9336 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009337 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009338 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009339 ASSERT_VK_SUCCESS(err);
9340
9341 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9342 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009343 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009344 ASSERT_VK_SUCCESS(err);
9345
9346 BeginCommandBuffer();
9347 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009348 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9349 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009350 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009351 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009352 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009353 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009354 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009355 resolveRegion.srcOffset.x = 0;
9356 resolveRegion.srcOffset.y = 0;
9357 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009358 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009359 resolveRegion.dstSubresource.mipLevel = 0;
9360 resolveRegion.dstSubresource.baseArrayLayer = 0;
9361 resolveRegion.dstSubresource.layerCount = 0;
9362 resolveRegion.dstOffset.x = 0;
9363 resolveRegion.dstOffset.y = 0;
9364 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009365 resolveRegion.extent.width = 1;
9366 resolveRegion.extent.height = 1;
9367 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009368 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9369 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009370 EndCommandBuffer();
9371
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009372 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009373
Chia-I Wuf7458c52015-10-26 21:10:41 +08009374 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009375 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009376 vkFreeMemory(m_device->device(), srcMem, NULL);
9377 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009378}
9379
Karl Schultz6addd812016-02-02 17:17:23 -07009380TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
9381 VkResult err;
9382 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009383
Karl Schultz6addd812016-02-02 17:17:23 -07009384 m_errorMonitor->SetDesiredFailureMsg(
9385 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009386 "vkCmdResolveImage called with unmatched source and dest formats.");
9387
Mike Stroyana3082432015-09-25 13:39:21 -06009388 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009389
9390 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009391 VkImage srcImage;
9392 VkImage dstImage;
9393 VkDeviceMemory srcMem;
9394 VkDeviceMemory destMem;
9395 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009396
9397 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009398 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9399 image_create_info.pNext = NULL;
9400 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9401 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9402 image_create_info.extent.width = 32;
9403 image_create_info.extent.height = 1;
9404 image_create_info.extent.depth = 1;
9405 image_create_info.mipLevels = 1;
9406 image_create_info.arrayLayers = 1;
9407 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
9408 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9409 // Note: Some implementations expect color attachment usage for any
9410 // multisample surface
9411 image_create_info.usage =
9412 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9413 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009414
Karl Schultz6addd812016-02-02 17:17:23 -07009415 err =
9416 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009417 ASSERT_VK_SUCCESS(err);
9418
Karl Schultz6addd812016-02-02 17:17:23 -07009419 // Set format to something other than source image
9420 image_create_info.format = VK_FORMAT_R32_SFLOAT;
9421 // Note: Some implementations expect color attachment usage for any
9422 // multisample surface
9423 image_create_info.usage =
9424 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9425 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009426
Karl Schultz6addd812016-02-02 17:17:23 -07009427 err =
9428 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009429 ASSERT_VK_SUCCESS(err);
9430
9431 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009432 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009433 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9434 memAlloc.pNext = NULL;
9435 memAlloc.allocationSize = 0;
9436 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009437
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009438 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009439 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009440 pass =
9441 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009442 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009443 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009444 ASSERT_VK_SUCCESS(err);
9445
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009446 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009447 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009448 pass =
9449 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009450 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009451 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009452 ASSERT_VK_SUCCESS(err);
9453
9454 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9455 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009456 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009457 ASSERT_VK_SUCCESS(err);
9458
9459 BeginCommandBuffer();
9460 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009461 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9462 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009463 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009464 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009465 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009466 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009467 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009468 resolveRegion.srcOffset.x = 0;
9469 resolveRegion.srcOffset.y = 0;
9470 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009471 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009472 resolveRegion.dstSubresource.mipLevel = 0;
9473 resolveRegion.dstSubresource.baseArrayLayer = 0;
9474 resolveRegion.dstSubresource.layerCount = 0;
9475 resolveRegion.dstOffset.x = 0;
9476 resolveRegion.dstOffset.y = 0;
9477 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009478 resolveRegion.extent.width = 1;
9479 resolveRegion.extent.height = 1;
9480 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009481 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9482 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009483 EndCommandBuffer();
9484
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009485 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009486
Chia-I Wuf7458c52015-10-26 21:10:41 +08009487 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009488 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009489 vkFreeMemory(m_device->device(), srcMem, NULL);
9490 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009491}
9492
Karl Schultz6addd812016-02-02 17:17:23 -07009493TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
9494 VkResult err;
9495 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009496
Karl Schultz6addd812016-02-02 17:17:23 -07009497 m_errorMonitor->SetDesiredFailureMsg(
9498 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009499 "vkCmdResolveImage called with unmatched source and dest image types.");
9500
Mike Stroyana3082432015-09-25 13:39:21 -06009501 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009502
9503 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009504 VkImage srcImage;
9505 VkImage dstImage;
9506 VkDeviceMemory srcMem;
9507 VkDeviceMemory destMem;
9508 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009509
9510 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009511 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9512 image_create_info.pNext = NULL;
9513 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9514 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9515 image_create_info.extent.width = 32;
9516 image_create_info.extent.height = 1;
9517 image_create_info.extent.depth = 1;
9518 image_create_info.mipLevels = 1;
9519 image_create_info.arrayLayers = 1;
9520 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
9521 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9522 // Note: Some implementations expect color attachment usage for any
9523 // multisample surface
9524 image_create_info.usage =
9525 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9526 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009527
Karl Schultz6addd812016-02-02 17:17:23 -07009528 err =
9529 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009530 ASSERT_VK_SUCCESS(err);
9531
Karl Schultz6addd812016-02-02 17:17:23 -07009532 image_create_info.imageType = VK_IMAGE_TYPE_1D;
9533 // Note: Some implementations expect color attachment usage for any
9534 // multisample surface
9535 image_create_info.usage =
9536 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9537 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009538
Karl Schultz6addd812016-02-02 17:17:23 -07009539 err =
9540 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009541 ASSERT_VK_SUCCESS(err);
9542
9543 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009544 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009545 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9546 memAlloc.pNext = NULL;
9547 memAlloc.allocationSize = 0;
9548 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009549
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009550 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009551 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009552 pass =
9553 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009554 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009555 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009556 ASSERT_VK_SUCCESS(err);
9557
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009558 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009559 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009560 pass =
9561 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009562 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009563 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009564 ASSERT_VK_SUCCESS(err);
9565
9566 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9567 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009568 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009569 ASSERT_VK_SUCCESS(err);
9570
9571 BeginCommandBuffer();
9572 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009573 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9574 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009575 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009576 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009577 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009578 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009579 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009580 resolveRegion.srcOffset.x = 0;
9581 resolveRegion.srcOffset.y = 0;
9582 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009583 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009584 resolveRegion.dstSubresource.mipLevel = 0;
9585 resolveRegion.dstSubresource.baseArrayLayer = 0;
9586 resolveRegion.dstSubresource.layerCount = 0;
9587 resolveRegion.dstOffset.x = 0;
9588 resolveRegion.dstOffset.y = 0;
9589 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009590 resolveRegion.extent.width = 1;
9591 resolveRegion.extent.height = 1;
9592 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009593 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9594 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009595 EndCommandBuffer();
9596
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009597 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009598
Chia-I Wuf7458c52015-10-26 21:10:41 +08009599 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009600 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009601 vkFreeMemory(m_device->device(), srcMem, NULL);
9602 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009603}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009604
Karl Schultz6addd812016-02-02 17:17:23 -07009605TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009606 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07009607 // to using a DS format, then cause it to hit error due to COLOR_BIT not
9608 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009609 // The image format check comes 2nd in validation so we trigger it first,
9610 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07009611 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009612
Karl Schultz6addd812016-02-02 17:17:23 -07009613 m_errorMonitor->SetDesiredFailureMsg(
9614 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009615 "Combination depth/stencil image formats can have only the ");
9616
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009617 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009618
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009619 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009620 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
9621 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009622
9623 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009624 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9625 ds_pool_ci.pNext = NULL;
9626 ds_pool_ci.maxSets = 1;
9627 ds_pool_ci.poolSizeCount = 1;
9628 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009629
9630 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009631 err =
9632 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009633 ASSERT_VK_SUCCESS(err);
9634
9635 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009636 dsl_binding.binding = 0;
9637 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
9638 dsl_binding.descriptorCount = 1;
9639 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9640 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009641
9642 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009643 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9644 ds_layout_ci.pNext = NULL;
9645 ds_layout_ci.bindingCount = 1;
9646 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009647 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009648 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9649 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009650 ASSERT_VK_SUCCESS(err);
9651
9652 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009653 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009654 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009655 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009656 alloc_info.descriptorPool = ds_pool;
9657 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009658 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9659 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009660 ASSERT_VK_SUCCESS(err);
9661
Karl Schultz6addd812016-02-02 17:17:23 -07009662 VkImage image_bad;
9663 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009664 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07009665 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009666 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07009667 const int32_t tex_width = 32;
9668 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009669
9670 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009671 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9672 image_create_info.pNext = NULL;
9673 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9674 image_create_info.format = tex_format_bad;
9675 image_create_info.extent.width = tex_width;
9676 image_create_info.extent.height = tex_height;
9677 image_create_info.extent.depth = 1;
9678 image_create_info.mipLevels = 1;
9679 image_create_info.arrayLayers = 1;
9680 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9681 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9682 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
9683 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
9684 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009685
Karl Schultz6addd812016-02-02 17:17:23 -07009686 err =
9687 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009688 ASSERT_VK_SUCCESS(err);
9689 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07009690 image_create_info.usage =
9691 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9692 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
9693 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009694 ASSERT_VK_SUCCESS(err);
9695
9696 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009697 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9698 image_view_create_info.image = image_bad;
9699 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
9700 image_view_create_info.format = tex_format_bad;
9701 image_view_create_info.subresourceRange.baseArrayLayer = 0;
9702 image_view_create_info.subresourceRange.baseMipLevel = 0;
9703 image_view_create_info.subresourceRange.layerCount = 1;
9704 image_view_create_info.subresourceRange.levelCount = 1;
9705 image_view_create_info.subresourceRange.aspectMask =
9706 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009707
9708 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07009709 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
9710 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009711
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009712 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009713
Chia-I Wuf7458c52015-10-26 21:10:41 +08009714 vkDestroyImage(m_device->device(), image_bad, NULL);
9715 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009716 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9717 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009718}
Tobin Ehliscde08892015-09-22 10:11:37 -06009719#endif // IMAGE_TESTS
9720
Tony Barbour300a6082015-04-07 13:44:53 -06009721int main(int argc, char **argv) {
9722 int result;
9723
Cody Northrop8e54a402016-03-08 22:25:52 -07009724#ifdef ANDROID
9725 int vulkanSupport = InitVulkan();
9726 if (vulkanSupport == 0)
9727 return 1;
9728#endif
9729
Tony Barbour300a6082015-04-07 13:44:53 -06009730 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06009731 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06009732
9733 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
9734
9735 result = RUN_ALL_TESTS();
9736
Tony Barbour6918cd52015-04-09 12:58:51 -06009737 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06009738 return result;
9739}