blob: 6771f68adc982c42171aa83f75cb7bca22d18a14 [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
Tobin Ehlis0788f522015-05-26 16:11:58 -060036#define MEM_TRACKER_TESTS 1
37#define OBJ_TRACKER_TESTS 1
38#define DRAW_STATE_TESTS 1
39#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120040#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060041#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060042#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060043
Mark Lobodzinski3780e142015-05-14 15:08:13 -050044//--------------------------------------------------------------------------------------
45// Mesh and VertexFormat Data
46//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070047struct Vertex {
48 float posX, posY, posZ, posW; // Position data
49 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050050};
51
Karl Schultz6addd812016-02-02 17:17:23 -070052#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050053
54typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070055 BsoFailNone = 0x00000000,
56 BsoFailLineWidth = 0x00000001,
57 BsoFailDepthBias = 0x00000002,
58 BsoFailViewport = 0x00000004,
59 BsoFailScissor = 0x00000008,
60 BsoFailBlend = 0x00000010,
61 BsoFailDepthBounds = 0x00000020,
62 BsoFailStencilReadMask = 0x00000040,
63 BsoFailStencilWriteMask = 0x00000080,
64 BsoFailStencilReference = 0x00000100,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050065} BsoFailSelect;
66
67struct vktriangle_vs_uniform {
68 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070069 float mvp[4][4];
70 float position[3][4];
71 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050072};
73
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050074static const char bindStateVertShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120075 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070076 "vec2 vertices[3];\n"
77 "out gl_PerVertex {\n"
78 " vec4 gl_Position;\n"
79 "};\n"
80 "void main() {\n"
81 " vertices[0] = vec2(-1.0, -1.0);\n"
82 " vertices[1] = vec2( 1.0, -1.0);\n"
83 " vertices[2] = vec2( 0.0, 1.0);\n"
84 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
85 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050086
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050087static const char bindStateFragShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120088 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070089 "\n"
90 "layout(location = 0) out vec4 uFragColor;\n"
91 "void main(){\n"
92 " uFragColor = vec4(0,1,0,1);\n"
93 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050094
Karl Schultz6addd812016-02-02 17:17:23 -070095static VKAPI_ATTR VkBool32 VKAPI_CALL
96myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
97 uint64_t srcObject, size_t location, int32_t msgCode,
98 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -060099
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600100// ********************************************************
101// ErrorMonitor Usage:
102//
103// Call SetDesiredFailureMsg with a string to be compared against all
104// encountered log messages. Passing NULL will match all log messages.
105// logMsg will return true for skipCall only if msg is matched or NULL.
106//
107// Call DesiredMsgFound to determine if the desired failure message
108// was encountered.
109
Tony Barbour300a6082015-04-07 13:44:53 -0600110class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700111 public:
112 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600113 test_platform_thread_create_mutex(&m_mutex);
114 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700115 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700116 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600117 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600118 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600119
Karl Schultz6addd812016-02-02 17:17:23 -0700120 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200121 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600122 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600123 m_failureMsg.clear();
124 m_otherMsgs.clear();
125 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700126 m_msgFound = VK_FALSE;
127 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600128 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600129 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600130
Karl Schultz6addd812016-02-02 17:17:23 -0700131 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600132 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600133 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600134 if (m_bailout != NULL) {
135 *m_bailout = true;
136 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600137 string errorString(msgString);
138 if (msgFlags & m_msgFlags) {
139 if (errorString.find(m_desiredMsg) != string::npos) {
Chris Forbesc7b8ad72016-04-04 18:50:38 +1200140 if (m_msgFound) { /* if multiple matches, don't lose all but the last! */
141 m_otherMsgs.push_back(m_failureMsg);
142 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600143 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700144 m_msgFound = VK_TRUE;
145 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600146 } else {
147 m_otherMsgs.push_back(errorString);
148 }
149 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600150 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600151 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600152 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600153
Karl Schultz6addd812016-02-02 17:17:23 -0700154 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600155
Karl Schultz6addd812016-02-02 17:17:23 -0700156 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600157
Karl Schultz6addd812016-02-02 17:17:23 -0700158 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600159
Karl Schultz6addd812016-02-02 17:17:23 -0700160 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600161
Karl Schultz6addd812016-02-02 17:17:23 -0700162 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600163 vector<string> otherMsgs = GetOtherFailureMsgs();
164 cout << "Other error messages logged for this test were:" << endl;
165 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
166 cout << " " << *iter << endl;
167 }
168 }
169
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200170 /* helpers */
171
172 void ExpectSuccess() {
173 // match anything
174 SetDesiredFailureMsg(~0u, "");
175 }
176
177 void VerifyFound() {
178 // Not seeing the desired message is a failure. /Before/ throwing, dump
179 // any other messages.
180 if (!DesiredMsgFound()) {
181 DumpFailureMsgs();
182 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
183 }
184 }
185
186 void VerifyNotFound() {
187 // ExpectSuccess() configured us to match anything. Any error is a
188 // failure.
189 if (DesiredMsgFound()) {
190 DumpFailureMsgs();
191 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
192 }
193 }
194
Karl Schultz6addd812016-02-02 17:17:23 -0700195 private:
196 VkFlags m_msgFlags;
197 string m_desiredMsg;
198 string m_failureMsg;
199 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600200 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700201 bool *m_bailout;
202 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600203};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500204
Karl Schultz6addd812016-02-02 17:17:23 -0700205static VKAPI_ATTR VkBool32 VKAPI_CALL
206myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
207 uint64_t srcObject, size_t location, int32_t msgCode,
208 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
209 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700210 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700211 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600212 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600213 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600214 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600215 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600216}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500217
Karl Schultz6addd812016-02-02 17:17:23 -0700218class VkLayerTest : public VkRenderFramework {
219 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800220 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
221 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700222 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
223 BsoFailSelect failMask);
224 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
225 VkPipelineObj &pipelineobj,
226 VkDescriptorSetObj &descriptorSet,
227 BsoFailSelect failMask);
228 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
229 VkDescriptorSetObj &descriptorSet,
230 BsoFailSelect failMask) {
231 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
232 failMask);
233 }
Tony Barbour300a6082015-04-07 13:44:53 -0600234
Tony Barbourfe3351b2015-07-28 10:17:20 -0600235 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700236 VkResult BeginCommandBuffer() {
237 return BeginCommandBuffer(*m_commandBuffer);
238 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800239 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700240 void Draw(uint32_t vertexCount, uint32_t instanceCount,
241 uint32_t firstVertex, uint32_t firstInstance) {
242 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
243 firstInstance);
244 }
245 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
246 uint32_t firstIndex, int32_t vertexOffset,
247 uint32_t firstInstance) {
248 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
249 vertexOffset, firstInstance);
250 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800251 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); }
Karl Schultz6addd812016-02-02 17:17:23 -0700252 void QueueCommandBuffer(const VkFence &fence) {
253 m_commandBuffer->QueueCommandBuffer(fence);
254 }
255 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
256 VkDeviceSize offset, uint32_t binding) {
257 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
258 }
259 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
260 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
261 }
262
263 protected:
264 ErrorMonitor *m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600265
266 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600267 std::vector<const char *> instance_layer_names;
268 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600269 std::vector<const char *> instance_extension_names;
270 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600271
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700272 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600273 /*
274 * Since CreateDbgMsgCallback is an instance level extension call
275 * any extension / layer that utilizes that feature also needs
276 * to be enabled at create instance time.
277 */
Karl Schultz6addd812016-02-02 17:17:23 -0700278 // Use Threading layer first to protect others from
279 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700280 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600281 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800282 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700283 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800284 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
285 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700286 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600287
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700288 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600289 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800290 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700291 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800292 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
293 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700294 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600295
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600296 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600297 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800298 this->app_info.pApplicationName = "layer_tests";
299 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600300 this->app_info.pEngineName = "unittest";
301 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600302 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600303
Tony Barbour15524c32015-04-29 17:34:29 -0600304 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600305 InitFramework(instance_layer_names, device_layer_names,
306 instance_extension_names, device_extension_names,
307 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600308 }
309
310 virtual void TearDown() {
311 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600312 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600313 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600314 }
315};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500316
Karl Schultz6addd812016-02-02 17:17:23 -0700317VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600318 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600319
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800320 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600321
322 /*
323 * For render test all drawing happens in a single render pass
324 * on a single command buffer.
325 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200326 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800327 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600328 }
329
330 return result;
331}
332
Karl Schultz6addd812016-02-02 17:17:23 -0700333VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600334 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600335
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200336 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800337 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200338 }
Tony Barbour300a6082015-04-07 13:44:53 -0600339
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800340 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600341
342 return result;
343}
344
Karl Schultz6addd812016-02-02 17:17:23 -0700345void VkLayerTest::VKTriangleTest(const char *vertShaderText,
346 const char *fragShaderText,
347 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500348 // Create identity matrix
349 int i;
350 struct vktriangle_vs_uniform data;
351
352 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700353 glm::mat4 View = glm::mat4(1.0f);
354 glm::mat4 Model = glm::mat4(1.0f);
355 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500356 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700357 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500358
359 memcpy(&data.mvp, &MVP[0][0], matrixSize);
360
Karl Schultz6addd812016-02-02 17:17:23 -0700361 static const Vertex tri_data[] = {
362 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
363 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
364 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500365 };
366
Karl Schultz6addd812016-02-02 17:17:23 -0700367 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500368 data.position[i][0] = tri_data[i].posX;
369 data.position[i][1] = tri_data[i].posY;
370 data.position[i][2] = tri_data[i].posZ;
371 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700372 data.color[i][0] = tri_data[i].r;
373 data.color[i][1] = tri_data[i].g;
374 data.color[i][2] = tri_data[i].b;
375 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500376 }
377
378 ASSERT_NO_FATAL_FAILURE(InitState());
379 ASSERT_NO_FATAL_FAILURE(InitViewport());
380
Karl Schultz6addd812016-02-02 17:17:23 -0700381 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
382 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500383
Karl Schultz6addd812016-02-02 17:17:23 -0700384 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
385 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
386 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500387
388 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800389 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500390 pipelineobj.AddShader(&vs);
391 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600392 if (failMask & BsoFailLineWidth) {
393 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600394 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
395 ia_state.sType =
396 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
397 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
398 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600399 }
400 if (failMask & BsoFailDepthBias) {
401 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600402 VkPipelineRasterizationStateCreateInfo rs_state = {};
403 rs_state.sType =
404 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
405 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600406 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600407 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600408 }
Karl Schultz6addd812016-02-02 17:17:23 -0700409 // Viewport and scissors must stay in synch or other errors will occur than
410 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600411 if (failMask & BsoFailViewport) {
412 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600413 m_viewports.clear();
414 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600415 }
416 if (failMask & BsoFailScissor) {
417 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600418 m_scissors.clear();
419 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600420 }
421 if (failMask & BsoFailBlend) {
422 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600423 VkPipelineColorBlendAttachmentState att_state = {};
424 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
425 att_state.blendEnable = VK_TRUE;
426 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600427 }
428 if (failMask & BsoFailDepthBounds) {
429 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
430 }
431 if (failMask & BsoFailStencilReadMask) {
432 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
433 }
434 if (failMask & BsoFailStencilWriteMask) {
435 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
436 }
437 if (failMask & BsoFailStencilReference) {
438 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
439 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500440
441 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700442 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
443 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500444
445 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600446 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500447
Tony Barbourfe3351b2015-07-28 10:17:20 -0600448 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500449
450 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600451 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500452
453 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600454 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500455
Tony Barbourfe3351b2015-07-28 10:17:20 -0600456 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500457}
458
Karl Schultz6addd812016-02-02 17:17:23 -0700459void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
460 VkPipelineObj &pipelineobj,
461 VkDescriptorSetObj &descriptorSet,
462 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500463 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700464 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
465 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500466 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700467 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
468 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500469 }
470
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800471 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700472 // Make sure depthWriteEnable is set so that Depth fail test will work
473 // correctly
474 // Make sure stencilTestEnable is set so that Stencil fail test will work
475 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600476 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800477 stencil.failOp = VK_STENCIL_OP_KEEP;
478 stencil.passOp = VK_STENCIL_OP_KEEP;
479 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
480 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600481
482 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
483 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600484 ds_ci.pNext = NULL;
485 ds_ci.depthTestEnable = VK_FALSE;
486 ds_ci.depthWriteEnable = VK_TRUE;
487 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
488 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600489 if (failMask & BsoFailDepthBounds) {
490 ds_ci.depthBoundsTestEnable = VK_TRUE;
491 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600492 ds_ci.stencilTestEnable = VK_TRUE;
493 ds_ci.front = stencil;
494 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600495
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600496 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600497 pipelineobj.SetViewport(m_viewports);
498 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800499 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700500 VkResult err = pipelineobj.CreateVKPipeline(
501 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600502 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800503 commandBuffer->BindPipeline(pipelineobj);
504 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500505}
506
507// ********************************************************************************************************************
508// ********************************************************************************************************************
509// ********************************************************************************************************************
510// ********************************************************************************************************************
Tobin Ehlis0788f522015-05-26 16:11:58 -0600511#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700512#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800513TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500514{
515 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500516 VkFenceCreateInfo fenceInfo = {};
517 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
518 fenceInfo.pNext = NULL;
519 fenceInfo.flags = 0;
520
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700521 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600522
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500523 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600524
525 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
526 vk_testing::Buffer buffer;
527 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500528
Tony Barbourfe3351b2015-07-28 10:17:20 -0600529 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800530 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600531 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500532
533 testFence.init(*m_device, fenceInfo);
534
535 // Bypass framework since it does the waits automatically
536 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600537 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800538 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
539 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800540 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600541 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700542 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800543 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800544 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800545 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600546 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600547
548 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500549 ASSERT_VK_SUCCESS( err );
550
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500551 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800552 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500553
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200554 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500555}
556
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800557TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500558{
559 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500560 VkFenceCreateInfo fenceInfo = {};
561 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
562 fenceInfo.pNext = NULL;
563 fenceInfo.flags = 0;
564
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700565 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600566
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500567 ASSERT_NO_FATAL_FAILURE(InitState());
568 ASSERT_NO_FATAL_FAILURE(InitViewport());
569 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
570
Tony Barbourfe3351b2015-07-28 10:17:20 -0600571 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800572 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600573 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500574
575 testFence.init(*m_device, fenceInfo);
576
577 // Bypass framework since it does the waits automatically
578 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600579 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800580 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
581 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800582 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600583 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700584 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800585 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800586 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800587 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600588 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600589
590 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500591 ASSERT_VK_SUCCESS( err );
592
Jon Ashburnf19916e2016-01-11 13:12:43 -0700593 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800594 VkCommandBufferBeginInfo info = {};
595 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
596 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600597 info.renderPass = VK_NULL_HANDLE;
598 info.subpass = 0;
599 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +0800600 info.occlusionQueryEnable = VK_FALSE;
601 info.queryFlags = 0;
602 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600603
604 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800605 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500606
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200607 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500608}
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700609#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200610
Karl Schultz6addd812016-02-02 17:17:23 -0700611TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
612 VkResult err;
613 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500614
Karl Schultz6addd812016-02-02 17:17:23 -0700615 m_errorMonitor->SetDesiredFailureMsg(
616 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600617 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
618
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500619 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500620
621 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700622 VkImage image;
623 VkDeviceMemory mem;
624 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500625
Karl Schultz6addd812016-02-02 17:17:23 -0700626 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
627 const int32_t tex_width = 32;
628 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500629
Tony Barboureb254902015-07-15 12:50:33 -0600630 VkImageCreateInfo image_create_info = {};
631 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700632 image_create_info.pNext = NULL;
633 image_create_info.imageType = VK_IMAGE_TYPE_2D;
634 image_create_info.format = tex_format;
635 image_create_info.extent.width = tex_width;
636 image_create_info.extent.height = tex_height;
637 image_create_info.extent.depth = 1;
638 image_create_info.mipLevels = 1;
639 image_create_info.arrayLayers = 1;
640 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
641 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
642 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
643 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600644
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800645 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800646 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700647 mem_alloc.pNext = NULL;
648 mem_alloc.allocationSize = 0;
649 // Introduce failure, do NOT set memProps to
650 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
651 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500652
Chia-I Wuf7458c52015-10-26 21:10:41 +0800653 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500654 ASSERT_VK_SUCCESS(err);
655
Karl Schultz6addd812016-02-02 17:17:23 -0700656 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500657
Mark Lobodzinski23065352015-05-29 09:32:35 -0500658 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500659
Karl Schultz6addd812016-02-02 17:17:23 -0700660 pass =
661 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
662 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
663 if (!pass) { // If we can't find any unmappable memory this test doesn't
664 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +0800665 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -0600666 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -0600667 }
Mike Stroyan713b2d72015-08-04 10:49:29 -0600668
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500669 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800670 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500671 ASSERT_VK_SUCCESS(err);
672
673 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -0600674 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500675 ASSERT_VK_SUCCESS(err);
676
677 // Map memory as if to initialize the image
678 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -0700679 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
680 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500681
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200682 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600683
Chia-I Wuf7458c52015-10-26 21:10:41 +0800684 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500685}
686
Karl Schultz6addd812016-02-02 17:17:23 -0700687TEST_F(VkLayerTest, RebindMemory) {
688 VkResult err;
689 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500690
Karl Schultz6addd812016-02-02 17:17:23 -0700691 m_errorMonitor->SetDesiredFailureMsg(
692 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600693 "which has already been bound to mem object");
694
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500695 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500696
697 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700698 VkImage image;
699 VkDeviceMemory mem1;
700 VkDeviceMemory mem2;
701 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500702
Karl Schultz6addd812016-02-02 17:17:23 -0700703 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
704 const int32_t tex_width = 32;
705 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500706
Tony Barboureb254902015-07-15 12:50:33 -0600707 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700708 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
709 image_create_info.pNext = NULL;
710 image_create_info.imageType = VK_IMAGE_TYPE_2D;
711 image_create_info.format = tex_format;
712 image_create_info.extent.width = tex_width;
713 image_create_info.extent.height = tex_height;
714 image_create_info.extent.depth = 1;
715 image_create_info.mipLevels = 1;
716 image_create_info.arrayLayers = 1;
717 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
718 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
719 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
720 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500721
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800722 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700723 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
724 mem_alloc.pNext = NULL;
725 mem_alloc.allocationSize = 0;
726 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -0600727
Karl Schultz6addd812016-02-02 17:17:23 -0700728 // Introduce failure, do NOT set memProps to
729 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -0600730 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800731 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500732 ASSERT_VK_SUCCESS(err);
733
Karl Schultz6addd812016-02-02 17:17:23 -0700734 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500735
736 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -0700737 pass =
738 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -0600739 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500740
741 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800742 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500743 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800744 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500745 ASSERT_VK_SUCCESS(err);
746
747 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -0600748 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500749 ASSERT_VK_SUCCESS(err);
750
Karl Schultz6addd812016-02-02 17:17:23 -0700751 // Introduce validation failure, try to bind a different memory object to
752 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -0600753 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500754
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200755 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600756
Chia-I Wuf7458c52015-10-26 21:10:41 +0800757 vkDestroyImage(m_device->device(), image, NULL);
758 vkFreeMemory(m_device->device(), mem1, NULL);
759 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500760}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500761
Karl Schultz6addd812016-02-02 17:17:23 -0700762TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600763 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600764
Karl Schultz6addd812016-02-02 17:17:23 -0700765 m_errorMonitor->SetDesiredFailureMsg(
766 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
767 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600768
769 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600770 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
771 fenceInfo.pNext = NULL;
772 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -0600773
Tony Barbour300a6082015-04-07 13:44:53 -0600774 ASSERT_NO_FATAL_FAILURE(InitState());
775 ASSERT_NO_FATAL_FAILURE(InitViewport());
776 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
777
Tony Barbourfe3351b2015-07-28 10:17:20 -0600778 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -0700779 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
780 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600781 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600782
783 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600784
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600785 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800786 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
787 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800788 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600789 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700790 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800791 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800792 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800793 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600794 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600795
796 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -0700797 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600798
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200799 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600800}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600801// This is a positive test. We used to expect error in this case but spec now
802// allows it
Karl Schultz6addd812016-02-02 17:17:23 -0700803TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600804 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600805 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600806 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600807 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
808 fenceInfo.pNext = NULL;
809
Tony Barbour0b4d9562015-04-09 10:48:04 -0600810 ASSERT_NO_FATAL_FAILURE(InitState());
811 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +0800812 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600813 VkResult result = vkResetFences(m_device->device(), 1, fences);
814 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -0600815
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600816 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -0600817}
Tobin Ehlis41376e12015-07-03 08:45:14 -0600818
Chia-I Wu08accc62015-07-07 11:50:03 +0800819/* TODO: Update for changes due to bug-14075 tiling across render passes */
820#if 0
Tobin Ehlis41376e12015-07-03 08:45:14 -0600821TEST_F(VkLayerTest, InvalidUsageBits)
822{
823 // Initiate Draw w/o a PSO bound
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600824
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600826 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -0600827
828 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800829 VkCommandBufferObj commandBuffer(m_device);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600830 BeginCommandBuffer();
Tobin Ehlis41376e12015-07-03 08:45:14 -0600831
832 const VkExtent3D e3d = {
833 .width = 128,
834 .height = 128,
835 .depth = 1,
836 };
837 const VkImageCreateInfo ici = {
838 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
839 .pNext = NULL,
840 .imageType = VK_IMAGE_TYPE_2D,
841 .format = VK_FORMAT_D32_SFLOAT_S8_UINT,
842 .extent = e3d,
843 .mipLevels = 1,
844 .arraySize = 1,
Chia-I Wu5c17c962015-10-31 00:31:16 +0800845 .samples = VK_SAMPLE_COUNT_1_BIT,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600846 .tiling = VK_IMAGE_TILING_LINEAR,
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600847 .usage = 0, // Not setting VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
Tobin Ehlis41376e12015-07-03 08:45:14 -0600848 .flags = 0,
849 };
850
851 VkImage dsi;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800852 vkCreateImage(m_device->device(), &ici, NULL, &dsi);
Tobin Ehlis41376e12015-07-03 08:45:14 -0600853 VkDepthStencilView dsv;
854 const VkDepthStencilViewCreateInfo dsvci = {
855 .sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO,
856 .pNext = NULL,
857 .image = dsi,
858 .mipLevel = 0,
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -0600859 .baseArrayLayer = 0,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600860 .arraySize = 1,
861 .flags = 0,
862 };
Chia-I Wuf7458c52015-10-26 21:10:41 +0800863 vkCreateDepthStencilView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600864
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200865 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -0600866}
Mark Lobodzinski209b5292015-09-17 09:44:05 -0600867#endif // 0
868#endif // MEM_TRACKER_TESTS
869
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600870#if OBJ_TRACKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -0700871TEST_F(VkLayerTest, PipelineNotBound) {
872 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600873
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -0700875 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600876
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600877 ASSERT_NO_FATAL_FAILURE(InitState());
878 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600879
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800880 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700881 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
882 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600883
884 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700885 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
886 ds_pool_ci.pNext = NULL;
887 ds_pool_ci.maxSets = 1;
888 ds_pool_ci.poolSizeCount = 1;
889 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600890
891 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -0700892 err =
893 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600894 ASSERT_VK_SUCCESS(err);
895
896 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700897 dsl_binding.binding = 0;
898 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
899 dsl_binding.descriptorCount = 1;
900 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
901 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600902
903 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700904 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
905 ds_layout_ci.pNext = NULL;
906 ds_layout_ci.bindingCount = 1;
907 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600908
909 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700910 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
911 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600912 ASSERT_VK_SUCCESS(err);
913
914 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800915 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800916 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -0700917 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -0600918 alloc_info.descriptorPool = ds_pool;
919 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700920 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
921 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600922 ASSERT_VK_SUCCESS(err);
923
924 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700925 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
926 pipeline_layout_ci.pNext = NULL;
927 pipeline_layout_ci.setLayoutCount = 1;
928 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600929
930 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700931 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
932 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600933 ASSERT_VK_SUCCESS(err);
934
Mark Youngad779052016-01-06 14:26:04 -0700935 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600936
937 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -0700938 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
939 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600940
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200941 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600942
Chia-I Wuf7458c52015-10-26 21:10:41 +0800943 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
944 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
945 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -0600946}
947
Karl Schultz6addd812016-02-02 17:17:23 -0700948TEST_F(VkLayerTest, BindInvalidMemory) {
949 VkResult err;
950 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -0600951
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -0700953 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600954
Tobin Ehlisec598302015-09-15 15:02:17 -0600955 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -0600956
957 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700958 VkImage image;
959 VkDeviceMemory mem;
960 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -0600961
Karl Schultz6addd812016-02-02 17:17:23 -0700962 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
963 const int32_t tex_width = 32;
964 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -0600965
966 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700967 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
968 image_create_info.pNext = NULL;
969 image_create_info.imageType = VK_IMAGE_TYPE_2D;
970 image_create_info.format = tex_format;
971 image_create_info.extent.width = tex_width;
972 image_create_info.extent.height = tex_height;
973 image_create_info.extent.depth = 1;
974 image_create_info.mipLevels = 1;
975 image_create_info.arrayLayers = 1;
976 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
977 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
978 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
979 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -0600980
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800981 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700982 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
983 mem_alloc.pNext = NULL;
984 mem_alloc.allocationSize = 0;
985 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -0600986
Chia-I Wuf7458c52015-10-26 21:10:41 +0800987 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -0600988 ASSERT_VK_SUCCESS(err);
989
Karl Schultz6addd812016-02-02 17:17:23 -0700990 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -0600991
992 mem_alloc.allocationSize = mem_reqs.size;
993
Karl Schultz6addd812016-02-02 17:17:23 -0700994 pass =
995 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -0600996 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -0600997
998 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800999 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001000 ASSERT_VK_SUCCESS(err);
1001
1002 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001003 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001004
1005 // Try to bind free memory that has been freed
1006 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1007 // This may very well return an error.
1008 (void)err;
1009
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001010 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001011
Chia-I Wuf7458c52015-10-26 21:10:41 +08001012 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001013}
1014
Karl Schultz6addd812016-02-02 17:17:23 -07001015TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1016 VkResult err;
1017 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001018
Karl Schultz6addd812016-02-02 17:17:23 -07001019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1020 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001021
Tobin Ehlisec598302015-09-15 15:02:17 -06001022 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001023
Karl Schultz6addd812016-02-02 17:17:23 -07001024 // Create an image object, allocate memory, destroy the object and then try
1025 // to bind it
1026 VkImage image;
1027 VkDeviceMemory mem;
1028 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001029
Karl Schultz6addd812016-02-02 17:17:23 -07001030 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1031 const int32_t tex_width = 32;
1032 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001033
1034 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001035 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1036 image_create_info.pNext = NULL;
1037 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1038 image_create_info.format = tex_format;
1039 image_create_info.extent.width = tex_width;
1040 image_create_info.extent.height = tex_height;
1041 image_create_info.extent.depth = 1;
1042 image_create_info.mipLevels = 1;
1043 image_create_info.arrayLayers = 1;
1044 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1045 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1046 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1047 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001048
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001049 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001050 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1051 mem_alloc.pNext = NULL;
1052 mem_alloc.allocationSize = 0;
1053 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001054
Chia-I Wuf7458c52015-10-26 21:10:41 +08001055 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001056 ASSERT_VK_SUCCESS(err);
1057
Karl Schultz6addd812016-02-02 17:17:23 -07001058 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001059
1060 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001061 pass =
1062 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001063 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001064
1065 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001066 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001067 ASSERT_VK_SUCCESS(err);
1068
1069 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001070 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001071 ASSERT_VK_SUCCESS(err);
1072
1073 // Now Try to bind memory to this destroyed object
1074 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1075 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001076 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001077
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001078 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001079
Chia-I Wuf7458c52015-10-26 21:10:41 +08001080 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001081}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001082
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001083#endif // OBJ_TRACKER_TESTS
1084
Tobin Ehlis0788f522015-05-26 16:11:58 -06001085#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001086
1087// This is a positive test. No errors should be generated.
1088TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
1089
1090 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1091 "submitted on separate queues followed by a QueueWaitIdle.");
1092
1093 m_errorMonitor->ExpectSuccess();
1094
1095 VkSemaphore semaphore;
1096 VkSemaphoreCreateInfo semaphore_create_info{};
1097 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1098 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1099 &semaphore);
1100
1101 VkCommandPool command_pool;
1102 VkCommandPoolCreateInfo pool_create_info{};
1103 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1104 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1105 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1106 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1107 &command_pool);
1108
1109 VkCommandBuffer command_buffer[2];
1110 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1111 command_buffer_allocate_info.sType =
1112 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1113 command_buffer_allocate_info.commandPool = command_pool;
1114 command_buffer_allocate_info.commandBufferCount = 2;
1115 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1116 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1117 command_buffer);
1118
1119 VkQueue queue = VK_NULL_HANDLE;
1120 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1121 1, &queue);
1122
1123 {
1124 VkCommandBufferBeginInfo begin_info{};
1125 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1126 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1127
1128 vkCmdPipelineBarrier(command_buffer[0],
1129 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1130 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1131 0, nullptr, 0, nullptr);
1132
1133 VkViewport viewport{};
1134 viewport.maxDepth = 1.0f;
1135 viewport.minDepth = 0.0f;
1136 viewport.width = 512;
1137 viewport.height = 512;
1138 viewport.x = 0;
1139 viewport.y = 0;
1140 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1141 vkEndCommandBuffer(command_buffer[0]);
1142 }
1143 {
1144 VkCommandBufferBeginInfo begin_info{};
1145 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1146 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1147
1148 VkViewport viewport{};
1149 viewport.maxDepth = 1.0f;
1150 viewport.minDepth = 0.0f;
1151 viewport.width = 512;
1152 viewport.height = 512;
1153 viewport.x = 0;
1154 viewport.y = 0;
1155 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1156 vkEndCommandBuffer(command_buffer[1]);
1157 }
1158 {
1159 VkSubmitInfo submit_info{};
1160 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1161 submit_info.commandBufferCount = 1;
1162 submit_info.pCommandBuffers = &command_buffer[0];
1163 submit_info.signalSemaphoreCount = 1;
1164 submit_info.pSignalSemaphores = &semaphore;
1165 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1166 }
1167 {
1168 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1169 VkSubmitInfo submit_info{};
1170 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1171 submit_info.commandBufferCount = 1;
1172 submit_info.pCommandBuffers = &command_buffer[1];
1173 submit_info.waitSemaphoreCount = 1;
1174 submit_info.pWaitSemaphores = &semaphore;
1175 submit_info.pWaitDstStageMask = flags;
1176 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1177 }
1178
1179 vkQueueWaitIdle(m_device->m_queue);
1180
1181 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1182 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1183 &command_buffer[0]);
1184 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1185
1186 m_errorMonitor->VerifyNotFound();
1187}
1188
1189// This is a positive test. No errors should be generated.
1190TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
1191
1192 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1193 "submitted on separate queues, the second having a fence"
1194 "followed by a QueueWaitIdle.");
1195
1196 m_errorMonitor->ExpectSuccess();
1197
1198 VkFence fence;
1199 VkFenceCreateInfo fence_create_info{};
1200 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1201 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1202
1203 VkSemaphore semaphore;
1204 VkSemaphoreCreateInfo semaphore_create_info{};
1205 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1206 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1207 &semaphore);
1208
1209 VkCommandPool command_pool;
1210 VkCommandPoolCreateInfo pool_create_info{};
1211 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1212 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1213 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1214 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1215 &command_pool);
1216
1217 VkCommandBuffer command_buffer[2];
1218 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1219 command_buffer_allocate_info.sType =
1220 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1221 command_buffer_allocate_info.commandPool = command_pool;
1222 command_buffer_allocate_info.commandBufferCount = 2;
1223 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1224 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1225 command_buffer);
1226
1227 VkQueue queue = VK_NULL_HANDLE;
1228 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1229 1, &queue);
1230
1231 {
1232 VkCommandBufferBeginInfo begin_info{};
1233 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1234 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1235
1236 vkCmdPipelineBarrier(command_buffer[0],
1237 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1238 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1239 0, nullptr, 0, nullptr);
1240
1241 VkViewport viewport{};
1242 viewport.maxDepth = 1.0f;
1243 viewport.minDepth = 0.0f;
1244 viewport.width = 512;
1245 viewport.height = 512;
1246 viewport.x = 0;
1247 viewport.y = 0;
1248 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1249 vkEndCommandBuffer(command_buffer[0]);
1250 }
1251 {
1252 VkCommandBufferBeginInfo begin_info{};
1253 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1254 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1255
1256 VkViewport viewport{};
1257 viewport.maxDepth = 1.0f;
1258 viewport.minDepth = 0.0f;
1259 viewport.width = 512;
1260 viewport.height = 512;
1261 viewport.x = 0;
1262 viewport.y = 0;
1263 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1264 vkEndCommandBuffer(command_buffer[1]);
1265 }
1266 {
1267 VkSubmitInfo submit_info{};
1268 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1269 submit_info.commandBufferCount = 1;
1270 submit_info.pCommandBuffers = &command_buffer[0];
1271 submit_info.signalSemaphoreCount = 1;
1272 submit_info.pSignalSemaphores = &semaphore;
1273 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1274 }
1275 {
1276 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1277 VkSubmitInfo submit_info{};
1278 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1279 submit_info.commandBufferCount = 1;
1280 submit_info.pCommandBuffers = &command_buffer[1];
1281 submit_info.waitSemaphoreCount = 1;
1282 submit_info.pWaitSemaphores = &semaphore;
1283 submit_info.pWaitDstStageMask = flags;
1284 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1285 }
1286
1287 vkQueueWaitIdle(m_device->m_queue);
1288
1289 vkDestroyFence(m_device->device(), fence, nullptr);
1290 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1291 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1292 &command_buffer[0]);
1293 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1294
1295 m_errorMonitor->VerifyNotFound();
1296}
1297
1298// This is a positive test. No errors should be generated.
1299TEST_F(VkLayerTest,
1300 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
1301
1302 TEST_DESCRIPTION(
1303 "Two command buffers, each in a separate QueueSubmit call "
1304 "submitted on separate queues, the second having a fence"
1305 "followed by two consecutive WaitForFences calls on the same fence.");
1306
1307 m_errorMonitor->ExpectSuccess();
1308
1309 VkFence fence;
1310 VkFenceCreateInfo fence_create_info{};
1311 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1312 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1313
1314 VkSemaphore semaphore;
1315 VkSemaphoreCreateInfo semaphore_create_info{};
1316 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1317 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1318 &semaphore);
1319
1320 VkCommandPool command_pool;
1321 VkCommandPoolCreateInfo pool_create_info{};
1322 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1323 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1324 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1325 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1326 &command_pool);
1327
1328 VkCommandBuffer command_buffer[2];
1329 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1330 command_buffer_allocate_info.sType =
1331 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1332 command_buffer_allocate_info.commandPool = command_pool;
1333 command_buffer_allocate_info.commandBufferCount = 2;
1334 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1335 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1336 command_buffer);
1337
1338 VkQueue queue = VK_NULL_HANDLE;
1339 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1340 1, &queue);
1341
1342 {
1343 VkCommandBufferBeginInfo begin_info{};
1344 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1345 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1346
1347 vkCmdPipelineBarrier(command_buffer[0],
1348 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1349 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1350 0, nullptr, 0, nullptr);
1351
1352 VkViewport viewport{};
1353 viewport.maxDepth = 1.0f;
1354 viewport.minDepth = 0.0f;
1355 viewport.width = 512;
1356 viewport.height = 512;
1357 viewport.x = 0;
1358 viewport.y = 0;
1359 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1360 vkEndCommandBuffer(command_buffer[0]);
1361 }
1362 {
1363 VkCommandBufferBeginInfo begin_info{};
1364 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1365 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1366
1367 VkViewport viewport{};
1368 viewport.maxDepth = 1.0f;
1369 viewport.minDepth = 0.0f;
1370 viewport.width = 512;
1371 viewport.height = 512;
1372 viewport.x = 0;
1373 viewport.y = 0;
1374 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1375 vkEndCommandBuffer(command_buffer[1]);
1376 }
1377 {
1378 VkSubmitInfo submit_info{};
1379 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1380 submit_info.commandBufferCount = 1;
1381 submit_info.pCommandBuffers = &command_buffer[0];
1382 submit_info.signalSemaphoreCount = 1;
1383 submit_info.pSignalSemaphores = &semaphore;
1384 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1385 }
1386 {
1387 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1388 VkSubmitInfo submit_info{};
1389 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1390 submit_info.commandBufferCount = 1;
1391 submit_info.pCommandBuffers = &command_buffer[1];
1392 submit_info.waitSemaphoreCount = 1;
1393 submit_info.pWaitSemaphores = &semaphore;
1394 submit_info.pWaitDstStageMask = flags;
1395 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1396 }
1397
1398 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1399 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1400
1401 vkDestroyFence(m_device->device(), fence, nullptr);
1402 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1403 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1404 &command_buffer[0]);
1405 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1406
1407 m_errorMonitor->VerifyNotFound();
1408}
1409
1410// This is a positive test. No errors should be generated.
1411TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
1412
1413 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1414 "submitted on separate queues, the second having a fence, "
1415 "followed by a WaitForFences call.");
1416
1417 m_errorMonitor->ExpectSuccess();
1418
1419 VkFence fence;
1420 VkFenceCreateInfo fence_create_info{};
1421 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1422 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1423
1424 VkSemaphore semaphore;
1425 VkSemaphoreCreateInfo semaphore_create_info{};
1426 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1427 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1428 &semaphore);
1429
1430 VkCommandPool command_pool;
1431 VkCommandPoolCreateInfo pool_create_info{};
1432 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1433 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1434 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1435 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1436 &command_pool);
1437
1438 VkCommandBuffer command_buffer[2];
1439 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1440 command_buffer_allocate_info.sType =
1441 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1442 command_buffer_allocate_info.commandPool = command_pool;
1443 command_buffer_allocate_info.commandBufferCount = 2;
1444 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1445 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1446 command_buffer);
1447
1448 VkQueue queue = VK_NULL_HANDLE;
1449 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1450 1, &queue);
1451
1452
1453 {
1454 VkCommandBufferBeginInfo begin_info{};
1455 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1456 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1457
1458 vkCmdPipelineBarrier(command_buffer[0],
1459 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1460 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1461 0, nullptr, 0, nullptr);
1462
1463 VkViewport viewport{};
1464 viewport.maxDepth = 1.0f;
1465 viewport.minDepth = 0.0f;
1466 viewport.width = 512;
1467 viewport.height = 512;
1468 viewport.x = 0;
1469 viewport.y = 0;
1470 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1471 vkEndCommandBuffer(command_buffer[0]);
1472 }
1473 {
1474 VkCommandBufferBeginInfo begin_info{};
1475 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1476 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1477
1478 VkViewport viewport{};
1479 viewport.maxDepth = 1.0f;
1480 viewport.minDepth = 0.0f;
1481 viewport.width = 512;
1482 viewport.height = 512;
1483 viewport.x = 0;
1484 viewport.y = 0;
1485 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1486 vkEndCommandBuffer(command_buffer[1]);
1487 }
1488 {
1489 VkSubmitInfo submit_info{};
1490 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1491 submit_info.commandBufferCount = 1;
1492 submit_info.pCommandBuffers = &command_buffer[0];
1493 submit_info.signalSemaphoreCount = 1;
1494 submit_info.pSignalSemaphores = &semaphore;
1495 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1496 }
1497 {
1498 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1499 VkSubmitInfo submit_info{};
1500 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1501 submit_info.commandBufferCount = 1;
1502 submit_info.pCommandBuffers = &command_buffer[1];
1503 submit_info.waitSemaphoreCount = 1;
1504 submit_info.pWaitSemaphores = &semaphore;
1505 submit_info.pWaitDstStageMask = flags;
1506 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1507 }
1508
1509 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1510
1511 vkDestroyFence(m_device->device(), fence, nullptr);
1512 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1513 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1514 &command_buffer[0]);
1515 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1516
1517 m_errorMonitor->VerifyNotFound();
1518}
1519
1520// This is a positive test. No errors should be generated.
1521TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
1522
1523 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1524 "on the same queue, sharing a signal/wait semaphore, the "
1525 "second having a fence, "
1526 "followed by a WaitForFences call.");
1527
1528 m_errorMonitor->ExpectSuccess();
1529
1530 VkFence fence;
1531 VkFenceCreateInfo fence_create_info{};
1532 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1533 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1534
1535 VkSemaphore semaphore;
1536 VkSemaphoreCreateInfo semaphore_create_info{};
1537 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1538 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1539 &semaphore);
1540
1541 VkCommandPool command_pool;
1542 VkCommandPoolCreateInfo pool_create_info{};
1543 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1544 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1545 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1546 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1547 &command_pool);
1548
1549 VkCommandBuffer command_buffer[2];
1550 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1551 command_buffer_allocate_info.sType =
1552 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1553 command_buffer_allocate_info.commandPool = command_pool;
1554 command_buffer_allocate_info.commandBufferCount = 2;
1555 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1556 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1557 command_buffer);
1558
1559 {
1560 VkCommandBufferBeginInfo begin_info{};
1561 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1562 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1563
1564 vkCmdPipelineBarrier(command_buffer[0],
1565 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1566 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1567 0, nullptr, 0, nullptr);
1568
1569 VkViewport viewport{};
1570 viewport.maxDepth = 1.0f;
1571 viewport.minDepth = 0.0f;
1572 viewport.width = 512;
1573 viewport.height = 512;
1574 viewport.x = 0;
1575 viewport.y = 0;
1576 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1577 vkEndCommandBuffer(command_buffer[0]);
1578 }
1579 {
1580 VkCommandBufferBeginInfo begin_info{};
1581 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1582 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1583
1584 VkViewport viewport{};
1585 viewport.maxDepth = 1.0f;
1586 viewport.minDepth = 0.0f;
1587 viewport.width = 512;
1588 viewport.height = 512;
1589 viewport.x = 0;
1590 viewport.y = 0;
1591 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1592 vkEndCommandBuffer(command_buffer[1]);
1593 }
1594 {
1595 VkSubmitInfo submit_info{};
1596 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1597 submit_info.commandBufferCount = 1;
1598 submit_info.pCommandBuffers = &command_buffer[0];
1599 submit_info.signalSemaphoreCount = 1;
1600 submit_info.pSignalSemaphores = &semaphore;
1601 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1602 }
1603 {
1604 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1605 VkSubmitInfo submit_info{};
1606 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1607 submit_info.commandBufferCount = 1;
1608 submit_info.pCommandBuffers = &command_buffer[1];
1609 submit_info.waitSemaphoreCount = 1;
1610 submit_info.pWaitSemaphores = &semaphore;
1611 submit_info.pWaitDstStageMask = flags;
1612 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1613 }
1614
1615 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1616
1617 vkDestroyFence(m_device->device(), fence, nullptr);
1618 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1619 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1620 &command_buffer[0]);
1621 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1622
1623 m_errorMonitor->VerifyNotFound();
1624}
1625
1626// This is a positive test. No errors should be generated.
1627TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
1628
1629 TEST_DESCRIPTION(
1630 "Two command buffers, each in a separate QueueSubmit call "
1631 "on the same queue, no fences, followed by a third QueueSubmit with NO "
1632 "SubmitInfos but with a fence, followed by a WaitForFences call.");
1633
1634 m_errorMonitor->ExpectSuccess();
1635
1636 VkFence fence;
1637 VkFenceCreateInfo fence_create_info{};
1638 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1639 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1640
1641 VkCommandPool command_pool;
1642 VkCommandPoolCreateInfo pool_create_info{};
1643 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1644 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1645 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1646 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1647 &command_pool);
1648
1649 VkCommandBuffer command_buffer[2];
1650 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1651 command_buffer_allocate_info.sType =
1652 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1653 command_buffer_allocate_info.commandPool = command_pool;
1654 command_buffer_allocate_info.commandBufferCount = 2;
1655 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1656 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1657 command_buffer);
1658
1659 {
1660 VkCommandBufferBeginInfo begin_info{};
1661 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1662 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1663
1664 vkCmdPipelineBarrier(command_buffer[0],
1665 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1666 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1667 0, nullptr, 0, nullptr);
1668
1669 VkViewport viewport{};
1670 viewport.maxDepth = 1.0f;
1671 viewport.minDepth = 0.0f;
1672 viewport.width = 512;
1673 viewport.height = 512;
1674 viewport.x = 0;
1675 viewport.y = 0;
1676 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1677 vkEndCommandBuffer(command_buffer[0]);
1678 }
1679 {
1680 VkCommandBufferBeginInfo begin_info{};
1681 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1682 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1683
1684 VkViewport viewport{};
1685 viewport.maxDepth = 1.0f;
1686 viewport.minDepth = 0.0f;
1687 viewport.width = 512;
1688 viewport.height = 512;
1689 viewport.x = 0;
1690 viewport.y = 0;
1691 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1692 vkEndCommandBuffer(command_buffer[1]);
1693 }
1694 {
1695 VkSubmitInfo submit_info{};
1696 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1697 submit_info.commandBufferCount = 1;
1698 submit_info.pCommandBuffers = &command_buffer[0];
1699 submit_info.signalSemaphoreCount = 0;
1700 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
1701 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1702 }
1703 {
1704 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1705 VkSubmitInfo submit_info{};
1706 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1707 submit_info.commandBufferCount = 1;
1708 submit_info.pCommandBuffers = &command_buffer[1];
1709 submit_info.waitSemaphoreCount = 0;
1710 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
1711 submit_info.pWaitDstStageMask = flags;
1712 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1713 }
1714
1715 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
1716
1717 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1718
1719 vkDestroyFence(m_device->device(), fence, nullptr);
1720 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1721 &command_buffer[0]);
1722 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1723
1724 m_errorMonitor->VerifyNotFound();
1725}
1726
1727// This is a positive test. No errors should be generated.
1728TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
1729
1730 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1731 "on the same queue, the second having a fence, followed "
1732 "by a WaitForFences call.");
1733
1734 m_errorMonitor->ExpectSuccess();
1735
1736 VkFence fence;
1737 VkFenceCreateInfo fence_create_info{};
1738 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1739 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1740
1741 VkCommandPool command_pool;
1742 VkCommandPoolCreateInfo pool_create_info{};
1743 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1744 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1745 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1746 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1747 &command_pool);
1748
1749 VkCommandBuffer command_buffer[2];
1750 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1751 command_buffer_allocate_info.sType =
1752 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1753 command_buffer_allocate_info.commandPool = command_pool;
1754 command_buffer_allocate_info.commandBufferCount = 2;
1755 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1756 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1757 command_buffer);
1758
1759 {
1760 VkCommandBufferBeginInfo begin_info{};
1761 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1762 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1763
1764 vkCmdPipelineBarrier(command_buffer[0],
1765 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1766 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1767 0, nullptr, 0, nullptr);
1768
1769 VkViewport viewport{};
1770 viewport.maxDepth = 1.0f;
1771 viewport.minDepth = 0.0f;
1772 viewport.width = 512;
1773 viewport.height = 512;
1774 viewport.x = 0;
1775 viewport.y = 0;
1776 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1777 vkEndCommandBuffer(command_buffer[0]);
1778 }
1779 {
1780 VkCommandBufferBeginInfo begin_info{};
1781 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1782 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1783
1784 VkViewport viewport{};
1785 viewport.maxDepth = 1.0f;
1786 viewport.minDepth = 0.0f;
1787 viewport.width = 512;
1788 viewport.height = 512;
1789 viewport.x = 0;
1790 viewport.y = 0;
1791 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1792 vkEndCommandBuffer(command_buffer[1]);
1793 }
1794 {
1795 VkSubmitInfo submit_info{};
1796 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1797 submit_info.commandBufferCount = 1;
1798 submit_info.pCommandBuffers = &command_buffer[0];
1799 submit_info.signalSemaphoreCount = 0;
1800 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
1801 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1802 }
1803 {
1804 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1805 VkSubmitInfo submit_info{};
1806 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1807 submit_info.commandBufferCount = 1;
1808 submit_info.pCommandBuffers = &command_buffer[1];
1809 submit_info.waitSemaphoreCount = 0;
1810 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
1811 submit_info.pWaitDstStageMask = flags;
1812 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1813 }
1814
1815 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1816
1817 vkDestroyFence(m_device->device(), fence, nullptr);
1818 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1819 &command_buffer[0]);
1820 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1821
1822 m_errorMonitor->VerifyNotFound();
1823}
1824
1825// This is a positive test. No errors should be generated.
1826TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
1827
1828 TEST_DESCRIPTION(
1829 "Two command buffers each in a separate SubmitInfo sent in a single "
1830 "QueueSubmit call followed by a WaitForFences call.");
1831
1832 m_errorMonitor->ExpectSuccess();
1833
1834 VkFence fence;
1835 VkFenceCreateInfo fence_create_info{};
1836 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1837 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1838
1839 VkSemaphore semaphore;
1840 VkSemaphoreCreateInfo semaphore_create_info{};
1841 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1842 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1843 &semaphore);
1844
1845 VkCommandPool command_pool;
1846 VkCommandPoolCreateInfo pool_create_info{};
1847 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1848 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1849 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1850 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1851 &command_pool);
1852
1853 VkCommandBuffer command_buffer[2];
1854 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1855 command_buffer_allocate_info.sType =
1856 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1857 command_buffer_allocate_info.commandPool = command_pool;
1858 command_buffer_allocate_info.commandBufferCount = 2;
1859 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1860 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1861 command_buffer);
1862
1863 {
1864 VkCommandBufferBeginInfo begin_info{};
1865 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1866 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1867
1868 vkCmdPipelineBarrier(command_buffer[0],
1869 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1870 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1871 0, nullptr, 0, nullptr);
1872
1873 VkViewport viewport{};
1874 viewport.maxDepth = 1.0f;
1875 viewport.minDepth = 0.0f;
1876 viewport.width = 512;
1877 viewport.height = 512;
1878 viewport.x = 0;
1879 viewport.y = 0;
1880 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1881 vkEndCommandBuffer(command_buffer[0]);
1882 }
1883 {
1884 VkCommandBufferBeginInfo begin_info{};
1885 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1886 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1887
1888 VkViewport viewport{};
1889 viewport.maxDepth = 1.0f;
1890 viewport.minDepth = 0.0f;
1891 viewport.width = 512;
1892 viewport.height = 512;
1893 viewport.x = 0;
1894 viewport.y = 0;
1895 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1896 vkEndCommandBuffer(command_buffer[1]);
1897 }
1898 {
1899 VkSubmitInfo submit_info[2];
1900 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1901
1902 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1903 submit_info[0].pNext = NULL;
1904 submit_info[0].commandBufferCount = 1;
1905 submit_info[0].pCommandBuffers = &command_buffer[0];
1906 submit_info[0].signalSemaphoreCount = 1;
1907 submit_info[0].pSignalSemaphores = &semaphore;
1908 submit_info[0].waitSemaphoreCount = 0;
1909 submit_info[0].pWaitSemaphores = NULL;
1910 submit_info[0].pWaitDstStageMask = 0;
1911
1912 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1913 submit_info[1].pNext = NULL;
1914 submit_info[1].commandBufferCount = 1;
1915 submit_info[1].pCommandBuffers = &command_buffer[1];
1916 submit_info[1].waitSemaphoreCount = 1;
1917 submit_info[1].pWaitSemaphores = &semaphore;
1918 submit_info[1].pWaitDstStageMask = flags;
1919 submit_info[1].signalSemaphoreCount = 0;
1920 submit_info[1].pSignalSemaphores = NULL;
1921 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
1922 }
1923
1924 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1925
1926 vkDestroyFence(m_device->device(), fence, nullptr);
1927 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1928 &command_buffer[0]);
1929 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1930
1931 m_errorMonitor->VerifyNotFound();
1932}
1933
Karl Schultz6addd812016-02-02 17:17:23 -07001934TEST_F(VkLayerTest, LineWidthStateNotBound) {
1935 m_errorMonitor->SetDesiredFailureMsg(
1936 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001937 "Dynamic line width state not set for this command buffer");
1938
Karl Schultz6addd812016-02-02 17:17:23 -07001939 TEST_DESCRIPTION("Simple Draw Call that validates failure when a line "
1940 "width state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001941
Karl Schultz6addd812016-02-02 17:17:23 -07001942 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1943 BsoFailLineWidth);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001944
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001945 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001946}
1947
Karl Schultz6addd812016-02-02 17:17:23 -07001948TEST_F(VkLayerTest, DepthBiasStateNotBound) {
1949 m_errorMonitor->SetDesiredFailureMsg(
1950 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001951 "Dynamic depth bias state not set for this command buffer");
1952
Karl Schultz6addd812016-02-02 17:17:23 -07001953 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
1954 "bias state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001955
Karl Schultz6addd812016-02-02 17:17:23 -07001956 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1957 BsoFailDepthBias);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001958
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001959 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001960}
1961
Karl Schultz6addd812016-02-02 17:17:23 -07001962// Disable these two tests until we can sort out how to track multiple layer
1963// errors
1964TEST_F(VkLayerTest, ViewportStateNotBound) {
1965 m_errorMonitor->SetDesiredFailureMsg(
1966 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001967 "Dynamic viewport state not set for this command buffer");
1968
Karl Schultz6addd812016-02-02 17:17:23 -07001969 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
1970 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001971
Karl Schultz6addd812016-02-02 17:17:23 -07001972 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1973 BsoFailViewport);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001974
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001975 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001976}
1977
Karl Schultz6addd812016-02-02 17:17:23 -07001978TEST_F(VkLayerTest, ScissorStateNotBound) {
1979 m_errorMonitor->SetDesiredFailureMsg(
1980 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001981 "Dynamic scissor state not set for this command buffer");
1982
Karl Schultz6addd812016-02-02 17:17:23 -07001983 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
1984 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001985
Karl Schultz6addd812016-02-02 17:17:23 -07001986 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1987 BsoFailScissor);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001988
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001989 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001990}
1991
Karl Schultz6addd812016-02-02 17:17:23 -07001992TEST_F(VkLayerTest, BlendStateNotBound) {
1993 m_errorMonitor->SetDesiredFailureMsg(
1994 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7a1d2352016-03-28 11:18:19 -06001995 "Dynamic blend constants state not set for this command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001996
Karl Schultz6addd812016-02-02 17:17:23 -07001997 TEST_DESCRIPTION("Simple Draw Call that validates failure when a blend "
1998 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001999
Karl Schultz6addd812016-02-02 17:17:23 -07002000 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2001 BsoFailBlend);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002002
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002003 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002004}
2005
Karl Schultz6addd812016-02-02 17:17:23 -07002006TEST_F(VkLayerTest, DepthBoundsStateNotBound) {
2007 m_errorMonitor->SetDesiredFailureMsg(
2008 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002009 "Dynamic depth bounds state not set for this command buffer");
2010
Karl Schultz6addd812016-02-02 17:17:23 -07002011 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
2012 "bounds state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002013
Karl Schultz6addd812016-02-02 17:17:23 -07002014 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2015 BsoFailDepthBounds);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002016
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002017 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002018}
2019
Karl Schultz6addd812016-02-02 17:17:23 -07002020TEST_F(VkLayerTest, StencilReadMaskNotSet) {
2021 m_errorMonitor->SetDesiredFailureMsg(
2022 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002023 "Dynamic stencil read mask state not set for this command buffer");
2024
Tobin Ehlis963a4042015-09-29 08:18:34 -06002025 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002026
Karl Schultz6addd812016-02-02 17:17:23 -07002027 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2028 "read mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002029
Karl Schultz6addd812016-02-02 17:17:23 -07002030 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2031 BsoFailStencilReadMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002032
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002033 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002034}
2035
Karl Schultz6addd812016-02-02 17:17:23 -07002036TEST_F(VkLayerTest, StencilWriteMaskNotSet) {
2037 m_errorMonitor->SetDesiredFailureMsg(
2038 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002039 "Dynamic stencil write mask state not set for this command buffer");
2040
Tobin Ehlis963a4042015-09-29 08:18:34 -06002041 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002042
Karl Schultz6addd812016-02-02 17:17:23 -07002043 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2044 "write mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002045
Karl Schultz6addd812016-02-02 17:17:23 -07002046 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2047 BsoFailStencilWriteMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002048
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002049 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002050}
2051
Karl Schultz6addd812016-02-02 17:17:23 -07002052TEST_F(VkLayerTest, StencilReferenceNotSet) {
2053 m_errorMonitor->SetDesiredFailureMsg(
2054 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002055 "Dynamic stencil reference state not set for this command buffer");
2056
Karl Schultz6addd812016-02-02 17:17:23 -07002057 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2058 "reference is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002059
Karl Schultz6addd812016-02-02 17:17:23 -07002060 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2061 BsoFailStencilReference);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002062
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002063 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002064}
2065
Karl Schultz6addd812016-02-02 17:17:23 -07002066TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002067 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002068
Karl Schultz6addd812016-02-02 17:17:23 -07002069 m_errorMonitor->SetDesiredFailureMsg(
2070 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2071 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
2072 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002073
2074 VkFenceCreateInfo fenceInfo = {};
2075 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2076 fenceInfo.pNext = NULL;
2077 fenceInfo.flags = 0;
2078
2079 ASSERT_NO_FATAL_FAILURE(InitState());
2080 ASSERT_NO_FATAL_FAILURE(InitViewport());
2081 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2082
Karl Schultz6addd812016-02-02 17:17:23 -07002083 // We luck out b/c by default the framework creates CB w/ the
2084 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002085 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002086 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2087 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002088 EndCommandBuffer();
2089
2090 testFence.init(*m_device, fenceInfo);
2091
2092 // Bypass framework since it does the waits automatically
2093 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002094 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002095 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2096 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002097 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002098 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002099 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002100 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002101 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002102 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002103 submit_info.pSignalSemaphores = NULL;
2104
Karl Schultz6addd812016-02-02 17:17:23 -07002105 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
2106 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002107
Karl Schultz6addd812016-02-02 17:17:23 -07002108 // Cause validation error by re-submitting cmd buffer that should only be
2109 // submitted once
2110 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002111
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002112 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002113}
2114
Karl Schultz6addd812016-02-02 17:17:23 -07002115TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002116 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07002117 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002118
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002119 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002120 "Unable to allocate 1 descriptors of "
2121 "type "
2122 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002123
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002124 ASSERT_NO_FATAL_FAILURE(InitState());
2125 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002126
Karl Schultz6addd812016-02-02 17:17:23 -07002127 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
2128 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002129 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002130 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2131 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002132
2133 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002134 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2135 ds_pool_ci.pNext = NULL;
2136 ds_pool_ci.flags = 0;
2137 ds_pool_ci.maxSets = 1;
2138 ds_pool_ci.poolSizeCount = 1;
2139 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002140
2141 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002142 err =
2143 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002144 ASSERT_VK_SUCCESS(err);
2145
2146 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002147 dsl_binding.binding = 0;
2148 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2149 dsl_binding.descriptorCount = 1;
2150 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2151 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002152
2153 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002154 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2155 ds_layout_ci.pNext = NULL;
2156 ds_layout_ci.bindingCount = 1;
2157 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002158
2159 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002160 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2161 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002162 ASSERT_VK_SUCCESS(err);
2163
2164 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002165 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002166 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002167 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002168 alloc_info.descriptorPool = ds_pool;
2169 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002170 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2171 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002172
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002173 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002174
Chia-I Wuf7458c52015-10-26 21:10:41 +08002175 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2176 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002177}
2178
Karl Schultz6addd812016-02-02 17:17:23 -07002179TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
2180 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06002181
Karl Schultz6addd812016-02-02 17:17:23 -07002182 m_errorMonitor->SetDesiredFailureMsg(
2183 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2184 "It is invalid to call vkFreeDescriptorSets() with a pool created "
2185 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002186
Tobin Ehlise735c692015-10-08 13:13:50 -06002187 ASSERT_NO_FATAL_FAILURE(InitState());
2188 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06002189
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002190 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002191 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2192 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06002193
2194 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002195 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2196 ds_pool_ci.pNext = NULL;
2197 ds_pool_ci.maxSets = 1;
2198 ds_pool_ci.poolSizeCount = 1;
2199 ds_pool_ci.flags = 0;
2200 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
2201 // app can only call vkResetDescriptorPool on this pool.;
2202 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06002203
2204 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002205 err =
2206 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06002207 ASSERT_VK_SUCCESS(err);
2208
2209 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002210 dsl_binding.binding = 0;
2211 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2212 dsl_binding.descriptorCount = 1;
2213 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2214 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06002215
2216 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002217 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2218 ds_layout_ci.pNext = NULL;
2219 ds_layout_ci.bindingCount = 1;
2220 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06002221
2222 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002223 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2224 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06002225 ASSERT_VK_SUCCESS(err);
2226
2227 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002228 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002229 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002230 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002231 alloc_info.descriptorPool = ds_pool;
2232 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002233 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2234 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06002235 ASSERT_VK_SUCCESS(err);
2236
2237 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002238 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06002239
Chia-I Wuf7458c52015-10-26 21:10:41 +08002240 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2241 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06002242}
2243
Karl Schultz6addd812016-02-02 17:17:23 -07002244TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002245 // Attempt to clear Descriptor Pool with bad object.
2246 // ObjectTracker should catch this.
2247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2248 "Invalid VkDescriptorPool Object 0xbaad6001");
2249 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
2250 vkResetDescriptorPool(device(), badPool, 0);
2251 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002252}
2253
Karl Schultz6addd812016-02-02 17:17:23 -07002254TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002255 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
2256 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002257 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06002258 // call vkCmdBindDescriptorSets w/ false Descriptor Set
2259 VkDescriptorSet badSet = (VkDescriptorSet)0xbaad6001;
2260 VkResult err;
2261 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2262 "Invalid VkDescriptorSet Object 0xbaad6001");
2263
2264 ASSERT_NO_FATAL_FAILURE(InitState());
2265
2266 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
2267 layout_bindings[0].binding = 0;
2268 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2269 layout_bindings[0].descriptorCount = 1;
2270 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2271 layout_bindings[0].pImmutableSamplers = NULL;
2272
2273 VkDescriptorSetLayout descriptor_set_layout;
2274 VkDescriptorSetLayoutCreateInfo dslci = {};
2275 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2276 dslci.pNext = NULL;
2277 dslci.bindingCount = 1;
2278 dslci.pBindings = layout_bindings;
2279 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
2280 assert(!err);
2281
2282 VkPipelineLayout pipeline_layout;
2283 VkPipelineLayoutCreateInfo plci = {};
2284 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2285 plci.pNext = NULL;
2286 plci.setLayoutCount = 1;
2287 plci.pSetLayouts = &descriptor_set_layout;
2288 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
2289 assert(!err);
2290
2291 BeginCommandBuffer();
2292 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2293 pipeline_layout, 0, 1, &badSet, 0, NULL);
2294 m_errorMonitor->VerifyFound();
2295 EndCommandBuffer();
2296 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
2297 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002298}
2299
Karl Schultz6addd812016-02-02 17:17:23 -07002300TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002301 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
2302 // ObjectTracker should catch this.
2303 VkDescriptorSetLayout bad_layout = (VkDescriptorSetLayout)0xbaad6001;
2304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2305 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
2306
2307 VkPipelineLayout pipeline_layout;
2308 VkPipelineLayoutCreateInfo plci = {};
2309 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2310 plci.pNext = NULL;
2311 plci.setLayoutCount = 1;
2312 plci.pSetLayouts = &bad_layout;
2313 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
2314
2315 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002316}
2317
Karl Schultz6addd812016-02-02 17:17:23 -07002318TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002319 // Attempt to bind an invalid Pipeline to a valid Command Buffer
2320 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002321 // Create a valid cmd buffer
2322 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultzbdb75952016-04-19 11:36:49 -06002323 VkPipeline bad_pipeline = (VkPipeline)0xbaad6001;
2324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2325 "Invalid VkPipeline Object 0xbaad6001");
2326 ASSERT_NO_FATAL_FAILURE(InitState());
2327 BeginCommandBuffer();
2328 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2329 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
2330 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002331}
2332
Karl Schultz6addd812016-02-02 17:17:23 -07002333TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
2334 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
2335 // CommandBuffer
2336 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002337
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002339 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002340
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002341 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06002342 ASSERT_NO_FATAL_FAILURE(InitViewport());
2343 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002344 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002345 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2346 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06002347
2348 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002349 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2350 ds_pool_ci.pNext = NULL;
2351 ds_pool_ci.maxSets = 1;
2352 ds_pool_ci.poolSizeCount = 1;
2353 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06002354
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002355 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002356 err =
2357 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002358 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002359
Tony Barboureb254902015-07-15 12:50:33 -06002360 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002361 dsl_binding.binding = 0;
2362 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2363 dsl_binding.descriptorCount = 1;
2364 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2365 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002366
Tony Barboureb254902015-07-15 12:50:33 -06002367 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002368 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2369 ds_layout_ci.pNext = NULL;
2370 ds_layout_ci.bindingCount = 1;
2371 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002372 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002373 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2374 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002375 ASSERT_VK_SUCCESS(err);
2376
2377 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002378 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002379 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002380 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002381 alloc_info.descriptorPool = ds_pool;
2382 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002383 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2384 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002385 ASSERT_VK_SUCCESS(err);
2386
Tony Barboureb254902015-07-15 12:50:33 -06002387 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002388 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2389 pipeline_layout_ci.pNext = NULL;
2390 pipeline_layout_ci.setLayoutCount = 1;
2391 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002392
2393 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002394 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2395 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002396 ASSERT_VK_SUCCESS(err);
2397
Karl Schultz6addd812016-02-02 17:17:23 -07002398 VkShaderObj vs(m_device, bindStateVertShaderText,
2399 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06002400 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07002401 // on more devices
2402 VkShaderObj fs(m_device, bindStateFragShaderText,
2403 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002404
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002405 VkPipelineObj pipe(m_device);
2406 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06002407 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06002408 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002409 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06002410
2411 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002412 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2413 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2414 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2415 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2416 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002417
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002418 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002419
Chia-I Wuf7458c52015-10-26 21:10:41 +08002420 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2421 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2422 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002423}
2424
Karl Schultz6addd812016-02-02 17:17:23 -07002425TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002426 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07002427 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002428
Karl Schultz6addd812016-02-02 17:17:23 -07002429 m_errorMonitor->SetDesiredFailureMsg(
2430 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002431 "Attempt to update descriptor with invalid bufferView ");
2432
2433 ASSERT_NO_FATAL_FAILURE(InitState());
2434 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002435 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2436 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002437
2438 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002439 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2440 ds_pool_ci.pNext = NULL;
2441 ds_pool_ci.maxSets = 1;
2442 ds_pool_ci.poolSizeCount = 1;
2443 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002444
2445 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002446 err =
2447 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002448 ASSERT_VK_SUCCESS(err);
2449
2450 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002451 dsl_binding.binding = 0;
2452 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2453 dsl_binding.descriptorCount = 1;
2454 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2455 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002456
2457 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002458 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2459 ds_layout_ci.pNext = NULL;
2460 ds_layout_ci.bindingCount = 1;
2461 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002462 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002463 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2464 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002465 ASSERT_VK_SUCCESS(err);
2466
2467 VkDescriptorSet descriptorSet;
2468 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002469 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002470 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002471 alloc_info.descriptorPool = ds_pool;
2472 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002473 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2474 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002475 ASSERT_VK_SUCCESS(err);
2476
Karl Schultz6addd812016-02-02 17:17:23 -07002477 VkBufferView view =
2478 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002479 VkWriteDescriptorSet descriptor_write;
2480 memset(&descriptor_write, 0, sizeof(descriptor_write));
2481 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2482 descriptor_write.dstSet = descriptorSet;
2483 descriptor_write.dstBinding = 0;
2484 descriptor_write.descriptorCount = 1;
2485 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2486 descriptor_write.pTexelBufferView = &view;
2487
2488 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2489
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002490 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002491
2492 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2493 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2494}
2495
Karl Schultz6addd812016-02-02 17:17:23 -07002496TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
2497 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
2498 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07002499 // 1. No dynamicOffset supplied
2500 // 2. Too many dynamicOffsets supplied
2501 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07002502 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002503 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002504 " requires 1 dynamicOffsets, but only "
2505 "0 dynamicOffsets are left in "
2506 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002507
2508 ASSERT_NO_FATAL_FAILURE(InitState());
2509 ASSERT_NO_FATAL_FAILURE(InitViewport());
2510 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2511
2512 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002513 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2514 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002515
2516 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002517 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2518 ds_pool_ci.pNext = NULL;
2519 ds_pool_ci.maxSets = 1;
2520 ds_pool_ci.poolSizeCount = 1;
2521 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002522
2523 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002524 err =
2525 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002526 ASSERT_VK_SUCCESS(err);
2527
2528 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002529 dsl_binding.binding = 0;
2530 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2531 dsl_binding.descriptorCount = 1;
2532 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2533 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002534
2535 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002536 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2537 ds_layout_ci.pNext = NULL;
2538 ds_layout_ci.bindingCount = 1;
2539 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002540 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002541 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2542 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002543 ASSERT_VK_SUCCESS(err);
2544
2545 VkDescriptorSet descriptorSet;
2546 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002547 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002548 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002549 alloc_info.descriptorPool = ds_pool;
2550 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002551 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2552 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002553 ASSERT_VK_SUCCESS(err);
2554
2555 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002556 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2557 pipeline_layout_ci.pNext = NULL;
2558 pipeline_layout_ci.setLayoutCount = 1;
2559 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002560
2561 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002562 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2563 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002564 ASSERT_VK_SUCCESS(err);
2565
2566 // Create a buffer to update the descriptor with
2567 uint32_t qfi = 0;
2568 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002569 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2570 buffCI.size = 1024;
2571 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2572 buffCI.queueFamilyIndexCount = 1;
2573 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002574
2575 VkBuffer dyub;
2576 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2577 ASSERT_VK_SUCCESS(err);
2578 // Correctly update descriptor to avoid "NOT_UPDATED" error
2579 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002580 buffInfo.buffer = dyub;
2581 buffInfo.offset = 0;
2582 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002583
2584 VkWriteDescriptorSet descriptor_write;
2585 memset(&descriptor_write, 0, sizeof(descriptor_write));
2586 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2587 descriptor_write.dstSet = descriptorSet;
2588 descriptor_write.dstBinding = 0;
2589 descriptor_write.descriptorCount = 1;
2590 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2591 descriptor_write.pBufferInfo = &buffInfo;
2592
2593 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2594
2595 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002596 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2597 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2598 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002599 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07002600 uint32_t pDynOff[2] = {512, 756};
2601 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07002602 m_errorMonitor->SetDesiredFailureMsg(
2603 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07002604 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07002605 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2606 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2607 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12002608 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07002609 // Finally cause error due to dynamicOffset being too big
Karl Schultz6addd812016-02-02 17:17:23 -07002610 m_errorMonitor->SetDesiredFailureMsg(
2611 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07002612 " from its update, this oversteps its buffer (");
2613 // Create PSO to be used for draw-time errors below
2614 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002615 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002616 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07002617 "out gl_PerVertex { \n"
2618 " vec4 gl_Position;\n"
2619 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002620 "void main(){\n"
2621 " gl_Position = vec4(1);\n"
2622 "}\n";
2623 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002624 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002625 "\n"
2626 "layout(location=0) out vec4 x;\n"
2627 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2628 "void main(){\n"
2629 " x = vec4(bar.y);\n"
2630 "}\n";
2631 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2632 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2633 VkPipelineObj pipe(m_device);
2634 pipe.AddShader(&vs);
2635 pipe.AddShader(&fs);
2636 pipe.AddColorAttachment();
2637 pipe.CreateVKPipeline(pipeline_layout, renderPass());
2638
Karl Schultz6addd812016-02-02 17:17:23 -07002639 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2640 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2641 // This update should succeed, but offset size of 512 will overstep buffer
2642 // /w range 1024 & size 1024
2643 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2644 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2645 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07002646 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002647 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002648
2649 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2650 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2651}
2652
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002653TEST_F(VkLayerTest, InvalidPushConstants) {
2654 // Hit push constant error cases:
2655 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
2656 // 2. Incorrectly set push constant size to 0
2657 // 3. Incorrectly set push constant size to non-multiple of 4
2658 // 4. Attempt push constant update that exceeds maxPushConstantSize
2659 VkResult err;
2660 m_errorMonitor->SetDesiredFailureMsg(
2661 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2662 "vkCreatePipelineLayout() call has push constants with offset ");
2663
2664 ASSERT_NO_FATAL_FAILURE(InitState());
2665 ASSERT_NO_FATAL_FAILURE(InitViewport());
2666 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2667
2668 VkPushConstantRange pc_range = {};
2669 pc_range.size = 0xFFFFFFFFu;
2670 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2671 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
2672 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2673 pipeline_layout_ci.pushConstantRangeCount = 1;
2674 pipeline_layout_ci.pPushConstantRanges = &pc_range;
2675
2676 VkPipelineLayout pipeline_layout;
2677 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2678 &pipeline_layout);
2679
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002680 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002681 // Now cause errors due to size 0 and non-4 byte aligned size
2682 pc_range.size = 0;
2683 m_errorMonitor->SetDesiredFailureMsg(
2684 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2685 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
2686 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2687 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002688 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002689 pc_range.size = 1;
2690 m_errorMonitor->SetDesiredFailureMsg(
2691 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2692 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
2693 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2694 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002695 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002696 // Cause error due to bad size in vkCmdPushConstants() call
2697 m_errorMonitor->SetDesiredFailureMsg(
2698 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2699 "vkCmdPushConstants() call has push constants with offset ");
2700 pipeline_layout_ci.pushConstantRangeCount = 0;
2701 pipeline_layout_ci.pPushConstantRanges = NULL;
2702 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2703 &pipeline_layout);
2704 ASSERT_VK_SUCCESS(err);
2705 BeginCommandBuffer();
2706 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
2707 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002708 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002709 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2710}
2711
Karl Schultz6addd812016-02-02 17:17:23 -07002712TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07002713 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07002714 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002715
2716 ASSERT_NO_FATAL_FAILURE(InitState());
2717 ASSERT_NO_FATAL_FAILURE(InitViewport());
2718 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2719
2720 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
2721 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002722 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2723 ds_type_count[0].descriptorCount = 10;
2724 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
2725 ds_type_count[1].descriptorCount = 2;
2726 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
2727 ds_type_count[2].descriptorCount = 2;
2728 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
2729 ds_type_count[3].descriptorCount = 5;
2730 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
2731 // type
2732 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
2733 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
2734 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002735
2736 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002737 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2738 ds_pool_ci.pNext = NULL;
2739 ds_pool_ci.maxSets = 5;
2740 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
2741 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002742
2743 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002744 err =
2745 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002746 ASSERT_VK_SUCCESS(err);
2747
2748 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
2749 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002750 dsl_binding[0].binding = 0;
2751 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2752 dsl_binding[0].descriptorCount = 5;
2753 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
2754 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002755
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002756 // Create layout identical to set0 layout but w/ different stageFlags
2757 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002758 dsl_fs_stage_only.binding = 0;
2759 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2760 dsl_fs_stage_only.descriptorCount = 5;
2761 dsl_fs_stage_only.stageFlags =
2762 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
2763 // bind time
2764 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002765 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002766 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2767 ds_layout_ci.pNext = NULL;
2768 ds_layout_ci.bindingCount = 1;
2769 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002770 static const uint32_t NUM_LAYOUTS = 4;
2771 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002772 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002773 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
2774 // layout for error case
2775 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2776 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002777 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002778 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002779 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2780 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002781 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002782 dsl_binding[0].binding = 0;
2783 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002784 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002785 dsl_binding[1].binding = 1;
2786 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
2787 dsl_binding[1].descriptorCount = 2;
2788 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
2789 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002790 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002791 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07002792 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2793 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002794 ASSERT_VK_SUCCESS(err);
2795 dsl_binding[0].binding = 0;
2796 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002797 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002798 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07002799 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2800 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002801 ASSERT_VK_SUCCESS(err);
2802 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002803 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07002804 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2805 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002806 ASSERT_VK_SUCCESS(err);
2807
2808 static const uint32_t NUM_SETS = 4;
2809 VkDescriptorSet descriptorSet[NUM_SETS] = {};
2810 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002811 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002812 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002813 alloc_info.descriptorPool = ds_pool;
2814 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002815 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2816 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002817 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002818 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07002819 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002820 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002821 err =
2822 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002823 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002824
2825 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002826 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2827 pipeline_layout_ci.pNext = NULL;
2828 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
2829 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002830
2831 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002832 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2833 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002834 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002835 // Create pipelineLayout with only one setLayout
2836 pipeline_layout_ci.setLayoutCount = 1;
2837 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002838 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2839 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002840 ASSERT_VK_SUCCESS(err);
2841 // Create pipelineLayout with 2 descriptor setLayout at index 0
2842 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
2843 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07002844 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2845 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002846 ASSERT_VK_SUCCESS(err);
2847 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
2848 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
2849 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07002850 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2851 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002852 ASSERT_VK_SUCCESS(err);
2853 // Create pipelineLayout with UB type, but stageFlags for FS only
2854 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
2855 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002856 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2857 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002858 ASSERT_VK_SUCCESS(err);
2859 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
2860 VkDescriptorSetLayout pl_bad_s0[2] = {};
2861 pl_bad_s0[0] = ds_layout_fs_only;
2862 pl_bad_s0[1] = ds_layout[1];
2863 pipeline_layout_ci.setLayoutCount = 2;
2864 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
2865 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07002866 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2867 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002868 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002869
2870 // Create a buffer to update the descriptor with
2871 uint32_t qfi = 0;
2872 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002873 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2874 buffCI.size = 1024;
2875 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2876 buffCI.queueFamilyIndexCount = 1;
2877 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002878
2879 VkBuffer dyub;
2880 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2881 ASSERT_VK_SUCCESS(err);
2882 // Correctly update descriptor to avoid "NOT_UPDATED" error
2883 static const uint32_t NUM_BUFFS = 5;
2884 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002885 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07002886 buffInfo[i].buffer = dyub;
2887 buffInfo[i].offset = 0;
2888 buffInfo[i].range = 1024;
2889 }
Karl Schultz6addd812016-02-02 17:17:23 -07002890 VkImage image;
2891 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2892 const int32_t tex_width = 32;
2893 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002894 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002895 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2896 image_create_info.pNext = NULL;
2897 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2898 image_create_info.format = tex_format;
2899 image_create_info.extent.width = tex_width;
2900 image_create_info.extent.height = tex_height;
2901 image_create_info.extent.depth = 1;
2902 image_create_info.mipLevels = 1;
2903 image_create_info.arrayLayers = 1;
2904 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2905 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2906 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2907 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002908 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2909 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002910
Karl Schultz6addd812016-02-02 17:17:23 -07002911 VkMemoryRequirements memReqs;
2912 VkDeviceMemory imageMem;
2913 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002914 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002915 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2916 memAlloc.pNext = NULL;
2917 memAlloc.allocationSize = 0;
2918 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002919 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
2920 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002921 pass =
2922 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002923 ASSERT_TRUE(pass);
2924 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
2925 ASSERT_VK_SUCCESS(err);
2926 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
2927 ASSERT_VK_SUCCESS(err);
2928
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002929 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002930 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2931 image_view_create_info.image = image;
2932 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
2933 image_view_create_info.format = tex_format;
2934 image_view_create_info.subresourceRange.layerCount = 1;
2935 image_view_create_info.subresourceRange.baseMipLevel = 0;
2936 image_view_create_info.subresourceRange.levelCount = 1;
2937 image_view_create_info.subresourceRange.aspectMask =
2938 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002939
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002940 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07002941 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
2942 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002943 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002944 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002945 imageInfo[0].imageView = view;
2946 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2947 imageInfo[1].imageView = view;
2948 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002949 imageInfo[2].imageView = view;
2950 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2951 imageInfo[3].imageView = view;
2952 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002953
2954 static const uint32_t NUM_SET_UPDATES = 3;
2955 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
2956 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2957 descriptor_write[0].dstSet = descriptorSet[0];
2958 descriptor_write[0].dstBinding = 0;
2959 descriptor_write[0].descriptorCount = 5;
2960 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2961 descriptor_write[0].pBufferInfo = buffInfo;
2962 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2963 descriptor_write[1].dstSet = descriptorSet[1];
2964 descriptor_write[1].dstBinding = 0;
2965 descriptor_write[1].descriptorCount = 2;
2966 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
2967 descriptor_write[1].pImageInfo = imageInfo;
2968 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2969 descriptor_write[2].dstSet = descriptorSet[1];
2970 descriptor_write[2].dstBinding = 1;
2971 descriptor_write[2].descriptorCount = 2;
2972 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002973 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002974
2975 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002976
Tobin Ehlis88452832015-12-03 09:40:56 -07002977 // Create PSO to be used for draw-time errors below
2978 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002979 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002980 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07002981 "out gl_PerVertex {\n"
2982 " vec4 gl_Position;\n"
2983 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002984 "void main(){\n"
2985 " gl_Position = vec4(1);\n"
2986 "}\n";
2987 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002988 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002989 "\n"
2990 "layout(location=0) out vec4 x;\n"
2991 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2992 "void main(){\n"
2993 " x = vec4(bar.y);\n"
2994 "}\n";
2995 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2996 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002997 VkPipelineObj pipe(m_device);
2998 pipe.AddShader(&vs);
2999 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07003000 pipe.AddColorAttachment();
3001 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07003002
3003 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07003004
Karl Schultz6addd812016-02-02 17:17:23 -07003005 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3006 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3007 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
3008 // of PSO
3009 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
3010 // cmd_pipeline.c
3011 // due to the fact that cmd_alloc_dset_data() has not been called in
3012 // cmd_bind_graphics_pipeline()
3013 // TODO : Want to cause various binding incompatibility issues here to test
3014 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07003015 // First cause various verify_layout_compatibility() fails
3016 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003017 // verify_set_layout_compatibility fail cases:
3018 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07003019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3020 " due to: invalid VkPipelineLayout ");
3021 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3022 VK_PIPELINE_BIND_POINT_GRAPHICS,
3023 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
3024 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003025 m_errorMonitor->VerifyFound();
3026
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003027 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07003028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3029 " attempting to bind set to index 1");
3030 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3031 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
3032 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003033 m_errorMonitor->VerifyFound();
3034
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003035 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003036 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
3037 // descriptors
3038 m_errorMonitor->SetDesiredFailureMsg(
3039 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3040 ", but corresponding set being bound has 5 descriptors.");
3041 vkCmdBindDescriptorSets(
3042 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3043 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003044 m_errorMonitor->VerifyFound();
3045
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003046 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
3047 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07003048 m_errorMonitor->SetDesiredFailureMsg(
3049 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3050 " descriptor from pipelineLayout is type 'VK_DESCRIPTOR_TYPE_SAMPLER'");
3051 vkCmdBindDescriptorSets(
3052 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3053 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003054 m_errorMonitor->VerifyFound();
3055
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003056 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
3057 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07003058 m_errorMonitor->SetDesiredFailureMsg(
3059 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3060 " descriptor from pipelineLayout has stageFlags ");
3061 vkCmdBindDescriptorSets(
3062 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3063 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003064 m_errorMonitor->VerifyFound();
3065
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003066 // Cause INFO messages due to disturbing previously bound Sets
3067 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07003068 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3069 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3070 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003071 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07003072 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003073 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003074 " previously bound as set #0 was disturbed ");
3075 vkCmdBindDescriptorSets(
3076 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3077 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003078 m_errorMonitor->VerifyFound();
3079
Karl Schultz6addd812016-02-02 17:17:23 -07003080 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3081 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3082 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003083 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003084 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003085 " newly bound as set #0 so set #1 and "
3086 "any subsequent sets were disturbed ");
3087 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3088 VK_PIPELINE_BIND_POINT_GRAPHICS,
3089 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003090 m_errorMonitor->VerifyFound();
3091
Tobin Ehlis88452832015-12-03 09:40:56 -07003092 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07003093 // 1. Error due to not binding required set (we actually use same code as
3094 // above to disturb set0)
3095 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3096 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3097 2, &descriptorSet[0], 0, NULL);
3098 vkCmdBindDescriptorSets(
3099 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3100 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
3101 m_errorMonitor->SetDesiredFailureMsg(
3102 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3103 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07003104 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003105 m_errorMonitor->VerifyFound();
3106
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003107 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003108 // 2. Error due to bound set not being compatible with PSO's
3109 // VkPipelineLayout (diff stageFlags in this case)
3110 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3111 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3112 2, &descriptorSet[0], 0, NULL);
3113 m_errorMonitor->SetDesiredFailureMsg(
3114 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3115 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07003116 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003117 m_errorMonitor->VerifyFound();
3118
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003119 // Remaining clean-up
3120 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003121 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003122 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
3123 }
3124 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
3125 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, descriptorSet);
3126 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003127 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3128 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3129}
Tobin Ehlis559c6382015-11-05 09:52:49 -07003130
Karl Schultz6addd812016-02-02 17:17:23 -07003131TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003132
Karl Schultz6addd812016-02-02 17:17:23 -07003133 m_errorMonitor->SetDesiredFailureMsg(
3134 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003135 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003136
3137 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003138 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003139 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003140 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003141
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003142 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003143}
3144
Karl Schultz6addd812016-02-02 17:17:23 -07003145TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
3146 VkResult err;
3147 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003148
Karl Schultz6addd812016-02-02 17:17:23 -07003149 m_errorMonitor->SetDesiredFailureMsg(
3150 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07003151 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003152
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003153 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003154
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003155 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003156 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003157 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003158 cmd.commandPool = m_commandPool;
3159 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003160 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06003161
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003162 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06003163 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003164
3165 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003166 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003167 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003168 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003169 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07003170 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
3171 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003172 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003173
3174 // The error should be caught by validation of the BeginCommandBuffer call
3175 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
3176
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003177 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003178 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003179}
3180
Karl Schultz6addd812016-02-02 17:17:23 -07003181TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003182 // Cause error due to Begin while recording CB
3183 // Then cause 2 errors for attempting to reset CB w/o having
3184 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
3185 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003186 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003187 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003188
3189 ASSERT_NO_FATAL_FAILURE(InitState());
3190
3191 // Calls AllocateCommandBuffers
3192 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
3193
Karl Schultz6addd812016-02-02 17:17:23 -07003194 // Force the failure by setting the Renderpass and Framebuffer fields with
3195 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003196 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003197 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003198 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3199 cmd_buf_info.pNext = NULL;
3200 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003201 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003202
3203 // Begin CB to transition to recording state
3204 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
3205 // Can't re-begin. This should trigger error
3206 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003207 m_errorMonitor->VerifyFound();
3208
Karl Schultz6addd812016-02-02 17:17:23 -07003209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3210 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003211 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
3212 // Reset attempt will trigger error due to incorrect CommandPool state
3213 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003214 m_errorMonitor->VerifyFound();
3215
Karl Schultz6addd812016-02-02 17:17:23 -07003216 m_errorMonitor->SetDesiredFailureMsg(
3217 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3218 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003219 // Transition CB to RECORDED state
3220 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
3221 // Now attempting to Begin will implicitly reset, which triggers error
3222 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003223 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003224}
3225
Karl Schultz6addd812016-02-02 17:17:23 -07003226TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003227 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003228 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003229
Karl Schultz6addd812016-02-02 17:17:23 -07003230 m_errorMonitor->SetDesiredFailureMsg(
3231 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003232 "Invalid Pipeline CreateInfo State: Vtx Shader required");
3233
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003234 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003235 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003236
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003237 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003238 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3239 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003240
3241 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003242 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3243 ds_pool_ci.pNext = NULL;
3244 ds_pool_ci.maxSets = 1;
3245 ds_pool_ci.poolSizeCount = 1;
3246 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003247
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003248 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003249 err =
3250 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003251 ASSERT_VK_SUCCESS(err);
3252
Tony Barboureb254902015-07-15 12:50:33 -06003253 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003254 dsl_binding.binding = 0;
3255 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3256 dsl_binding.descriptorCount = 1;
3257 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3258 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003259
Tony Barboureb254902015-07-15 12:50:33 -06003260 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003261 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3262 ds_layout_ci.pNext = NULL;
3263 ds_layout_ci.bindingCount = 1;
3264 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003265
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003266 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003267 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3268 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003269 ASSERT_VK_SUCCESS(err);
3270
3271 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003272 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003273 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003274 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003275 alloc_info.descriptorPool = ds_pool;
3276 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003277 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3278 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003279 ASSERT_VK_SUCCESS(err);
3280
Tony Barboureb254902015-07-15 12:50:33 -06003281 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003282 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3283 pipeline_layout_ci.setLayoutCount = 1;
3284 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003285
3286 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003287 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3288 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003289 ASSERT_VK_SUCCESS(err);
3290
Tobin Ehlise68360f2015-10-01 11:15:13 -06003291 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07003292 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06003293
3294 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003295 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3296 vp_state_ci.scissorCount = 1;
3297 vp_state_ci.pScissors = &sc;
3298 vp_state_ci.viewportCount = 1;
3299 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003300
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003301 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3302 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3303 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3304 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3305 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3306 rs_state_ci.depthClampEnable = VK_FALSE;
3307 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3308 rs_state_ci.depthBiasEnable = VK_FALSE;
3309
Tony Barboureb254902015-07-15 12:50:33 -06003310 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003311 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3312 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003313 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003314 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3315 gp_ci.layout = pipeline_layout;
3316 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06003317
3318 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003319 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3320 pc_ci.initialDataSize = 0;
3321 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003322
3323 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003324 VkPipelineCache pipelineCache;
3325
Karl Schultz6addd812016-02-02 17:17:23 -07003326 err =
3327 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06003328 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003329 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3330 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003331
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003332 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003333
Chia-I Wuf7458c52015-10-26 21:10:41 +08003334 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3335 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3336 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3337 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003338}
Tobin Ehlis912df022015-09-17 08:46:18 -06003339/*// TODO : This test should be good, but needs Tess support in compiler to run
3340TEST_F(VkLayerTest, InvalidPatchControlPoints)
3341{
3342 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06003343 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003344
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003346 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
3347primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003348
Tobin Ehlis912df022015-09-17 08:46:18 -06003349 ASSERT_NO_FATAL_FAILURE(InitState());
3350 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06003351
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003352 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06003353 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003354 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003355
3356 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3357 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3358 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003359 ds_pool_ci.poolSizeCount = 1;
3360 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06003361
3362 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003363 err = vkCreateDescriptorPool(m_device->device(),
3364VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06003365 ASSERT_VK_SUCCESS(err);
3366
3367 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08003368 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06003369 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08003370 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003371 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3372 dsl_binding.pImmutableSamplers = NULL;
3373
3374 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003375 ds_layout_ci.sType =
3376VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003377 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003378 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003379 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06003380
3381 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003382 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3383&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003384 ASSERT_VK_SUCCESS(err);
3385
3386 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07003387 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
3388VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06003389 ASSERT_VK_SUCCESS(err);
3390
3391 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003392 pipeline_layout_ci.sType =
3393VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003394 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003395 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003396 pipeline_layout_ci.pSetLayouts = &ds_layout;
3397
3398 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003399 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3400&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003401 ASSERT_VK_SUCCESS(err);
3402
3403 VkPipelineShaderStageCreateInfo shaderStages[3];
3404 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
3405
Karl Schultz6addd812016-02-02 17:17:23 -07003406 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
3407this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003408 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07003409 VkShaderObj
3410tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
3411this);
3412 VkShaderObj
3413te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
3414this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003415
Karl Schultz6addd812016-02-02 17:17:23 -07003416 shaderStages[0].sType =
3417VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003418 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003419 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003420 shaderStages[1].sType =
3421VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003422 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003423 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003424 shaderStages[2].sType =
3425VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003426 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003427 shaderStages[2].shader = te.handle();
3428
3429 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003430 iaCI.sType =
3431VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08003432 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06003433
3434 VkPipelineTessellationStateCreateInfo tsCI = {};
3435 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
3436 tsCI.patchControlPoints = 0; // This will cause an error
3437
3438 VkGraphicsPipelineCreateInfo gp_ci = {};
3439 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3440 gp_ci.pNext = NULL;
3441 gp_ci.stageCount = 3;
3442 gp_ci.pStages = shaderStages;
3443 gp_ci.pVertexInputState = NULL;
3444 gp_ci.pInputAssemblyState = &iaCI;
3445 gp_ci.pTessellationState = &tsCI;
3446 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003447 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06003448 gp_ci.pMultisampleState = NULL;
3449 gp_ci.pDepthStencilState = NULL;
3450 gp_ci.pColorBlendState = NULL;
3451 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3452 gp_ci.layout = pipeline_layout;
3453 gp_ci.renderPass = renderPass();
3454
3455 VkPipelineCacheCreateInfo pc_ci = {};
3456 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3457 pc_ci.pNext = NULL;
3458 pc_ci.initialSize = 0;
3459 pc_ci.initialData = 0;
3460 pc_ci.maxSize = 0;
3461
3462 VkPipeline pipeline;
3463 VkPipelineCache pipelineCache;
3464
Karl Schultz6addd812016-02-02 17:17:23 -07003465 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
3466&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06003467 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003468 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3469&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06003470
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003471 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003472
Chia-I Wuf7458c52015-10-26 21:10:41 +08003473 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3474 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3475 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3476 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06003477}
3478*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06003479// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07003480TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07003481 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003482
Karl Schultz6addd812016-02-02 17:17:23 -07003483 m_errorMonitor->SetDesiredFailureMsg(
3484 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003485 "Gfx Pipeline viewport count (1) must match scissor count (0).");
3486
Tobin Ehlise68360f2015-10-01 11:15:13 -06003487 ASSERT_NO_FATAL_FAILURE(InitState());
3488 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003489
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003490 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003491 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3492 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003493
3494 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003495 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3496 ds_pool_ci.maxSets = 1;
3497 ds_pool_ci.poolSizeCount = 1;
3498 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003499
3500 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003501 err =
3502 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003503 ASSERT_VK_SUCCESS(err);
3504
3505 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003506 dsl_binding.binding = 0;
3507 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3508 dsl_binding.descriptorCount = 1;
3509 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003510
3511 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003512 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3513 ds_layout_ci.bindingCount = 1;
3514 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003515
3516 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003517 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3518 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003519 ASSERT_VK_SUCCESS(err);
3520
3521 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003522 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003523 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003524 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003525 alloc_info.descriptorPool = ds_pool;
3526 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003527 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3528 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003529 ASSERT_VK_SUCCESS(err);
3530
3531 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003532 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3533 pipeline_layout_ci.setLayoutCount = 1;
3534 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003535
3536 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003537 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3538 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003539 ASSERT_VK_SUCCESS(err);
3540
3541 VkViewport vp = {}; // Just need dummy vp to point to
3542
3543 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003544 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3545 vp_state_ci.scissorCount = 0;
3546 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
3547 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003548
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003549 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3550 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3551 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3552 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3553 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3554 rs_state_ci.depthClampEnable = VK_FALSE;
3555 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3556 rs_state_ci.depthBiasEnable = VK_FALSE;
3557
Cody Northropeb3a6c12015-10-05 14:44:45 -06003558 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003559 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003560
Karl Schultz6addd812016-02-02 17:17:23 -07003561 VkShaderObj vs(m_device, bindStateVertShaderText,
3562 VK_SHADER_STAGE_VERTEX_BIT, this);
3563 VkShaderObj fs(m_device, bindStateFragShaderText,
3564 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003565 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003566 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003567 shaderStages[0] = vs.GetStageCreateInfo();
3568 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003569
3570 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003571 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3572 gp_ci.stageCount = 2;
3573 gp_ci.pStages = shaderStages;
3574 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003575 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003576 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3577 gp_ci.layout = pipeline_layout;
3578 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003579
3580 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003581 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003582
3583 VkPipeline pipeline;
3584 VkPipelineCache pipelineCache;
3585
Karl Schultz6addd812016-02-02 17:17:23 -07003586 err =
3587 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003588 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003589 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3590 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003591
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003592 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003593
Chia-I Wuf7458c52015-10-26 21:10:41 +08003594 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3595 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3596 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3597 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003598}
Karl Schultz6addd812016-02-02 17:17:23 -07003599// Don't set viewport state in PSO. This is an error b/c we always need this
3600// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06003601// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07003602TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06003603 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003604 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003605
Karl Schultz6addd812016-02-02 17:17:23 -07003606 m_errorMonitor->SetDesiredFailureMsg(
3607 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003608 "Gfx Pipeline pViewportState is null. Even if ");
3609
Tobin Ehlise68360f2015-10-01 11:15:13 -06003610 ASSERT_NO_FATAL_FAILURE(InitState());
3611 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003612
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003613 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003614 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3615 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003616
3617 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003618 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3619 ds_pool_ci.maxSets = 1;
3620 ds_pool_ci.poolSizeCount = 1;
3621 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003622
3623 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003624 err =
3625 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003626 ASSERT_VK_SUCCESS(err);
3627
3628 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003629 dsl_binding.binding = 0;
3630 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3631 dsl_binding.descriptorCount = 1;
3632 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003633
3634 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003635 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3636 ds_layout_ci.bindingCount = 1;
3637 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003638
3639 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003640 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3641 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003642 ASSERT_VK_SUCCESS(err);
3643
3644 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003645 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003646 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003647 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003648 alloc_info.descriptorPool = ds_pool;
3649 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003650 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3651 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003652 ASSERT_VK_SUCCESS(err);
3653
3654 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003655 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3656 pipeline_layout_ci.setLayoutCount = 1;
3657 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003658
3659 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003660 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3661 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003662 ASSERT_VK_SUCCESS(err);
3663
3664 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
3665 // Set scissor as dynamic to avoid second error
3666 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003667 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3668 dyn_state_ci.dynamicStateCount = 1;
3669 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003670
Cody Northropeb3a6c12015-10-05 14:44:45 -06003671 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003672 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003673
Karl Schultz6addd812016-02-02 17:17:23 -07003674 VkShaderObj vs(m_device, bindStateVertShaderText,
3675 VK_SHADER_STAGE_VERTEX_BIT, this);
3676 VkShaderObj fs(m_device, bindStateFragShaderText,
3677 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003678 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003679 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003680 shaderStages[0] = vs.GetStageCreateInfo();
3681 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003682
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003683
3684 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3685 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3686 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3687 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3688 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3689 rs_state_ci.depthClampEnable = VK_FALSE;
3690 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3691 rs_state_ci.depthBiasEnable = VK_FALSE;
3692
Tobin Ehlise68360f2015-10-01 11:15:13 -06003693 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003694 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3695 gp_ci.stageCount = 2;
3696 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003697 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003698 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
3699 // should cause validation error
3700 gp_ci.pDynamicState = &dyn_state_ci;
3701 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3702 gp_ci.layout = pipeline_layout;
3703 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003704
3705 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003706 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003707
3708 VkPipeline pipeline;
3709 VkPipelineCache pipelineCache;
3710
Karl Schultz6addd812016-02-02 17:17:23 -07003711 err =
3712 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003713 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003714 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3715 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003716
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003717 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003718
Chia-I Wuf7458c52015-10-26 21:10:41 +08003719 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3720 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3721 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3722 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003723}
3724// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07003725// Then run second test where dynamic scissor count doesn't match PSO scissor
3726// count
3727TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
3728 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003729
Karl Schultz6addd812016-02-02 17:17:23 -07003730 m_errorMonitor->SetDesiredFailureMsg(
3731 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003732 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
3733
Tobin Ehlise68360f2015-10-01 11:15:13 -06003734 ASSERT_NO_FATAL_FAILURE(InitState());
3735 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003736
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003737 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003738 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3739 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003740
3741 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003742 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3743 ds_pool_ci.maxSets = 1;
3744 ds_pool_ci.poolSizeCount = 1;
3745 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003746
3747 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003748 err =
3749 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003750 ASSERT_VK_SUCCESS(err);
3751
3752 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003753 dsl_binding.binding = 0;
3754 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3755 dsl_binding.descriptorCount = 1;
3756 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003757
3758 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003759 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3760 ds_layout_ci.bindingCount = 1;
3761 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003762
3763 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003764 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3765 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003766 ASSERT_VK_SUCCESS(err);
3767
3768 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003769 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003770 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003771 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003772 alloc_info.descriptorPool = ds_pool;
3773 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003774 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3775 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003776 ASSERT_VK_SUCCESS(err);
3777
3778 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003779 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3780 pipeline_layout_ci.setLayoutCount = 1;
3781 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003782
3783 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003784 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3785 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003786 ASSERT_VK_SUCCESS(err);
3787
3788 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003789 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3790 vp_state_ci.viewportCount = 1;
3791 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
3792 vp_state_ci.scissorCount = 1;
3793 vp_state_ci.pScissors =
3794 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06003795
3796 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
3797 // Set scissor as dynamic to avoid that error
3798 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003799 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3800 dyn_state_ci.dynamicStateCount = 1;
3801 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003802
Cody Northropeb3a6c12015-10-05 14:44:45 -06003803 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003804 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003805
Karl Schultz6addd812016-02-02 17:17:23 -07003806 VkShaderObj vs(m_device, bindStateVertShaderText,
3807 VK_SHADER_STAGE_VERTEX_BIT, this);
3808 VkShaderObj fs(m_device, bindStateFragShaderText,
3809 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003810 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003811 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003812 shaderStages[0] = vs.GetStageCreateInfo();
3813 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003814
Cody Northropf6622dc2015-10-06 10:33:21 -06003815 VkPipelineVertexInputStateCreateInfo vi_ci = {};
3816 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
3817 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003818 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06003819 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003820 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06003821 vi_ci.pVertexAttributeDescriptions = nullptr;
3822
3823 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
3824 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
3825 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
3826
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003827 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003828 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06003829 rs_ci.pNext = nullptr;
3830
Mark Youngc89c6312016-03-31 16:03:20 -06003831 VkPipelineColorBlendAttachmentState att = {};
3832 att.blendEnable = VK_FALSE;
3833 att.colorWriteMask = 0xf;
3834
Cody Northropf6622dc2015-10-06 10:33:21 -06003835 VkPipelineColorBlendStateCreateInfo cb_ci = {};
3836 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
3837 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06003838 cb_ci.attachmentCount = 1;
3839 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06003840
Tobin Ehlise68360f2015-10-01 11:15:13 -06003841 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003842 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3843 gp_ci.stageCount = 2;
3844 gp_ci.pStages = shaderStages;
3845 gp_ci.pVertexInputState = &vi_ci;
3846 gp_ci.pInputAssemblyState = &ia_ci;
3847 gp_ci.pViewportState = &vp_state_ci;
3848 gp_ci.pRasterizationState = &rs_ci;
3849 gp_ci.pColorBlendState = &cb_ci;
3850 gp_ci.pDynamicState = &dyn_state_ci;
3851 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3852 gp_ci.layout = pipeline_layout;
3853 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003854
3855 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003856 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003857
3858 VkPipeline pipeline;
3859 VkPipelineCache pipelineCache;
3860
Karl Schultz6addd812016-02-02 17:17:23 -07003861 err =
3862 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003863 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003864 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3865 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003866
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003867 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003868
Tobin Ehlisd332f282015-10-02 11:00:56 -06003869 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07003870 // First need to successfully create the PSO from above by setting
3871 // pViewports
3872 m_errorMonitor->SetDesiredFailureMsg(
3873 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3874 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
3875 "scissorCount is 1. These counts must match.");
3876
3877 VkViewport vp = {}; // Just need dummy vp to point to
3878 vp_state_ci.pViewports = &vp;
3879 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3880 &gp_ci, NULL, &pipeline);
3881 ASSERT_VK_SUCCESS(err);
3882 BeginCommandBuffer();
3883 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3884 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
3885 VkRect2D scissors[2] = {}; // don't care about data
3886 // Count of 2 doesn't match PSO count of 1
3887 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
3888 Draw(1, 0, 0, 0);
3889
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003890 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07003891
3892 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3893 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3894 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3895 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3896}
3897// Create PSO w/o non-zero scissorCount but no scissor data
3898// Then run second test where dynamic viewportCount doesn't match PSO
3899// viewportCount
3900TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
3901 VkResult err;
3902
3903 m_errorMonitor->SetDesiredFailureMsg(
3904 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3905 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
3906
3907 ASSERT_NO_FATAL_FAILURE(InitState());
3908 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3909
3910 VkDescriptorPoolSize ds_type_count = {};
3911 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3912 ds_type_count.descriptorCount = 1;
3913
3914 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3915 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3916 ds_pool_ci.maxSets = 1;
3917 ds_pool_ci.poolSizeCount = 1;
3918 ds_pool_ci.pPoolSizes = &ds_type_count;
3919
3920 VkDescriptorPool ds_pool;
3921 err =
3922 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
3923 ASSERT_VK_SUCCESS(err);
3924
3925 VkDescriptorSetLayoutBinding dsl_binding = {};
3926 dsl_binding.binding = 0;
3927 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3928 dsl_binding.descriptorCount = 1;
3929 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3930
3931 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3932 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3933 ds_layout_ci.bindingCount = 1;
3934 ds_layout_ci.pBindings = &dsl_binding;
3935
3936 VkDescriptorSetLayout ds_layout;
3937 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3938 &ds_layout);
3939 ASSERT_VK_SUCCESS(err);
3940
3941 VkDescriptorSet descriptorSet;
3942 VkDescriptorSetAllocateInfo alloc_info = {};
3943 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3944 alloc_info.descriptorSetCount = 1;
3945 alloc_info.descriptorPool = ds_pool;
3946 alloc_info.pSetLayouts = &ds_layout;
3947 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3948 &descriptorSet);
3949 ASSERT_VK_SUCCESS(err);
3950
3951 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3952 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3953 pipeline_layout_ci.setLayoutCount = 1;
3954 pipeline_layout_ci.pSetLayouts = &ds_layout;
3955
3956 VkPipelineLayout pipeline_layout;
3957 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3958 &pipeline_layout);
3959 ASSERT_VK_SUCCESS(err);
3960
3961 VkPipelineViewportStateCreateInfo vp_state_ci = {};
3962 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3963 vp_state_ci.scissorCount = 1;
3964 vp_state_ci.pScissors =
3965 NULL; // Null scissor w/ count of 1 should cause error
3966 vp_state_ci.viewportCount = 1;
3967 vp_state_ci.pViewports =
3968 NULL; // vp is dynamic (below) so this won't cause error
3969
3970 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
3971 // Set scissor as dynamic to avoid that error
3972 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
3973 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3974 dyn_state_ci.dynamicStateCount = 1;
3975 dyn_state_ci.pDynamicStates = &vp_state;
3976
3977 VkPipelineShaderStageCreateInfo shaderStages[2];
3978 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
3979
3980 VkShaderObj vs(m_device, bindStateVertShaderText,
3981 VK_SHADER_STAGE_VERTEX_BIT, this);
3982 VkShaderObj fs(m_device, bindStateFragShaderText,
3983 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003984 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003985 // but add it to be able to run on more devices
3986 shaderStages[0] = vs.GetStageCreateInfo();
3987 shaderStages[1] = fs.GetStageCreateInfo();
3988
3989 VkPipelineVertexInputStateCreateInfo vi_ci = {};
3990 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
3991 vi_ci.pNext = nullptr;
3992 vi_ci.vertexBindingDescriptionCount = 0;
3993 vi_ci.pVertexBindingDescriptions = nullptr;
3994 vi_ci.vertexAttributeDescriptionCount = 0;
3995 vi_ci.pVertexAttributeDescriptions = nullptr;
3996
3997 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
3998 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
3999 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4000
4001 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4002 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4003 rs_ci.pNext = nullptr;
4004
Mark Youngc89c6312016-03-31 16:03:20 -06004005 VkPipelineColorBlendAttachmentState att = {};
4006 att.blendEnable = VK_FALSE;
4007 att.colorWriteMask = 0xf;
4008
Karl Schultz6addd812016-02-02 17:17:23 -07004009 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4010 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4011 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004012 cb_ci.attachmentCount = 1;
4013 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07004014
4015 VkGraphicsPipelineCreateInfo gp_ci = {};
4016 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4017 gp_ci.stageCount = 2;
4018 gp_ci.pStages = shaderStages;
4019 gp_ci.pVertexInputState = &vi_ci;
4020 gp_ci.pInputAssemblyState = &ia_ci;
4021 gp_ci.pViewportState = &vp_state_ci;
4022 gp_ci.pRasterizationState = &rs_ci;
4023 gp_ci.pColorBlendState = &cb_ci;
4024 gp_ci.pDynamicState = &dyn_state_ci;
4025 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4026 gp_ci.layout = pipeline_layout;
4027 gp_ci.renderPass = renderPass();
4028
4029 VkPipelineCacheCreateInfo pc_ci = {};
4030 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4031
4032 VkPipeline pipeline;
4033 VkPipelineCache pipelineCache;
4034
4035 err =
4036 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4037 ASSERT_VK_SUCCESS(err);
4038 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4039 &gp_ci, NULL, &pipeline);
4040
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004041 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004042
4043 // Now hit second fail case where we set scissor w/ different count than PSO
4044 // First need to successfully create the PSO from above by setting
4045 // pViewports
4046 m_errorMonitor->SetDesiredFailureMsg(
4047 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4048 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
4049 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004050
Tobin Ehlisd332f282015-10-02 11:00:56 -06004051 VkRect2D sc = {}; // Just need dummy vp to point to
4052 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07004053 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4054 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004055 ASSERT_VK_SUCCESS(err);
4056 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004057 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4058 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004059 VkViewport viewports[2] = {}; // don't care about data
4060 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07004061 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004062 Draw(1, 0, 0, 0);
4063
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004064 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004065
Chia-I Wuf7458c52015-10-26 21:10:41 +08004066 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4067 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4068 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4069 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004070}
4071
Mark Young7394fdd2016-03-31 14:56:43 -06004072TEST_F(VkLayerTest, PSOLineWidthInvalid) {
4073 VkResult err;
4074
4075 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4076 "Attempt to set lineWidth to 0");
4077
4078 ASSERT_NO_FATAL_FAILURE(InitState());
4079 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4080
4081 VkDescriptorPoolSize ds_type_count = {};
4082 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4083 ds_type_count.descriptorCount = 1;
4084
4085 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4086 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4087 ds_pool_ci.maxSets = 1;
4088 ds_pool_ci.poolSizeCount = 1;
4089 ds_pool_ci.pPoolSizes = &ds_type_count;
4090
4091 VkDescriptorPool ds_pool;
4092 err =
4093 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4094 ASSERT_VK_SUCCESS(err);
4095
4096 VkDescriptorSetLayoutBinding dsl_binding = {};
4097 dsl_binding.binding = 0;
4098 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4099 dsl_binding.descriptorCount = 1;
4100 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4101
4102 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4103 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4104 ds_layout_ci.bindingCount = 1;
4105 ds_layout_ci.pBindings = &dsl_binding;
4106
4107 VkDescriptorSetLayout ds_layout;
4108 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4109 &ds_layout);
4110 ASSERT_VK_SUCCESS(err);
4111
4112 VkDescriptorSet descriptorSet;
4113 VkDescriptorSetAllocateInfo alloc_info = {};
4114 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4115 alloc_info.descriptorSetCount = 1;
4116 alloc_info.descriptorPool = ds_pool;
4117 alloc_info.pSetLayouts = &ds_layout;
4118 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4119 &descriptorSet);
4120 ASSERT_VK_SUCCESS(err);
4121
4122 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4123 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4124 pipeline_layout_ci.setLayoutCount = 1;
4125 pipeline_layout_ci.pSetLayouts = &ds_layout;
4126
4127 VkPipelineLayout pipeline_layout;
4128 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4129 &pipeline_layout);
4130 ASSERT_VK_SUCCESS(err);
4131
4132 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4133 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4134 vp_state_ci.scissorCount = 1;
4135 vp_state_ci.pScissors = NULL;
4136 vp_state_ci.viewportCount = 1;
4137 vp_state_ci.pViewports = NULL;
4138
4139 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
4140 VK_DYNAMIC_STATE_SCISSOR,
4141 VK_DYNAMIC_STATE_LINE_WIDTH};
4142 // Set scissor as dynamic to avoid that error
4143 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4144 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4145 dyn_state_ci.dynamicStateCount = 2;
4146 dyn_state_ci.pDynamicStates = dynamic_states;
4147
4148 VkPipelineShaderStageCreateInfo shaderStages[2];
4149 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4150
4151 VkShaderObj vs(m_device, bindStateVertShaderText,
4152 VK_SHADER_STAGE_VERTEX_BIT, this);
4153 VkShaderObj fs(m_device, bindStateFragShaderText,
4154 VK_SHADER_STAGE_FRAGMENT_BIT,
4155 this); // TODO - We shouldn't need a fragment shader
4156 // but add it to be able to run on more devices
4157 shaderStages[0] = vs.GetStageCreateInfo();
4158 shaderStages[1] = fs.GetStageCreateInfo();
4159
4160 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4161 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4162 vi_ci.pNext = nullptr;
4163 vi_ci.vertexBindingDescriptionCount = 0;
4164 vi_ci.pVertexBindingDescriptions = nullptr;
4165 vi_ci.vertexAttributeDescriptionCount = 0;
4166 vi_ci.pVertexAttributeDescriptions = nullptr;
4167
4168 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4169 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4170 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4171
4172 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4173 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4174 rs_ci.pNext = nullptr;
4175
4176 // Check too low (line width of 0.0f).
4177 rs_ci.lineWidth = 0.0f;
4178
4179 VkPipelineColorBlendAttachmentState att = {};
4180 att.blendEnable = VK_FALSE;
4181 att.colorWriteMask = 0xf;
4182
4183 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4184 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4185 cb_ci.pNext = nullptr;
4186 cb_ci.attachmentCount = 1;
4187 cb_ci.pAttachments = &att;
4188
4189 VkGraphicsPipelineCreateInfo gp_ci = {};
4190 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4191 gp_ci.stageCount = 2;
4192 gp_ci.pStages = shaderStages;
4193 gp_ci.pVertexInputState = &vi_ci;
4194 gp_ci.pInputAssemblyState = &ia_ci;
4195 gp_ci.pViewportState = &vp_state_ci;
4196 gp_ci.pRasterizationState = &rs_ci;
4197 gp_ci.pColorBlendState = &cb_ci;
4198 gp_ci.pDynamicState = &dyn_state_ci;
4199 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4200 gp_ci.layout = pipeline_layout;
4201 gp_ci.renderPass = renderPass();
4202
4203 VkPipelineCacheCreateInfo pc_ci = {};
4204 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4205
4206 VkPipeline pipeline;
4207 VkPipelineCache pipelineCache;
4208
4209 err =
4210 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4211 ASSERT_VK_SUCCESS(err);
4212 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4213 &gp_ci, NULL, &pipeline);
4214
4215 m_errorMonitor->VerifyFound();
4216
4217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4218 "Attempt to set lineWidth to 65536");
4219
4220 // Check too high (line width of 65536.0f).
4221 rs_ci.lineWidth = 65536.0f;
4222
4223 err =
4224 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4225 ASSERT_VK_SUCCESS(err);
4226 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4227 &gp_ci, NULL, &pipeline);
4228
4229 m_errorMonitor->VerifyFound();
4230
4231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4232 "Attempt to set lineWidth to 0");
4233
4234 dyn_state_ci.dynamicStateCount = 3;
4235
4236 rs_ci.lineWidth = 1.0f;
4237
4238 err =
4239 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4240 ASSERT_VK_SUCCESS(err);
4241 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4242 &gp_ci, NULL, &pipeline);
4243 BeginCommandBuffer();
4244 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4245 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4246
4247 // Check too low with dynamic setting.
4248 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 0.0f);
4249 m_errorMonitor->VerifyFound();
4250
4251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4252 "Attempt to set lineWidth to 65536");
4253
4254 // Check too high with dynamic setting.
4255 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
4256 m_errorMonitor->VerifyFound();
4257 EndCommandBuffer();
4258
4259 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4260 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4261 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4262 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4263}
4264
Karl Schultz6addd812016-02-02 17:17:23 -07004265TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004266 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004267 m_errorMonitor->SetDesiredFailureMsg(
4268 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004269 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004270
4271 ASSERT_NO_FATAL_FAILURE(InitState());
4272 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004273
Tony Barbourfe3351b2015-07-28 10:17:20 -06004274 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004275 // Don't care about RenderPass handle b/c error should be flagged before
4276 // that
4277 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
4278 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004279
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004280 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004281}
4282
Karl Schultz6addd812016-02-02 17:17:23 -07004283TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004284 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004285 m_errorMonitor->SetDesiredFailureMsg(
4286 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004287 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004288
4289 ASSERT_NO_FATAL_FAILURE(InitState());
4290 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004291
Tony Barbourfe3351b2015-07-28 10:17:20 -06004292 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004293 // Just create a dummy Renderpass that's non-NULL so we can get to the
4294 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06004295 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004296 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4297 rp_begin.pNext = NULL;
4298 rp_begin.renderPass = renderPass();
4299 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004300
Karl Schultz6addd812016-02-02 17:17:23 -07004301 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
4302 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004303
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004304 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004305}
4306
Karl Schultz6addd812016-02-02 17:17:23 -07004307TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004308 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004309 m_errorMonitor->SetDesiredFailureMsg(
4310 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004311 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004312
4313 ASSERT_NO_FATAL_FAILURE(InitState());
4314 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004315
4316 // Renderpass is started here
4317 BeginCommandBuffer();
4318
4319 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004320 vk_testing::Buffer dstBuffer;
4321 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004322
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004323 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004324
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004325 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004326}
4327
Karl Schultz6addd812016-02-02 17:17:23 -07004328TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004329 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004330 m_errorMonitor->SetDesiredFailureMsg(
4331 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004332 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004333
4334 ASSERT_NO_FATAL_FAILURE(InitState());
4335 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004336
4337 // Renderpass is started here
4338 BeginCommandBuffer();
4339
4340 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004341 vk_testing::Buffer dstBuffer;
4342 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004343
Karl Schultz6addd812016-02-02 17:17:23 -07004344 VkDeviceSize dstOffset = 0;
4345 VkDeviceSize dataSize = 1024;
4346 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004347
Karl Schultz6addd812016-02-02 17:17:23 -07004348 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
4349 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004350
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004351 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004352}
4353
Karl Schultz6addd812016-02-02 17:17:23 -07004354TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004355 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004356 m_errorMonitor->SetDesiredFailureMsg(
4357 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004358 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004359
4360 ASSERT_NO_FATAL_FAILURE(InitState());
4361 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004362
4363 // Renderpass is started here
4364 BeginCommandBuffer();
4365
Michael Lentine0a369f62016-02-03 16:51:46 -06004366 VkClearColorValue clear_color;
4367 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07004368 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
4369 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4370 const int32_t tex_width = 32;
4371 const int32_t tex_height = 32;
4372 VkImageCreateInfo image_create_info = {};
4373 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4374 image_create_info.pNext = NULL;
4375 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4376 image_create_info.format = tex_format;
4377 image_create_info.extent.width = tex_width;
4378 image_create_info.extent.height = tex_height;
4379 image_create_info.extent.depth = 1;
4380 image_create_info.mipLevels = 1;
4381 image_create_info.arrayLayers = 1;
4382 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4383 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4384 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004385
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004386 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004387 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4388 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004389
Karl Schultz6addd812016-02-02 17:17:23 -07004390 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4391 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004392
Karl Schultz6addd812016-02-02 17:17:23 -07004393 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4394 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004395
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004396 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004397}
4398
Karl Schultz6addd812016-02-02 17:17:23 -07004399TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004400 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004401 m_errorMonitor->SetDesiredFailureMsg(
4402 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004403 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004404
4405 ASSERT_NO_FATAL_FAILURE(InitState());
4406 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004407
4408 // Renderpass is started here
4409 BeginCommandBuffer();
4410
4411 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07004412 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004413 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
4414 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4415 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
4416 image_create_info.extent.width = 64;
4417 image_create_info.extent.height = 64;
4418 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4419 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004420
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004421 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004422 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4423 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004424
Karl Schultz6addd812016-02-02 17:17:23 -07004425 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4426 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004427
Karl Schultz6addd812016-02-02 17:17:23 -07004428 vkCmdClearDepthStencilImage(
4429 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4430 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
4431 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004432
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004433 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004434}
4435
Karl Schultz6addd812016-02-02 17:17:23 -07004436TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004437 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004438 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004439
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004441 "vkCmdClearAttachments: This call "
4442 "must be issued inside an active "
4443 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004444
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004445 ASSERT_NO_FATAL_FAILURE(InitState());
4446 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004447
4448 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004449 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004450 ASSERT_VK_SUCCESS(err);
4451
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004452 VkClearAttachment color_attachment;
4453 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4454 color_attachment.clearValue.color.float32[0] = 0;
4455 color_attachment.clearValue.color.float32[1] = 0;
4456 color_attachment.clearValue.color.float32[2] = 0;
4457 color_attachment.clearValue.color.float32[3] = 0;
4458 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004459 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
4460 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
4461 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004462
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004463 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004464}
4465
Karl Schultz9e66a292016-04-21 15:57:51 -06004466TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
4467 // Try to add a buffer memory barrier with no buffer.
4468 m_errorMonitor->SetDesiredFailureMsg(
4469 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4470 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
4471
4472 ASSERT_NO_FATAL_FAILURE(InitState());
4473 BeginCommandBuffer();
4474
4475 VkBufferMemoryBarrier buf_barrier = {};
4476 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
4477 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4478 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4479 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4480 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4481 buf_barrier.buffer = VK_NULL_HANDLE;
4482 buf_barrier.offset = 0;
4483 buf_barrier.size = VK_WHOLE_SIZE;
4484 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4485 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
4486 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
4487
4488 m_errorMonitor->VerifyFound();
4489}
4490
Karl Schultz6addd812016-02-02 17:17:23 -07004491TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004492 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004493 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004494
Karl Schultz6addd812016-02-02 17:17:23 -07004495 m_errorMonitor->SetDesiredFailureMsg(
4496 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004497 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
4498
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004499 ASSERT_NO_FATAL_FAILURE(InitState());
4500 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004501 uint32_t qfi = 0;
4502 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004503 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4504 buffCI.size = 1024;
4505 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
4506 buffCI.queueFamilyIndexCount = 1;
4507 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004508
4509 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004510 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004511 ASSERT_VK_SUCCESS(err);
4512
4513 BeginCommandBuffer();
4514 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004515 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4516 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004517 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07004518 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
4519 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004520
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004521 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004522
Chia-I Wuf7458c52015-10-26 21:10:41 +08004523 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004524}
4525
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004526TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
4527 // Create an out-of-range queueFamilyIndex
4528 m_errorMonitor->SetDesiredFailureMsg(
4529 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06004530 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004531
4532 ASSERT_NO_FATAL_FAILURE(InitState());
4533 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4534 VkBufferCreateInfo buffCI = {};
4535 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4536 buffCI.size = 1024;
4537 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
4538 buffCI.queueFamilyIndexCount = 1;
4539 // Introduce failure by specifying invalid queue_family_index
4540 uint32_t qfi = 777;
4541 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06004542 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004543
4544 VkBuffer ib;
4545 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
4546
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004547 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004548}
4549
Karl Schultz6addd812016-02-02 17:17:23 -07004550TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
4551 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
4552 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004553
Karl Schultz6addd812016-02-02 17:17:23 -07004554 m_errorMonitor->SetDesiredFailureMsg(
4555 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004556 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004557
4558 ASSERT_NO_FATAL_FAILURE(InitState());
4559 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004560
4561 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004562 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004563 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
4564 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004565
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004566 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004567}
4568
Karl Schultz6addd812016-02-02 17:17:23 -07004569TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004570 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07004571 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004572
Karl Schultz6addd812016-02-02 17:17:23 -07004573 m_errorMonitor->SetDesiredFailureMsg(
4574 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Write descriptor update has descriptor "
4575 "type VK_DESCRIPTOR_TYPE_SAMPLER that "
4576 "does not match ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004577
Tobin Ehlis3b780662015-05-28 12:11:26 -06004578 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004579 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004580 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004581 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4582 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004583
4584 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004585 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4586 ds_pool_ci.pNext = NULL;
4587 ds_pool_ci.maxSets = 1;
4588 ds_pool_ci.poolSizeCount = 1;
4589 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004590
Tobin Ehlis3b780662015-05-28 12:11:26 -06004591 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004592 err =
4593 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004594 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06004595 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004596 dsl_binding.binding = 0;
4597 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4598 dsl_binding.descriptorCount = 1;
4599 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4600 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004601
Tony Barboureb254902015-07-15 12:50:33 -06004602 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004603 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4604 ds_layout_ci.pNext = NULL;
4605 ds_layout_ci.bindingCount = 1;
4606 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004607
Tobin Ehlis3b780662015-05-28 12:11:26 -06004608 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004609 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4610 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004611 ASSERT_VK_SUCCESS(err);
4612
4613 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004614 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004615 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004616 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004617 alloc_info.descriptorPool = ds_pool;
4618 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004619 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4620 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004621 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004622
Tony Barboureb254902015-07-15 12:50:33 -06004623 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004624 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4625 sampler_ci.pNext = NULL;
4626 sampler_ci.magFilter = VK_FILTER_NEAREST;
4627 sampler_ci.minFilter = VK_FILTER_NEAREST;
4628 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4629 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4630 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4631 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4632 sampler_ci.mipLodBias = 1.0;
4633 sampler_ci.anisotropyEnable = VK_FALSE;
4634 sampler_ci.maxAnisotropy = 1;
4635 sampler_ci.compareEnable = VK_FALSE;
4636 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4637 sampler_ci.minLod = 1.0;
4638 sampler_ci.maxLod = 1.0;
4639 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4640 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Mark Lobodzinski52ac6582015-09-01 15:42:56 -06004641
Tobin Ehlis3b780662015-05-28 12:11:26 -06004642 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004643 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004644 ASSERT_VK_SUCCESS(err);
4645
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004646 VkDescriptorImageInfo info = {};
4647 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004648
4649 VkWriteDescriptorSet descriptor_write;
4650 memset(&descriptor_write, 0, sizeof(descriptor_write));
4651 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004652 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004653 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004654 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004655 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004656 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004657
4658 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4659
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004660 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004661
Chia-I Wuf7458c52015-10-26 21:10:41 +08004662 vkDestroySampler(m_device->device(), sampler, NULL);
4663 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4664 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004665}
4666
Karl Schultz6addd812016-02-02 17:17:23 -07004667TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004668 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07004669 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004670
Karl Schultz6addd812016-02-02 17:17:23 -07004671 m_errorMonitor->SetDesiredFailureMsg(
4672 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Descriptor update type of "
4673 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET "
4674 "is out of bounds for matching binding");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004675
Tobin Ehlis3b780662015-05-28 12:11:26 -06004676 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004677 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004678 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004679 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4680 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004681
4682 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004683 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4684 ds_pool_ci.pNext = NULL;
4685 ds_pool_ci.maxSets = 1;
4686 ds_pool_ci.poolSizeCount = 1;
4687 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004688
Tobin Ehlis3b780662015-05-28 12:11:26 -06004689 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004690 err =
4691 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004692 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004693
Tony Barboureb254902015-07-15 12:50:33 -06004694 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004695 dsl_binding.binding = 0;
4696 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4697 dsl_binding.descriptorCount = 1;
4698 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4699 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06004700
4701 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004702 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4703 ds_layout_ci.pNext = NULL;
4704 ds_layout_ci.bindingCount = 1;
4705 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004706
Tobin Ehlis3b780662015-05-28 12:11:26 -06004707 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004708 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4709 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004710 ASSERT_VK_SUCCESS(err);
4711
4712 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004713 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004714 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004715 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004716 alloc_info.descriptorPool = ds_pool;
4717 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004718 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4719 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004720 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004721
Tony Barboureb254902015-07-15 12:50:33 -06004722 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004723 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4724 sampler_ci.pNext = NULL;
4725 sampler_ci.magFilter = VK_FILTER_NEAREST;
4726 sampler_ci.minFilter = VK_FILTER_NEAREST;
4727 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4728 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4729 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4730 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4731 sampler_ci.mipLodBias = 1.0;
4732 sampler_ci.anisotropyEnable = VK_FALSE;
4733 sampler_ci.maxAnisotropy = 1;
4734 sampler_ci.compareEnable = VK_FALSE;
4735 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4736 sampler_ci.minLod = 1.0;
4737 sampler_ci.maxLod = 1.0;
4738 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4739 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06004740
Tobin Ehlis3b780662015-05-28 12:11:26 -06004741 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004742 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004743 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004744
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004745 VkDescriptorImageInfo info = {};
4746 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004747
4748 VkWriteDescriptorSet descriptor_write;
4749 memset(&descriptor_write, 0, sizeof(descriptor_write));
4750 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004751 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004752 descriptor_write.dstArrayElement =
4753 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08004754 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004755 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004756 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004757 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004758
4759 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4760
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004761 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004762
Chia-I Wuf7458c52015-10-26 21:10:41 +08004763 vkDestroySampler(m_device->device(), sampler, NULL);
4764 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4765 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004766}
4767
Karl Schultz6addd812016-02-02 17:17:23 -07004768TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
4769 // Create layout w/ count of 1 and attempt update to that layout w/ binding
4770 // index 2
4771 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004772
Karl Schultz6addd812016-02-02 17:17:23 -07004773 m_errorMonitor->SetDesiredFailureMsg(
4774 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004775 " does not have binding to match update binding ");
4776
Tobin Ehlis3b780662015-05-28 12:11:26 -06004777 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004778 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004779 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004780 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4781 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004782
4783 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004784 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4785 ds_pool_ci.pNext = NULL;
4786 ds_pool_ci.maxSets = 1;
4787 ds_pool_ci.poolSizeCount = 1;
4788 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004789
Tobin Ehlis3b780662015-05-28 12:11:26 -06004790 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004791 err =
4792 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004793 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004794
Tony Barboureb254902015-07-15 12:50:33 -06004795 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004796 dsl_binding.binding = 0;
4797 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4798 dsl_binding.descriptorCount = 1;
4799 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4800 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06004801
4802 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004803 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4804 ds_layout_ci.pNext = NULL;
4805 ds_layout_ci.bindingCount = 1;
4806 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004807 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004808 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4809 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004810 ASSERT_VK_SUCCESS(err);
4811
4812 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004813 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004814 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004815 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004816 alloc_info.descriptorPool = ds_pool;
4817 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004818 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4819 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004820 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004821
Tony Barboureb254902015-07-15 12:50:33 -06004822 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004823 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4824 sampler_ci.pNext = NULL;
4825 sampler_ci.magFilter = VK_FILTER_NEAREST;
4826 sampler_ci.minFilter = VK_FILTER_NEAREST;
4827 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4828 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4829 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4830 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4831 sampler_ci.mipLodBias = 1.0;
4832 sampler_ci.anisotropyEnable = VK_FALSE;
4833 sampler_ci.maxAnisotropy = 1;
4834 sampler_ci.compareEnable = VK_FALSE;
4835 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4836 sampler_ci.minLod = 1.0;
4837 sampler_ci.maxLod = 1.0;
4838 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4839 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06004840
Tobin Ehlis3b780662015-05-28 12:11:26 -06004841 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004842 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004843 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004844
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004845 VkDescriptorImageInfo info = {};
4846 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004847
4848 VkWriteDescriptorSet descriptor_write;
4849 memset(&descriptor_write, 0, sizeof(descriptor_write));
4850 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004851 descriptor_write.dstSet = descriptorSet;
4852 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004853 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004854 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004855 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004856 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004857
4858 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4859
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004860 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004861
Chia-I Wuf7458c52015-10-26 21:10:41 +08004862 vkDestroySampler(m_device->device(), sampler, NULL);
4863 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4864 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004865}
4866
Karl Schultz6addd812016-02-02 17:17:23 -07004867TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
4868 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
4869 // types
4870 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004871
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004872 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004873 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004874
Tobin Ehlis3b780662015-05-28 12:11:26 -06004875 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004876
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004877 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004878 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4879 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004880
4881 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004882 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4883 ds_pool_ci.pNext = NULL;
4884 ds_pool_ci.maxSets = 1;
4885 ds_pool_ci.poolSizeCount = 1;
4886 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004887
Tobin Ehlis3b780662015-05-28 12:11:26 -06004888 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004889 err =
4890 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004891 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06004892 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004893 dsl_binding.binding = 0;
4894 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4895 dsl_binding.descriptorCount = 1;
4896 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4897 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004898
Tony Barboureb254902015-07-15 12:50:33 -06004899 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004900 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4901 ds_layout_ci.pNext = NULL;
4902 ds_layout_ci.bindingCount = 1;
4903 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004904
Tobin Ehlis3b780662015-05-28 12:11:26 -06004905 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004906 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4907 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004908 ASSERT_VK_SUCCESS(err);
4909
4910 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004911 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004912 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004913 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004914 alloc_info.descriptorPool = ds_pool;
4915 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004916 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4917 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004918 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004919
Tony Barboureb254902015-07-15 12:50:33 -06004920 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004921 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4922 sampler_ci.pNext = NULL;
4923 sampler_ci.magFilter = VK_FILTER_NEAREST;
4924 sampler_ci.minFilter = VK_FILTER_NEAREST;
4925 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4926 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4927 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4928 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4929 sampler_ci.mipLodBias = 1.0;
4930 sampler_ci.anisotropyEnable = VK_FALSE;
4931 sampler_ci.maxAnisotropy = 1;
4932 sampler_ci.compareEnable = VK_FALSE;
4933 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4934 sampler_ci.minLod = 1.0;
4935 sampler_ci.maxLod = 1.0;
4936 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4937 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004938 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004939 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004940 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004941
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004942 VkDescriptorImageInfo info = {};
4943 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004944
4945 VkWriteDescriptorSet descriptor_write;
4946 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07004947 descriptor_write.sType =
4948 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004949 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004950 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004951 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004952 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004953 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004954
4955 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4956
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004957 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004958
Chia-I Wuf7458c52015-10-26 21:10:41 +08004959 vkDestroySampler(m_device->device(), sampler, NULL);
4960 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4961 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004962}
4963
Karl Schultz6addd812016-02-02 17:17:23 -07004964TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004965 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07004966 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004967
Karl Schultz6addd812016-02-02 17:17:23 -07004968 m_errorMonitor->SetDesiredFailureMsg(
4969 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004970 "Attempt to update descriptor with invalid sampler 0xbaadbeef");
4971
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004972 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004973 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
4974 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004975 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004976 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
4977 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004978
4979 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004980 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4981 ds_pool_ci.pNext = NULL;
4982 ds_pool_ci.maxSets = 1;
4983 ds_pool_ci.poolSizeCount = 1;
4984 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004985
4986 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004987 err =
4988 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004989 ASSERT_VK_SUCCESS(err);
4990
4991 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004992 dsl_binding.binding = 0;
4993 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4994 dsl_binding.descriptorCount = 1;
4995 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4996 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004997
4998 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004999 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5000 ds_layout_ci.pNext = NULL;
5001 ds_layout_ci.bindingCount = 1;
5002 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005003 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005004 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5005 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005006 ASSERT_VK_SUCCESS(err);
5007
5008 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005009 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005010 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005011 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005012 alloc_info.descriptorPool = ds_pool;
5013 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005014 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5015 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005016 ASSERT_VK_SUCCESS(err);
5017
Karl Schultz6addd812016-02-02 17:17:23 -07005018 VkSampler sampler =
5019 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005020
5021 VkDescriptorImageInfo descriptor_info;
5022 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5023 descriptor_info.sampler = sampler;
5024
5025 VkWriteDescriptorSet descriptor_write;
5026 memset(&descriptor_write, 0, sizeof(descriptor_write));
5027 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005028 descriptor_write.dstSet = descriptorSet;
5029 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005030 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005031 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5032 descriptor_write.pImageInfo = &descriptor_info;
5033
5034 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5035
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005036 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005037
Chia-I Wuf7458c52015-10-26 21:10:41 +08005038 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5039 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005040}
5041
Karl Schultz6addd812016-02-02 17:17:23 -07005042TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
5043 // Create a single combined Image/Sampler descriptor and send it an invalid
5044 // imageView
5045 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005046
Karl Schultz6addd812016-02-02 17:17:23 -07005047 m_errorMonitor->SetDesiredFailureMsg(
5048 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005049 "Attempt to update descriptor with invalid imageView 0xbaadbeef");
5050
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005051 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005052 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005053 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5054 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005055
5056 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005057 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5058 ds_pool_ci.pNext = NULL;
5059 ds_pool_ci.maxSets = 1;
5060 ds_pool_ci.poolSizeCount = 1;
5061 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005062
5063 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005064 err =
5065 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005066 ASSERT_VK_SUCCESS(err);
5067
5068 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005069 dsl_binding.binding = 0;
5070 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5071 dsl_binding.descriptorCount = 1;
5072 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5073 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005074
5075 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005076 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5077 ds_layout_ci.pNext = NULL;
5078 ds_layout_ci.bindingCount = 1;
5079 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005080 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005081 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5082 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005083 ASSERT_VK_SUCCESS(err);
5084
5085 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005086 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005087 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005088 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005089 alloc_info.descriptorPool = ds_pool;
5090 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005091 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5092 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005093 ASSERT_VK_SUCCESS(err);
5094
5095 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005096 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5097 sampler_ci.pNext = NULL;
5098 sampler_ci.magFilter = VK_FILTER_NEAREST;
5099 sampler_ci.minFilter = VK_FILTER_NEAREST;
5100 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5101 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5102 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5103 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5104 sampler_ci.mipLodBias = 1.0;
5105 sampler_ci.anisotropyEnable = VK_FALSE;
5106 sampler_ci.maxAnisotropy = 1;
5107 sampler_ci.compareEnable = VK_FALSE;
5108 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5109 sampler_ci.minLod = 1.0;
5110 sampler_ci.maxLod = 1.0;
5111 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5112 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005113
5114 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005115 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005116 ASSERT_VK_SUCCESS(err);
5117
Karl Schultz6addd812016-02-02 17:17:23 -07005118 VkImageView view =
5119 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005120
5121 VkDescriptorImageInfo descriptor_info;
5122 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5123 descriptor_info.sampler = sampler;
5124 descriptor_info.imageView = view;
5125
5126 VkWriteDescriptorSet descriptor_write;
5127 memset(&descriptor_write, 0, sizeof(descriptor_write));
5128 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005129 descriptor_write.dstSet = descriptorSet;
5130 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005131 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005132 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5133 descriptor_write.pImageInfo = &descriptor_info;
5134
5135 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5136
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005137 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005138
Chia-I Wuf7458c52015-10-26 21:10:41 +08005139 vkDestroySampler(m_device->device(), sampler, NULL);
5140 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5141 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005142}
5143
Karl Schultz6addd812016-02-02 17:17:23 -07005144TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
5145 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
5146 // into the other
5147 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005148
Karl Schultz6addd812016-02-02 17:17:23 -07005149 m_errorMonitor->SetDesiredFailureMsg(
5150 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Copy descriptor update index 0, update "
5151 "count #1, has src update descriptor "
5152 "type VK_DESCRIPTOR_TYPE_SAMPLER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005153
Tobin Ehlis04356f92015-10-27 16:35:27 -06005154 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005155 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005156 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005157 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5158 ds_type_count[0].descriptorCount = 1;
5159 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
5160 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005161
5162 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005163 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5164 ds_pool_ci.pNext = NULL;
5165 ds_pool_ci.maxSets = 1;
5166 ds_pool_ci.poolSizeCount = 2;
5167 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005168
5169 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005170 err =
5171 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005172 ASSERT_VK_SUCCESS(err);
5173 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005174 dsl_binding[0].binding = 0;
5175 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5176 dsl_binding[0].descriptorCount = 1;
5177 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
5178 dsl_binding[0].pImmutableSamplers = NULL;
5179 dsl_binding[1].binding = 1;
5180 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5181 dsl_binding[1].descriptorCount = 1;
5182 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
5183 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005184
5185 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005186 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5187 ds_layout_ci.pNext = NULL;
5188 ds_layout_ci.bindingCount = 2;
5189 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005190
5191 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005192 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5193 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005194 ASSERT_VK_SUCCESS(err);
5195
5196 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005197 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005198 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005199 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005200 alloc_info.descriptorPool = ds_pool;
5201 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005202 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5203 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005204 ASSERT_VK_SUCCESS(err);
5205
5206 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005207 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5208 sampler_ci.pNext = NULL;
5209 sampler_ci.magFilter = VK_FILTER_NEAREST;
5210 sampler_ci.minFilter = VK_FILTER_NEAREST;
5211 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5212 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5213 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5214 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5215 sampler_ci.mipLodBias = 1.0;
5216 sampler_ci.anisotropyEnable = VK_FALSE;
5217 sampler_ci.maxAnisotropy = 1;
5218 sampler_ci.compareEnable = VK_FALSE;
5219 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5220 sampler_ci.minLod = 1.0;
5221 sampler_ci.maxLod = 1.0;
5222 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5223 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005224
5225 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005226 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005227 ASSERT_VK_SUCCESS(err);
5228
5229 VkDescriptorImageInfo info = {};
5230 info.sampler = sampler;
5231
5232 VkWriteDescriptorSet descriptor_write;
5233 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
5234 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005235 descriptor_write.dstSet = descriptorSet;
5236 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08005237 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005238 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5239 descriptor_write.pImageInfo = &info;
5240 // This write update should succeed
5241 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5242 // Now perform a copy update that fails due to type mismatch
5243 VkCopyDescriptorSet copy_ds_update;
5244 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5245 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5246 copy_ds_update.srcSet = descriptorSet;
5247 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005248 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005249 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08005250 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005251 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5252
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005253 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005254 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005255 m_errorMonitor->SetDesiredFailureMsg(
5256 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005257 "Copy descriptor update 0 has srcBinding 3 which is out of bounds ");
Tobin Ehlis04356f92015-10-27 16:35:27 -06005258 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5259 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5260 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005261 copy_ds_update.srcBinding =
5262 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005263 copy_ds_update.dstSet = descriptorSet;
5264 copy_ds_update.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005265 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005266 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5267
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005268 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005269
Tobin Ehlis04356f92015-10-27 16:35:27 -06005270 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005271 m_errorMonitor->SetDesiredFailureMsg(
5272 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005273 "Copy descriptor src update is out of bounds for matching binding 1 ");
5274
Tobin Ehlis04356f92015-10-27 16:35:27 -06005275 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5276 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5277 copy_ds_update.srcSet = descriptorSet;
5278 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005279 copy_ds_update.dstSet = descriptorSet;
5280 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005281 copy_ds_update.descriptorCount =
5282 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06005283 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5284
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005285 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005286
Chia-I Wuf7458c52015-10-26 21:10:41 +08005287 vkDestroySampler(m_device->device(), sampler, NULL);
5288 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5289 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005290}
5291
Karl Schultz6addd812016-02-02 17:17:23 -07005292TEST_F(VkLayerTest, NumSamplesMismatch) {
5293 // Create CommandBuffer where MSAA samples doesn't match RenderPass
5294 // sampleCount
5295 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005296
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005297 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005298 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005299
Tobin Ehlis3b780662015-05-28 12:11:26 -06005300 ASSERT_NO_FATAL_FAILURE(InitState());
5301 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005302 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06005303 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005304 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005305
5306 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005307 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5308 ds_pool_ci.pNext = NULL;
5309 ds_pool_ci.maxSets = 1;
5310 ds_pool_ci.poolSizeCount = 1;
5311 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005312
Tobin Ehlis3b780662015-05-28 12:11:26 -06005313 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005314 err =
5315 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005316 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005317
Tony Barboureb254902015-07-15 12:50:33 -06005318 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08005319 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06005320 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08005321 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005322 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5323 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005324
Tony Barboureb254902015-07-15 12:50:33 -06005325 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5326 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5327 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005328 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07005329 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005330
Tobin Ehlis3b780662015-05-28 12:11:26 -06005331 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005332 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5333 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005334 ASSERT_VK_SUCCESS(err);
5335
5336 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005337 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005338 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005339 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005340 alloc_info.descriptorPool = ds_pool;
5341 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005342 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5343 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005344 ASSERT_VK_SUCCESS(err);
5345
Tony Barboureb254902015-07-15 12:50:33 -06005346 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005347 pipe_ms_state_ci.sType =
5348 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5349 pipe_ms_state_ci.pNext = NULL;
5350 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5351 pipe_ms_state_ci.sampleShadingEnable = 0;
5352 pipe_ms_state_ci.minSampleShading = 1.0;
5353 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005354
Tony Barboureb254902015-07-15 12:50:33 -06005355 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005356 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5357 pipeline_layout_ci.pNext = NULL;
5358 pipeline_layout_ci.setLayoutCount = 1;
5359 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005360
5361 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005362 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5363 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005364 ASSERT_VK_SUCCESS(err);
5365
Karl Schultz6addd812016-02-02 17:17:23 -07005366 VkShaderObj vs(m_device, bindStateVertShaderText,
5367 VK_SHADER_STAGE_VERTEX_BIT, this);
5368 VkShaderObj fs(m_device, bindStateFragShaderText,
5369 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005370 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005371 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005372 VkPipelineObj pipe(m_device);
5373 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005374 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005375 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005376 pipe.SetMSAA(&pipe_ms_state_ci);
5377 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005378
Tony Barbourfe3351b2015-07-28 10:17:20 -06005379 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005380 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5381 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005382
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005383 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005384
Chia-I Wuf7458c52015-10-26 21:10:41 +08005385 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5386 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5387 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005388}
Tobin Ehlis0f10db52016-04-04 10:00:21 -06005389#ifdef ADD_BACK_IN_WHEN_CHECK_IS_BACK // TODO : Re-enable when GH256 fixed
Mark Youngc89c6312016-03-31 16:03:20 -06005390TEST_F(VkLayerTest, NumBlendAttachMismatch) {
5391 // Create Pipeline where the number of blend attachments doesn't match the
5392 // number of color attachments. In this case, we don't add any color
5393 // blend attachments even though we have a color attachment.
5394 VkResult err;
5395
5396 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5397 "Mismatch between blend state attachment");
5398
5399 ASSERT_NO_FATAL_FAILURE(InitState());
5400 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5401 VkDescriptorPoolSize ds_type_count = {};
5402 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5403 ds_type_count.descriptorCount = 1;
5404
5405 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5406 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5407 ds_pool_ci.pNext = NULL;
5408 ds_pool_ci.maxSets = 1;
5409 ds_pool_ci.poolSizeCount = 1;
5410 ds_pool_ci.pPoolSizes = &ds_type_count;
5411
5412 VkDescriptorPool ds_pool;
5413 err =
5414 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5415 ASSERT_VK_SUCCESS(err);
5416
5417 VkDescriptorSetLayoutBinding dsl_binding = {};
5418 dsl_binding.binding = 0;
5419 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5420 dsl_binding.descriptorCount = 1;
5421 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5422 dsl_binding.pImmutableSamplers = NULL;
5423
5424 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5425 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5426 ds_layout_ci.pNext = NULL;
5427 ds_layout_ci.bindingCount = 1;
5428 ds_layout_ci.pBindings = &dsl_binding;
5429
5430 VkDescriptorSetLayout ds_layout;
5431 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5432 &ds_layout);
5433 ASSERT_VK_SUCCESS(err);
5434
5435 VkDescriptorSet descriptorSet;
5436 VkDescriptorSetAllocateInfo alloc_info = {};
5437 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5438 alloc_info.descriptorSetCount = 1;
5439 alloc_info.descriptorPool = ds_pool;
5440 alloc_info.pSetLayouts = &ds_layout;
5441 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5442 &descriptorSet);
5443 ASSERT_VK_SUCCESS(err);
5444
5445 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
5446 pipe_ms_state_ci.sType =
5447 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5448 pipe_ms_state_ci.pNext = NULL;
5449 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
5450 pipe_ms_state_ci.sampleShadingEnable = 0;
5451 pipe_ms_state_ci.minSampleShading = 1.0;
5452 pipe_ms_state_ci.pSampleMask = NULL;
5453
5454 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5455 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5456 pipeline_layout_ci.pNext = NULL;
5457 pipeline_layout_ci.setLayoutCount = 1;
5458 pipeline_layout_ci.pSetLayouts = &ds_layout;
5459
5460 VkPipelineLayout pipeline_layout;
5461 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5462 &pipeline_layout);
5463 ASSERT_VK_SUCCESS(err);
5464
5465 VkShaderObj vs(m_device, bindStateVertShaderText,
5466 VK_SHADER_STAGE_VERTEX_BIT, this);
5467 VkShaderObj fs(m_device, bindStateFragShaderText,
5468 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005469 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06005470 // but add it to be able to run on more devices
5471 VkPipelineObj pipe(m_device);
5472 pipe.AddShader(&vs);
5473 pipe.AddShader(&fs);
5474 pipe.SetMSAA(&pipe_ms_state_ci);
5475 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5476
5477 BeginCommandBuffer();
5478 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5479 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5480
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005481 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06005482
5483 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5484 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5485 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5486}
Tony Barbour4e81a202016-04-04 11:09:40 -06005487#endif //ADD_BACK_IN_WHEN_CHECK_IS_BACK
Karl Schultz6addd812016-02-02 17:17:23 -07005488TEST_F(VkLayerTest, ClearCmdNoDraw) {
5489 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
5490 // to issuing a Draw
5491 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005492
Karl Schultz6addd812016-02-02 17:17:23 -07005493 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07005494 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005495 "vkCmdClearAttachments() issued on CB object ");
5496
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005497 ASSERT_NO_FATAL_FAILURE(InitState());
5498 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06005499
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005500 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005501 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5502 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005503
5504 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005505 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5506 ds_pool_ci.pNext = NULL;
5507 ds_pool_ci.maxSets = 1;
5508 ds_pool_ci.poolSizeCount = 1;
5509 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005510
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005511 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005512 err =
5513 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005514 ASSERT_VK_SUCCESS(err);
5515
Tony Barboureb254902015-07-15 12:50:33 -06005516 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005517 dsl_binding.binding = 0;
5518 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5519 dsl_binding.descriptorCount = 1;
5520 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5521 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005522
Tony Barboureb254902015-07-15 12:50:33 -06005523 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005524 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5525 ds_layout_ci.pNext = NULL;
5526 ds_layout_ci.bindingCount = 1;
5527 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005528
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005529 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005530 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5531 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005532 ASSERT_VK_SUCCESS(err);
5533
5534 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005535 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005536 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005537 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005538 alloc_info.descriptorPool = ds_pool;
5539 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005540 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5541 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005542 ASSERT_VK_SUCCESS(err);
5543
Tony Barboureb254902015-07-15 12:50:33 -06005544 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005545 pipe_ms_state_ci.sType =
5546 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5547 pipe_ms_state_ci.pNext = NULL;
5548 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5549 pipe_ms_state_ci.sampleShadingEnable = 0;
5550 pipe_ms_state_ci.minSampleShading = 1.0;
5551 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005552
Tony Barboureb254902015-07-15 12:50:33 -06005553 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005554 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5555 pipeline_layout_ci.pNext = NULL;
5556 pipeline_layout_ci.setLayoutCount = 1;
5557 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005558
5559 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005560 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5561 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005562 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005563
Karl Schultz6addd812016-02-02 17:17:23 -07005564 VkShaderObj vs(m_device, bindStateVertShaderText,
5565 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06005566 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07005567 // on more devices
5568 VkShaderObj fs(m_device, bindStateFragShaderText,
5569 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005570
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005571 VkPipelineObj pipe(m_device);
5572 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005573 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005574 pipe.SetMSAA(&pipe_ms_state_ci);
5575 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06005576
5577 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005578
Karl Schultz6addd812016-02-02 17:17:23 -07005579 // Main thing we care about for this test is that the VkImage obj we're
5580 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005581 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005582 VkClearAttachment color_attachment;
5583 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5584 color_attachment.clearValue.color.float32[0] = 1.0;
5585 color_attachment.clearValue.color.float32[1] = 1.0;
5586 color_attachment.clearValue.color.float32[2] = 1.0;
5587 color_attachment.clearValue.color.float32[3] = 1.0;
5588 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005589 VkClearRect clear_rect = {
5590 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005591
Karl Schultz6addd812016-02-02 17:17:23 -07005592 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
5593 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005594
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005595 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005596
Chia-I Wuf7458c52015-10-26 21:10:41 +08005597 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5598 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5599 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005600}
5601
Karl Schultz6addd812016-02-02 17:17:23 -07005602TEST_F(VkLayerTest, VtxBufferBadIndex) {
5603 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005604
Karl Schultz6addd812016-02-02 17:17:23 -07005605 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005606 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07005607 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005608
Tobin Ehlis502480b2015-06-24 15:53:07 -06005609 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06005610 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06005611 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06005612
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005613 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005614 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5615 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005616
5617 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005618 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5619 ds_pool_ci.pNext = NULL;
5620 ds_pool_ci.maxSets = 1;
5621 ds_pool_ci.poolSizeCount = 1;
5622 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005623
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005624 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005625 err =
5626 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005627 ASSERT_VK_SUCCESS(err);
5628
Tony Barboureb254902015-07-15 12:50:33 -06005629 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005630 dsl_binding.binding = 0;
5631 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5632 dsl_binding.descriptorCount = 1;
5633 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5634 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005635
Tony Barboureb254902015-07-15 12:50:33 -06005636 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005637 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5638 ds_layout_ci.pNext = NULL;
5639 ds_layout_ci.bindingCount = 1;
5640 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005641
Tobin Ehlis502480b2015-06-24 15:53:07 -06005642 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005643 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5644 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005645 ASSERT_VK_SUCCESS(err);
5646
5647 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005648 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005649 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005650 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005651 alloc_info.descriptorPool = ds_pool;
5652 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005653 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5654 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005655 ASSERT_VK_SUCCESS(err);
5656
Tony Barboureb254902015-07-15 12:50:33 -06005657 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005658 pipe_ms_state_ci.sType =
5659 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5660 pipe_ms_state_ci.pNext = NULL;
5661 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
5662 pipe_ms_state_ci.sampleShadingEnable = 0;
5663 pipe_ms_state_ci.minSampleShading = 1.0;
5664 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005665
Tony Barboureb254902015-07-15 12:50:33 -06005666 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005667 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5668 pipeline_layout_ci.pNext = NULL;
5669 pipeline_layout_ci.setLayoutCount = 1;
5670 pipeline_layout_ci.pSetLayouts = &ds_layout;
5671 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005672
Karl Schultz6addd812016-02-02 17:17:23 -07005673 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5674 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005675 ASSERT_VK_SUCCESS(err);
5676
Karl Schultz6addd812016-02-02 17:17:23 -07005677 VkShaderObj vs(m_device, bindStateVertShaderText,
5678 VK_SHADER_STAGE_VERTEX_BIT, this);
5679 VkShaderObj fs(m_device, bindStateFragShaderText,
5680 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005681 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005682 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005683 VkPipelineObj pipe(m_device);
5684 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005685 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005686 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005687 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06005688 pipe.SetViewport(m_viewports);
5689 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005690 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06005691
5692 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005693 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5694 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06005695 // Don't care about actual data, just need to get to draw to flag error
5696 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07005697 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
5698 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06005699 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06005700 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005701
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005702 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005703
Chia-I Wuf7458c52015-10-26 21:10:41 +08005704 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5705 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5706 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005707}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005708#endif // DRAW_STATE_TESTS
5709
Tobin Ehlis0788f522015-05-26 16:11:58 -06005710#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06005711#if GTEST_IS_THREADSAFE
5712struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005713 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005714 VkEvent event;
5715 bool bailout;
5716};
5717
Karl Schultz6addd812016-02-02 17:17:23 -07005718extern "C" void *AddToCommandBuffer(void *arg) {
5719 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005720
Karl Schultz6addd812016-02-02 17:17:23 -07005721 for (int i = 0; i < 10000; i++) {
5722 vkCmdSetEvent(data->commandBuffer, data->event,
5723 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005724 if (data->bailout) {
5725 break;
5726 }
5727 }
5728 return NULL;
5729}
5730
Karl Schultz6addd812016-02-02 17:17:23 -07005731TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06005732 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005733
Karl Schultz6addd812016-02-02 17:17:23 -07005734 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5735 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005736
Mike Stroyanaccf7692015-05-12 16:00:45 -06005737 ASSERT_NO_FATAL_FAILURE(InitState());
5738 ASSERT_NO_FATAL_FAILURE(InitViewport());
5739 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5740
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005741 // Calls AllocateCommandBuffers
5742 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06005743
5744 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005745 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005746
5747 VkEventCreateInfo event_info;
5748 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005749 VkResult err;
5750
5751 memset(&event_info, 0, sizeof(event_info));
5752 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5753
Chia-I Wuf7458c52015-10-26 21:10:41 +08005754 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005755 ASSERT_VK_SUCCESS(err);
5756
Mike Stroyanaccf7692015-05-12 16:00:45 -06005757 err = vkResetEvent(device(), event);
5758 ASSERT_VK_SUCCESS(err);
5759
5760 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005761 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005762 data.event = event;
5763 data.bailout = false;
5764 m_errorMonitor->SetBailout(&data.bailout);
5765 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06005766 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005767 // Add many entries to command buffer from this thread at the same time.
5768 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06005769
Mike Stroyan4268d1f2015-07-13 14:45:35 -06005770 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005771 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005772
Mike Stroyan10b8cb72016-01-22 15:22:03 -07005773 m_errorMonitor->SetBailout(NULL);
5774
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005775 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005776
Chia-I Wuf7458c52015-10-26 21:10:41 +08005777 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005778}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005779#endif // GTEST_IS_THREADSAFE
5780#endif // THREADING_TESTS
5781
Chris Forbes9f7ff632015-05-25 11:13:08 +12005782#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07005783TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005784 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005785 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005786
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005787 ASSERT_NO_FATAL_FAILURE(InitState());
5788 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5789
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005790 VkShaderModule module;
5791 VkShaderModuleCreateInfo moduleCreateInfo;
5792 struct icd_spv_header spv;
5793
5794 spv.magic = ICD_SPV_MAGIC;
5795 spv.version = ICD_SPV_VERSION;
5796 spv.gen_magic = 0;
5797
5798 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
5799 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07005800 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005801 moduleCreateInfo.codeSize = 4;
5802 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005803 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005804
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005805 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005806}
5807
Karl Schultz6addd812016-02-02 17:17:23 -07005808TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005810 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005811
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005812 ASSERT_NO_FATAL_FAILURE(InitState());
5813 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5814
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005815 VkShaderModule module;
5816 VkShaderModuleCreateInfo moduleCreateInfo;
5817 struct icd_spv_header spv;
5818
5819 spv.magic = ~ICD_SPV_MAGIC;
5820 spv.version = ICD_SPV_VERSION;
5821 spv.gen_magic = 0;
5822
5823 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
5824 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07005825 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005826 moduleCreateInfo.codeSize = sizeof(spv) + 10;
5827 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005828 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005829
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005830 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005831}
5832
Karl Schultz6addd812016-02-02 17:17:23 -07005833TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005835 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005836
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005837 ASSERT_NO_FATAL_FAILURE(InitState());
5838 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5839
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005840 VkShaderModule module;
5841 VkShaderModuleCreateInfo moduleCreateInfo;
5842 struct icd_spv_header spv;
5843
5844 spv.magic = ICD_SPV_MAGIC;
5845 spv.version = ~ICD_SPV_VERSION;
5846 spv.gen_magic = 0;
5847
5848 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
5849 moduleCreateInfo.pNext = NULL;
5850
Karl Schultz6addd812016-02-02 17:17:23 -07005851 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005852 moduleCreateInfo.codeSize = sizeof(spv) + 10;
5853 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005854 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005855
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005856 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005857}
5858
Karl Schultz6addd812016-02-02 17:17:23 -07005859TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005861 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005862
Chris Forbes9f7ff632015-05-25 11:13:08 +12005863 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005864 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12005865
5866 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005867 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005868 "\n"
5869 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07005870 "out gl_PerVertex {\n"
5871 " vec4 gl_Position;\n"
5872 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005873 "void main(){\n"
5874 " gl_Position = vec4(1);\n"
5875 " x = 0;\n"
5876 "}\n";
5877 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005878 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005879 "\n"
5880 "layout(location=0) out vec4 color;\n"
5881 "void main(){\n"
5882 " color = vec4(1);\n"
5883 "}\n";
5884
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005885 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5886 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12005887
5888 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005889 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12005890 pipe.AddShader(&vs);
5891 pipe.AddShader(&fs);
5892
Chris Forbes9f7ff632015-05-25 11:13:08 +12005893 VkDescriptorSetObj descriptorSet(m_device);
5894 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005895 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12005896
Tony Barbour5781e8f2015-08-04 16:23:11 -06005897 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12005898
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005899 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12005900}
Chris Forbes9f7ff632015-05-25 11:13:08 +12005901
Karl Schultz6addd812016-02-02 17:17:23 -07005902TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005904 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005905
Chris Forbes59cb88d2015-05-25 11:13:13 +12005906 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005907 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12005908
5909 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005910 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005911 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005912 "out gl_PerVertex {\n"
5913 " vec4 gl_Position;\n"
5914 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005915 "void main(){\n"
5916 " gl_Position = vec4(1);\n"
5917 "}\n";
5918 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005919 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005920 "\n"
5921 "layout(location=0) in float x;\n"
5922 "layout(location=0) out vec4 color;\n"
5923 "void main(){\n"
5924 " color = vec4(x);\n"
5925 "}\n";
5926
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005927 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5928 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12005929
5930 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005931 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12005932 pipe.AddShader(&vs);
5933 pipe.AddShader(&fs);
5934
Chris Forbes59cb88d2015-05-25 11:13:13 +12005935 VkDescriptorSetObj descriptorSet(m_device);
5936 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005937 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12005938
Tony Barbour5781e8f2015-08-04 16:23:11 -06005939 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12005940
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005941 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12005942}
5943
Karl Schultz6addd812016-02-02 17:17:23 -07005944TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13005945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005946 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13005947
5948 ASSERT_NO_FATAL_FAILURE(InitState());
5949 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5950
5951 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005952 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13005953 "\n"
5954 "out gl_PerVertex {\n"
5955 " vec4 gl_Position;\n"
5956 "};\n"
5957 "void main(){\n"
5958 " gl_Position = vec4(1);\n"
5959 "}\n";
5960 char const *fsSource =
5961 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13005962 "\n"
5963 "in block { layout(location=0) float x; } ins;\n"
5964 "layout(location=0) out vec4 color;\n"
5965 "void main(){\n"
5966 " color = vec4(ins.x);\n"
5967 "}\n";
5968
5969 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5970 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5971
5972 VkPipelineObj pipe(m_device);
5973 pipe.AddColorAttachment();
5974 pipe.AddShader(&vs);
5975 pipe.AddShader(&fs);
5976
5977 VkDescriptorSetObj descriptorSet(m_device);
5978 descriptorSet.AppendDummy();
5979 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5980
5981 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5982
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005983 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13005984}
5985
Karl Schultz6addd812016-02-02 17:17:23 -07005986TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13005987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13005988 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07005989 "output arr[2] of float32' vs 'ptr to "
5990 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13005991
5992 ASSERT_NO_FATAL_FAILURE(InitState());
5993 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5994
5995 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005996 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13005997 "\n"
5998 "layout(location=0) out float x[2];\n"
5999 "out gl_PerVertex {\n"
6000 " vec4 gl_Position;\n"
6001 "};\n"
6002 "void main(){\n"
6003 " x[0] = 0; x[1] = 0;\n"
6004 " gl_Position = vec4(1);\n"
6005 "}\n";
6006 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006007 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006008 "\n"
6009 "layout(location=0) in float x[3];\n"
6010 "layout(location=0) out vec4 color;\n"
6011 "void main(){\n"
6012 " color = vec4(x[0] + x[1] + x[2]);\n"
6013 "}\n";
6014
6015 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6016 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6017
6018 VkPipelineObj pipe(m_device);
6019 pipe.AddColorAttachment();
6020 pipe.AddShader(&vs);
6021 pipe.AddShader(&fs);
6022
6023 VkDescriptorSetObj descriptorSet(m_device);
6024 descriptorSet.AppendDummy();
6025 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6026
6027 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6028
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006029 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13006030}
6031
Karl Schultz6addd812016-02-02 17:17:23 -07006032TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006033 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006034 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006035
Chris Forbesb56af562015-05-25 11:13:17 +12006036 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006037 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12006038
6039 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006040 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006041 "\n"
6042 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006043 "out gl_PerVertex {\n"
6044 " vec4 gl_Position;\n"
6045 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006046 "void main(){\n"
6047 " x = 0;\n"
6048 " gl_Position = vec4(1);\n"
6049 "}\n";
6050 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006051 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006052 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006053 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12006054 "layout(location=0) out vec4 color;\n"
6055 "void main(){\n"
6056 " color = vec4(x);\n"
6057 "}\n";
6058
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006059 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6060 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12006061
6062 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006063 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12006064 pipe.AddShader(&vs);
6065 pipe.AddShader(&fs);
6066
Chris Forbesb56af562015-05-25 11:13:17 +12006067 VkDescriptorSetObj descriptorSet(m_device);
6068 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006069 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12006070
Tony Barbour5781e8f2015-08-04 16:23:11 -06006071 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12006072
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006073 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12006074}
6075
Karl Schultz6addd812016-02-02 17:17:23 -07006076TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006078 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006079
6080 ASSERT_NO_FATAL_FAILURE(InitState());
6081 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6082
6083 char const *vsSource =
6084 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006085 "\n"
6086 "out block { layout(location=0) int x; } outs;\n"
6087 "out gl_PerVertex {\n"
6088 " vec4 gl_Position;\n"
6089 "};\n"
6090 "void main(){\n"
6091 " outs.x = 0;\n"
6092 " gl_Position = vec4(1);\n"
6093 "}\n";
6094 char const *fsSource =
6095 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006096 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006097 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13006098 "layout(location=0) out vec4 color;\n"
6099 "void main(){\n"
6100 " color = vec4(ins.x);\n"
6101 "}\n";
6102
6103 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6104 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6105
6106 VkPipelineObj pipe(m_device);
6107 pipe.AddColorAttachment();
6108 pipe.AddShader(&vs);
6109 pipe.AddShader(&fs);
6110
6111 VkDescriptorSetObj descriptorSet(m_device);
6112 descriptorSet.AppendDummy();
6113 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6114
6115 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6116
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006117 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006118}
6119
6120TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
6121 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6122 "location 0.0 which is not written by vertex shader");
6123
6124 ASSERT_NO_FATAL_FAILURE(InitState());
6125 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6126
6127 char const *vsSource =
6128 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006129 "\n"
6130 "out block { layout(location=1) float x; } outs;\n"
6131 "out gl_PerVertex {\n"
6132 " vec4 gl_Position;\n"
6133 "};\n"
6134 "void main(){\n"
6135 " outs.x = 0;\n"
6136 " gl_Position = vec4(1);\n"
6137 "}\n";
6138 char const *fsSource =
6139 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006140 "\n"
6141 "in block { layout(location=0) float x; } ins;\n"
6142 "layout(location=0) out vec4 color;\n"
6143 "void main(){\n"
6144 " color = vec4(ins.x);\n"
6145 "}\n";
6146
6147 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6148 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6149
6150 VkPipelineObj pipe(m_device);
6151 pipe.AddColorAttachment();
6152 pipe.AddShader(&vs);
6153 pipe.AddShader(&fs);
6154
6155 VkDescriptorSetObj descriptorSet(m_device);
6156 descriptorSet.AppendDummy();
6157 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6158
6159 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6160
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006161 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006162}
6163
6164TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
6165 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6166 "location 0.1 which is not written by vertex shader");
6167
6168 ASSERT_NO_FATAL_FAILURE(InitState());
6169 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6170
6171 char const *vsSource =
6172 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006173 "\n"
6174 "out block { layout(location=0, component=0) float x; } outs;\n"
6175 "out gl_PerVertex {\n"
6176 " vec4 gl_Position;\n"
6177 "};\n"
6178 "void main(){\n"
6179 " outs.x = 0;\n"
6180 " gl_Position = vec4(1);\n"
6181 "}\n";
6182 char const *fsSource =
6183 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006184 "\n"
6185 "in block { layout(location=0, component=1) float x; } ins;\n"
6186 "layout(location=0) out vec4 color;\n"
6187 "void main(){\n"
6188 " color = vec4(ins.x);\n"
6189 "}\n";
6190
6191 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6192 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6193
6194 VkPipelineObj pipe(m_device);
6195 pipe.AddColorAttachment();
6196 pipe.AddShader(&vs);
6197 pipe.AddShader(&fs);
6198
6199 VkDescriptorSetObj descriptorSet(m_device);
6200 descriptorSet.AppendDummy();
6201 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6202
6203 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6204
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006205 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006206}
6207
Karl Schultz6addd812016-02-02 17:17:23 -07006208TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006210 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006211
Chris Forbesde136e02015-05-25 11:13:28 +12006212 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006213 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12006214
6215 VkVertexInputBindingDescription input_binding;
6216 memset(&input_binding, 0, sizeof(input_binding));
6217
6218 VkVertexInputAttributeDescription input_attrib;
6219 memset(&input_attrib, 0, sizeof(input_attrib));
6220 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6221
6222 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006223 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006224 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006225 "out gl_PerVertex {\n"
6226 " vec4 gl_Position;\n"
6227 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006228 "void main(){\n"
6229 " gl_Position = vec4(1);\n"
6230 "}\n";
6231 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006232 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006233 "\n"
6234 "layout(location=0) out vec4 color;\n"
6235 "void main(){\n"
6236 " color = vec4(1);\n"
6237 "}\n";
6238
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006239 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6240 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12006241
6242 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006243 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12006244 pipe.AddShader(&vs);
6245 pipe.AddShader(&fs);
6246
6247 pipe.AddVertexInputBindings(&input_binding, 1);
6248 pipe.AddVertexInputAttribs(&input_attrib, 1);
6249
Chris Forbesde136e02015-05-25 11:13:28 +12006250 VkDescriptorSetObj descriptorSet(m_device);
6251 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006252 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12006253
Tony Barbour5781e8f2015-08-04 16:23:11 -06006254 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12006255
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006256 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12006257}
6258
Karl Schultz6addd812016-02-02 17:17:23 -07006259TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006260 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006261 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13006262
6263 ASSERT_NO_FATAL_FAILURE(InitState());
6264 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6265
6266 VkVertexInputBindingDescription input_binding;
6267 memset(&input_binding, 0, sizeof(input_binding));
6268
6269 VkVertexInputAttributeDescription input_attrib;
6270 memset(&input_attrib, 0, sizeof(input_attrib));
6271 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6272
6273 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006274 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006275 "\n"
6276 "layout(location=1) in float x;\n"
6277 "out gl_PerVertex {\n"
6278 " vec4 gl_Position;\n"
6279 "};\n"
6280 "void main(){\n"
6281 " gl_Position = vec4(x);\n"
6282 "}\n";
6283 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006284 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006285 "\n"
6286 "layout(location=0) out vec4 color;\n"
6287 "void main(){\n"
6288 " color = vec4(1);\n"
6289 "}\n";
6290
6291 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6292 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6293
6294 VkPipelineObj pipe(m_device);
6295 pipe.AddColorAttachment();
6296 pipe.AddShader(&vs);
6297 pipe.AddShader(&fs);
6298
6299 pipe.AddVertexInputBindings(&input_binding, 1);
6300 pipe.AddVertexInputAttribs(&input_attrib, 1);
6301
6302 VkDescriptorSetObj descriptorSet(m_device);
6303 descriptorSet.AppendDummy();
6304 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6305
6306 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6307
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006308 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13006309}
6310
Karl Schultz6addd812016-02-02 17:17:23 -07006311TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
6312 m_errorMonitor->SetDesiredFailureMsg(
6313 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006314 "VS consumes input at location 0 but not provided");
6315
Chris Forbes62e8e502015-05-25 11:13:29 +12006316 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006317 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12006318
6319 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006320 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006321 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006322 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07006323 "out gl_PerVertex {\n"
6324 " vec4 gl_Position;\n"
6325 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006326 "void main(){\n"
6327 " gl_Position = x;\n"
6328 "}\n";
6329 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006330 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006331 "\n"
6332 "layout(location=0) out vec4 color;\n"
6333 "void main(){\n"
6334 " color = vec4(1);\n"
6335 "}\n";
6336
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006337 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6338 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12006339
6340 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006341 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12006342 pipe.AddShader(&vs);
6343 pipe.AddShader(&fs);
6344
Chris Forbes62e8e502015-05-25 11:13:29 +12006345 VkDescriptorSetObj descriptorSet(m_device);
6346 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006347 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12006348
Tony Barbour5781e8f2015-08-04 16:23:11 -06006349 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12006350
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006351 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12006352}
6353
Karl Schultz6addd812016-02-02 17:17:23 -07006354TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
6355 m_errorMonitor->SetDesiredFailureMsg(
6356 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006357 "location 0 does not match VS input type");
6358
Chris Forbesc97d98e2015-05-25 11:13:31 +12006359 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006360 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006361
6362 VkVertexInputBindingDescription input_binding;
6363 memset(&input_binding, 0, sizeof(input_binding));
6364
6365 VkVertexInputAttributeDescription input_attrib;
6366 memset(&input_attrib, 0, sizeof(input_attrib));
6367 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6368
6369 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006370 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006371 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006372 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07006373 "out gl_PerVertex {\n"
6374 " vec4 gl_Position;\n"
6375 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006376 "void main(){\n"
6377 " gl_Position = vec4(x);\n"
6378 "}\n";
6379 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006380 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006381 "\n"
6382 "layout(location=0) out vec4 color;\n"
6383 "void main(){\n"
6384 " color = vec4(1);\n"
6385 "}\n";
6386
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006387 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6388 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006389
6390 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006391 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006392 pipe.AddShader(&vs);
6393 pipe.AddShader(&fs);
6394
6395 pipe.AddVertexInputBindings(&input_binding, 1);
6396 pipe.AddVertexInputAttribs(&input_attrib, 1);
6397
Chris Forbesc97d98e2015-05-25 11:13:31 +12006398 VkDescriptorSetObj descriptorSet(m_device);
6399 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006400 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006401
Tony Barbour5781e8f2015-08-04 16:23:11 -06006402 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006403
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006404 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006405}
6406
Chris Forbesc68b43c2016-04-06 11:18:47 +12006407TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
6408 m_errorMonitor->SetDesiredFailureMsg(
6409 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6410 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
6411
6412 ASSERT_NO_FATAL_FAILURE(InitState());
6413 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6414
6415 char const *vsSource =
6416 "#version 450\n"
6417 "\n"
6418 "out gl_PerVertex {\n"
6419 " vec4 gl_Position;\n"
6420 "};\n"
6421 "void main(){\n"
6422 " gl_Position = vec4(1);\n"
6423 "}\n";
6424 char const *fsSource =
6425 "#version 450\n"
6426 "\n"
6427 "layout(location=0) out vec4 color;\n"
6428 "void main(){\n"
6429 " color = vec4(1);\n"
6430 "}\n";
6431
6432 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6433 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6434
6435 VkPipelineObj pipe(m_device);
6436 pipe.AddColorAttachment();
6437 pipe.AddShader(&vs);
6438 pipe.AddShader(&vs);
6439 pipe.AddShader(&fs);
6440
6441 VkDescriptorSetObj descriptorSet(m_device);
6442 descriptorSet.AppendDummy();
6443 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6444
6445 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6446
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006447 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12006448}
6449
Karl Schultz6addd812016-02-02 17:17:23 -07006450TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006451 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13006452
6453 ASSERT_NO_FATAL_FAILURE(InitState());
6454 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6455
6456 VkVertexInputBindingDescription input_binding;
6457 memset(&input_binding, 0, sizeof(input_binding));
6458
6459 VkVertexInputAttributeDescription input_attribs[2];
6460 memset(input_attribs, 0, sizeof(input_attribs));
6461
6462 for (int i = 0; i < 2; i++) {
6463 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
6464 input_attribs[i].location = i;
6465 }
6466
6467 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006468 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006469 "\n"
6470 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006471 "out gl_PerVertex {\n"
6472 " vec4 gl_Position;\n"
6473 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006474 "void main(){\n"
6475 " gl_Position = x[0] + x[1];\n"
6476 "}\n";
6477 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006478 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006479 "\n"
6480 "layout(location=0) out vec4 color;\n"
6481 "void main(){\n"
6482 " color = vec4(1);\n"
6483 "}\n";
6484
6485 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6486 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6487
6488 VkPipelineObj pipe(m_device);
6489 pipe.AddColorAttachment();
6490 pipe.AddShader(&vs);
6491 pipe.AddShader(&fs);
6492
6493 pipe.AddVertexInputBindings(&input_binding, 1);
6494 pipe.AddVertexInputAttribs(input_attribs, 2);
6495
6496 VkDescriptorSetObj descriptorSet(m_device);
6497 descriptorSet.AppendDummy();
6498 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6499
6500 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6501
6502 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006503 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13006504}
6505
Chris Forbes2682b242015-11-24 11:13:14 +13006506TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
6507{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006508 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13006509
6510 ASSERT_NO_FATAL_FAILURE(InitState());
6511 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6512
6513 VkVertexInputBindingDescription input_binding;
6514 memset(&input_binding, 0, sizeof(input_binding));
6515
6516 VkVertexInputAttributeDescription input_attribs[2];
6517 memset(input_attribs, 0, sizeof(input_attribs));
6518
6519 for (int i = 0; i < 2; i++) {
6520 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
6521 input_attribs[i].location = i;
6522 }
6523
6524 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006525 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006526 "\n"
6527 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07006528 "out gl_PerVertex {\n"
6529 " vec4 gl_Position;\n"
6530 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006531 "void main(){\n"
6532 " gl_Position = x[0] + x[1];\n"
6533 "}\n";
6534 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006535 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006536 "\n"
6537 "layout(location=0) out vec4 color;\n"
6538 "void main(){\n"
6539 " color = vec4(1);\n"
6540 "}\n";
6541
6542 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6543 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6544
6545 VkPipelineObj pipe(m_device);
6546 pipe.AddColorAttachment();
6547 pipe.AddShader(&vs);
6548 pipe.AddShader(&fs);
6549
6550 pipe.AddVertexInputBindings(&input_binding, 1);
6551 pipe.AddVertexInputAttribs(input_attribs, 2);
6552
6553 VkDescriptorSetObj descriptorSet(m_device);
6554 descriptorSet.AppendDummy();
6555 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6556
6557 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6558
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006559 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13006560}
Chris Forbes2682b242015-11-24 11:13:14 +13006561
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006562TEST_F(VkLayerTest, CreatePipelineSimplePositive)
6563{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006564 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006565
6566 ASSERT_NO_FATAL_FAILURE(InitState());
6567 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6568
6569 char const *vsSource =
6570 "#version 450\n"
6571 "out gl_PerVertex {\n"
6572 " vec4 gl_Position;\n"
6573 "};\n"
6574 "void main(){\n"
6575 " gl_Position = vec4(0);\n"
6576 "}\n";
6577 char const *fsSource =
6578 "#version 450\n"
6579 "\n"
6580 "layout(location=0) out vec4 color;\n"
6581 "void main(){\n"
6582 " color = vec4(1);\n"
6583 "}\n";
6584
6585 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6586 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6587
6588 VkPipelineObj pipe(m_device);
6589 pipe.AddColorAttachment();
6590 pipe.AddShader(&vs);
6591 pipe.AddShader(&fs);
6592
6593 VkDescriptorSetObj descriptorSet(m_device);
6594 descriptorSet.AppendDummy();
6595 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6596
6597 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6598
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006599 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006600}
6601
Chris Forbes912c9192016-04-05 17:50:35 +12006602TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
6603{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006604 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12006605
6606 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
6607
6608 ASSERT_NO_FATAL_FAILURE(InitState());
6609 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6610
6611 char const *vsSource =
6612 "#version 450\n"
6613 "out gl_PerVertex {\n"
6614 " vec4 gl_Position;\n"
6615 "};\n"
6616 "layout(location=0) out vec3 x;\n"
6617 "layout(location=1) out ivec3 y;\n"
6618 "layout(location=2) out vec3 z;\n"
6619 "void main(){\n"
6620 " gl_Position = vec4(0);\n"
6621 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
6622 "}\n";
6623 char const *fsSource =
6624 "#version 450\n"
6625 "\n"
6626 "layout(location=0) out vec4 color;\n"
6627 "layout(location=0) in float x;\n"
6628 "layout(location=1) flat in int y;\n"
6629 "layout(location=2) in vec2 z;\n"
6630 "void main(){\n"
6631 " color = vec4(1 + x + y + z.x);\n"
6632 "}\n";
6633
6634 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6635 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6636
6637 VkPipelineObj pipe(m_device);
6638 pipe.AddColorAttachment();
6639 pipe.AddShader(&vs);
6640 pipe.AddShader(&fs);
6641
6642 VkDescriptorSetObj descriptorSet(m_device);
6643 descriptorSet.AppendDummy();
6644 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6645
6646 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6647
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006648 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12006649}
6650
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006651TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
6652{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006653 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006654
6655 ASSERT_NO_FATAL_FAILURE(InitState());
6656 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6657
Chris Forbesc1e852d2016-04-04 19:26:42 +12006658 if (!m_device->phy().features().tessellationShader) {
6659 printf("Device does not support tessellation shaders; skipped.\n");
6660 return;
6661 }
6662
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006663 char const *vsSource =
6664 "#version 450\n"
6665 "void main(){}\n";
6666 char const *tcsSource =
6667 "#version 450\n"
6668 "layout(location=0) out int x[];\n"
6669 "layout(vertices=3) out;\n"
6670 "void main(){\n"
6671 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
6672 " gl_TessLevelInner[0] = 1;\n"
6673 " x[gl_InvocationID] = gl_InvocationID;\n"
6674 "}\n";
6675 char const *tesSource =
6676 "#version 450\n"
6677 "layout(triangles, equal_spacing, cw) in;\n"
6678 "layout(location=0) in int x[];\n"
6679 "out gl_PerVertex { vec4 gl_Position; };\n"
6680 "void main(){\n"
6681 " gl_Position.xyz = gl_TessCoord;\n"
6682 " gl_Position.w = x[0] + x[1] + x[2];\n"
6683 "}\n";
6684 char const *fsSource =
6685 "#version 450\n"
6686 "layout(location=0) out vec4 color;\n"
6687 "void main(){\n"
6688 " color = vec4(1);\n"
6689 "}\n";
6690
6691 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6692 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
6693 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
6694 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6695
6696 VkPipelineInputAssemblyStateCreateInfo iasci{
6697 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
6698 nullptr,
6699 0,
6700 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
6701 VK_FALSE};
6702
Chris Forbesb4cacb62016-04-04 19:15:00 +12006703 VkPipelineTessellationStateCreateInfo tsci{
6704 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
6705 nullptr,
6706 0,
6707 3};
6708
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006709 VkPipelineObj pipe(m_device);
6710 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12006711 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006712 pipe.AddColorAttachment();
6713 pipe.AddShader(&vs);
6714 pipe.AddShader(&tcs);
6715 pipe.AddShader(&tes);
6716 pipe.AddShader(&fs);
6717
6718 VkDescriptorSetObj descriptorSet(m_device);
6719 descriptorSet.AppendDummy();
6720 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6721
6722 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6723
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006724 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006725}
6726
Chris Forbesa0ab8152016-04-20 13:34:27 +12006727TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
6728{
6729 m_errorMonitor->ExpectSuccess();
6730
6731 ASSERT_NO_FATAL_FAILURE(InitState());
6732 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6733
6734 if (!m_device->phy().features().geometryShader) {
6735 printf("Device does not support geometry shaders; skipped.\n");
6736 return;
6737 }
6738
6739 char const *vsSource =
6740 "#version 450\n"
6741 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
6742 "void main(){\n"
6743 " vs_out.x = vec4(1);\n"
6744 "}\n";
6745 char const *gsSource =
6746 "#version 450\n"
6747 "layout(triangles) in;\n"
6748 "layout(triangle_strip, max_vertices=3) out;\n"
6749 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
6750 "out gl_PerVertex { vec4 gl_Position; };\n"
6751 "void main() {\n"
6752 " gl_Position = gs_in[0].x;\n"
6753 " EmitVertex();\n"
6754 "}\n";
6755 char const *fsSource =
6756 "#version 450\n"
6757 "layout(location=0) out vec4 color;\n"
6758 "void main(){\n"
6759 " color = vec4(1);\n"
6760 "}\n";
6761
6762 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6763 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
6764 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6765
6766 VkPipelineObj pipe(m_device);
6767 pipe.AddColorAttachment();
6768 pipe.AddShader(&vs);
6769 pipe.AddShader(&gs);
6770 pipe.AddShader(&fs);
6771
6772 VkDescriptorSetObj descriptorSet(m_device);
6773 descriptorSet.AppendDummy();
6774 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6775
6776 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6777
6778 m_errorMonitor->VerifyNotFound();
6779}
6780
Chris Forbesa0193bc2016-04-04 19:19:47 +12006781TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
6782{
6783 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6784 "is per-vertex in tessellation control shader stage "
6785 "but per-patch in tessellation evaluation shader stage");
6786
6787 ASSERT_NO_FATAL_FAILURE(InitState());
6788 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6789
Chris Forbesc1e852d2016-04-04 19:26:42 +12006790 if (!m_device->phy().features().tessellationShader) {
6791 printf("Device does not support tessellation shaders; skipped.\n");
6792 return;
6793 }
6794
Chris Forbesa0193bc2016-04-04 19:19:47 +12006795 char const *vsSource =
6796 "#version 450\n"
6797 "void main(){}\n";
6798 char const *tcsSource =
6799 "#version 450\n"
6800 "layout(location=0) out int x[];\n"
6801 "layout(vertices=3) out;\n"
6802 "void main(){\n"
6803 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
6804 " gl_TessLevelInner[0] = 1;\n"
6805 " x[gl_InvocationID] = gl_InvocationID;\n"
6806 "}\n";
6807 char const *tesSource =
6808 "#version 450\n"
6809 "layout(triangles, equal_spacing, cw) in;\n"
6810 "layout(location=0) patch in int x;\n"
6811 "out gl_PerVertex { vec4 gl_Position; };\n"
6812 "void main(){\n"
6813 " gl_Position.xyz = gl_TessCoord;\n"
6814 " gl_Position.w = x;\n"
6815 "}\n";
6816 char const *fsSource =
6817 "#version 450\n"
6818 "layout(location=0) out vec4 color;\n"
6819 "void main(){\n"
6820 " color = vec4(1);\n"
6821 "}\n";
6822
6823 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6824 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
6825 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
6826 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6827
6828 VkPipelineInputAssemblyStateCreateInfo iasci{
6829 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
6830 nullptr,
6831 0,
6832 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
6833 VK_FALSE};
6834
6835 VkPipelineTessellationStateCreateInfo tsci{
6836 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
6837 nullptr,
6838 0,
6839 3};
6840
6841 VkPipelineObj pipe(m_device);
6842 pipe.SetInputAssembly(&iasci);
6843 pipe.SetTessellation(&tsci);
6844 pipe.AddColorAttachment();
6845 pipe.AddShader(&vs);
6846 pipe.AddShader(&tcs);
6847 pipe.AddShader(&tes);
6848 pipe.AddShader(&fs);
6849
6850 VkDescriptorSetObj descriptorSet(m_device);
6851 descriptorSet.AppendDummy();
6852 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6853
6854 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6855
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006856 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12006857}
6858
Karl Schultz6addd812016-02-02 17:17:23 -07006859TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
6860 m_errorMonitor->SetDesiredFailureMsg(
6861 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006862 "Duplicate vertex input binding descriptions for binding 0");
6863
Chris Forbes280ba2c2015-06-12 11:16:41 +12006864 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006865 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12006866
6867 /* Two binding descriptions for binding 0 */
6868 VkVertexInputBindingDescription input_bindings[2];
6869 memset(input_bindings, 0, sizeof(input_bindings));
6870
6871 VkVertexInputAttributeDescription input_attrib;
6872 memset(&input_attrib, 0, sizeof(input_attrib));
6873 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6874
6875 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006876 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12006877 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006878 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07006879 "out gl_PerVertex {\n"
6880 " vec4 gl_Position;\n"
6881 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12006882 "void main(){\n"
6883 " gl_Position = vec4(x);\n"
6884 "}\n";
6885 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006886 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12006887 "\n"
6888 "layout(location=0) out vec4 color;\n"
6889 "void main(){\n"
6890 " color = vec4(1);\n"
6891 "}\n";
6892
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006893 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6894 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12006895
6896 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006897 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12006898 pipe.AddShader(&vs);
6899 pipe.AddShader(&fs);
6900
6901 pipe.AddVertexInputBindings(input_bindings, 2);
6902 pipe.AddVertexInputAttribs(&input_attrib, 1);
6903
Chris Forbes280ba2c2015-06-12 11:16:41 +12006904 VkDescriptorSetObj descriptorSet(m_device);
6905 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006906 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12006907
Tony Barbour5781e8f2015-08-04 16:23:11 -06006908 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12006909
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006910 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12006911}
Chris Forbes8f68b562015-05-25 11:13:32 +12006912
Chris Forbes35efec72016-04-21 14:32:08 +12006913TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
6914 m_errorMonitor->ExpectSuccess();
6915
6916 ASSERT_NO_FATAL_FAILURE(InitState());
6917 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6918
6919 if (!m_device->phy().features().tessellationShader) {
6920 printf("Device does not support 64bit vertex attributes; skipped.\n");
6921 return;
6922 }
6923
6924 VkVertexInputBindingDescription input_bindings[1];
6925 memset(input_bindings, 0, sizeof(input_bindings));
6926
6927 VkVertexInputAttributeDescription input_attribs[4];
6928 memset(input_attribs, 0, sizeof(input_attribs));
6929 input_attribs[0].location = 0;
6930 input_attribs[0].offset = 0;
6931 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
6932 input_attribs[1].location = 2;
6933 input_attribs[1].offset = 32;
6934 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
6935 input_attribs[2].location = 4;
6936 input_attribs[2].offset = 64;
6937 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
6938 input_attribs[3].location = 6;
6939 input_attribs[3].offset = 96;
6940 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
6941
6942 char const *vsSource =
6943 "#version 450\n"
6944 "\n"
6945 "layout(location=0) in dmat4 x;\n"
6946 "out gl_PerVertex {\n"
6947 " vec4 gl_Position;\n"
6948 "};\n"
6949 "void main(){\n"
6950 " gl_Position = vec4(x[0][0]);\n"
6951 "}\n";
6952 char const *fsSource =
6953 "#version 450\n"
6954 "\n"
6955 "layout(location=0) out vec4 color;\n"
6956 "void main(){\n"
6957 " color = vec4(1);\n"
6958 "}\n";
6959
6960 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6961 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6962
6963 VkPipelineObj pipe(m_device);
6964 pipe.AddColorAttachment();
6965 pipe.AddShader(&vs);
6966 pipe.AddShader(&fs);
6967
6968 pipe.AddVertexInputBindings(input_bindings, 1);
6969 pipe.AddVertexInputAttribs(input_attribs, 4);
6970
6971 VkDescriptorSetObj descriptorSet(m_device);
6972 descriptorSet.AppendDummy();
6973 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6974
6975 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6976
6977 m_errorMonitor->VerifyNotFound();
6978}
6979
Karl Schultz6addd812016-02-02 17:17:23 -07006980TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006982 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006983
Chris Forbes4d6d1e52015-05-25 11:13:40 +12006984 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12006985
6986 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006987 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12006988 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006989 "out gl_PerVertex {\n"
6990 " vec4 gl_Position;\n"
6991 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12006992 "void main(){\n"
6993 " gl_Position = vec4(1);\n"
6994 "}\n";
6995 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006996 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12006997 "\n"
6998 "void main(){\n"
6999 "}\n";
7000
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007001 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7002 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007003
7004 VkPipelineObj pipe(m_device);
7005 pipe.AddShader(&vs);
7006 pipe.AddShader(&fs);
7007
Chia-I Wu08accc62015-07-07 11:50:03 +08007008 /* set up CB 0, not written */
7009 pipe.AddColorAttachment();
7010 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007011
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007012 VkDescriptorSetObj descriptorSet(m_device);
7013 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007014 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007015
Tony Barbour5781e8f2015-08-04 16:23:11 -06007016 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007017
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007018 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007019}
7020
Karl Schultz6addd812016-02-02 17:17:23 -07007021TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07007022 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007023 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007024 "FS writes to output location 1 with no matching attachment");
7025
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007026 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007027
7028 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007029 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007030 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007031 "out gl_PerVertex {\n"
7032 " vec4 gl_Position;\n"
7033 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007034 "void main(){\n"
7035 " gl_Position = vec4(1);\n"
7036 "}\n";
7037 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007038 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007039 "\n"
7040 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007041 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007042 "void main(){\n"
7043 " x = vec4(1);\n"
7044 " y = vec4(1);\n"
7045 "}\n";
7046
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007047 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7048 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007049
7050 VkPipelineObj pipe(m_device);
7051 pipe.AddShader(&vs);
7052 pipe.AddShader(&fs);
7053
Chia-I Wu08accc62015-07-07 11:50:03 +08007054 /* set up CB 0, not written */
7055 pipe.AddColorAttachment();
7056 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007057 /* FS writes CB 1, but we don't configure it */
7058
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007059 VkDescriptorSetObj descriptorSet(m_device);
7060 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007061 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007062
Tony Barbour5781e8f2015-08-04 16:23:11 -06007063 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007064
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007065 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007066}
7067
Karl Schultz6addd812016-02-02 17:17:23 -07007068TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007069 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007070 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007071
Chris Forbesa36d69e2015-05-25 11:13:44 +12007072 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007073
7074 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007075 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007076 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007077 "out gl_PerVertex {\n"
7078 " vec4 gl_Position;\n"
7079 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007080 "void main(){\n"
7081 " gl_Position = vec4(1);\n"
7082 "}\n";
7083 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007084 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007085 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007086 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12007087 "void main(){\n"
7088 " x = ivec4(1);\n"
7089 "}\n";
7090
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007091 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7092 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007093
7094 VkPipelineObj pipe(m_device);
7095 pipe.AddShader(&vs);
7096 pipe.AddShader(&fs);
7097
Chia-I Wu08accc62015-07-07 11:50:03 +08007098 /* set up CB 0; type is UNORM by default */
7099 pipe.AddColorAttachment();
7100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007101
Chris Forbesa36d69e2015-05-25 11:13:44 +12007102 VkDescriptorSetObj descriptorSet(m_device);
7103 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007104 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007105
Tony Barbour5781e8f2015-08-04 16:23:11 -06007106 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007107
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007108 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12007109}
Chris Forbes7b1b8932015-06-05 14:43:36 +12007110
Karl Schultz6addd812016-02-02 17:17:23 -07007111TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007113 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007114
Chris Forbes556c76c2015-08-14 12:04:59 +12007115 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12007116
7117 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007118 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007119 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007120 "out gl_PerVertex {\n"
7121 " vec4 gl_Position;\n"
7122 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007123 "void main(){\n"
7124 " gl_Position = vec4(1);\n"
7125 "}\n";
7126 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007127 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007128 "\n"
7129 "layout(location=0) out vec4 x;\n"
7130 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7131 "void main(){\n"
7132 " x = vec4(bar.y);\n"
7133 "}\n";
7134
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007135 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7136 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12007137
Chris Forbes556c76c2015-08-14 12:04:59 +12007138 VkPipelineObj pipe(m_device);
7139 pipe.AddShader(&vs);
7140 pipe.AddShader(&fs);
7141
7142 /* set up CB 0; type is UNORM by default */
7143 pipe.AddColorAttachment();
7144 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7145
7146 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007147 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12007148
7149 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7150
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007151 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12007152}
7153
Chris Forbes5c59e902016-02-26 16:56:09 +13007154TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
7155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7156 "not declared in layout");
7157
7158 ASSERT_NO_FATAL_FAILURE(InitState());
7159
7160 char const *vsSource =
7161 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007162 "\n"
7163 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
7164 "out gl_PerVertex {\n"
7165 " vec4 gl_Position;\n"
7166 "};\n"
7167 "void main(){\n"
7168 " gl_Position = vec4(consts.x);\n"
7169 "}\n";
7170 char const *fsSource =
7171 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007172 "\n"
7173 "layout(location=0) out vec4 x;\n"
7174 "void main(){\n"
7175 " x = vec4(1);\n"
7176 "}\n";
7177
7178 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7179 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7180
7181 VkPipelineObj pipe(m_device);
7182 pipe.AddShader(&vs);
7183 pipe.AddShader(&fs);
7184
7185 /* set up CB 0; type is UNORM by default */
7186 pipe.AddColorAttachment();
7187 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7188
7189 VkDescriptorSetObj descriptorSet(m_device);
7190 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7191
7192 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7193
7194 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007195 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13007196}
7197
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007198#endif // SHADER_CHECKER_TESTS
7199
7200#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06007201TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07007202 m_errorMonitor->SetDesiredFailureMsg(
7203 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007204 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007205
7206 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007207
7208 // Create an image
7209 VkImage image;
7210
Karl Schultz6addd812016-02-02 17:17:23 -07007211 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7212 const int32_t tex_width = 32;
7213 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007214
7215 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007216 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7217 image_create_info.pNext = NULL;
7218 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7219 image_create_info.format = tex_format;
7220 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007221 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07007222 image_create_info.extent.depth = 1;
7223 image_create_info.mipLevels = 1;
7224 image_create_info.arrayLayers = 1;
7225 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7226 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7227 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7228 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007229
7230 // Introduce error by sending down a bogus width extent
7231 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007232 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007233
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007234 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007235}
7236
Mark Youngc48c4c12016-04-11 14:26:49 -06007237TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
7238 m_errorMonitor->SetDesiredFailureMsg(
7239 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7240 "CreateImage extents is 0 for at least one required dimension");
7241
7242 ASSERT_NO_FATAL_FAILURE(InitState());
7243
7244 // Create an image
7245 VkImage image;
7246
7247 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7248 const int32_t tex_width = 32;
7249 const int32_t tex_height = 32;
7250
7251 VkImageCreateInfo image_create_info = {};
7252 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7253 image_create_info.pNext = NULL;
7254 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7255 image_create_info.format = tex_format;
7256 image_create_info.extent.width = tex_width;
7257 image_create_info.extent.height = tex_height;
7258 image_create_info.extent.depth = 1;
7259 image_create_info.mipLevels = 1;
7260 image_create_info.arrayLayers = 1;
7261 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7262 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7263 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7264 image_create_info.flags = 0;
7265
7266 // Introduce error by sending down a bogus width extent
7267 image_create_info.extent.width = 0;
7268 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7269
7270 m_errorMonitor->VerifyFound();
7271}
7272
Karl Schultz6addd812016-02-02 17:17:23 -07007273TEST_F(VkLayerTest, UpdateBufferAlignment) {
7274 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06007275
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007276 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007277 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007278
Mike Stroyana3082432015-09-25 13:39:21 -06007279 ASSERT_NO_FATAL_FAILURE(InitState());
7280
7281 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7282 vk_testing::Buffer buffer;
7283 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7284
7285 BeginCommandBuffer();
7286 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007287 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007288 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007289
Mike Stroyana3082432015-09-25 13:39:21 -06007290 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007292 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007293
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007294 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007295 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007296 EndCommandBuffer();
7297}
7298
Karl Schultz6addd812016-02-02 17:17:23 -07007299TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007300 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007301 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06007302
7303 ASSERT_NO_FATAL_FAILURE(InitState());
7304
7305 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7306 vk_testing::Buffer buffer;
7307 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7308
7309 BeginCommandBuffer();
7310 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007311 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007312 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007313
Mike Stroyana3082432015-09-25 13:39:21 -06007314 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007315 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007316 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007317
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007318 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007319
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007320 m_errorMonitor->VerifyFound();
7321
Mike Stroyana3082432015-09-25 13:39:21 -06007322 EndCommandBuffer();
7323}
7324
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007325#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12007326
Tobin Ehliscde08892015-09-22 10:11:37 -06007327#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07007328TEST_F(VkLayerTest, InvalidImageView) {
7329 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06007330
Karl Schultz6addd812016-02-02 17:17:23 -07007331 m_errorMonitor->SetDesiredFailureMsg(
7332 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007333 "vkCreateImageView called with baseMipLevel 10 ");
7334
Tobin Ehliscde08892015-09-22 10:11:37 -06007335 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06007336
Mike Stroyana3082432015-09-25 13:39:21 -06007337 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07007338 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06007339
Karl Schultz6addd812016-02-02 17:17:23 -07007340 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7341 const int32_t tex_width = 32;
7342 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06007343
7344 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007345 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7346 image_create_info.pNext = NULL;
7347 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7348 image_create_info.format = tex_format;
7349 image_create_info.extent.width = tex_width;
7350 image_create_info.extent.height = tex_height;
7351 image_create_info.extent.depth = 1;
7352 image_create_info.mipLevels = 1;
7353 image_create_info.arrayLayers = 1;
7354 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7355 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7356 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7357 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06007358
Chia-I Wuf7458c52015-10-26 21:10:41 +08007359 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06007360 ASSERT_VK_SUCCESS(err);
7361
7362 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007363 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7364 image_view_create_info.image = image;
7365 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7366 image_view_create_info.format = tex_format;
7367 image_view_create_info.subresourceRange.layerCount = 1;
7368 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
7369 image_view_create_info.subresourceRange.levelCount = 1;
7370 image_view_create_info.subresourceRange.aspectMask =
7371 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06007372
7373 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007374 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7375 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06007376
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007377 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06007378}
Mike Stroyana3082432015-09-25 13:39:21 -06007379
Karl Schultz6addd812016-02-02 17:17:23 -07007380TEST_F(VkLayerTest, InvalidImageViewAspect) {
7381 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007382
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007384 "vkCreateImageView: Color image "
7385 "formats must have ONLY the "
7386 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007387
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007388 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007389
7390 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07007391 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007392
Karl Schultz6addd812016-02-02 17:17:23 -07007393 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7394 const int32_t tex_width = 32;
7395 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007396
7397 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007398 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7399 image_create_info.pNext = NULL;
7400 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7401 image_create_info.format = tex_format;
7402 image_create_info.extent.width = tex_width;
7403 image_create_info.extent.height = tex_height;
7404 image_create_info.extent.depth = 1;
7405 image_create_info.mipLevels = 1;
7406 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7407 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7408 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7409 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007410
Chia-I Wuf7458c52015-10-26 21:10:41 +08007411 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007412 ASSERT_VK_SUCCESS(err);
7413
7414 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007415 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7416 image_view_create_info.image = image;
7417 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7418 image_view_create_info.format = tex_format;
7419 image_view_create_info.subresourceRange.baseMipLevel = 0;
7420 image_view_create_info.subresourceRange.levelCount = 1;
7421 // Cause an error by setting an invalid image aspect
7422 image_view_create_info.subresourceRange.aspectMask =
7423 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007424
7425 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007426 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7427 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007428
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007429 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007430}
7431
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007432TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07007433 VkResult err;
7434 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007435
Karl Schultz6addd812016-02-02 17:17:23 -07007436 m_errorMonitor->SetDesiredFailureMsg(
7437 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007438 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007439
Mike Stroyana3082432015-09-25 13:39:21 -06007440 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007441
7442 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007443 VkImage srcImage;
7444 VkImage dstImage;
7445 VkDeviceMemory srcMem;
7446 VkDeviceMemory destMem;
7447 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007448
7449 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007450 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7451 image_create_info.pNext = NULL;
7452 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7453 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7454 image_create_info.extent.width = 32;
7455 image_create_info.extent.height = 32;
7456 image_create_info.extent.depth = 1;
7457 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007458 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07007459 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7460 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7461 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7462 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007463
Karl Schultz6addd812016-02-02 17:17:23 -07007464 err =
7465 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007466 ASSERT_VK_SUCCESS(err);
7467
Karl Schultz6addd812016-02-02 17:17:23 -07007468 err =
7469 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007470 ASSERT_VK_SUCCESS(err);
7471
7472 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007473 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007474 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7475 memAlloc.pNext = NULL;
7476 memAlloc.allocationSize = 0;
7477 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007478
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007479 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007480 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007481 pass =
7482 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007483 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007484 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007485 ASSERT_VK_SUCCESS(err);
7486
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007487 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007488 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007489 pass =
7490 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007491 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007492 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007493 ASSERT_VK_SUCCESS(err);
7494
7495 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7496 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007497 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007498 ASSERT_VK_SUCCESS(err);
7499
7500 BeginCommandBuffer();
7501 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007502 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007503 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007504 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007505 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06007506 copyRegion.srcOffset.x = 0;
7507 copyRegion.srcOffset.y = 0;
7508 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007509 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007510 copyRegion.dstSubresource.mipLevel = 0;
7511 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007512 // Introduce failure by forcing the dst layerCount to differ from src
7513 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007514 copyRegion.dstOffset.x = 0;
7515 copyRegion.dstOffset.y = 0;
7516 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007517 copyRegion.extent.width = 1;
7518 copyRegion.extent.height = 1;
7519 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007520 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7521 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007522 EndCommandBuffer();
7523
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007524 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007525
Chia-I Wuf7458c52015-10-26 21:10:41 +08007526 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007527 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007528 vkFreeMemory(m_device->device(), srcMem, NULL);
7529 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007530}
7531
Karl Schultz6addd812016-02-02 17:17:23 -07007532TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06007533 VkResult err;
7534 bool pass;
7535
7536 // Create color images with different format sizes and try to copy between them
7537 m_errorMonitor->SetDesiredFailureMsg(
7538 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7539 "vkCmdCopyImage called with unmatched source and dest image format sizes");
7540
7541 ASSERT_NO_FATAL_FAILURE(InitState());
7542
7543 // Create two images of different types and try to copy between them
7544 VkImage srcImage;
7545 VkImage dstImage;
7546 VkDeviceMemory srcMem;
7547 VkDeviceMemory destMem;
7548 VkMemoryRequirements memReqs;
7549
7550 VkImageCreateInfo image_create_info = {};
7551 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7552 image_create_info.pNext = NULL;
7553 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7554 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7555 image_create_info.extent.width = 32;
7556 image_create_info.extent.height = 32;
7557 image_create_info.extent.depth = 1;
7558 image_create_info.mipLevels = 1;
7559 image_create_info.arrayLayers = 1;
7560 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7561 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7562 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7563 image_create_info.flags = 0;
7564
7565 err =
7566 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
7567 ASSERT_VK_SUCCESS(err);
7568
7569 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7570 // Introduce failure by creating second image with a different-sized format.
7571 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
7572
7573 err =
7574 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
7575 ASSERT_VK_SUCCESS(err);
7576
7577 // Allocate memory
7578 VkMemoryAllocateInfo memAlloc = {};
7579 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7580 memAlloc.pNext = NULL;
7581 memAlloc.allocationSize = 0;
7582 memAlloc.memoryTypeIndex = 0;
7583
7584 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
7585 memAlloc.allocationSize = memReqs.size;
7586 pass =
7587 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
7588 ASSERT_TRUE(pass);
7589 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
7590 ASSERT_VK_SUCCESS(err);
7591
7592 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
7593 memAlloc.allocationSize = memReqs.size;
7594 pass =
7595 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
7596 ASSERT_TRUE(pass);
7597 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
7598 ASSERT_VK_SUCCESS(err);
7599
7600 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7601 ASSERT_VK_SUCCESS(err);
7602 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
7603 ASSERT_VK_SUCCESS(err);
7604
7605 BeginCommandBuffer();
7606 VkImageCopy copyRegion;
7607 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7608 copyRegion.srcSubresource.mipLevel = 0;
7609 copyRegion.srcSubresource.baseArrayLayer = 0;
7610 copyRegion.srcSubresource.layerCount = 0;
7611 copyRegion.srcOffset.x = 0;
7612 copyRegion.srcOffset.y = 0;
7613 copyRegion.srcOffset.z = 0;
7614 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7615 copyRegion.dstSubresource.mipLevel = 0;
7616 copyRegion.dstSubresource.baseArrayLayer = 0;
7617 copyRegion.dstSubresource.layerCount = 0;
7618 copyRegion.dstOffset.x = 0;
7619 copyRegion.dstOffset.y = 0;
7620 copyRegion.dstOffset.z = 0;
7621 copyRegion.extent.width = 1;
7622 copyRegion.extent.height = 1;
7623 copyRegion.extent.depth = 1;
7624 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7625 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7626 EndCommandBuffer();
7627
7628 m_errorMonitor->VerifyFound();
7629
7630 vkDestroyImage(m_device->device(), srcImage, NULL);
7631 vkDestroyImage(m_device->device(), dstImage, NULL);
7632 vkFreeMemory(m_device->device(), srcMem, NULL);
7633 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007634}
7635
Karl Schultz6addd812016-02-02 17:17:23 -07007636TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
7637 VkResult err;
7638 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007639
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007640 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007641 m_errorMonitor->SetDesiredFailureMsg(
7642 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007643 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007644
Mike Stroyana3082432015-09-25 13:39:21 -06007645 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007646
7647 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007648 VkImage srcImage;
7649 VkImage dstImage;
7650 VkDeviceMemory srcMem;
7651 VkDeviceMemory destMem;
7652 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007653
7654 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007655 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7656 image_create_info.pNext = NULL;
7657 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7658 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7659 image_create_info.extent.width = 32;
7660 image_create_info.extent.height = 32;
7661 image_create_info.extent.depth = 1;
7662 image_create_info.mipLevels = 1;
7663 image_create_info.arrayLayers = 1;
7664 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7665 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7666 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7667 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007668
Karl Schultz6addd812016-02-02 17:17:23 -07007669 err =
7670 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007671 ASSERT_VK_SUCCESS(err);
7672
Karl Schultzbdb75952016-04-19 11:36:49 -06007673 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7674
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007675 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07007676 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007677 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
7678 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007679
Karl Schultz6addd812016-02-02 17:17:23 -07007680 err =
7681 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007682 ASSERT_VK_SUCCESS(err);
7683
7684 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007685 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007686 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7687 memAlloc.pNext = NULL;
7688 memAlloc.allocationSize = 0;
7689 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007690
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007691 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007692 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007693 pass =
7694 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007695 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007696 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007697 ASSERT_VK_SUCCESS(err);
7698
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007699 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007700 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007701 pass =
7702 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007703 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007704 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007705 ASSERT_VK_SUCCESS(err);
7706
7707 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7708 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007709 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007710 ASSERT_VK_SUCCESS(err);
7711
7712 BeginCommandBuffer();
7713 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007714 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007715 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007716 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007717 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007718 copyRegion.srcOffset.x = 0;
7719 copyRegion.srcOffset.y = 0;
7720 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007721 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007722 copyRegion.dstSubresource.mipLevel = 0;
7723 copyRegion.dstSubresource.baseArrayLayer = 0;
7724 copyRegion.dstSubresource.layerCount = 0;
7725 copyRegion.dstOffset.x = 0;
7726 copyRegion.dstOffset.y = 0;
7727 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007728 copyRegion.extent.width = 1;
7729 copyRegion.extent.height = 1;
7730 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007731 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7732 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007733 EndCommandBuffer();
7734
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007735 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007736
Chia-I Wuf7458c52015-10-26 21:10:41 +08007737 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007738 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007739 vkFreeMemory(m_device->device(), srcMem, NULL);
7740 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007741}
7742
Karl Schultz6addd812016-02-02 17:17:23 -07007743TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
7744 VkResult err;
7745 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007746
Karl Schultz6addd812016-02-02 17:17:23 -07007747 m_errorMonitor->SetDesiredFailureMsg(
7748 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007749 "vkCmdResolveImage called with source sample count less than 2.");
7750
Mike Stroyana3082432015-09-25 13:39:21 -06007751 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007752
7753 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07007754 VkImage srcImage;
7755 VkImage dstImage;
7756 VkDeviceMemory srcMem;
7757 VkDeviceMemory destMem;
7758 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007759
7760 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007761 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7762 image_create_info.pNext = NULL;
7763 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7764 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7765 image_create_info.extent.width = 32;
7766 image_create_info.extent.height = 1;
7767 image_create_info.extent.depth = 1;
7768 image_create_info.mipLevels = 1;
7769 image_create_info.arrayLayers = 1;
7770 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7771 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7772 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7773 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007774
Karl Schultz6addd812016-02-02 17:17:23 -07007775 err =
7776 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007777 ASSERT_VK_SUCCESS(err);
7778
Karl Schultz6addd812016-02-02 17:17:23 -07007779 image_create_info.imageType = VK_IMAGE_TYPE_1D;
7780 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007781
Karl Schultz6addd812016-02-02 17:17:23 -07007782 err =
7783 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007784 ASSERT_VK_SUCCESS(err);
7785
7786 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007787 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007788 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7789 memAlloc.pNext = NULL;
7790 memAlloc.allocationSize = 0;
7791 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007792
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007793 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007794 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007795 pass =
7796 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007797 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007798 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007799 ASSERT_VK_SUCCESS(err);
7800
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007801 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007802 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007803 pass =
7804 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007805 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007806 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007807 ASSERT_VK_SUCCESS(err);
7808
7809 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7810 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007811 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007812 ASSERT_VK_SUCCESS(err);
7813
7814 BeginCommandBuffer();
7815 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07007816 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
7817 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06007818 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007819 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007820 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007821 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007822 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007823 resolveRegion.srcOffset.x = 0;
7824 resolveRegion.srcOffset.y = 0;
7825 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007826 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007827 resolveRegion.dstSubresource.mipLevel = 0;
7828 resolveRegion.dstSubresource.baseArrayLayer = 0;
7829 resolveRegion.dstSubresource.layerCount = 0;
7830 resolveRegion.dstOffset.x = 0;
7831 resolveRegion.dstOffset.y = 0;
7832 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007833 resolveRegion.extent.width = 1;
7834 resolveRegion.extent.height = 1;
7835 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007836 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7837 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007838 EndCommandBuffer();
7839
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007840 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007841
Chia-I Wuf7458c52015-10-26 21:10:41 +08007842 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007843 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007844 vkFreeMemory(m_device->device(), srcMem, NULL);
7845 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007846}
7847
Karl Schultz6addd812016-02-02 17:17:23 -07007848TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
7849 VkResult err;
7850 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007851
Karl Schultz6addd812016-02-02 17:17:23 -07007852 m_errorMonitor->SetDesiredFailureMsg(
7853 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007854 "vkCmdResolveImage called with dest sample count greater than 1.");
7855
Mike Stroyana3082432015-09-25 13:39:21 -06007856 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007857
7858 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07007859 VkImage srcImage;
7860 VkImage dstImage;
7861 VkDeviceMemory srcMem;
7862 VkDeviceMemory destMem;
7863 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007864
7865 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007866 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7867 image_create_info.pNext = NULL;
7868 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7869 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7870 image_create_info.extent.width = 32;
7871 image_create_info.extent.height = 1;
7872 image_create_info.extent.depth = 1;
7873 image_create_info.mipLevels = 1;
7874 image_create_info.arrayLayers = 1;
7875 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
7876 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7877 // Note: Some implementations expect color attachment usage for any
7878 // multisample surface
7879 image_create_info.usage =
7880 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
7881 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007882
Karl Schultz6addd812016-02-02 17:17:23 -07007883 err =
7884 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007885 ASSERT_VK_SUCCESS(err);
7886
Karl Schultz6addd812016-02-02 17:17:23 -07007887 image_create_info.imageType = VK_IMAGE_TYPE_1D;
7888 // Note: Some implementations expect color attachment usage for any
7889 // multisample surface
7890 image_create_info.usage =
7891 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007892
Karl Schultz6addd812016-02-02 17:17:23 -07007893 err =
7894 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007895 ASSERT_VK_SUCCESS(err);
7896
7897 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007898 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007899 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7900 memAlloc.pNext = NULL;
7901 memAlloc.allocationSize = 0;
7902 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007903
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007904 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007905 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007906 pass =
7907 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007908 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007909 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007910 ASSERT_VK_SUCCESS(err);
7911
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007912 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007913 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007914 pass =
7915 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007916 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007917 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007918 ASSERT_VK_SUCCESS(err);
7919
7920 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7921 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007922 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007923 ASSERT_VK_SUCCESS(err);
7924
7925 BeginCommandBuffer();
7926 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07007927 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
7928 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06007929 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007930 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007931 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007932 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007933 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007934 resolveRegion.srcOffset.x = 0;
7935 resolveRegion.srcOffset.y = 0;
7936 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007937 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007938 resolveRegion.dstSubresource.mipLevel = 0;
7939 resolveRegion.dstSubresource.baseArrayLayer = 0;
7940 resolveRegion.dstSubresource.layerCount = 0;
7941 resolveRegion.dstOffset.x = 0;
7942 resolveRegion.dstOffset.y = 0;
7943 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007944 resolveRegion.extent.width = 1;
7945 resolveRegion.extent.height = 1;
7946 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007947 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7948 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007949 EndCommandBuffer();
7950
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007951 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007952
Chia-I Wuf7458c52015-10-26 21:10:41 +08007953 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007954 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007955 vkFreeMemory(m_device->device(), srcMem, NULL);
7956 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007957}
7958
Karl Schultz6addd812016-02-02 17:17:23 -07007959TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
7960 VkResult err;
7961 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007962
Karl Schultz6addd812016-02-02 17:17:23 -07007963 m_errorMonitor->SetDesiredFailureMsg(
7964 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007965 "vkCmdResolveImage called with unmatched source and dest formats.");
7966
Mike Stroyana3082432015-09-25 13:39:21 -06007967 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007968
7969 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007970 VkImage srcImage;
7971 VkImage dstImage;
7972 VkDeviceMemory srcMem;
7973 VkDeviceMemory destMem;
7974 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007975
7976 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007977 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7978 image_create_info.pNext = NULL;
7979 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7980 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7981 image_create_info.extent.width = 32;
7982 image_create_info.extent.height = 1;
7983 image_create_info.extent.depth = 1;
7984 image_create_info.mipLevels = 1;
7985 image_create_info.arrayLayers = 1;
7986 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
7987 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7988 // Note: Some implementations expect color attachment usage for any
7989 // multisample surface
7990 image_create_info.usage =
7991 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
7992 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007993
Karl Schultz6addd812016-02-02 17:17:23 -07007994 err =
7995 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007996 ASSERT_VK_SUCCESS(err);
7997
Karl Schultz6addd812016-02-02 17:17:23 -07007998 // Set format to something other than source image
7999 image_create_info.format = VK_FORMAT_R32_SFLOAT;
8000 // Note: Some implementations expect color attachment usage for any
8001 // multisample surface
8002 image_create_info.usage =
8003 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8004 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008005
Karl Schultz6addd812016-02-02 17:17:23 -07008006 err =
8007 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008008 ASSERT_VK_SUCCESS(err);
8009
8010 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008011 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008012 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8013 memAlloc.pNext = NULL;
8014 memAlloc.allocationSize = 0;
8015 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008016
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008017 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008018 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008019 pass =
8020 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008021 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008022 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008023 ASSERT_VK_SUCCESS(err);
8024
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008025 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008026 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008027 pass =
8028 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008029 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008030 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008031 ASSERT_VK_SUCCESS(err);
8032
8033 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8034 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008035 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008036 ASSERT_VK_SUCCESS(err);
8037
8038 BeginCommandBuffer();
8039 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008040 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8041 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008042 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008043 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008044 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008045 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008046 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008047 resolveRegion.srcOffset.x = 0;
8048 resolveRegion.srcOffset.y = 0;
8049 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008050 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008051 resolveRegion.dstSubresource.mipLevel = 0;
8052 resolveRegion.dstSubresource.baseArrayLayer = 0;
8053 resolveRegion.dstSubresource.layerCount = 0;
8054 resolveRegion.dstOffset.x = 0;
8055 resolveRegion.dstOffset.y = 0;
8056 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008057 resolveRegion.extent.width = 1;
8058 resolveRegion.extent.height = 1;
8059 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008060 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8061 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008062 EndCommandBuffer();
8063
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008064 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008065
Chia-I Wuf7458c52015-10-26 21:10:41 +08008066 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008067 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008068 vkFreeMemory(m_device->device(), srcMem, NULL);
8069 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008070}
8071
Karl Schultz6addd812016-02-02 17:17:23 -07008072TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
8073 VkResult err;
8074 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008075
Karl Schultz6addd812016-02-02 17:17:23 -07008076 m_errorMonitor->SetDesiredFailureMsg(
8077 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008078 "vkCmdResolveImage called with unmatched source and dest image types.");
8079
Mike Stroyana3082432015-09-25 13:39:21 -06008080 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008081
8082 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008083 VkImage srcImage;
8084 VkImage dstImage;
8085 VkDeviceMemory srcMem;
8086 VkDeviceMemory destMem;
8087 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008088
8089 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008090 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8091 image_create_info.pNext = NULL;
8092 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8093 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8094 image_create_info.extent.width = 32;
8095 image_create_info.extent.height = 1;
8096 image_create_info.extent.depth = 1;
8097 image_create_info.mipLevels = 1;
8098 image_create_info.arrayLayers = 1;
8099 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8100 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8101 // Note: Some implementations expect color attachment usage for any
8102 // multisample surface
8103 image_create_info.usage =
8104 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8105 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008106
Karl Schultz6addd812016-02-02 17:17:23 -07008107 err =
8108 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008109 ASSERT_VK_SUCCESS(err);
8110
Karl Schultz6addd812016-02-02 17:17:23 -07008111 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8112 // Note: Some implementations expect color attachment usage for any
8113 // multisample surface
8114 image_create_info.usage =
8115 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8116 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008117
Karl Schultz6addd812016-02-02 17:17:23 -07008118 err =
8119 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008120 ASSERT_VK_SUCCESS(err);
8121
8122 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008123 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008124 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8125 memAlloc.pNext = NULL;
8126 memAlloc.allocationSize = 0;
8127 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008128
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008129 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008130 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008131 pass =
8132 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008133 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008134 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008135 ASSERT_VK_SUCCESS(err);
8136
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008137 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008138 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008139 pass =
8140 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008141 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008142 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008143 ASSERT_VK_SUCCESS(err);
8144
8145 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8146 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008147 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008148 ASSERT_VK_SUCCESS(err);
8149
8150 BeginCommandBuffer();
8151 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008152 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8153 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008154 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008155 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008156 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008157 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008158 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008159 resolveRegion.srcOffset.x = 0;
8160 resolveRegion.srcOffset.y = 0;
8161 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008162 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008163 resolveRegion.dstSubresource.mipLevel = 0;
8164 resolveRegion.dstSubresource.baseArrayLayer = 0;
8165 resolveRegion.dstSubresource.layerCount = 0;
8166 resolveRegion.dstOffset.x = 0;
8167 resolveRegion.dstOffset.y = 0;
8168 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008169 resolveRegion.extent.width = 1;
8170 resolveRegion.extent.height = 1;
8171 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008172 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8173 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008174 EndCommandBuffer();
8175
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008176 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008177
Chia-I Wuf7458c52015-10-26 21:10:41 +08008178 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008179 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008180 vkFreeMemory(m_device->device(), srcMem, NULL);
8181 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008182}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008183
Karl Schultz6addd812016-02-02 17:17:23 -07008184TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008185 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07008186 // to using a DS format, then cause it to hit error due to COLOR_BIT not
8187 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008188 // The image format check comes 2nd in validation so we trigger it first,
8189 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07008190 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008191
Karl Schultz6addd812016-02-02 17:17:23 -07008192 m_errorMonitor->SetDesiredFailureMsg(
8193 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008194 "Combination depth/stencil image formats can have only the ");
8195
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008196 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008197
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008198 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008199 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8200 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008201
8202 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008203 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8204 ds_pool_ci.pNext = NULL;
8205 ds_pool_ci.maxSets = 1;
8206 ds_pool_ci.poolSizeCount = 1;
8207 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008208
8209 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008210 err =
8211 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008212 ASSERT_VK_SUCCESS(err);
8213
8214 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008215 dsl_binding.binding = 0;
8216 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8217 dsl_binding.descriptorCount = 1;
8218 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8219 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008220
8221 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008222 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8223 ds_layout_ci.pNext = NULL;
8224 ds_layout_ci.bindingCount = 1;
8225 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008226 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008227 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8228 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008229 ASSERT_VK_SUCCESS(err);
8230
8231 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008232 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008233 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008234 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008235 alloc_info.descriptorPool = ds_pool;
8236 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008237 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8238 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008239 ASSERT_VK_SUCCESS(err);
8240
Karl Schultz6addd812016-02-02 17:17:23 -07008241 VkImage image_bad;
8242 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008243 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07008244 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008245 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07008246 const int32_t tex_width = 32;
8247 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008248
8249 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008250 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8251 image_create_info.pNext = NULL;
8252 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8253 image_create_info.format = tex_format_bad;
8254 image_create_info.extent.width = tex_width;
8255 image_create_info.extent.height = tex_height;
8256 image_create_info.extent.depth = 1;
8257 image_create_info.mipLevels = 1;
8258 image_create_info.arrayLayers = 1;
8259 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8260 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8261 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
8262 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
8263 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008264
Karl Schultz6addd812016-02-02 17:17:23 -07008265 err =
8266 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008267 ASSERT_VK_SUCCESS(err);
8268 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07008269 image_create_info.usage =
8270 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8271 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
8272 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008273 ASSERT_VK_SUCCESS(err);
8274
8275 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008276 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8277 image_view_create_info.image = image_bad;
8278 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8279 image_view_create_info.format = tex_format_bad;
8280 image_view_create_info.subresourceRange.baseArrayLayer = 0;
8281 image_view_create_info.subresourceRange.baseMipLevel = 0;
8282 image_view_create_info.subresourceRange.layerCount = 1;
8283 image_view_create_info.subresourceRange.levelCount = 1;
8284 image_view_create_info.subresourceRange.aspectMask =
8285 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008286
8287 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008288 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8289 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008290
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008291 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008292
Chia-I Wuf7458c52015-10-26 21:10:41 +08008293 vkDestroyImage(m_device->device(), image_bad, NULL);
8294 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008295 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8296 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008297}
Tobin Ehliscde08892015-09-22 10:11:37 -06008298#endif // IMAGE_TESTS
8299
Tony Barbour300a6082015-04-07 13:44:53 -06008300int main(int argc, char **argv) {
8301 int result;
8302
Cody Northrop8e54a402016-03-08 22:25:52 -07008303#ifdef ANDROID
8304 int vulkanSupport = InitVulkan();
8305 if (vulkanSupport == 0)
8306 return 1;
8307#endif
8308
Tony Barbour300a6082015-04-07 13:44:53 -06008309 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06008310 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06008311
8312 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
8313
8314 result = RUN_ALL_TESTS();
8315
Tony Barbour6918cd52015-04-09 12:58:51 -06008316 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06008317 return result;
8318}