blob: 07ca4c069ccb097fc3d08adc8ec8f0a07d0d5ccf [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
Dustin Graves48458142016-04-29 16:11:55 -0600120 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
121
Karl Schultz6addd812016-02-02 17:17:23 -0700122 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200123 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600124 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600125 m_failureMsg.clear();
126 m_otherMsgs.clear();
127 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700128 m_msgFound = VK_FALSE;
129 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600130 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600131 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600132
Karl Schultz6addd812016-02-02 17:17:23 -0700133 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600134 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600135 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600136 if (m_bailout != NULL) {
137 *m_bailout = true;
138 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600139 string errorString(msgString);
140 if (msgFlags & m_msgFlags) {
141 if (errorString.find(m_desiredMsg) != string::npos) {
Chris Forbesc7b8ad72016-04-04 18:50:38 +1200142 if (m_msgFound) { /* if multiple matches, don't lose all but the last! */
143 m_otherMsgs.push_back(m_failureMsg);
144 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600145 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700146 m_msgFound = VK_TRUE;
147 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600148 } else {
149 m_otherMsgs.push_back(errorString);
150 }
151 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600152 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600153 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600154 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600155
Karl Schultz6addd812016-02-02 17:17:23 -0700156 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600157
Karl Schultz6addd812016-02-02 17:17:23 -0700158 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600159
Karl Schultz6addd812016-02-02 17:17:23 -0700160 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600161
Karl Schultz6addd812016-02-02 17:17:23 -0700162 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600163
Karl Schultz6addd812016-02-02 17:17:23 -0700164 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165 vector<string> otherMsgs = GetOtherFailureMsgs();
166 cout << "Other error messages logged for this test were:" << endl;
167 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
168 cout << " " << *iter << endl;
169 }
170 }
171
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200172 /* helpers */
173
174 void ExpectSuccess() {
175 // match anything
176 SetDesiredFailureMsg(~0u, "");
177 }
178
179 void VerifyFound() {
180 // Not seeing the desired message is a failure. /Before/ throwing, dump
181 // any other messages.
182 if (!DesiredMsgFound()) {
183 DumpFailureMsgs();
184 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
185 }
186 }
187
188 void VerifyNotFound() {
189 // ExpectSuccess() configured us to match anything. Any error is a
190 // failure.
191 if (DesiredMsgFound()) {
192 DumpFailureMsgs();
193 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
194 }
195 }
196
Karl Schultz6addd812016-02-02 17:17:23 -0700197 private:
198 VkFlags m_msgFlags;
199 string m_desiredMsg;
200 string m_failureMsg;
201 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600202 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700203 bool *m_bailout;
204 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600205};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500206
Karl Schultz6addd812016-02-02 17:17:23 -0700207static VKAPI_ATTR VkBool32 VKAPI_CALL
208myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
209 uint64_t srcObject, size_t location, int32_t msgCode,
210 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
211 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700212 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700213 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600214 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600215 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600216 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600217 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600218}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500219
Karl Schultz6addd812016-02-02 17:17:23 -0700220class VkLayerTest : public VkRenderFramework {
221 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800222 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
223 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700224 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
225 BsoFailSelect failMask);
226 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
227 VkPipelineObj &pipelineobj,
228 VkDescriptorSetObj &descriptorSet,
229 BsoFailSelect failMask);
230 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
231 VkDescriptorSetObj &descriptorSet,
232 BsoFailSelect failMask) {
233 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
234 failMask);
235 }
Tony Barbour300a6082015-04-07 13:44:53 -0600236
Tony Barbourfe3351b2015-07-28 10:17:20 -0600237 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700238 VkResult BeginCommandBuffer() {
239 return BeginCommandBuffer(*m_commandBuffer);
240 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800241 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700242 void Draw(uint32_t vertexCount, uint32_t instanceCount,
243 uint32_t firstVertex, uint32_t firstInstance) {
244 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
245 firstInstance);
246 }
247 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
248 uint32_t firstIndex, int32_t vertexOffset,
249 uint32_t firstInstance) {
250 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
251 vertexOffset, firstInstance);
252 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800253 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); }
Karl Schultz6addd812016-02-02 17:17:23 -0700254 void QueueCommandBuffer(const VkFence &fence) {
255 m_commandBuffer->QueueCommandBuffer(fence);
256 }
257 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
258 VkDeviceSize offset, uint32_t binding) {
259 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
260 }
261 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
262 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
263 }
264
265 protected:
266 ErrorMonitor *m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600267
268 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600269 std::vector<const char *> instance_layer_names;
270 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600271 std::vector<const char *> instance_extension_names;
272 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600273
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700274 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600275 /*
276 * Since CreateDbgMsgCallback is an instance level extension call
277 * any extension / layer that utilizes that feature also needs
278 * to be enabled at create instance time.
279 */
Karl Schultz6addd812016-02-02 17:17:23 -0700280 // Use Threading layer first to protect others from
281 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700282 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600283 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800284 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700285 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800286 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
287 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700288 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600289
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700290 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600291 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800292 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700293 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800294 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
295 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700296 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600297
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600298 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600299 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800300 this->app_info.pApplicationName = "layer_tests";
301 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600302 this->app_info.pEngineName = "unittest";
303 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600304 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600305
Tony Barbour15524c32015-04-29 17:34:29 -0600306 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600307 InitFramework(instance_layer_names, device_layer_names,
308 instance_extension_names, device_extension_names,
309 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600310 }
311
312 virtual void TearDown() {
313 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600314 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600315 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600316 }
317};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500318
Karl Schultz6addd812016-02-02 17:17:23 -0700319VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600320 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600321
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800322 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600323
324 /*
325 * For render test all drawing happens in a single render pass
326 * on a single command buffer.
327 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200328 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800329 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600330 }
331
332 return result;
333}
334
Karl Schultz6addd812016-02-02 17:17:23 -0700335VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600336 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600337
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200338 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800339 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200340 }
Tony Barbour300a6082015-04-07 13:44:53 -0600341
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800342 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600343
344 return result;
345}
346
Karl Schultz6addd812016-02-02 17:17:23 -0700347void VkLayerTest::VKTriangleTest(const char *vertShaderText,
348 const char *fragShaderText,
349 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500350 // Create identity matrix
351 int i;
352 struct vktriangle_vs_uniform data;
353
354 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700355 glm::mat4 View = glm::mat4(1.0f);
356 glm::mat4 Model = glm::mat4(1.0f);
357 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500358 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700359 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500360
361 memcpy(&data.mvp, &MVP[0][0], matrixSize);
362
Karl Schultz6addd812016-02-02 17:17:23 -0700363 static const Vertex tri_data[] = {
364 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
365 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
366 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500367 };
368
Karl Schultz6addd812016-02-02 17:17:23 -0700369 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500370 data.position[i][0] = tri_data[i].posX;
371 data.position[i][1] = tri_data[i].posY;
372 data.position[i][2] = tri_data[i].posZ;
373 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700374 data.color[i][0] = tri_data[i].r;
375 data.color[i][1] = tri_data[i].g;
376 data.color[i][2] = tri_data[i].b;
377 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500378 }
379
380 ASSERT_NO_FATAL_FAILURE(InitState());
381 ASSERT_NO_FATAL_FAILURE(InitViewport());
382
Karl Schultz6addd812016-02-02 17:17:23 -0700383 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
384 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500385
Karl Schultz6addd812016-02-02 17:17:23 -0700386 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
387 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
388 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500389
390 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800391 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500392 pipelineobj.AddShader(&vs);
393 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600394 if (failMask & BsoFailLineWidth) {
395 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600396 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
397 ia_state.sType =
398 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
399 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
400 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600401 }
402 if (failMask & BsoFailDepthBias) {
403 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600404 VkPipelineRasterizationStateCreateInfo rs_state = {};
405 rs_state.sType =
406 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
407 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600408 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600409 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600410 }
Karl Schultz6addd812016-02-02 17:17:23 -0700411 // Viewport and scissors must stay in synch or other errors will occur than
412 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600413 if (failMask & BsoFailViewport) {
414 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600415 m_viewports.clear();
416 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600417 }
418 if (failMask & BsoFailScissor) {
419 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600420 m_scissors.clear();
421 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600422 }
423 if (failMask & BsoFailBlend) {
424 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600425 VkPipelineColorBlendAttachmentState att_state = {};
426 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
427 att_state.blendEnable = VK_TRUE;
428 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600429 }
430 if (failMask & BsoFailDepthBounds) {
431 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
432 }
433 if (failMask & BsoFailStencilReadMask) {
434 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
435 }
436 if (failMask & BsoFailStencilWriteMask) {
437 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
438 }
439 if (failMask & BsoFailStencilReference) {
440 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
441 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500442
443 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700444 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
445 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500446
447 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600448 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500449
Tony Barbourfe3351b2015-07-28 10:17:20 -0600450 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500451
452 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600453 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500454
455 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600456 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500457
Tony Barbourfe3351b2015-07-28 10:17:20 -0600458 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500459}
460
Karl Schultz6addd812016-02-02 17:17:23 -0700461void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
462 VkPipelineObj &pipelineobj,
463 VkDescriptorSetObj &descriptorSet,
464 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500465 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700466 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
467 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500468 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700469 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
470 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500471 }
472
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800473 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700474 // Make sure depthWriteEnable is set so that Depth fail test will work
475 // correctly
476 // Make sure stencilTestEnable is set so that Stencil fail test will work
477 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600478 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800479 stencil.failOp = VK_STENCIL_OP_KEEP;
480 stencil.passOp = VK_STENCIL_OP_KEEP;
481 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
482 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600483
484 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
485 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600486 ds_ci.pNext = NULL;
487 ds_ci.depthTestEnable = VK_FALSE;
488 ds_ci.depthWriteEnable = VK_TRUE;
489 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
490 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600491 if (failMask & BsoFailDepthBounds) {
492 ds_ci.depthBoundsTestEnable = VK_TRUE;
493 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600494 ds_ci.stencilTestEnable = VK_TRUE;
495 ds_ci.front = stencil;
496 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600497
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600498 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600499 pipelineobj.SetViewport(m_viewports);
500 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800501 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700502 VkResult err = pipelineobj.CreateVKPipeline(
503 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600504 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800505 commandBuffer->BindPipeline(pipelineobj);
506 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500507}
508
509// ********************************************************************************************************************
510// ********************************************************************************************************************
511// ********************************************************************************************************************
512// ********************************************************************************************************************
Tobin Ehlis0788f522015-05-26 16:11:58 -0600513#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700514#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800515TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500516{
517 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500518 VkFenceCreateInfo fenceInfo = {};
519 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
520 fenceInfo.pNext = NULL;
521 fenceInfo.flags = 0;
522
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700523 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600524
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500525 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600526
527 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
528 vk_testing::Buffer buffer;
529 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500530
Tony Barbourfe3351b2015-07-28 10:17:20 -0600531 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800532 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600533 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500534
535 testFence.init(*m_device, fenceInfo);
536
537 // Bypass framework since it does the waits automatically
538 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600539 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800540 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
541 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800542 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600543 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700544 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800545 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800546 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800547 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600548 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600549
550 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500551 ASSERT_VK_SUCCESS( err );
552
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500553 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800554 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500555
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200556 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500557}
558
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800559TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500560{
561 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500562 VkFenceCreateInfo fenceInfo = {};
563 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
564 fenceInfo.pNext = NULL;
565 fenceInfo.flags = 0;
566
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700567 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600568
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500569 ASSERT_NO_FATAL_FAILURE(InitState());
570 ASSERT_NO_FATAL_FAILURE(InitViewport());
571 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
572
Tony Barbourfe3351b2015-07-28 10:17:20 -0600573 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800574 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600575 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500576
577 testFence.init(*m_device, fenceInfo);
578
579 // Bypass framework since it does the waits automatically
580 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600581 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800582 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
583 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800584 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600585 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700586 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800587 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800588 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800589 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600590 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600591
592 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500593 ASSERT_VK_SUCCESS( err );
594
Jon Ashburnf19916e2016-01-11 13:12:43 -0700595 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800596 VkCommandBufferBeginInfo info = {};
597 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
598 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600599 info.renderPass = VK_NULL_HANDLE;
600 info.subpass = 0;
601 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +0800602 info.occlusionQueryEnable = VK_FALSE;
603 info.queryFlags = 0;
604 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600605
606 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800607 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500608
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200609 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500610}
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700611#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200612
Karl Schultz6addd812016-02-02 17:17:23 -0700613TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
614 VkResult err;
615 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500616
Karl Schultz6addd812016-02-02 17:17:23 -0700617 m_errorMonitor->SetDesiredFailureMsg(
618 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600619 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
620
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500621 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500622
623 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700624 VkImage image;
625 VkDeviceMemory mem;
626 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500627
Karl Schultz6addd812016-02-02 17:17:23 -0700628 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
629 const int32_t tex_width = 32;
630 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500631
Tony Barboureb254902015-07-15 12:50:33 -0600632 VkImageCreateInfo image_create_info = {};
633 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700634 image_create_info.pNext = NULL;
635 image_create_info.imageType = VK_IMAGE_TYPE_2D;
636 image_create_info.format = tex_format;
637 image_create_info.extent.width = tex_width;
638 image_create_info.extent.height = tex_height;
639 image_create_info.extent.depth = 1;
640 image_create_info.mipLevels = 1;
641 image_create_info.arrayLayers = 1;
642 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
643 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
644 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
645 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600646
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800647 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800648 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700649 mem_alloc.pNext = NULL;
650 mem_alloc.allocationSize = 0;
651 // Introduce failure, do NOT set memProps to
652 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
653 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500654
Chia-I Wuf7458c52015-10-26 21:10:41 +0800655 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500656 ASSERT_VK_SUCCESS(err);
657
Karl Schultz6addd812016-02-02 17:17:23 -0700658 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500659
Mark Lobodzinski23065352015-05-29 09:32:35 -0500660 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500661
Karl Schultz6addd812016-02-02 17:17:23 -0700662 pass =
663 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
664 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
665 if (!pass) { // If we can't find any unmappable memory this test doesn't
666 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +0800667 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -0600668 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -0600669 }
Mike Stroyan713b2d72015-08-04 10:49:29 -0600670
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500671 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800672 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500673 ASSERT_VK_SUCCESS(err);
674
675 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -0600676 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500677 ASSERT_VK_SUCCESS(err);
678
679 // Map memory as if to initialize the image
680 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -0700681 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
682 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500683
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200684 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600685
Chia-I Wuf7458c52015-10-26 21:10:41 +0800686 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500687}
688
Karl Schultz6addd812016-02-02 17:17:23 -0700689TEST_F(VkLayerTest, RebindMemory) {
690 VkResult err;
691 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500692
Karl Schultz6addd812016-02-02 17:17:23 -0700693 m_errorMonitor->SetDesiredFailureMsg(
694 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600695 "which has already been bound to mem object");
696
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500697 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500698
699 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700700 VkImage image;
701 VkDeviceMemory mem1;
702 VkDeviceMemory mem2;
703 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500704
Karl Schultz6addd812016-02-02 17:17:23 -0700705 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
706 const int32_t tex_width = 32;
707 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500708
Tony Barboureb254902015-07-15 12:50:33 -0600709 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700710 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
711 image_create_info.pNext = NULL;
712 image_create_info.imageType = VK_IMAGE_TYPE_2D;
713 image_create_info.format = tex_format;
714 image_create_info.extent.width = tex_width;
715 image_create_info.extent.height = tex_height;
716 image_create_info.extent.depth = 1;
717 image_create_info.mipLevels = 1;
718 image_create_info.arrayLayers = 1;
719 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
720 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
721 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
722 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500723
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800724 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700725 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
726 mem_alloc.pNext = NULL;
727 mem_alloc.allocationSize = 0;
728 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -0600729
Karl Schultz6addd812016-02-02 17:17:23 -0700730 // Introduce failure, do NOT set memProps to
731 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -0600732 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800733 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500734 ASSERT_VK_SUCCESS(err);
735
Karl Schultz6addd812016-02-02 17:17:23 -0700736 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500737
738 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -0700739 pass =
740 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -0600741 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500742
743 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800744 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500745 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800746 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500747 ASSERT_VK_SUCCESS(err);
748
749 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -0600750 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500751 ASSERT_VK_SUCCESS(err);
752
Karl Schultz6addd812016-02-02 17:17:23 -0700753 // Introduce validation failure, try to bind a different memory object to
754 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -0600755 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500756
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200757 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600758
Chia-I Wuf7458c52015-10-26 21:10:41 +0800759 vkDestroyImage(m_device->device(), image, NULL);
760 vkFreeMemory(m_device->device(), mem1, NULL);
761 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500762}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500763
Karl Schultz6addd812016-02-02 17:17:23 -0700764TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600765 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600766
Karl Schultz6addd812016-02-02 17:17:23 -0700767 m_errorMonitor->SetDesiredFailureMsg(
768 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
769 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600770
771 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600772 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
773 fenceInfo.pNext = NULL;
774 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -0600775
Tony Barbour300a6082015-04-07 13:44:53 -0600776 ASSERT_NO_FATAL_FAILURE(InitState());
777 ASSERT_NO_FATAL_FAILURE(InitViewport());
778 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
779
Tony Barbourfe3351b2015-07-28 10:17:20 -0600780 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -0700781 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
782 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600783 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600784
785 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600786
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600787 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800788 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
789 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800790 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600791 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700792 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800793 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800794 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800795 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600796 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600797
798 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -0700799 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600800
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200801 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600802}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600803// This is a positive test. We used to expect error in this case but spec now
804// allows it
Karl Schultz6addd812016-02-02 17:17:23 -0700805TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600806 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600807 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600808 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600809 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
810 fenceInfo.pNext = NULL;
811
Tony Barbour0b4d9562015-04-09 10:48:04 -0600812 ASSERT_NO_FATAL_FAILURE(InitState());
813 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +0800814 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600815 VkResult result = vkResetFences(m_device->device(), 1, fences);
816 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -0600817
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600818 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -0600819}
Tobin Ehlis41376e12015-07-03 08:45:14 -0600820
Chia-I Wu08accc62015-07-07 11:50:03 +0800821/* TODO: Update for changes due to bug-14075 tiling across render passes */
822#if 0
Tobin Ehlis41376e12015-07-03 08:45:14 -0600823TEST_F(VkLayerTest, InvalidUsageBits)
824{
825 // Initiate Draw w/o a PSO bound
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600826
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600828 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -0600829
830 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800831 VkCommandBufferObj commandBuffer(m_device);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600832 BeginCommandBuffer();
Tobin Ehlis41376e12015-07-03 08:45:14 -0600833
834 const VkExtent3D e3d = {
835 .width = 128,
836 .height = 128,
837 .depth = 1,
838 };
839 const VkImageCreateInfo ici = {
840 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
841 .pNext = NULL,
842 .imageType = VK_IMAGE_TYPE_2D,
843 .format = VK_FORMAT_D32_SFLOAT_S8_UINT,
844 .extent = e3d,
845 .mipLevels = 1,
846 .arraySize = 1,
Chia-I Wu5c17c962015-10-31 00:31:16 +0800847 .samples = VK_SAMPLE_COUNT_1_BIT,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600848 .tiling = VK_IMAGE_TILING_LINEAR,
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600849 .usage = 0, // Not setting VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
Tobin Ehlis41376e12015-07-03 08:45:14 -0600850 .flags = 0,
851 };
852
853 VkImage dsi;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800854 vkCreateImage(m_device->device(), &ici, NULL, &dsi);
Tobin Ehlis41376e12015-07-03 08:45:14 -0600855 VkDepthStencilView dsv;
856 const VkDepthStencilViewCreateInfo dsvci = {
857 .sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO,
858 .pNext = NULL,
859 .image = dsi,
860 .mipLevel = 0,
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -0600861 .baseArrayLayer = 0,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600862 .arraySize = 1,
863 .flags = 0,
864 };
Chia-I Wuf7458c52015-10-26 21:10:41 +0800865 vkCreateDepthStencilView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600866
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200867 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -0600868}
Mark Lobodzinski209b5292015-09-17 09:44:05 -0600869#endif // 0
870#endif // MEM_TRACKER_TESTS
871
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600872#if OBJ_TRACKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -0700873TEST_F(VkLayerTest, PipelineNotBound) {
874 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600875
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700876 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -0700877 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600878
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600879 ASSERT_NO_FATAL_FAILURE(InitState());
880 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600881
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800882 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700883 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
884 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600885
886 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700887 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
888 ds_pool_ci.pNext = NULL;
889 ds_pool_ci.maxSets = 1;
890 ds_pool_ci.poolSizeCount = 1;
891 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600892
893 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -0700894 err =
895 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600896 ASSERT_VK_SUCCESS(err);
897
898 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700899 dsl_binding.binding = 0;
900 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
901 dsl_binding.descriptorCount = 1;
902 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
903 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600904
905 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700906 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
907 ds_layout_ci.pNext = NULL;
908 ds_layout_ci.bindingCount = 1;
909 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600910
911 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700912 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
913 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600914 ASSERT_VK_SUCCESS(err);
915
916 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800917 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800918 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -0700919 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -0600920 alloc_info.descriptorPool = ds_pool;
921 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700922 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
923 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600924 ASSERT_VK_SUCCESS(err);
925
926 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700927 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
928 pipeline_layout_ci.pNext = NULL;
929 pipeline_layout_ci.setLayoutCount = 1;
930 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600931
932 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700933 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
934 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600935 ASSERT_VK_SUCCESS(err);
936
Mark Youngad779052016-01-06 14:26:04 -0700937 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600938
939 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -0700940 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
941 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600942
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200943 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600944
Chia-I Wuf7458c52015-10-26 21:10:41 +0800945 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
946 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
947 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -0600948}
949
Karl Schultz6addd812016-02-02 17:17:23 -0700950TEST_F(VkLayerTest, BindInvalidMemory) {
951 VkResult err;
952 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -0600953
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -0700955 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600956
Tobin Ehlisec598302015-09-15 15:02:17 -0600957 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -0600958
959 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700960 VkImage image;
961 VkDeviceMemory mem;
962 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -0600963
Karl Schultz6addd812016-02-02 17:17:23 -0700964 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
965 const int32_t tex_width = 32;
966 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -0600967
968 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700969 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
970 image_create_info.pNext = NULL;
971 image_create_info.imageType = VK_IMAGE_TYPE_2D;
972 image_create_info.format = tex_format;
973 image_create_info.extent.width = tex_width;
974 image_create_info.extent.height = tex_height;
975 image_create_info.extent.depth = 1;
976 image_create_info.mipLevels = 1;
977 image_create_info.arrayLayers = 1;
978 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
979 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
980 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
981 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -0600982
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800983 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700984 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
985 mem_alloc.pNext = NULL;
986 mem_alloc.allocationSize = 0;
987 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -0600988
Chia-I Wuf7458c52015-10-26 21:10:41 +0800989 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -0600990 ASSERT_VK_SUCCESS(err);
991
Karl Schultz6addd812016-02-02 17:17:23 -0700992 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -0600993
994 mem_alloc.allocationSize = mem_reqs.size;
995
Karl Schultz6addd812016-02-02 17:17:23 -0700996 pass =
997 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -0600998 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -0600999
1000 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001001 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001002 ASSERT_VK_SUCCESS(err);
1003
1004 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001005 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001006
1007 // Try to bind free memory that has been freed
1008 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1009 // This may very well return an error.
1010 (void)err;
1011
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001012 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001013
Chia-I Wuf7458c52015-10-26 21:10:41 +08001014 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001015}
1016
Karl Schultz6addd812016-02-02 17:17:23 -07001017TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1018 VkResult err;
1019 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001020
Karl Schultz6addd812016-02-02 17:17:23 -07001021 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1022 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001023
Tobin Ehlisec598302015-09-15 15:02:17 -06001024 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001025
Karl Schultz6addd812016-02-02 17:17:23 -07001026 // Create an image object, allocate memory, destroy the object and then try
1027 // to bind it
1028 VkImage image;
1029 VkDeviceMemory mem;
1030 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001031
Karl Schultz6addd812016-02-02 17:17:23 -07001032 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1033 const int32_t tex_width = 32;
1034 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001035
1036 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001037 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1038 image_create_info.pNext = NULL;
1039 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1040 image_create_info.format = tex_format;
1041 image_create_info.extent.width = tex_width;
1042 image_create_info.extent.height = tex_height;
1043 image_create_info.extent.depth = 1;
1044 image_create_info.mipLevels = 1;
1045 image_create_info.arrayLayers = 1;
1046 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1047 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1048 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1049 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001050
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001051 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001052 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1053 mem_alloc.pNext = NULL;
1054 mem_alloc.allocationSize = 0;
1055 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001056
Chia-I Wuf7458c52015-10-26 21:10:41 +08001057 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001058 ASSERT_VK_SUCCESS(err);
1059
Karl Schultz6addd812016-02-02 17:17:23 -07001060 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001061
1062 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001063 pass =
1064 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001065 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001066
1067 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001068 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001069 ASSERT_VK_SUCCESS(err);
1070
1071 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001072 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001073 ASSERT_VK_SUCCESS(err);
1074
1075 // Now Try to bind memory to this destroyed object
1076 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1077 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001078 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001079
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001080 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001081
Chia-I Wuf7458c52015-10-26 21:10:41 +08001082 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001083}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001084
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001085#endif // OBJ_TRACKER_TESTS
1086
Tobin Ehlis0788f522015-05-26 16:11:58 -06001087#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001088
1089// This is a positive test. No errors should be generated.
1090TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
1091
1092 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1093 "submitted on separate queues followed by a QueueWaitIdle.");
1094
Dustin Graves48458142016-04-29 16:11:55 -06001095 if ((m_device->queue_props.empty()) ||
1096 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001097 return;
1098
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001099 m_errorMonitor->ExpectSuccess();
1100
1101 VkSemaphore semaphore;
1102 VkSemaphoreCreateInfo semaphore_create_info{};
1103 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1104 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1105 &semaphore);
1106
1107 VkCommandPool command_pool;
1108 VkCommandPoolCreateInfo pool_create_info{};
1109 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1110 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1111 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1112 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1113 &command_pool);
1114
1115 VkCommandBuffer command_buffer[2];
1116 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1117 command_buffer_allocate_info.sType =
1118 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1119 command_buffer_allocate_info.commandPool = command_pool;
1120 command_buffer_allocate_info.commandBufferCount = 2;
1121 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1122 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1123 command_buffer);
1124
1125 VkQueue queue = VK_NULL_HANDLE;
1126 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1127 1, &queue);
1128
1129 {
1130 VkCommandBufferBeginInfo begin_info{};
1131 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1132 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1133
1134 vkCmdPipelineBarrier(command_buffer[0],
1135 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1136 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1137 0, nullptr, 0, nullptr);
1138
1139 VkViewport viewport{};
1140 viewport.maxDepth = 1.0f;
1141 viewport.minDepth = 0.0f;
1142 viewport.width = 512;
1143 viewport.height = 512;
1144 viewport.x = 0;
1145 viewport.y = 0;
1146 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1147 vkEndCommandBuffer(command_buffer[0]);
1148 }
1149 {
1150 VkCommandBufferBeginInfo begin_info{};
1151 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1152 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1153
1154 VkViewport viewport{};
1155 viewport.maxDepth = 1.0f;
1156 viewport.minDepth = 0.0f;
1157 viewport.width = 512;
1158 viewport.height = 512;
1159 viewport.x = 0;
1160 viewport.y = 0;
1161 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1162 vkEndCommandBuffer(command_buffer[1]);
1163 }
1164 {
1165 VkSubmitInfo submit_info{};
1166 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1167 submit_info.commandBufferCount = 1;
1168 submit_info.pCommandBuffers = &command_buffer[0];
1169 submit_info.signalSemaphoreCount = 1;
1170 submit_info.pSignalSemaphores = &semaphore;
1171 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1172 }
1173 {
1174 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1175 VkSubmitInfo submit_info{};
1176 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1177 submit_info.commandBufferCount = 1;
1178 submit_info.pCommandBuffers = &command_buffer[1];
1179 submit_info.waitSemaphoreCount = 1;
1180 submit_info.pWaitSemaphores = &semaphore;
1181 submit_info.pWaitDstStageMask = flags;
1182 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1183 }
1184
1185 vkQueueWaitIdle(m_device->m_queue);
1186
1187 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1188 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1189 &command_buffer[0]);
1190 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1191
1192 m_errorMonitor->VerifyNotFound();
1193}
1194
1195// This is a positive test. No errors should be generated.
1196TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
1197
1198 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1199 "submitted on separate queues, the second having a fence"
1200 "followed by a QueueWaitIdle.");
1201
Dustin Graves48458142016-04-29 16:11:55 -06001202 if ((m_device->queue_props.empty()) ||
1203 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001204 return;
1205
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001206 m_errorMonitor->ExpectSuccess();
1207
1208 VkFence fence;
1209 VkFenceCreateInfo fence_create_info{};
1210 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1211 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1212
1213 VkSemaphore semaphore;
1214 VkSemaphoreCreateInfo semaphore_create_info{};
1215 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1216 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1217 &semaphore);
1218
1219 VkCommandPool command_pool;
1220 VkCommandPoolCreateInfo pool_create_info{};
1221 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1222 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1223 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1224 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1225 &command_pool);
1226
1227 VkCommandBuffer command_buffer[2];
1228 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1229 command_buffer_allocate_info.sType =
1230 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1231 command_buffer_allocate_info.commandPool = command_pool;
1232 command_buffer_allocate_info.commandBufferCount = 2;
1233 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1234 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1235 command_buffer);
1236
1237 VkQueue queue = VK_NULL_HANDLE;
1238 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1239 1, &queue);
1240
1241 {
1242 VkCommandBufferBeginInfo begin_info{};
1243 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1244 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1245
1246 vkCmdPipelineBarrier(command_buffer[0],
1247 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1248 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1249 0, nullptr, 0, nullptr);
1250
1251 VkViewport viewport{};
1252 viewport.maxDepth = 1.0f;
1253 viewport.minDepth = 0.0f;
1254 viewport.width = 512;
1255 viewport.height = 512;
1256 viewport.x = 0;
1257 viewport.y = 0;
1258 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1259 vkEndCommandBuffer(command_buffer[0]);
1260 }
1261 {
1262 VkCommandBufferBeginInfo begin_info{};
1263 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1264 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1265
1266 VkViewport viewport{};
1267 viewport.maxDepth = 1.0f;
1268 viewport.minDepth = 0.0f;
1269 viewport.width = 512;
1270 viewport.height = 512;
1271 viewport.x = 0;
1272 viewport.y = 0;
1273 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1274 vkEndCommandBuffer(command_buffer[1]);
1275 }
1276 {
1277 VkSubmitInfo submit_info{};
1278 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1279 submit_info.commandBufferCount = 1;
1280 submit_info.pCommandBuffers = &command_buffer[0];
1281 submit_info.signalSemaphoreCount = 1;
1282 submit_info.pSignalSemaphores = &semaphore;
1283 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1284 }
1285 {
1286 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1287 VkSubmitInfo submit_info{};
1288 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1289 submit_info.commandBufferCount = 1;
1290 submit_info.pCommandBuffers = &command_buffer[1];
1291 submit_info.waitSemaphoreCount = 1;
1292 submit_info.pWaitSemaphores = &semaphore;
1293 submit_info.pWaitDstStageMask = flags;
1294 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1295 }
1296
1297 vkQueueWaitIdle(m_device->m_queue);
1298
1299 vkDestroyFence(m_device->device(), fence, nullptr);
1300 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1301 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1302 &command_buffer[0]);
1303 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1304
1305 m_errorMonitor->VerifyNotFound();
1306}
1307
1308// This is a positive test. No errors should be generated.
1309TEST_F(VkLayerTest,
1310 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
1311
1312 TEST_DESCRIPTION(
1313 "Two command buffers, each in a separate QueueSubmit call "
1314 "submitted on separate queues, the second having a fence"
1315 "followed by two consecutive WaitForFences calls on the same fence.");
1316
Dustin Graves48458142016-04-29 16:11:55 -06001317 if ((m_device->queue_props.empty()) ||
1318 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001319 return;
1320
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001321 m_errorMonitor->ExpectSuccess();
1322
1323 VkFence fence;
1324 VkFenceCreateInfo fence_create_info{};
1325 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1326 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1327
1328 VkSemaphore semaphore;
1329 VkSemaphoreCreateInfo semaphore_create_info{};
1330 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1331 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1332 &semaphore);
1333
1334 VkCommandPool command_pool;
1335 VkCommandPoolCreateInfo pool_create_info{};
1336 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1337 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1338 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1339 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1340 &command_pool);
1341
1342 VkCommandBuffer command_buffer[2];
1343 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1344 command_buffer_allocate_info.sType =
1345 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1346 command_buffer_allocate_info.commandPool = command_pool;
1347 command_buffer_allocate_info.commandBufferCount = 2;
1348 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1349 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1350 command_buffer);
1351
1352 VkQueue queue = VK_NULL_HANDLE;
1353 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1354 1, &queue);
1355
1356 {
1357 VkCommandBufferBeginInfo begin_info{};
1358 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1359 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1360
1361 vkCmdPipelineBarrier(command_buffer[0],
1362 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1363 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1364 0, nullptr, 0, nullptr);
1365
1366 VkViewport viewport{};
1367 viewport.maxDepth = 1.0f;
1368 viewport.minDepth = 0.0f;
1369 viewport.width = 512;
1370 viewport.height = 512;
1371 viewport.x = 0;
1372 viewport.y = 0;
1373 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1374 vkEndCommandBuffer(command_buffer[0]);
1375 }
1376 {
1377 VkCommandBufferBeginInfo begin_info{};
1378 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1379 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1380
1381 VkViewport viewport{};
1382 viewport.maxDepth = 1.0f;
1383 viewport.minDepth = 0.0f;
1384 viewport.width = 512;
1385 viewport.height = 512;
1386 viewport.x = 0;
1387 viewport.y = 0;
1388 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1389 vkEndCommandBuffer(command_buffer[1]);
1390 }
1391 {
1392 VkSubmitInfo submit_info{};
1393 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1394 submit_info.commandBufferCount = 1;
1395 submit_info.pCommandBuffers = &command_buffer[0];
1396 submit_info.signalSemaphoreCount = 1;
1397 submit_info.pSignalSemaphores = &semaphore;
1398 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1399 }
1400 {
1401 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1402 VkSubmitInfo submit_info{};
1403 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1404 submit_info.commandBufferCount = 1;
1405 submit_info.pCommandBuffers = &command_buffer[1];
1406 submit_info.waitSemaphoreCount = 1;
1407 submit_info.pWaitSemaphores = &semaphore;
1408 submit_info.pWaitDstStageMask = flags;
1409 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1410 }
1411
1412 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1413 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1414
1415 vkDestroyFence(m_device->device(), fence, nullptr);
1416 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1417 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1418 &command_buffer[0]);
1419 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1420
1421 m_errorMonitor->VerifyNotFound();
1422}
1423
1424// This is a positive test. No errors should be generated.
1425TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
1426
1427 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1428 "submitted on separate queues, the second having a fence, "
1429 "followed by a WaitForFences call.");
1430
Dustin Graves48458142016-04-29 16:11:55 -06001431 if ((m_device->queue_props.empty()) ||
1432 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001433 return;
1434
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001435 m_errorMonitor->ExpectSuccess();
1436
1437 VkFence fence;
1438 VkFenceCreateInfo fence_create_info{};
1439 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1440 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1441
1442 VkSemaphore semaphore;
1443 VkSemaphoreCreateInfo semaphore_create_info{};
1444 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1445 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1446 &semaphore);
1447
1448 VkCommandPool command_pool;
1449 VkCommandPoolCreateInfo pool_create_info{};
1450 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1451 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1452 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1453 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1454 &command_pool);
1455
1456 VkCommandBuffer command_buffer[2];
1457 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1458 command_buffer_allocate_info.sType =
1459 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1460 command_buffer_allocate_info.commandPool = command_pool;
1461 command_buffer_allocate_info.commandBufferCount = 2;
1462 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1463 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1464 command_buffer);
1465
1466 VkQueue queue = VK_NULL_HANDLE;
1467 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1468 1, &queue);
1469
1470
1471 {
1472 VkCommandBufferBeginInfo begin_info{};
1473 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1474 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1475
1476 vkCmdPipelineBarrier(command_buffer[0],
1477 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1478 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1479 0, nullptr, 0, nullptr);
1480
1481 VkViewport viewport{};
1482 viewport.maxDepth = 1.0f;
1483 viewport.minDepth = 0.0f;
1484 viewport.width = 512;
1485 viewport.height = 512;
1486 viewport.x = 0;
1487 viewport.y = 0;
1488 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1489 vkEndCommandBuffer(command_buffer[0]);
1490 }
1491 {
1492 VkCommandBufferBeginInfo begin_info{};
1493 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1494 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1495
1496 VkViewport viewport{};
1497 viewport.maxDepth = 1.0f;
1498 viewport.minDepth = 0.0f;
1499 viewport.width = 512;
1500 viewport.height = 512;
1501 viewport.x = 0;
1502 viewport.y = 0;
1503 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1504 vkEndCommandBuffer(command_buffer[1]);
1505 }
1506 {
1507 VkSubmitInfo submit_info{};
1508 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1509 submit_info.commandBufferCount = 1;
1510 submit_info.pCommandBuffers = &command_buffer[0];
1511 submit_info.signalSemaphoreCount = 1;
1512 submit_info.pSignalSemaphores = &semaphore;
1513 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1514 }
1515 {
1516 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1517 VkSubmitInfo submit_info{};
1518 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1519 submit_info.commandBufferCount = 1;
1520 submit_info.pCommandBuffers = &command_buffer[1];
1521 submit_info.waitSemaphoreCount = 1;
1522 submit_info.pWaitSemaphores = &semaphore;
1523 submit_info.pWaitDstStageMask = flags;
1524 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1525 }
1526
1527 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1528
1529 vkDestroyFence(m_device->device(), fence, nullptr);
1530 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1531 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1532 &command_buffer[0]);
1533 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1534
1535 m_errorMonitor->VerifyNotFound();
1536}
1537
1538// This is a positive test. No errors should be generated.
1539TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
1540
1541 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1542 "on the same queue, sharing a signal/wait semaphore, the "
1543 "second having a fence, "
1544 "followed by a WaitForFences call.");
1545
1546 m_errorMonitor->ExpectSuccess();
1547
1548 VkFence fence;
1549 VkFenceCreateInfo fence_create_info{};
1550 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1551 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1552
1553 VkSemaphore semaphore;
1554 VkSemaphoreCreateInfo semaphore_create_info{};
1555 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1556 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1557 &semaphore);
1558
1559 VkCommandPool command_pool;
1560 VkCommandPoolCreateInfo pool_create_info{};
1561 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1562 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1563 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1564 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1565 &command_pool);
1566
1567 VkCommandBuffer command_buffer[2];
1568 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1569 command_buffer_allocate_info.sType =
1570 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1571 command_buffer_allocate_info.commandPool = command_pool;
1572 command_buffer_allocate_info.commandBufferCount = 2;
1573 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1574 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1575 command_buffer);
1576
1577 {
1578 VkCommandBufferBeginInfo begin_info{};
1579 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1580 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1581
1582 vkCmdPipelineBarrier(command_buffer[0],
1583 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1584 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1585 0, nullptr, 0, nullptr);
1586
1587 VkViewport viewport{};
1588 viewport.maxDepth = 1.0f;
1589 viewport.minDepth = 0.0f;
1590 viewport.width = 512;
1591 viewport.height = 512;
1592 viewport.x = 0;
1593 viewport.y = 0;
1594 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1595 vkEndCommandBuffer(command_buffer[0]);
1596 }
1597 {
1598 VkCommandBufferBeginInfo begin_info{};
1599 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1600 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1601
1602 VkViewport viewport{};
1603 viewport.maxDepth = 1.0f;
1604 viewport.minDepth = 0.0f;
1605 viewport.width = 512;
1606 viewport.height = 512;
1607 viewport.x = 0;
1608 viewport.y = 0;
1609 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1610 vkEndCommandBuffer(command_buffer[1]);
1611 }
1612 {
1613 VkSubmitInfo submit_info{};
1614 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1615 submit_info.commandBufferCount = 1;
1616 submit_info.pCommandBuffers = &command_buffer[0];
1617 submit_info.signalSemaphoreCount = 1;
1618 submit_info.pSignalSemaphores = &semaphore;
1619 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1620 }
1621 {
1622 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1623 VkSubmitInfo submit_info{};
1624 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1625 submit_info.commandBufferCount = 1;
1626 submit_info.pCommandBuffers = &command_buffer[1];
1627 submit_info.waitSemaphoreCount = 1;
1628 submit_info.pWaitSemaphores = &semaphore;
1629 submit_info.pWaitDstStageMask = flags;
1630 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1631 }
1632
1633 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1634
1635 vkDestroyFence(m_device->device(), fence, nullptr);
1636 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1637 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1638 &command_buffer[0]);
1639 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1640
1641 m_errorMonitor->VerifyNotFound();
1642}
1643
1644// This is a positive test. No errors should be generated.
1645TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
1646
1647 TEST_DESCRIPTION(
1648 "Two command buffers, each in a separate QueueSubmit call "
1649 "on the same queue, no fences, followed by a third QueueSubmit with NO "
1650 "SubmitInfos but with a fence, followed by a WaitForFences call.");
1651
1652 m_errorMonitor->ExpectSuccess();
1653
1654 VkFence fence;
1655 VkFenceCreateInfo fence_create_info{};
1656 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1657 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1658
1659 VkCommandPool command_pool;
1660 VkCommandPoolCreateInfo pool_create_info{};
1661 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1662 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1663 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1664 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1665 &command_pool);
1666
1667 VkCommandBuffer command_buffer[2];
1668 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1669 command_buffer_allocate_info.sType =
1670 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1671 command_buffer_allocate_info.commandPool = command_pool;
1672 command_buffer_allocate_info.commandBufferCount = 2;
1673 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1674 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1675 command_buffer);
1676
1677 {
1678 VkCommandBufferBeginInfo begin_info{};
1679 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1680 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1681
1682 vkCmdPipelineBarrier(command_buffer[0],
1683 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1684 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1685 0, nullptr, 0, nullptr);
1686
1687 VkViewport viewport{};
1688 viewport.maxDepth = 1.0f;
1689 viewport.minDepth = 0.0f;
1690 viewport.width = 512;
1691 viewport.height = 512;
1692 viewport.x = 0;
1693 viewport.y = 0;
1694 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1695 vkEndCommandBuffer(command_buffer[0]);
1696 }
1697 {
1698 VkCommandBufferBeginInfo begin_info{};
1699 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1700 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1701
1702 VkViewport viewport{};
1703 viewport.maxDepth = 1.0f;
1704 viewport.minDepth = 0.0f;
1705 viewport.width = 512;
1706 viewport.height = 512;
1707 viewport.x = 0;
1708 viewport.y = 0;
1709 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1710 vkEndCommandBuffer(command_buffer[1]);
1711 }
1712 {
1713 VkSubmitInfo submit_info{};
1714 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1715 submit_info.commandBufferCount = 1;
1716 submit_info.pCommandBuffers = &command_buffer[0];
1717 submit_info.signalSemaphoreCount = 0;
1718 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
1719 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1720 }
1721 {
1722 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1723 VkSubmitInfo submit_info{};
1724 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1725 submit_info.commandBufferCount = 1;
1726 submit_info.pCommandBuffers = &command_buffer[1];
1727 submit_info.waitSemaphoreCount = 0;
1728 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
1729 submit_info.pWaitDstStageMask = flags;
1730 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1731 }
1732
1733 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
1734
1735 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1736
1737 vkDestroyFence(m_device->device(), fence, nullptr);
1738 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1739 &command_buffer[0]);
1740 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1741
1742 m_errorMonitor->VerifyNotFound();
1743}
1744
1745// This is a positive test. No errors should be generated.
1746TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
1747
1748 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1749 "on the same queue, the second having a fence, followed "
1750 "by a WaitForFences call.");
1751
1752 m_errorMonitor->ExpectSuccess();
1753
1754 VkFence fence;
1755 VkFenceCreateInfo fence_create_info{};
1756 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1757 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1758
1759 VkCommandPool command_pool;
1760 VkCommandPoolCreateInfo pool_create_info{};
1761 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1762 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1763 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1764 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1765 &command_pool);
1766
1767 VkCommandBuffer command_buffer[2];
1768 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1769 command_buffer_allocate_info.sType =
1770 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1771 command_buffer_allocate_info.commandPool = command_pool;
1772 command_buffer_allocate_info.commandBufferCount = 2;
1773 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1774 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1775 command_buffer);
1776
1777 {
1778 VkCommandBufferBeginInfo begin_info{};
1779 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1780 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1781
1782 vkCmdPipelineBarrier(command_buffer[0],
1783 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1784 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1785 0, nullptr, 0, nullptr);
1786
1787 VkViewport viewport{};
1788 viewport.maxDepth = 1.0f;
1789 viewport.minDepth = 0.0f;
1790 viewport.width = 512;
1791 viewport.height = 512;
1792 viewport.x = 0;
1793 viewport.y = 0;
1794 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1795 vkEndCommandBuffer(command_buffer[0]);
1796 }
1797 {
1798 VkCommandBufferBeginInfo begin_info{};
1799 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1800 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1801
1802 VkViewport viewport{};
1803 viewport.maxDepth = 1.0f;
1804 viewport.minDepth = 0.0f;
1805 viewport.width = 512;
1806 viewport.height = 512;
1807 viewport.x = 0;
1808 viewport.y = 0;
1809 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1810 vkEndCommandBuffer(command_buffer[1]);
1811 }
1812 {
1813 VkSubmitInfo submit_info{};
1814 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1815 submit_info.commandBufferCount = 1;
1816 submit_info.pCommandBuffers = &command_buffer[0];
1817 submit_info.signalSemaphoreCount = 0;
1818 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
1819 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1820 }
1821 {
1822 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1823 VkSubmitInfo submit_info{};
1824 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1825 submit_info.commandBufferCount = 1;
1826 submit_info.pCommandBuffers = &command_buffer[1];
1827 submit_info.waitSemaphoreCount = 0;
1828 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
1829 submit_info.pWaitDstStageMask = flags;
1830 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1831 }
1832
1833 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1834
1835 vkDestroyFence(m_device->device(), fence, nullptr);
1836 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1837 &command_buffer[0]);
1838 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1839
1840 m_errorMonitor->VerifyNotFound();
1841}
1842
1843// This is a positive test. No errors should be generated.
1844TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
1845
1846 TEST_DESCRIPTION(
1847 "Two command buffers each in a separate SubmitInfo sent in a single "
1848 "QueueSubmit call followed by a WaitForFences call.");
1849
1850 m_errorMonitor->ExpectSuccess();
1851
1852 VkFence fence;
1853 VkFenceCreateInfo fence_create_info{};
1854 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1855 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1856
1857 VkSemaphore semaphore;
1858 VkSemaphoreCreateInfo semaphore_create_info{};
1859 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1860 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1861 &semaphore);
1862
1863 VkCommandPool command_pool;
1864 VkCommandPoolCreateInfo pool_create_info{};
1865 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1866 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1867 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1868 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1869 &command_pool);
1870
1871 VkCommandBuffer command_buffer[2];
1872 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1873 command_buffer_allocate_info.sType =
1874 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1875 command_buffer_allocate_info.commandPool = command_pool;
1876 command_buffer_allocate_info.commandBufferCount = 2;
1877 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1878 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1879 command_buffer);
1880
1881 {
1882 VkCommandBufferBeginInfo begin_info{};
1883 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1884 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1885
1886 vkCmdPipelineBarrier(command_buffer[0],
1887 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1888 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1889 0, nullptr, 0, nullptr);
1890
1891 VkViewport viewport{};
1892 viewport.maxDepth = 1.0f;
1893 viewport.minDepth = 0.0f;
1894 viewport.width = 512;
1895 viewport.height = 512;
1896 viewport.x = 0;
1897 viewport.y = 0;
1898 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1899 vkEndCommandBuffer(command_buffer[0]);
1900 }
1901 {
1902 VkCommandBufferBeginInfo begin_info{};
1903 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1904 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1905
1906 VkViewport viewport{};
1907 viewport.maxDepth = 1.0f;
1908 viewport.minDepth = 0.0f;
1909 viewport.width = 512;
1910 viewport.height = 512;
1911 viewport.x = 0;
1912 viewport.y = 0;
1913 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1914 vkEndCommandBuffer(command_buffer[1]);
1915 }
1916 {
1917 VkSubmitInfo submit_info[2];
1918 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1919
1920 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1921 submit_info[0].pNext = NULL;
1922 submit_info[0].commandBufferCount = 1;
1923 submit_info[0].pCommandBuffers = &command_buffer[0];
1924 submit_info[0].signalSemaphoreCount = 1;
1925 submit_info[0].pSignalSemaphores = &semaphore;
1926 submit_info[0].waitSemaphoreCount = 0;
1927 submit_info[0].pWaitSemaphores = NULL;
1928 submit_info[0].pWaitDstStageMask = 0;
1929
1930 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1931 submit_info[1].pNext = NULL;
1932 submit_info[1].commandBufferCount = 1;
1933 submit_info[1].pCommandBuffers = &command_buffer[1];
1934 submit_info[1].waitSemaphoreCount = 1;
1935 submit_info[1].pWaitSemaphores = &semaphore;
1936 submit_info[1].pWaitDstStageMask = flags;
1937 submit_info[1].signalSemaphoreCount = 0;
1938 submit_info[1].pSignalSemaphores = NULL;
1939 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
1940 }
1941
1942 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1943
1944 vkDestroyFence(m_device->device(), fence, nullptr);
1945 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1946 &command_buffer[0]);
1947 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1948
1949 m_errorMonitor->VerifyNotFound();
1950}
1951
Karl Schultz6addd812016-02-02 17:17:23 -07001952TEST_F(VkLayerTest, LineWidthStateNotBound) {
1953 m_errorMonitor->SetDesiredFailureMsg(
1954 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001955 "Dynamic line width state not set for this command buffer");
1956
Karl Schultz6addd812016-02-02 17:17:23 -07001957 TEST_DESCRIPTION("Simple Draw Call that validates failure when a line "
1958 "width state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001959
Karl Schultz6addd812016-02-02 17:17:23 -07001960 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1961 BsoFailLineWidth);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001962
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001963 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001964}
1965
Karl Schultz6addd812016-02-02 17:17:23 -07001966TEST_F(VkLayerTest, DepthBiasStateNotBound) {
1967 m_errorMonitor->SetDesiredFailureMsg(
1968 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001969 "Dynamic depth bias state not set for this command buffer");
1970
Karl Schultz6addd812016-02-02 17:17:23 -07001971 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
1972 "bias state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001973
Karl Schultz6addd812016-02-02 17:17:23 -07001974 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1975 BsoFailDepthBias);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001976
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001977 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001978}
1979
Karl Schultz6addd812016-02-02 17:17:23 -07001980// Disable these two tests until we can sort out how to track multiple layer
1981// errors
1982TEST_F(VkLayerTest, ViewportStateNotBound) {
1983 m_errorMonitor->SetDesiredFailureMsg(
1984 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001985 "Dynamic viewport state not set for this command buffer");
1986
Karl Schultz6addd812016-02-02 17:17:23 -07001987 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
1988 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001989
Karl Schultz6addd812016-02-02 17:17:23 -07001990 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1991 BsoFailViewport);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001992
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001993 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001994}
1995
Karl Schultz6addd812016-02-02 17:17:23 -07001996TEST_F(VkLayerTest, ScissorStateNotBound) {
1997 m_errorMonitor->SetDesiredFailureMsg(
1998 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001999 "Dynamic scissor state not set for this command buffer");
2000
Karl Schultz6addd812016-02-02 17:17:23 -07002001 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
2002 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002003
Karl Schultz6addd812016-02-02 17:17:23 -07002004 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2005 BsoFailScissor);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002006
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002007 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002008}
2009
Karl Schultz6addd812016-02-02 17:17:23 -07002010TEST_F(VkLayerTest, BlendStateNotBound) {
2011 m_errorMonitor->SetDesiredFailureMsg(
2012 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7a1d2352016-03-28 11:18:19 -06002013 "Dynamic blend constants state not set for this command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002014
Karl Schultz6addd812016-02-02 17:17:23 -07002015 TEST_DESCRIPTION("Simple Draw Call that validates failure when a blend "
2016 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002017
Karl Schultz6addd812016-02-02 17:17:23 -07002018 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2019 BsoFailBlend);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002020
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002021 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002022}
2023
Karl Schultz6addd812016-02-02 17:17:23 -07002024TEST_F(VkLayerTest, DepthBoundsStateNotBound) {
2025 m_errorMonitor->SetDesiredFailureMsg(
2026 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002027 "Dynamic depth bounds state not set for this command buffer");
2028
Karl Schultz6addd812016-02-02 17:17:23 -07002029 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
2030 "bounds state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002031
Karl Schultz6addd812016-02-02 17:17:23 -07002032 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2033 BsoFailDepthBounds);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002034
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002035 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002036}
2037
Karl Schultz6addd812016-02-02 17:17:23 -07002038TEST_F(VkLayerTest, StencilReadMaskNotSet) {
2039 m_errorMonitor->SetDesiredFailureMsg(
2040 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002041 "Dynamic stencil read mask state not set for this command buffer");
2042
Tobin Ehlis963a4042015-09-29 08:18:34 -06002043 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002044
Karl Schultz6addd812016-02-02 17:17:23 -07002045 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2046 "read mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002047
Karl Schultz6addd812016-02-02 17:17:23 -07002048 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2049 BsoFailStencilReadMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002050
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002051 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002052}
2053
Karl Schultz6addd812016-02-02 17:17:23 -07002054TEST_F(VkLayerTest, StencilWriteMaskNotSet) {
2055 m_errorMonitor->SetDesiredFailureMsg(
2056 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002057 "Dynamic stencil write mask state not set for this command buffer");
2058
Tobin Ehlis963a4042015-09-29 08:18:34 -06002059 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002060
Karl Schultz6addd812016-02-02 17:17:23 -07002061 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2062 "write mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002063
Karl Schultz6addd812016-02-02 17:17:23 -07002064 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2065 BsoFailStencilWriteMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002066
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002067 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002068}
2069
Karl Schultz6addd812016-02-02 17:17:23 -07002070TEST_F(VkLayerTest, StencilReferenceNotSet) {
2071 m_errorMonitor->SetDesiredFailureMsg(
2072 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002073 "Dynamic stencil reference state not set for this command buffer");
2074
Karl Schultz6addd812016-02-02 17:17:23 -07002075 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2076 "reference is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002077
Karl Schultz6addd812016-02-02 17:17:23 -07002078 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2079 BsoFailStencilReference);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002080
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002081 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002082}
2083
Karl Schultz6addd812016-02-02 17:17:23 -07002084TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002085 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002086
Karl Schultz6addd812016-02-02 17:17:23 -07002087 m_errorMonitor->SetDesiredFailureMsg(
2088 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2089 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
2090 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002091
2092 VkFenceCreateInfo fenceInfo = {};
2093 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2094 fenceInfo.pNext = NULL;
2095 fenceInfo.flags = 0;
2096
2097 ASSERT_NO_FATAL_FAILURE(InitState());
2098 ASSERT_NO_FATAL_FAILURE(InitViewport());
2099 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2100
Karl Schultz6addd812016-02-02 17:17:23 -07002101 // We luck out b/c by default the framework creates CB w/ the
2102 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002103 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002104 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2105 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002106 EndCommandBuffer();
2107
2108 testFence.init(*m_device, fenceInfo);
2109
2110 // Bypass framework since it does the waits automatically
2111 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002112 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002113 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2114 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002115 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002116 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002117 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002118 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002119 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002120 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002121 submit_info.pSignalSemaphores = NULL;
2122
Karl Schultz6addd812016-02-02 17:17:23 -07002123 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
2124 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002125
Karl Schultz6addd812016-02-02 17:17:23 -07002126 // Cause validation error by re-submitting cmd buffer that should only be
2127 // submitted once
2128 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002129
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002130 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002131}
2132
Karl Schultz6addd812016-02-02 17:17:23 -07002133TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002134 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07002135 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002136
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002137 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002138 "Unable to allocate 1 descriptors of "
2139 "type "
2140 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002141
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002142 ASSERT_NO_FATAL_FAILURE(InitState());
2143 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002144
Karl Schultz6addd812016-02-02 17:17:23 -07002145 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
2146 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002147 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002148 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2149 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002150
2151 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002152 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2153 ds_pool_ci.pNext = NULL;
2154 ds_pool_ci.flags = 0;
2155 ds_pool_ci.maxSets = 1;
2156 ds_pool_ci.poolSizeCount = 1;
2157 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002158
2159 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002160 err =
2161 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002162 ASSERT_VK_SUCCESS(err);
2163
2164 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002165 dsl_binding.binding = 0;
2166 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2167 dsl_binding.descriptorCount = 1;
2168 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2169 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002170
2171 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002172 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2173 ds_layout_ci.pNext = NULL;
2174 ds_layout_ci.bindingCount = 1;
2175 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002176
2177 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002178 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2179 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002180 ASSERT_VK_SUCCESS(err);
2181
2182 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002183 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002184 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002185 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002186 alloc_info.descriptorPool = ds_pool;
2187 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002188 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2189 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002190
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002191 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002192
Chia-I Wuf7458c52015-10-26 21:10:41 +08002193 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2194 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002195}
2196
Karl Schultz6addd812016-02-02 17:17:23 -07002197TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
2198 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06002199
Karl Schultz6addd812016-02-02 17:17:23 -07002200 m_errorMonitor->SetDesiredFailureMsg(
2201 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2202 "It is invalid to call vkFreeDescriptorSets() with a pool created "
2203 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002204
Tobin Ehlise735c692015-10-08 13:13:50 -06002205 ASSERT_NO_FATAL_FAILURE(InitState());
2206 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06002207
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002208 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002209 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2210 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06002211
2212 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002213 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2214 ds_pool_ci.pNext = NULL;
2215 ds_pool_ci.maxSets = 1;
2216 ds_pool_ci.poolSizeCount = 1;
2217 ds_pool_ci.flags = 0;
2218 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
2219 // app can only call vkResetDescriptorPool on this pool.;
2220 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06002221
2222 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002223 err =
2224 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06002225 ASSERT_VK_SUCCESS(err);
2226
2227 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002228 dsl_binding.binding = 0;
2229 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2230 dsl_binding.descriptorCount = 1;
2231 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2232 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06002233
2234 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002235 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2236 ds_layout_ci.pNext = NULL;
2237 ds_layout_ci.bindingCount = 1;
2238 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06002239
2240 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002241 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2242 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06002243 ASSERT_VK_SUCCESS(err);
2244
2245 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002246 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002247 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002248 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002249 alloc_info.descriptorPool = ds_pool;
2250 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002251 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2252 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06002253 ASSERT_VK_SUCCESS(err);
2254
2255 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002256 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06002257
Chia-I Wuf7458c52015-10-26 21:10:41 +08002258 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2259 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06002260}
2261
Karl Schultz6addd812016-02-02 17:17:23 -07002262TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002263 // Attempt to clear Descriptor Pool with bad object.
2264 // ObjectTracker should catch this.
2265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2266 "Invalid VkDescriptorPool Object 0xbaad6001");
2267 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
2268 vkResetDescriptorPool(device(), badPool, 0);
2269 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002270}
2271
Karl Schultz6addd812016-02-02 17:17:23 -07002272TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002273 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
2274 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002275 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06002276 // call vkCmdBindDescriptorSets w/ false Descriptor Set
2277 VkDescriptorSet badSet = (VkDescriptorSet)0xbaad6001;
2278 VkResult err;
2279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2280 "Invalid VkDescriptorSet Object 0xbaad6001");
2281
2282 ASSERT_NO_FATAL_FAILURE(InitState());
2283
2284 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
2285 layout_bindings[0].binding = 0;
2286 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2287 layout_bindings[0].descriptorCount = 1;
2288 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2289 layout_bindings[0].pImmutableSamplers = NULL;
2290
2291 VkDescriptorSetLayout descriptor_set_layout;
2292 VkDescriptorSetLayoutCreateInfo dslci = {};
2293 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2294 dslci.pNext = NULL;
2295 dslci.bindingCount = 1;
2296 dslci.pBindings = layout_bindings;
2297 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002298 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002299
2300 VkPipelineLayout pipeline_layout;
2301 VkPipelineLayoutCreateInfo plci = {};
2302 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2303 plci.pNext = NULL;
2304 plci.setLayoutCount = 1;
2305 plci.pSetLayouts = &descriptor_set_layout;
2306 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002307 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002308
2309 BeginCommandBuffer();
2310 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2311 pipeline_layout, 0, 1, &badSet, 0, NULL);
2312 m_errorMonitor->VerifyFound();
2313 EndCommandBuffer();
2314 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
2315 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002316}
2317
Karl Schultz6addd812016-02-02 17:17:23 -07002318TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002319 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
2320 // ObjectTracker should catch this.
2321 VkDescriptorSetLayout bad_layout = (VkDescriptorSetLayout)0xbaad6001;
2322 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2323 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
2324
2325 VkPipelineLayout pipeline_layout;
2326 VkPipelineLayoutCreateInfo plci = {};
2327 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2328 plci.pNext = NULL;
2329 plci.setLayoutCount = 1;
2330 plci.pSetLayouts = &bad_layout;
2331 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
2332
2333 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002334}
2335
Karl Schultz6addd812016-02-02 17:17:23 -07002336TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002337 // Attempt to bind an invalid Pipeline to a valid Command Buffer
2338 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002339 // Create a valid cmd buffer
2340 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultzbdb75952016-04-19 11:36:49 -06002341 VkPipeline bad_pipeline = (VkPipeline)0xbaad6001;
2342 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2343 "Invalid VkPipeline Object 0xbaad6001");
2344 ASSERT_NO_FATAL_FAILURE(InitState());
2345 BeginCommandBuffer();
2346 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2347 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
2348 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002349}
2350
Karl Schultz6addd812016-02-02 17:17:23 -07002351TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
2352 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
2353 // CommandBuffer
2354 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002355
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002357 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002358
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002359 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06002360 ASSERT_NO_FATAL_FAILURE(InitViewport());
2361 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002362 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002363 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2364 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06002365
2366 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002367 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2368 ds_pool_ci.pNext = NULL;
2369 ds_pool_ci.maxSets = 1;
2370 ds_pool_ci.poolSizeCount = 1;
2371 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06002372
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002373 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002374 err =
2375 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002376 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002377
Tony Barboureb254902015-07-15 12:50:33 -06002378 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002379 dsl_binding.binding = 0;
2380 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2381 dsl_binding.descriptorCount = 1;
2382 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2383 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002384
Tony Barboureb254902015-07-15 12:50:33 -06002385 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002386 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2387 ds_layout_ci.pNext = NULL;
2388 ds_layout_ci.bindingCount = 1;
2389 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002390 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002391 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2392 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002393 ASSERT_VK_SUCCESS(err);
2394
2395 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002396 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002397 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002398 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002399 alloc_info.descriptorPool = ds_pool;
2400 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002401 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2402 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002403 ASSERT_VK_SUCCESS(err);
2404
Tony Barboureb254902015-07-15 12:50:33 -06002405 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002406 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2407 pipeline_layout_ci.pNext = NULL;
2408 pipeline_layout_ci.setLayoutCount = 1;
2409 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002410
2411 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002412 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2413 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002414 ASSERT_VK_SUCCESS(err);
2415
Karl Schultz6addd812016-02-02 17:17:23 -07002416 VkShaderObj vs(m_device, bindStateVertShaderText,
2417 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06002418 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07002419 // on more devices
2420 VkShaderObj fs(m_device, bindStateFragShaderText,
2421 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002422
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002423 VkPipelineObj pipe(m_device);
2424 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06002425 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06002426 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002427 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06002428
2429 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002430 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2431 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2432 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2433 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2434 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002435
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002436 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002437
Chia-I Wuf7458c52015-10-26 21:10:41 +08002438 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2439 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2440 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002441}
2442
Karl Schultz6addd812016-02-02 17:17:23 -07002443TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002444 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07002445 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002446
Karl Schultz6addd812016-02-02 17:17:23 -07002447 m_errorMonitor->SetDesiredFailureMsg(
2448 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002449 "Attempt to update descriptor with invalid bufferView ");
2450
2451 ASSERT_NO_FATAL_FAILURE(InitState());
2452 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002453 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2454 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002455
2456 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002457 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2458 ds_pool_ci.pNext = NULL;
2459 ds_pool_ci.maxSets = 1;
2460 ds_pool_ci.poolSizeCount = 1;
2461 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002462
2463 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002464 err =
2465 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002466 ASSERT_VK_SUCCESS(err);
2467
2468 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002469 dsl_binding.binding = 0;
2470 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2471 dsl_binding.descriptorCount = 1;
2472 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2473 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002474
2475 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002476 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2477 ds_layout_ci.pNext = NULL;
2478 ds_layout_ci.bindingCount = 1;
2479 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002480 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002481 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2482 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002483 ASSERT_VK_SUCCESS(err);
2484
2485 VkDescriptorSet descriptorSet;
2486 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002487 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002488 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002489 alloc_info.descriptorPool = ds_pool;
2490 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002491 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2492 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002493 ASSERT_VK_SUCCESS(err);
2494
Karl Schultz6addd812016-02-02 17:17:23 -07002495 VkBufferView view =
2496 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002497 VkWriteDescriptorSet descriptor_write;
2498 memset(&descriptor_write, 0, sizeof(descriptor_write));
2499 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2500 descriptor_write.dstSet = descriptorSet;
2501 descriptor_write.dstBinding = 0;
2502 descriptor_write.descriptorCount = 1;
2503 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2504 descriptor_write.pTexelBufferView = &view;
2505
2506 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2507
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002508 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002509
2510 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2511 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2512}
2513
Karl Schultz6addd812016-02-02 17:17:23 -07002514TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
2515 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
2516 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07002517 // 1. No dynamicOffset supplied
2518 // 2. Too many dynamicOffsets supplied
2519 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07002520 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002521 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002522 " requires 1 dynamicOffsets, but only "
2523 "0 dynamicOffsets are left in "
2524 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002525
2526 ASSERT_NO_FATAL_FAILURE(InitState());
2527 ASSERT_NO_FATAL_FAILURE(InitViewport());
2528 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2529
2530 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002531 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2532 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002533
2534 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002535 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2536 ds_pool_ci.pNext = NULL;
2537 ds_pool_ci.maxSets = 1;
2538 ds_pool_ci.poolSizeCount = 1;
2539 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002540
2541 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002542 err =
2543 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002544 ASSERT_VK_SUCCESS(err);
2545
2546 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002547 dsl_binding.binding = 0;
2548 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2549 dsl_binding.descriptorCount = 1;
2550 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2551 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002552
2553 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002554 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2555 ds_layout_ci.pNext = NULL;
2556 ds_layout_ci.bindingCount = 1;
2557 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002558 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002559 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2560 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002561 ASSERT_VK_SUCCESS(err);
2562
2563 VkDescriptorSet descriptorSet;
2564 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002565 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002566 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002567 alloc_info.descriptorPool = ds_pool;
2568 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002569 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2570 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002571 ASSERT_VK_SUCCESS(err);
2572
2573 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002574 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2575 pipeline_layout_ci.pNext = NULL;
2576 pipeline_layout_ci.setLayoutCount = 1;
2577 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002578
2579 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002580 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2581 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002582 ASSERT_VK_SUCCESS(err);
2583
2584 // Create a buffer to update the descriptor with
2585 uint32_t qfi = 0;
2586 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002587 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2588 buffCI.size = 1024;
2589 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2590 buffCI.queueFamilyIndexCount = 1;
2591 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002592
2593 VkBuffer dyub;
2594 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2595 ASSERT_VK_SUCCESS(err);
2596 // Correctly update descriptor to avoid "NOT_UPDATED" error
2597 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002598 buffInfo.buffer = dyub;
2599 buffInfo.offset = 0;
2600 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002601
2602 VkWriteDescriptorSet descriptor_write;
2603 memset(&descriptor_write, 0, sizeof(descriptor_write));
2604 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2605 descriptor_write.dstSet = descriptorSet;
2606 descriptor_write.dstBinding = 0;
2607 descriptor_write.descriptorCount = 1;
2608 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2609 descriptor_write.pBufferInfo = &buffInfo;
2610
2611 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2612
2613 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002614 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2615 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2616 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002617 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07002618 uint32_t pDynOff[2] = {512, 756};
2619 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07002620 m_errorMonitor->SetDesiredFailureMsg(
2621 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07002622 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07002623 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2624 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2625 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12002626 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07002627 // Finally cause error due to dynamicOffset being too big
Karl Schultz6addd812016-02-02 17:17:23 -07002628 m_errorMonitor->SetDesiredFailureMsg(
2629 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07002630 " from its update, this oversteps its buffer (");
2631 // Create PSO to be used for draw-time errors below
2632 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002633 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002634 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07002635 "out gl_PerVertex { \n"
2636 " vec4 gl_Position;\n"
2637 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002638 "void main(){\n"
2639 " gl_Position = vec4(1);\n"
2640 "}\n";
2641 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002642 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002643 "\n"
2644 "layout(location=0) out vec4 x;\n"
2645 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2646 "void main(){\n"
2647 " x = vec4(bar.y);\n"
2648 "}\n";
2649 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2650 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2651 VkPipelineObj pipe(m_device);
2652 pipe.AddShader(&vs);
2653 pipe.AddShader(&fs);
2654 pipe.AddColorAttachment();
2655 pipe.CreateVKPipeline(pipeline_layout, renderPass());
2656
Karl Schultz6addd812016-02-02 17:17:23 -07002657 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2658 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2659 // This update should succeed, but offset size of 512 will overstep buffer
2660 // /w range 1024 & size 1024
2661 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2662 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2663 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07002664 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002665 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002666
2667 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2668 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2669}
2670
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002671TEST_F(VkLayerTest, InvalidPushConstants) {
2672 // Hit push constant error cases:
2673 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
2674 // 2. Incorrectly set push constant size to 0
2675 // 3. Incorrectly set push constant size to non-multiple of 4
2676 // 4. Attempt push constant update that exceeds maxPushConstantSize
2677 VkResult err;
2678 m_errorMonitor->SetDesiredFailureMsg(
2679 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2680 "vkCreatePipelineLayout() call has push constants with offset ");
2681
2682 ASSERT_NO_FATAL_FAILURE(InitState());
2683 ASSERT_NO_FATAL_FAILURE(InitViewport());
2684 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2685
2686 VkPushConstantRange pc_range = {};
2687 pc_range.size = 0xFFFFFFFFu;
2688 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2689 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
2690 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2691 pipeline_layout_ci.pushConstantRangeCount = 1;
2692 pipeline_layout_ci.pPushConstantRanges = &pc_range;
2693
2694 VkPipelineLayout pipeline_layout;
2695 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2696 &pipeline_layout);
2697
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002698 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002699 // Now cause errors due to size 0 and non-4 byte aligned size
2700 pc_range.size = 0;
2701 m_errorMonitor->SetDesiredFailureMsg(
2702 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2703 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
2704 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2705 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002706 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002707 pc_range.size = 1;
2708 m_errorMonitor->SetDesiredFailureMsg(
2709 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2710 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
2711 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2712 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002713 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002714 // Cause error due to bad size in vkCmdPushConstants() call
2715 m_errorMonitor->SetDesiredFailureMsg(
2716 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2717 "vkCmdPushConstants() call has push constants with offset ");
2718 pipeline_layout_ci.pushConstantRangeCount = 0;
2719 pipeline_layout_ci.pPushConstantRanges = NULL;
2720 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2721 &pipeline_layout);
2722 ASSERT_VK_SUCCESS(err);
2723 BeginCommandBuffer();
2724 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
2725 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002726 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002727 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2728}
2729
Karl Schultz6addd812016-02-02 17:17:23 -07002730TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07002731 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07002732 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002733
2734 ASSERT_NO_FATAL_FAILURE(InitState());
2735 ASSERT_NO_FATAL_FAILURE(InitViewport());
2736 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2737
2738 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
2739 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002740 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2741 ds_type_count[0].descriptorCount = 10;
2742 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
2743 ds_type_count[1].descriptorCount = 2;
2744 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
2745 ds_type_count[2].descriptorCount = 2;
2746 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
2747 ds_type_count[3].descriptorCount = 5;
2748 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
2749 // type
2750 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
2751 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
2752 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002753
2754 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002755 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2756 ds_pool_ci.pNext = NULL;
2757 ds_pool_ci.maxSets = 5;
2758 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
2759 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002760
2761 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002762 err =
2763 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002764 ASSERT_VK_SUCCESS(err);
2765
2766 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
2767 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002768 dsl_binding[0].binding = 0;
2769 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2770 dsl_binding[0].descriptorCount = 5;
2771 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
2772 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002773
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002774 // Create layout identical to set0 layout but w/ different stageFlags
2775 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002776 dsl_fs_stage_only.binding = 0;
2777 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2778 dsl_fs_stage_only.descriptorCount = 5;
2779 dsl_fs_stage_only.stageFlags =
2780 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
2781 // bind time
2782 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002783 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002784 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2785 ds_layout_ci.pNext = NULL;
2786 ds_layout_ci.bindingCount = 1;
2787 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002788 static const uint32_t NUM_LAYOUTS = 4;
2789 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002790 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002791 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
2792 // layout for error case
2793 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2794 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002795 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002796 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002797 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2798 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002799 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002800 dsl_binding[0].binding = 0;
2801 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002802 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002803 dsl_binding[1].binding = 1;
2804 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
2805 dsl_binding[1].descriptorCount = 2;
2806 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
2807 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002808 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002809 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07002810 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2811 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002812 ASSERT_VK_SUCCESS(err);
2813 dsl_binding[0].binding = 0;
2814 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002815 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002816 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07002817 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2818 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002819 ASSERT_VK_SUCCESS(err);
2820 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002821 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07002822 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2823 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002824 ASSERT_VK_SUCCESS(err);
2825
2826 static const uint32_t NUM_SETS = 4;
2827 VkDescriptorSet descriptorSet[NUM_SETS] = {};
2828 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002829 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002830 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002831 alloc_info.descriptorPool = ds_pool;
2832 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002833 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2834 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002835 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002836 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07002837 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002838 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002839 err =
2840 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002841 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002842
2843 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002844 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2845 pipeline_layout_ci.pNext = NULL;
2846 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
2847 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002848
2849 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002850 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2851 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002852 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002853 // Create pipelineLayout with only one setLayout
2854 pipeline_layout_ci.setLayoutCount = 1;
2855 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002856 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2857 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002858 ASSERT_VK_SUCCESS(err);
2859 // Create pipelineLayout with 2 descriptor setLayout at index 0
2860 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
2861 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07002862 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2863 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002864 ASSERT_VK_SUCCESS(err);
2865 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
2866 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
2867 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07002868 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2869 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002870 ASSERT_VK_SUCCESS(err);
2871 // Create pipelineLayout with UB type, but stageFlags for FS only
2872 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
2873 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002874 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2875 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002876 ASSERT_VK_SUCCESS(err);
2877 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
2878 VkDescriptorSetLayout pl_bad_s0[2] = {};
2879 pl_bad_s0[0] = ds_layout_fs_only;
2880 pl_bad_s0[1] = ds_layout[1];
2881 pipeline_layout_ci.setLayoutCount = 2;
2882 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
2883 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07002884 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2885 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002886 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002887
2888 // Create a buffer to update the descriptor with
2889 uint32_t qfi = 0;
2890 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002891 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2892 buffCI.size = 1024;
2893 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2894 buffCI.queueFamilyIndexCount = 1;
2895 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002896
2897 VkBuffer dyub;
2898 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2899 ASSERT_VK_SUCCESS(err);
2900 // Correctly update descriptor to avoid "NOT_UPDATED" error
2901 static const uint32_t NUM_BUFFS = 5;
2902 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002903 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07002904 buffInfo[i].buffer = dyub;
2905 buffInfo[i].offset = 0;
2906 buffInfo[i].range = 1024;
2907 }
Karl Schultz6addd812016-02-02 17:17:23 -07002908 VkImage image;
2909 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2910 const int32_t tex_width = 32;
2911 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002912 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002913 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2914 image_create_info.pNext = NULL;
2915 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2916 image_create_info.format = tex_format;
2917 image_create_info.extent.width = tex_width;
2918 image_create_info.extent.height = tex_height;
2919 image_create_info.extent.depth = 1;
2920 image_create_info.mipLevels = 1;
2921 image_create_info.arrayLayers = 1;
2922 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2923 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2924 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2925 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002926 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2927 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002928
Karl Schultz6addd812016-02-02 17:17:23 -07002929 VkMemoryRequirements memReqs;
2930 VkDeviceMemory imageMem;
2931 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002932 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002933 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2934 memAlloc.pNext = NULL;
2935 memAlloc.allocationSize = 0;
2936 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002937 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
2938 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002939 pass =
2940 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002941 ASSERT_TRUE(pass);
2942 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
2943 ASSERT_VK_SUCCESS(err);
2944 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
2945 ASSERT_VK_SUCCESS(err);
2946
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002947 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002948 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2949 image_view_create_info.image = image;
2950 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
2951 image_view_create_info.format = tex_format;
2952 image_view_create_info.subresourceRange.layerCount = 1;
2953 image_view_create_info.subresourceRange.baseMipLevel = 0;
2954 image_view_create_info.subresourceRange.levelCount = 1;
2955 image_view_create_info.subresourceRange.aspectMask =
2956 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002957
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002958 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07002959 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
2960 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002961 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002962 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002963 imageInfo[0].imageView = view;
2964 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2965 imageInfo[1].imageView = view;
2966 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002967 imageInfo[2].imageView = view;
2968 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2969 imageInfo[3].imageView = view;
2970 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002971
2972 static const uint32_t NUM_SET_UPDATES = 3;
2973 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
2974 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2975 descriptor_write[0].dstSet = descriptorSet[0];
2976 descriptor_write[0].dstBinding = 0;
2977 descriptor_write[0].descriptorCount = 5;
2978 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2979 descriptor_write[0].pBufferInfo = buffInfo;
2980 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2981 descriptor_write[1].dstSet = descriptorSet[1];
2982 descriptor_write[1].dstBinding = 0;
2983 descriptor_write[1].descriptorCount = 2;
2984 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
2985 descriptor_write[1].pImageInfo = imageInfo;
2986 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2987 descriptor_write[2].dstSet = descriptorSet[1];
2988 descriptor_write[2].dstBinding = 1;
2989 descriptor_write[2].descriptorCount = 2;
2990 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002991 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002992
2993 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002994
Tobin Ehlis88452832015-12-03 09:40:56 -07002995 // Create PSO to be used for draw-time errors below
2996 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002997 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002998 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07002999 "out gl_PerVertex {\n"
3000 " vec4 gl_Position;\n"
3001 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003002 "void main(){\n"
3003 " gl_Position = vec4(1);\n"
3004 "}\n";
3005 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003006 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003007 "\n"
3008 "layout(location=0) out vec4 x;\n"
3009 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3010 "void main(){\n"
3011 " x = vec4(bar.y);\n"
3012 "}\n";
3013 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3014 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003015 VkPipelineObj pipe(m_device);
3016 pipe.AddShader(&vs);
3017 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07003018 pipe.AddColorAttachment();
3019 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07003020
3021 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07003022
Karl Schultz6addd812016-02-02 17:17:23 -07003023 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3024 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3025 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
3026 // of PSO
3027 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
3028 // cmd_pipeline.c
3029 // due to the fact that cmd_alloc_dset_data() has not been called in
3030 // cmd_bind_graphics_pipeline()
3031 // TODO : Want to cause various binding incompatibility issues here to test
3032 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07003033 // First cause various verify_layout_compatibility() fails
3034 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003035 // verify_set_layout_compatibility fail cases:
3036 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07003037 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3038 " due to: invalid VkPipelineLayout ");
3039 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3040 VK_PIPELINE_BIND_POINT_GRAPHICS,
3041 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
3042 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003043 m_errorMonitor->VerifyFound();
3044
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003045 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07003046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3047 " attempting to bind set to index 1");
3048 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3049 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
3050 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003051 m_errorMonitor->VerifyFound();
3052
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003053 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003054 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
3055 // descriptors
3056 m_errorMonitor->SetDesiredFailureMsg(
3057 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003058 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003059 vkCmdBindDescriptorSets(
3060 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3061 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003062 m_errorMonitor->VerifyFound();
3063
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003064 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
3065 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07003066 m_errorMonitor->SetDesiredFailureMsg(
3067 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003068 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07003069 vkCmdBindDescriptorSets(
3070 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3071 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003072 m_errorMonitor->VerifyFound();
3073
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003074 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
3075 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07003076 m_errorMonitor->SetDesiredFailureMsg(
3077 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003078 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003079 vkCmdBindDescriptorSets(
3080 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3081 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003082 m_errorMonitor->VerifyFound();
3083
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003084 // Cause INFO messages due to disturbing previously bound Sets
3085 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07003086 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3087 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3088 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003089 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07003090 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003091 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003092 " previously bound as set #0 was disturbed ");
3093 vkCmdBindDescriptorSets(
3094 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3095 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003096 m_errorMonitor->VerifyFound();
3097
Karl Schultz6addd812016-02-02 17:17:23 -07003098 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3099 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3100 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003101 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003102 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003103 " newly bound as set #0 so set #1 and "
3104 "any subsequent sets were disturbed ");
3105 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3106 VK_PIPELINE_BIND_POINT_GRAPHICS,
3107 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003108 m_errorMonitor->VerifyFound();
3109
Tobin Ehlis88452832015-12-03 09:40:56 -07003110 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07003111 // 1. Error due to not binding required set (we actually use same code as
3112 // above to disturb set0)
3113 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3114 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3115 2, &descriptorSet[0], 0, NULL);
3116 vkCmdBindDescriptorSets(
3117 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3118 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
3119 m_errorMonitor->SetDesiredFailureMsg(
3120 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3121 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07003122 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003123 m_errorMonitor->VerifyFound();
3124
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003125 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003126 // 2. Error due to bound set not being compatible with PSO's
3127 // VkPipelineLayout (diff stageFlags in this case)
3128 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3129 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3130 2, &descriptorSet[0], 0, NULL);
3131 m_errorMonitor->SetDesiredFailureMsg(
3132 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3133 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07003134 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003135 m_errorMonitor->VerifyFound();
3136
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003137 // Remaining clean-up
3138 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003139 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003140 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
3141 }
3142 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
3143 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, descriptorSet);
3144 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003145 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3146 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3147}
Tobin Ehlis559c6382015-11-05 09:52:49 -07003148
Karl Schultz6addd812016-02-02 17:17:23 -07003149TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003150
Karl Schultz6addd812016-02-02 17:17:23 -07003151 m_errorMonitor->SetDesiredFailureMsg(
3152 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003153 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003154
3155 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003156 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003157 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003158 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003159
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003160 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003161}
3162
Karl Schultz6addd812016-02-02 17:17:23 -07003163TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
3164 VkResult err;
3165 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003166
Karl Schultz6addd812016-02-02 17:17:23 -07003167 m_errorMonitor->SetDesiredFailureMsg(
3168 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07003169 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003170
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003171 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003172
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003173 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003174 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003175 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003176 cmd.commandPool = m_commandPool;
3177 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003178 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06003179
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003180 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06003181 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003182
3183 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003184 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003185 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003186 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003187 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07003188 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
3189 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003190 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003191
3192 // The error should be caught by validation of the BeginCommandBuffer call
3193 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
3194
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003195 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003196 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003197}
3198
Karl Schultz6addd812016-02-02 17:17:23 -07003199TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003200 // Cause error due to Begin while recording CB
3201 // Then cause 2 errors for attempting to reset CB w/o having
3202 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
3203 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003205 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003206
3207 ASSERT_NO_FATAL_FAILURE(InitState());
3208
3209 // Calls AllocateCommandBuffers
3210 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
3211
Karl Schultz6addd812016-02-02 17:17:23 -07003212 // Force the failure by setting the Renderpass and Framebuffer fields with
3213 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003214 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003215 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003216 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3217 cmd_buf_info.pNext = NULL;
3218 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003219 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003220
3221 // Begin CB to transition to recording state
3222 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
3223 // Can't re-begin. This should trigger error
3224 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003225 m_errorMonitor->VerifyFound();
3226
Karl Schultz6addd812016-02-02 17:17:23 -07003227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3228 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003229 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
3230 // Reset attempt will trigger error due to incorrect CommandPool state
3231 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003232 m_errorMonitor->VerifyFound();
3233
Karl Schultz6addd812016-02-02 17:17:23 -07003234 m_errorMonitor->SetDesiredFailureMsg(
3235 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3236 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003237 // Transition CB to RECORDED state
3238 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
3239 // Now attempting to Begin will implicitly reset, which triggers error
3240 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003241 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003242}
3243
Karl Schultz6addd812016-02-02 17:17:23 -07003244TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003245 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003246 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003247
Karl Schultz6addd812016-02-02 17:17:23 -07003248 m_errorMonitor->SetDesiredFailureMsg(
3249 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003250 "Invalid Pipeline CreateInfo State: Vtx Shader required");
3251
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003252 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003253 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003254
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003255 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003256 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3257 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003258
3259 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003260 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3261 ds_pool_ci.pNext = NULL;
3262 ds_pool_ci.maxSets = 1;
3263 ds_pool_ci.poolSizeCount = 1;
3264 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003265
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003266 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003267 err =
3268 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003269 ASSERT_VK_SUCCESS(err);
3270
Tony Barboureb254902015-07-15 12:50:33 -06003271 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003272 dsl_binding.binding = 0;
3273 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3274 dsl_binding.descriptorCount = 1;
3275 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3276 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003277
Tony Barboureb254902015-07-15 12:50:33 -06003278 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003279 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3280 ds_layout_ci.pNext = NULL;
3281 ds_layout_ci.bindingCount = 1;
3282 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003283
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003284 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003285 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3286 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003287 ASSERT_VK_SUCCESS(err);
3288
3289 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003290 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003291 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003292 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003293 alloc_info.descriptorPool = ds_pool;
3294 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003295 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3296 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003297 ASSERT_VK_SUCCESS(err);
3298
Tony Barboureb254902015-07-15 12:50:33 -06003299 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003300 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3301 pipeline_layout_ci.setLayoutCount = 1;
3302 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003303
3304 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003305 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3306 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003307 ASSERT_VK_SUCCESS(err);
3308
Tobin Ehlise68360f2015-10-01 11:15:13 -06003309 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07003310 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06003311
3312 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003313 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3314 vp_state_ci.scissorCount = 1;
3315 vp_state_ci.pScissors = &sc;
3316 vp_state_ci.viewportCount = 1;
3317 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003318
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003319 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3320 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3321 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3322 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3323 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3324 rs_state_ci.depthClampEnable = VK_FALSE;
3325 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3326 rs_state_ci.depthBiasEnable = VK_FALSE;
3327
Tony Barboureb254902015-07-15 12:50:33 -06003328 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003329 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3330 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003331 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003332 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3333 gp_ci.layout = pipeline_layout;
3334 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06003335
3336 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003337 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3338 pc_ci.initialDataSize = 0;
3339 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003340
3341 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003342 VkPipelineCache pipelineCache;
3343
Karl Schultz6addd812016-02-02 17:17:23 -07003344 err =
3345 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06003346 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003347 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3348 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003349
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003350 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003351
Chia-I Wuf7458c52015-10-26 21:10:41 +08003352 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3353 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3354 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3355 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003356}
Tobin Ehlis912df022015-09-17 08:46:18 -06003357/*// TODO : This test should be good, but needs Tess support in compiler to run
3358TEST_F(VkLayerTest, InvalidPatchControlPoints)
3359{
3360 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06003361 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003362
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003363 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003364 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
3365primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003366
Tobin Ehlis912df022015-09-17 08:46:18 -06003367 ASSERT_NO_FATAL_FAILURE(InitState());
3368 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06003369
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003370 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06003371 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003372 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003373
3374 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3375 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3376 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003377 ds_pool_ci.poolSizeCount = 1;
3378 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06003379
3380 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003381 err = vkCreateDescriptorPool(m_device->device(),
3382VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06003383 ASSERT_VK_SUCCESS(err);
3384
3385 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08003386 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06003387 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08003388 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003389 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3390 dsl_binding.pImmutableSamplers = NULL;
3391
3392 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003393 ds_layout_ci.sType =
3394VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003395 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003396 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003397 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06003398
3399 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003400 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3401&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003402 ASSERT_VK_SUCCESS(err);
3403
3404 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07003405 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
3406VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06003407 ASSERT_VK_SUCCESS(err);
3408
3409 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003410 pipeline_layout_ci.sType =
3411VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003412 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003413 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003414 pipeline_layout_ci.pSetLayouts = &ds_layout;
3415
3416 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003417 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3418&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003419 ASSERT_VK_SUCCESS(err);
3420
3421 VkPipelineShaderStageCreateInfo shaderStages[3];
3422 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
3423
Karl Schultz6addd812016-02-02 17:17:23 -07003424 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
3425this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003426 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07003427 VkShaderObj
3428tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
3429this);
3430 VkShaderObj
3431te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
3432this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003433
Karl Schultz6addd812016-02-02 17:17:23 -07003434 shaderStages[0].sType =
3435VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003436 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003437 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003438 shaderStages[1].sType =
3439VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003440 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003441 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003442 shaderStages[2].sType =
3443VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003444 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003445 shaderStages[2].shader = te.handle();
3446
3447 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003448 iaCI.sType =
3449VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08003450 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06003451
3452 VkPipelineTessellationStateCreateInfo tsCI = {};
3453 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
3454 tsCI.patchControlPoints = 0; // This will cause an error
3455
3456 VkGraphicsPipelineCreateInfo gp_ci = {};
3457 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3458 gp_ci.pNext = NULL;
3459 gp_ci.stageCount = 3;
3460 gp_ci.pStages = shaderStages;
3461 gp_ci.pVertexInputState = NULL;
3462 gp_ci.pInputAssemblyState = &iaCI;
3463 gp_ci.pTessellationState = &tsCI;
3464 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003465 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06003466 gp_ci.pMultisampleState = NULL;
3467 gp_ci.pDepthStencilState = NULL;
3468 gp_ci.pColorBlendState = NULL;
3469 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3470 gp_ci.layout = pipeline_layout;
3471 gp_ci.renderPass = renderPass();
3472
3473 VkPipelineCacheCreateInfo pc_ci = {};
3474 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3475 pc_ci.pNext = NULL;
3476 pc_ci.initialSize = 0;
3477 pc_ci.initialData = 0;
3478 pc_ci.maxSize = 0;
3479
3480 VkPipeline pipeline;
3481 VkPipelineCache pipelineCache;
3482
Karl Schultz6addd812016-02-02 17:17:23 -07003483 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
3484&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06003485 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003486 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3487&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06003488
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003489 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003490
Chia-I Wuf7458c52015-10-26 21:10:41 +08003491 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3492 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3493 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3494 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06003495}
3496*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06003497// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07003498TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07003499 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003500
Karl Schultz6addd812016-02-02 17:17:23 -07003501 m_errorMonitor->SetDesiredFailureMsg(
3502 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003503 "Gfx Pipeline viewport count (1) must match scissor count (0).");
3504
Tobin Ehlise68360f2015-10-01 11:15:13 -06003505 ASSERT_NO_FATAL_FAILURE(InitState());
3506 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003507
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003508 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003509 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3510 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003511
3512 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003513 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3514 ds_pool_ci.maxSets = 1;
3515 ds_pool_ci.poolSizeCount = 1;
3516 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003517
3518 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003519 err =
3520 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003521 ASSERT_VK_SUCCESS(err);
3522
3523 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003524 dsl_binding.binding = 0;
3525 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3526 dsl_binding.descriptorCount = 1;
3527 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003528
3529 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003530 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3531 ds_layout_ci.bindingCount = 1;
3532 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003533
3534 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003535 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3536 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003537 ASSERT_VK_SUCCESS(err);
3538
3539 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003540 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003541 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003542 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003543 alloc_info.descriptorPool = ds_pool;
3544 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003545 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3546 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003547 ASSERT_VK_SUCCESS(err);
3548
3549 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003550 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3551 pipeline_layout_ci.setLayoutCount = 1;
3552 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003553
3554 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003555 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3556 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003557 ASSERT_VK_SUCCESS(err);
3558
3559 VkViewport vp = {}; // Just need dummy vp to point to
3560
3561 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003562 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3563 vp_state_ci.scissorCount = 0;
3564 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
3565 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003566
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003567 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3568 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3569 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3570 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3571 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3572 rs_state_ci.depthClampEnable = VK_FALSE;
3573 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3574 rs_state_ci.depthBiasEnable = VK_FALSE;
3575
Cody Northropeb3a6c12015-10-05 14:44:45 -06003576 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003577 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003578
Karl Schultz6addd812016-02-02 17:17:23 -07003579 VkShaderObj vs(m_device, bindStateVertShaderText,
3580 VK_SHADER_STAGE_VERTEX_BIT, this);
3581 VkShaderObj fs(m_device, bindStateFragShaderText,
3582 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003583 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003584 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003585 shaderStages[0] = vs.GetStageCreateInfo();
3586 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003587
3588 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003589 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3590 gp_ci.stageCount = 2;
3591 gp_ci.pStages = shaderStages;
3592 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003593 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003594 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3595 gp_ci.layout = pipeline_layout;
3596 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003597
3598 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003599 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003600
3601 VkPipeline pipeline;
3602 VkPipelineCache pipelineCache;
3603
Karl Schultz6addd812016-02-02 17:17:23 -07003604 err =
3605 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003606 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003607 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3608 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003609
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003610 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003611
Chia-I Wuf7458c52015-10-26 21:10:41 +08003612 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3613 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3614 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3615 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003616}
Karl Schultz6addd812016-02-02 17:17:23 -07003617// Don't set viewport state in PSO. This is an error b/c we always need this
3618// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06003619// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07003620TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06003621 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003622 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003623
Karl Schultz6addd812016-02-02 17:17:23 -07003624 m_errorMonitor->SetDesiredFailureMsg(
3625 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003626 "Gfx Pipeline pViewportState is null. Even if ");
3627
Tobin Ehlise68360f2015-10-01 11:15:13 -06003628 ASSERT_NO_FATAL_FAILURE(InitState());
3629 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003630
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003631 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003632 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3633 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003634
3635 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003636 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3637 ds_pool_ci.maxSets = 1;
3638 ds_pool_ci.poolSizeCount = 1;
3639 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003640
3641 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003642 err =
3643 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003644 ASSERT_VK_SUCCESS(err);
3645
3646 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003647 dsl_binding.binding = 0;
3648 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3649 dsl_binding.descriptorCount = 1;
3650 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003651
3652 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003653 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3654 ds_layout_ci.bindingCount = 1;
3655 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003656
3657 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003658 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3659 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003660 ASSERT_VK_SUCCESS(err);
3661
3662 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003663 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003664 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003665 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003666 alloc_info.descriptorPool = ds_pool;
3667 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003668 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3669 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003670 ASSERT_VK_SUCCESS(err);
3671
3672 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003673 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3674 pipeline_layout_ci.setLayoutCount = 1;
3675 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003676
3677 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003678 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3679 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003680 ASSERT_VK_SUCCESS(err);
3681
3682 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
3683 // Set scissor as dynamic to avoid second error
3684 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003685 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3686 dyn_state_ci.dynamicStateCount = 1;
3687 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003688
Cody Northropeb3a6c12015-10-05 14:44:45 -06003689 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003690 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003691
Karl Schultz6addd812016-02-02 17:17:23 -07003692 VkShaderObj vs(m_device, bindStateVertShaderText,
3693 VK_SHADER_STAGE_VERTEX_BIT, this);
3694 VkShaderObj fs(m_device, bindStateFragShaderText,
3695 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003696 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003697 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003698 shaderStages[0] = vs.GetStageCreateInfo();
3699 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003700
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003701
3702 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3703 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3704 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3705 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3706 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3707 rs_state_ci.depthClampEnable = VK_FALSE;
3708 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3709 rs_state_ci.depthBiasEnable = VK_FALSE;
3710
Tobin Ehlise68360f2015-10-01 11:15:13 -06003711 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003712 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3713 gp_ci.stageCount = 2;
3714 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003715 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003716 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
3717 // should cause validation error
3718 gp_ci.pDynamicState = &dyn_state_ci;
3719 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3720 gp_ci.layout = pipeline_layout;
3721 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003722
3723 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003724 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003725
3726 VkPipeline pipeline;
3727 VkPipelineCache pipelineCache;
3728
Karl Schultz6addd812016-02-02 17:17:23 -07003729 err =
3730 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003731 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003732 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3733 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003734
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003735 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003736
Chia-I Wuf7458c52015-10-26 21:10:41 +08003737 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3738 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3739 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3740 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003741}
3742// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07003743// Then run second test where dynamic scissor count doesn't match PSO scissor
3744// count
3745TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
3746 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003747
Karl Schultz6addd812016-02-02 17:17:23 -07003748 m_errorMonitor->SetDesiredFailureMsg(
3749 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003750 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
3751
Tobin Ehlise68360f2015-10-01 11:15:13 -06003752 ASSERT_NO_FATAL_FAILURE(InitState());
3753 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003754
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003755 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003756 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3757 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003758
3759 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003760 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3761 ds_pool_ci.maxSets = 1;
3762 ds_pool_ci.poolSizeCount = 1;
3763 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003764
3765 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003766 err =
3767 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003768 ASSERT_VK_SUCCESS(err);
3769
3770 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003771 dsl_binding.binding = 0;
3772 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3773 dsl_binding.descriptorCount = 1;
3774 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003775
3776 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003777 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3778 ds_layout_ci.bindingCount = 1;
3779 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003780
3781 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003782 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3783 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003784 ASSERT_VK_SUCCESS(err);
3785
3786 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003787 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003788 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003789 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003790 alloc_info.descriptorPool = ds_pool;
3791 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003792 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3793 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003794 ASSERT_VK_SUCCESS(err);
3795
3796 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003797 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3798 pipeline_layout_ci.setLayoutCount = 1;
3799 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003800
3801 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003802 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3803 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003804 ASSERT_VK_SUCCESS(err);
3805
3806 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003807 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3808 vp_state_ci.viewportCount = 1;
3809 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
3810 vp_state_ci.scissorCount = 1;
3811 vp_state_ci.pScissors =
3812 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06003813
3814 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
3815 // Set scissor as dynamic to avoid that error
3816 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003817 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3818 dyn_state_ci.dynamicStateCount = 1;
3819 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003820
Cody Northropeb3a6c12015-10-05 14:44:45 -06003821 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003822 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003823
Karl Schultz6addd812016-02-02 17:17:23 -07003824 VkShaderObj vs(m_device, bindStateVertShaderText,
3825 VK_SHADER_STAGE_VERTEX_BIT, this);
3826 VkShaderObj fs(m_device, bindStateFragShaderText,
3827 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003828 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003829 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003830 shaderStages[0] = vs.GetStageCreateInfo();
3831 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003832
Cody Northropf6622dc2015-10-06 10:33:21 -06003833 VkPipelineVertexInputStateCreateInfo vi_ci = {};
3834 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
3835 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003836 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06003837 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003838 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06003839 vi_ci.pVertexAttributeDescriptions = nullptr;
3840
3841 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
3842 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
3843 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
3844
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003845 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003846 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06003847 rs_ci.pNext = nullptr;
3848
Mark Youngc89c6312016-03-31 16:03:20 -06003849 VkPipelineColorBlendAttachmentState att = {};
3850 att.blendEnable = VK_FALSE;
3851 att.colorWriteMask = 0xf;
3852
Cody Northropf6622dc2015-10-06 10:33:21 -06003853 VkPipelineColorBlendStateCreateInfo cb_ci = {};
3854 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
3855 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06003856 cb_ci.attachmentCount = 1;
3857 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06003858
Tobin Ehlise68360f2015-10-01 11:15:13 -06003859 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003860 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3861 gp_ci.stageCount = 2;
3862 gp_ci.pStages = shaderStages;
3863 gp_ci.pVertexInputState = &vi_ci;
3864 gp_ci.pInputAssemblyState = &ia_ci;
3865 gp_ci.pViewportState = &vp_state_ci;
3866 gp_ci.pRasterizationState = &rs_ci;
3867 gp_ci.pColorBlendState = &cb_ci;
3868 gp_ci.pDynamicState = &dyn_state_ci;
3869 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3870 gp_ci.layout = pipeline_layout;
3871 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003872
3873 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003874 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003875
3876 VkPipeline pipeline;
3877 VkPipelineCache pipelineCache;
3878
Karl Schultz6addd812016-02-02 17:17:23 -07003879 err =
3880 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003881 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003882 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3883 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003884
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003885 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003886
Tobin Ehlisd332f282015-10-02 11:00:56 -06003887 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07003888 // First need to successfully create the PSO from above by setting
3889 // pViewports
3890 m_errorMonitor->SetDesiredFailureMsg(
3891 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3892 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
3893 "scissorCount is 1. These counts must match.");
3894
3895 VkViewport vp = {}; // Just need dummy vp to point to
3896 vp_state_ci.pViewports = &vp;
3897 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3898 &gp_ci, NULL, &pipeline);
3899 ASSERT_VK_SUCCESS(err);
3900 BeginCommandBuffer();
3901 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3902 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
3903 VkRect2D scissors[2] = {}; // don't care about data
3904 // Count of 2 doesn't match PSO count of 1
3905 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
3906 Draw(1, 0, 0, 0);
3907
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003908 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07003909
3910 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3911 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3912 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3913 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3914}
3915// Create PSO w/o non-zero scissorCount but no scissor data
3916// Then run second test where dynamic viewportCount doesn't match PSO
3917// viewportCount
3918TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
3919 VkResult err;
3920
3921 m_errorMonitor->SetDesiredFailureMsg(
3922 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3923 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
3924
3925 ASSERT_NO_FATAL_FAILURE(InitState());
3926 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3927
3928 VkDescriptorPoolSize ds_type_count = {};
3929 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3930 ds_type_count.descriptorCount = 1;
3931
3932 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3933 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3934 ds_pool_ci.maxSets = 1;
3935 ds_pool_ci.poolSizeCount = 1;
3936 ds_pool_ci.pPoolSizes = &ds_type_count;
3937
3938 VkDescriptorPool ds_pool;
3939 err =
3940 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
3941 ASSERT_VK_SUCCESS(err);
3942
3943 VkDescriptorSetLayoutBinding dsl_binding = {};
3944 dsl_binding.binding = 0;
3945 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3946 dsl_binding.descriptorCount = 1;
3947 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3948
3949 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3950 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3951 ds_layout_ci.bindingCount = 1;
3952 ds_layout_ci.pBindings = &dsl_binding;
3953
3954 VkDescriptorSetLayout ds_layout;
3955 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3956 &ds_layout);
3957 ASSERT_VK_SUCCESS(err);
3958
3959 VkDescriptorSet descriptorSet;
3960 VkDescriptorSetAllocateInfo alloc_info = {};
3961 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3962 alloc_info.descriptorSetCount = 1;
3963 alloc_info.descriptorPool = ds_pool;
3964 alloc_info.pSetLayouts = &ds_layout;
3965 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3966 &descriptorSet);
3967 ASSERT_VK_SUCCESS(err);
3968
3969 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3970 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3971 pipeline_layout_ci.setLayoutCount = 1;
3972 pipeline_layout_ci.pSetLayouts = &ds_layout;
3973
3974 VkPipelineLayout pipeline_layout;
3975 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3976 &pipeline_layout);
3977 ASSERT_VK_SUCCESS(err);
3978
3979 VkPipelineViewportStateCreateInfo vp_state_ci = {};
3980 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3981 vp_state_ci.scissorCount = 1;
3982 vp_state_ci.pScissors =
3983 NULL; // Null scissor w/ count of 1 should cause error
3984 vp_state_ci.viewportCount = 1;
3985 vp_state_ci.pViewports =
3986 NULL; // vp is dynamic (below) so this won't cause error
3987
3988 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
3989 // Set scissor as dynamic to avoid that error
3990 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
3991 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3992 dyn_state_ci.dynamicStateCount = 1;
3993 dyn_state_ci.pDynamicStates = &vp_state;
3994
3995 VkPipelineShaderStageCreateInfo shaderStages[2];
3996 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
3997
3998 VkShaderObj vs(m_device, bindStateVertShaderText,
3999 VK_SHADER_STAGE_VERTEX_BIT, this);
4000 VkShaderObj fs(m_device, bindStateFragShaderText,
4001 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004002 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004003 // but add it to be able to run on more devices
4004 shaderStages[0] = vs.GetStageCreateInfo();
4005 shaderStages[1] = fs.GetStageCreateInfo();
4006
4007 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4008 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4009 vi_ci.pNext = nullptr;
4010 vi_ci.vertexBindingDescriptionCount = 0;
4011 vi_ci.pVertexBindingDescriptions = nullptr;
4012 vi_ci.vertexAttributeDescriptionCount = 0;
4013 vi_ci.pVertexAttributeDescriptions = nullptr;
4014
4015 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4016 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4017 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4018
4019 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4020 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4021 rs_ci.pNext = nullptr;
4022
Mark Youngc89c6312016-03-31 16:03:20 -06004023 VkPipelineColorBlendAttachmentState att = {};
4024 att.blendEnable = VK_FALSE;
4025 att.colorWriteMask = 0xf;
4026
Karl Schultz6addd812016-02-02 17:17:23 -07004027 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4028 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4029 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004030 cb_ci.attachmentCount = 1;
4031 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07004032
4033 VkGraphicsPipelineCreateInfo gp_ci = {};
4034 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4035 gp_ci.stageCount = 2;
4036 gp_ci.pStages = shaderStages;
4037 gp_ci.pVertexInputState = &vi_ci;
4038 gp_ci.pInputAssemblyState = &ia_ci;
4039 gp_ci.pViewportState = &vp_state_ci;
4040 gp_ci.pRasterizationState = &rs_ci;
4041 gp_ci.pColorBlendState = &cb_ci;
4042 gp_ci.pDynamicState = &dyn_state_ci;
4043 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4044 gp_ci.layout = pipeline_layout;
4045 gp_ci.renderPass = renderPass();
4046
4047 VkPipelineCacheCreateInfo pc_ci = {};
4048 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4049
4050 VkPipeline pipeline;
4051 VkPipelineCache pipelineCache;
4052
4053 err =
4054 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4055 ASSERT_VK_SUCCESS(err);
4056 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4057 &gp_ci, NULL, &pipeline);
4058
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004059 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004060
4061 // Now hit second fail case where we set scissor w/ different count than PSO
4062 // First need to successfully create the PSO from above by setting
4063 // pViewports
4064 m_errorMonitor->SetDesiredFailureMsg(
4065 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4066 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
4067 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004068
Tobin Ehlisd332f282015-10-02 11:00:56 -06004069 VkRect2D sc = {}; // Just need dummy vp to point to
4070 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07004071 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4072 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004073 ASSERT_VK_SUCCESS(err);
4074 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004075 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4076 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004077 VkViewport viewports[2] = {}; // don't care about data
4078 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07004079 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004080 Draw(1, 0, 0, 0);
4081
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004082 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004083
Chia-I Wuf7458c52015-10-26 21:10:41 +08004084 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4085 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4086 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4087 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004088}
4089
Mark Young7394fdd2016-03-31 14:56:43 -06004090TEST_F(VkLayerTest, PSOLineWidthInvalid) {
4091 VkResult err;
4092
4093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4094 "Attempt to set lineWidth to 0");
4095
4096 ASSERT_NO_FATAL_FAILURE(InitState());
4097 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4098
4099 VkDescriptorPoolSize ds_type_count = {};
4100 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4101 ds_type_count.descriptorCount = 1;
4102
4103 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4104 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4105 ds_pool_ci.maxSets = 1;
4106 ds_pool_ci.poolSizeCount = 1;
4107 ds_pool_ci.pPoolSizes = &ds_type_count;
4108
4109 VkDescriptorPool ds_pool;
4110 err =
4111 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4112 ASSERT_VK_SUCCESS(err);
4113
4114 VkDescriptorSetLayoutBinding dsl_binding = {};
4115 dsl_binding.binding = 0;
4116 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4117 dsl_binding.descriptorCount = 1;
4118 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4119
4120 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4121 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4122 ds_layout_ci.bindingCount = 1;
4123 ds_layout_ci.pBindings = &dsl_binding;
4124
4125 VkDescriptorSetLayout ds_layout;
4126 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4127 &ds_layout);
4128 ASSERT_VK_SUCCESS(err);
4129
4130 VkDescriptorSet descriptorSet;
4131 VkDescriptorSetAllocateInfo alloc_info = {};
4132 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4133 alloc_info.descriptorSetCount = 1;
4134 alloc_info.descriptorPool = ds_pool;
4135 alloc_info.pSetLayouts = &ds_layout;
4136 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4137 &descriptorSet);
4138 ASSERT_VK_SUCCESS(err);
4139
4140 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4141 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4142 pipeline_layout_ci.setLayoutCount = 1;
4143 pipeline_layout_ci.pSetLayouts = &ds_layout;
4144
4145 VkPipelineLayout pipeline_layout;
4146 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4147 &pipeline_layout);
4148 ASSERT_VK_SUCCESS(err);
4149
4150 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4151 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4152 vp_state_ci.scissorCount = 1;
4153 vp_state_ci.pScissors = NULL;
4154 vp_state_ci.viewportCount = 1;
4155 vp_state_ci.pViewports = NULL;
4156
4157 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
4158 VK_DYNAMIC_STATE_SCISSOR,
4159 VK_DYNAMIC_STATE_LINE_WIDTH};
4160 // Set scissor as dynamic to avoid that error
4161 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4162 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4163 dyn_state_ci.dynamicStateCount = 2;
4164 dyn_state_ci.pDynamicStates = dynamic_states;
4165
4166 VkPipelineShaderStageCreateInfo shaderStages[2];
4167 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4168
4169 VkShaderObj vs(m_device, bindStateVertShaderText,
4170 VK_SHADER_STAGE_VERTEX_BIT, this);
4171 VkShaderObj fs(m_device, bindStateFragShaderText,
4172 VK_SHADER_STAGE_FRAGMENT_BIT,
4173 this); // TODO - We shouldn't need a fragment shader
4174 // but add it to be able to run on more devices
4175 shaderStages[0] = vs.GetStageCreateInfo();
4176 shaderStages[1] = fs.GetStageCreateInfo();
4177
4178 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4179 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4180 vi_ci.pNext = nullptr;
4181 vi_ci.vertexBindingDescriptionCount = 0;
4182 vi_ci.pVertexBindingDescriptions = nullptr;
4183 vi_ci.vertexAttributeDescriptionCount = 0;
4184 vi_ci.pVertexAttributeDescriptions = nullptr;
4185
4186 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4187 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4188 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4189
4190 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4191 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4192 rs_ci.pNext = nullptr;
4193
4194 // Check too low (line width of 0.0f).
4195 rs_ci.lineWidth = 0.0f;
4196
4197 VkPipelineColorBlendAttachmentState att = {};
4198 att.blendEnable = VK_FALSE;
4199 att.colorWriteMask = 0xf;
4200
4201 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4202 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4203 cb_ci.pNext = nullptr;
4204 cb_ci.attachmentCount = 1;
4205 cb_ci.pAttachments = &att;
4206
4207 VkGraphicsPipelineCreateInfo gp_ci = {};
4208 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4209 gp_ci.stageCount = 2;
4210 gp_ci.pStages = shaderStages;
4211 gp_ci.pVertexInputState = &vi_ci;
4212 gp_ci.pInputAssemblyState = &ia_ci;
4213 gp_ci.pViewportState = &vp_state_ci;
4214 gp_ci.pRasterizationState = &rs_ci;
4215 gp_ci.pColorBlendState = &cb_ci;
4216 gp_ci.pDynamicState = &dyn_state_ci;
4217 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4218 gp_ci.layout = pipeline_layout;
4219 gp_ci.renderPass = renderPass();
4220
4221 VkPipelineCacheCreateInfo pc_ci = {};
4222 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4223
4224 VkPipeline pipeline;
4225 VkPipelineCache pipelineCache;
4226
4227 err =
4228 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4229 ASSERT_VK_SUCCESS(err);
4230 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4231 &gp_ci, NULL, &pipeline);
4232
4233 m_errorMonitor->VerifyFound();
4234
4235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4236 "Attempt to set lineWidth to 65536");
4237
4238 // Check too high (line width of 65536.0f).
4239 rs_ci.lineWidth = 65536.0f;
4240
4241 err =
4242 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4243 ASSERT_VK_SUCCESS(err);
4244 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4245 &gp_ci, NULL, &pipeline);
4246
4247 m_errorMonitor->VerifyFound();
4248
4249 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4250 "Attempt to set lineWidth to 0");
4251
4252 dyn_state_ci.dynamicStateCount = 3;
4253
4254 rs_ci.lineWidth = 1.0f;
4255
4256 err =
4257 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4258 ASSERT_VK_SUCCESS(err);
4259 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4260 &gp_ci, NULL, &pipeline);
4261 BeginCommandBuffer();
4262 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4263 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4264
4265 // Check too low with dynamic setting.
4266 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 0.0f);
4267 m_errorMonitor->VerifyFound();
4268
4269 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4270 "Attempt to set lineWidth to 65536");
4271
4272 // Check too high with dynamic setting.
4273 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
4274 m_errorMonitor->VerifyFound();
4275 EndCommandBuffer();
4276
4277 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4278 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4279 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4280 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4281}
4282
Karl Schultz6addd812016-02-02 17:17:23 -07004283TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004284 // Bind a NULL 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 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004288
4289 ASSERT_NO_FATAL_FAILURE(InitState());
4290 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004291
Tony Barbourfe3351b2015-07-28 10:17:20 -06004292 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004293 // Don't care about RenderPass handle b/c error should be flagged before
4294 // that
4295 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
4296 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004297
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004298 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004299}
4300
Karl Schultz6addd812016-02-02 17:17:23 -07004301TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004302 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004303 m_errorMonitor->SetDesiredFailureMsg(
4304 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004305 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004306
4307 ASSERT_NO_FATAL_FAILURE(InitState());
4308 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004309
Tony Barbourfe3351b2015-07-28 10:17:20 -06004310 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004311 // Just create a dummy Renderpass that's non-NULL so we can get to the
4312 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06004313 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004314 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4315 rp_begin.pNext = NULL;
4316 rp_begin.renderPass = renderPass();
4317 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004318
Karl Schultz6addd812016-02-02 17:17:23 -07004319 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
4320 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004321
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004322 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004323}
4324
Karl Schultz6addd812016-02-02 17:17:23 -07004325TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004326 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004327 m_errorMonitor->SetDesiredFailureMsg(
4328 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004329 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004330
4331 ASSERT_NO_FATAL_FAILURE(InitState());
4332 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004333
4334 // Renderpass is started here
4335 BeginCommandBuffer();
4336
4337 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004338 vk_testing::Buffer dstBuffer;
4339 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004340
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004341 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004342
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004343 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004344}
4345
Karl Schultz6addd812016-02-02 17:17:23 -07004346TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004347 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004348 m_errorMonitor->SetDesiredFailureMsg(
4349 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004350 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004351
4352 ASSERT_NO_FATAL_FAILURE(InitState());
4353 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004354
4355 // Renderpass is started here
4356 BeginCommandBuffer();
4357
4358 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004359 vk_testing::Buffer dstBuffer;
4360 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004361
Karl Schultz6addd812016-02-02 17:17:23 -07004362 VkDeviceSize dstOffset = 0;
4363 VkDeviceSize dataSize = 1024;
4364 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004365
Karl Schultz6addd812016-02-02 17:17:23 -07004366 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
4367 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004368
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004369 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004370}
4371
Karl Schultz6addd812016-02-02 17:17:23 -07004372TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004373 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004374 m_errorMonitor->SetDesiredFailureMsg(
4375 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004376 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004377
4378 ASSERT_NO_FATAL_FAILURE(InitState());
4379 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004380
4381 // Renderpass is started here
4382 BeginCommandBuffer();
4383
Michael Lentine0a369f62016-02-03 16:51:46 -06004384 VkClearColorValue clear_color;
4385 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07004386 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
4387 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4388 const int32_t tex_width = 32;
4389 const int32_t tex_height = 32;
4390 VkImageCreateInfo image_create_info = {};
4391 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4392 image_create_info.pNext = NULL;
4393 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4394 image_create_info.format = tex_format;
4395 image_create_info.extent.width = tex_width;
4396 image_create_info.extent.height = tex_height;
4397 image_create_info.extent.depth = 1;
4398 image_create_info.mipLevels = 1;
4399 image_create_info.arrayLayers = 1;
4400 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4401 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4402 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004403
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004404 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004405 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4406 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004407
Karl Schultz6addd812016-02-02 17:17:23 -07004408 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4409 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004410
Karl Schultz6addd812016-02-02 17:17:23 -07004411 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4412 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004413
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004414 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004415}
4416
Karl Schultz6addd812016-02-02 17:17:23 -07004417TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004418 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004419 m_errorMonitor->SetDesiredFailureMsg(
4420 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004421 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004422
4423 ASSERT_NO_FATAL_FAILURE(InitState());
4424 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004425
4426 // Renderpass is started here
4427 BeginCommandBuffer();
4428
4429 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07004430 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004431 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
4432 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4433 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
4434 image_create_info.extent.width = 64;
4435 image_create_info.extent.height = 64;
4436 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4437 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004438
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004439 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004440 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4441 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004442
Karl Schultz6addd812016-02-02 17:17:23 -07004443 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4444 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004445
Karl Schultz6addd812016-02-02 17:17:23 -07004446 vkCmdClearDepthStencilImage(
4447 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4448 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
4449 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004450
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004451 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004452}
4453
Karl Schultz6addd812016-02-02 17:17:23 -07004454TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004455 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004456 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004457
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004458 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004459 "vkCmdClearAttachments: This call "
4460 "must be issued inside an active "
4461 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004462
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004463 ASSERT_NO_FATAL_FAILURE(InitState());
4464 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004465
4466 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004467 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004468 ASSERT_VK_SUCCESS(err);
4469
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004470 VkClearAttachment color_attachment;
4471 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4472 color_attachment.clearValue.color.float32[0] = 0;
4473 color_attachment.clearValue.color.float32[1] = 0;
4474 color_attachment.clearValue.color.float32[2] = 0;
4475 color_attachment.clearValue.color.float32[3] = 0;
4476 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004477 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
4478 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
4479 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004480
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004481 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004482}
4483
Karl Schultz9e66a292016-04-21 15:57:51 -06004484TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
4485 // Try to add a buffer memory barrier with no buffer.
4486 m_errorMonitor->SetDesiredFailureMsg(
4487 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4488 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
4489
4490 ASSERT_NO_FATAL_FAILURE(InitState());
4491 BeginCommandBuffer();
4492
4493 VkBufferMemoryBarrier buf_barrier = {};
4494 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
4495 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4496 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4497 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4498 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4499 buf_barrier.buffer = VK_NULL_HANDLE;
4500 buf_barrier.offset = 0;
4501 buf_barrier.size = VK_WHOLE_SIZE;
4502 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4503 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
4504 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
4505
4506 m_errorMonitor->VerifyFound();
4507}
4508
Karl Schultz6addd812016-02-02 17:17:23 -07004509TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004510 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004511 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004512
Karl Schultz6addd812016-02-02 17:17:23 -07004513 m_errorMonitor->SetDesiredFailureMsg(
4514 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004515 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
4516
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004517 ASSERT_NO_FATAL_FAILURE(InitState());
4518 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004519 uint32_t qfi = 0;
4520 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004521 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4522 buffCI.size = 1024;
4523 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
4524 buffCI.queueFamilyIndexCount = 1;
4525 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004526
4527 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004528 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004529 ASSERT_VK_SUCCESS(err);
4530
4531 BeginCommandBuffer();
4532 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004533 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4534 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004535 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07004536 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
4537 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004538
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004539 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004540
Chia-I Wuf7458c52015-10-26 21:10:41 +08004541 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004542}
4543
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004544TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
4545 // Create an out-of-range queueFamilyIndex
4546 m_errorMonitor->SetDesiredFailureMsg(
4547 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06004548 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004549
4550 ASSERT_NO_FATAL_FAILURE(InitState());
4551 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4552 VkBufferCreateInfo buffCI = {};
4553 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4554 buffCI.size = 1024;
4555 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
4556 buffCI.queueFamilyIndexCount = 1;
4557 // Introduce failure by specifying invalid queue_family_index
4558 uint32_t qfi = 777;
4559 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06004560 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004561
4562 VkBuffer ib;
4563 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
4564
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004565 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004566}
4567
Karl Schultz6addd812016-02-02 17:17:23 -07004568TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
4569 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
4570 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004571
Karl Schultz6addd812016-02-02 17:17:23 -07004572 m_errorMonitor->SetDesiredFailureMsg(
4573 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004574 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004575
4576 ASSERT_NO_FATAL_FAILURE(InitState());
4577 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004578
4579 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004580 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004581 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
4582 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004583
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004584 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004585}
4586
Karl Schultz6addd812016-02-02 17:17:23 -07004587TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004588 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07004589 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004590
Karl Schultz6addd812016-02-02 17:17:23 -07004591 m_errorMonitor->SetDesiredFailureMsg(
4592 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Write descriptor update has descriptor "
4593 "type VK_DESCRIPTOR_TYPE_SAMPLER that "
4594 "does not match ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004595
Tobin Ehlis3b780662015-05-28 12:11:26 -06004596 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004597 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004598 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004599 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4600 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004601
4602 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004603 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4604 ds_pool_ci.pNext = NULL;
4605 ds_pool_ci.maxSets = 1;
4606 ds_pool_ci.poolSizeCount = 1;
4607 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004608
Tobin Ehlis3b780662015-05-28 12:11:26 -06004609 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004610 err =
4611 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004612 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06004613 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004614 dsl_binding.binding = 0;
4615 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4616 dsl_binding.descriptorCount = 1;
4617 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4618 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004619
Tony Barboureb254902015-07-15 12:50:33 -06004620 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004621 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4622 ds_layout_ci.pNext = NULL;
4623 ds_layout_ci.bindingCount = 1;
4624 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004625
Tobin Ehlis3b780662015-05-28 12:11:26 -06004626 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004627 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4628 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004629 ASSERT_VK_SUCCESS(err);
4630
4631 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004632 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004633 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004634 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004635 alloc_info.descriptorPool = ds_pool;
4636 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004637 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4638 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004639 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004640
Tony Barboureb254902015-07-15 12:50:33 -06004641 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004642 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4643 sampler_ci.pNext = NULL;
4644 sampler_ci.magFilter = VK_FILTER_NEAREST;
4645 sampler_ci.minFilter = VK_FILTER_NEAREST;
4646 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4647 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4648 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4649 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4650 sampler_ci.mipLodBias = 1.0;
4651 sampler_ci.anisotropyEnable = VK_FALSE;
4652 sampler_ci.maxAnisotropy = 1;
4653 sampler_ci.compareEnable = VK_FALSE;
4654 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4655 sampler_ci.minLod = 1.0;
4656 sampler_ci.maxLod = 1.0;
4657 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4658 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Mark Lobodzinski52ac6582015-09-01 15:42:56 -06004659
Tobin Ehlis3b780662015-05-28 12:11:26 -06004660 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004661 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004662 ASSERT_VK_SUCCESS(err);
4663
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004664 VkDescriptorImageInfo info = {};
4665 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004666
4667 VkWriteDescriptorSet descriptor_write;
4668 memset(&descriptor_write, 0, sizeof(descriptor_write));
4669 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004670 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004671 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004672 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004673 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004674 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004675
4676 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4677
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004678 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004679
Chia-I Wuf7458c52015-10-26 21:10:41 +08004680 vkDestroySampler(m_device->device(), sampler, NULL);
4681 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4682 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004683}
4684
Karl Schultz6addd812016-02-02 17:17:23 -07004685TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004686 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07004687 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004688
Karl Schultz6addd812016-02-02 17:17:23 -07004689 m_errorMonitor->SetDesiredFailureMsg(
4690 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Descriptor update type of "
4691 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET "
4692 "is out of bounds for matching binding");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004693
Tobin Ehlis3b780662015-05-28 12:11:26 -06004694 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004695 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004696 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004697 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4698 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004699
4700 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004701 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4702 ds_pool_ci.pNext = NULL;
4703 ds_pool_ci.maxSets = 1;
4704 ds_pool_ci.poolSizeCount = 1;
4705 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004706
Tobin Ehlis3b780662015-05-28 12:11:26 -06004707 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004708 err =
4709 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004710 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004711
Tony Barboureb254902015-07-15 12:50:33 -06004712 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004713 dsl_binding.binding = 0;
4714 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4715 dsl_binding.descriptorCount = 1;
4716 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4717 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06004718
4719 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004720 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4721 ds_layout_ci.pNext = NULL;
4722 ds_layout_ci.bindingCount = 1;
4723 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004724
Tobin Ehlis3b780662015-05-28 12:11:26 -06004725 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004726 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4727 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004728 ASSERT_VK_SUCCESS(err);
4729
4730 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004731 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004732 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004733 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004734 alloc_info.descriptorPool = ds_pool;
4735 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004736 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4737 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004738 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004739
Tony Barboureb254902015-07-15 12:50:33 -06004740 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004741 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4742 sampler_ci.pNext = NULL;
4743 sampler_ci.magFilter = VK_FILTER_NEAREST;
4744 sampler_ci.minFilter = VK_FILTER_NEAREST;
4745 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4746 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4747 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4748 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4749 sampler_ci.mipLodBias = 1.0;
4750 sampler_ci.anisotropyEnable = VK_FALSE;
4751 sampler_ci.maxAnisotropy = 1;
4752 sampler_ci.compareEnable = VK_FALSE;
4753 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4754 sampler_ci.minLod = 1.0;
4755 sampler_ci.maxLod = 1.0;
4756 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4757 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06004758
Tobin Ehlis3b780662015-05-28 12:11:26 -06004759 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004760 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004761 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004762
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004763 VkDescriptorImageInfo info = {};
4764 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004765
4766 VkWriteDescriptorSet descriptor_write;
4767 memset(&descriptor_write, 0, sizeof(descriptor_write));
4768 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004769 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004770 descriptor_write.dstArrayElement =
4771 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08004772 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004773 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004774 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004775 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004776
4777 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4778
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004779 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004780
Chia-I Wuf7458c52015-10-26 21:10:41 +08004781 vkDestroySampler(m_device->device(), sampler, NULL);
4782 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4783 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004784}
4785
Karl Schultz6addd812016-02-02 17:17:23 -07004786TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
4787 // Create layout w/ count of 1 and attempt update to that layout w/ binding
4788 // index 2
4789 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004790
Karl Schultz6addd812016-02-02 17:17:23 -07004791 m_errorMonitor->SetDesiredFailureMsg(
4792 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004793 " does not have binding to match update binding ");
4794
Tobin Ehlis3b780662015-05-28 12:11:26 -06004795 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004796 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004797 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004798 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4799 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004800
4801 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004802 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4803 ds_pool_ci.pNext = NULL;
4804 ds_pool_ci.maxSets = 1;
4805 ds_pool_ci.poolSizeCount = 1;
4806 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004807
Tobin Ehlis3b780662015-05-28 12:11:26 -06004808 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004809 err =
4810 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004811 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004812
Tony Barboureb254902015-07-15 12:50:33 -06004813 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004814 dsl_binding.binding = 0;
4815 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4816 dsl_binding.descriptorCount = 1;
4817 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4818 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06004819
4820 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004821 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4822 ds_layout_ci.pNext = NULL;
4823 ds_layout_ci.bindingCount = 1;
4824 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004825 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004826 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4827 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004828 ASSERT_VK_SUCCESS(err);
4829
4830 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004831 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004832 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004833 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004834 alloc_info.descriptorPool = ds_pool;
4835 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004836 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4837 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004838 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004839
Tony Barboureb254902015-07-15 12:50:33 -06004840 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004841 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4842 sampler_ci.pNext = NULL;
4843 sampler_ci.magFilter = VK_FILTER_NEAREST;
4844 sampler_ci.minFilter = VK_FILTER_NEAREST;
4845 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4846 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4847 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4848 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4849 sampler_ci.mipLodBias = 1.0;
4850 sampler_ci.anisotropyEnable = VK_FALSE;
4851 sampler_ci.maxAnisotropy = 1;
4852 sampler_ci.compareEnable = VK_FALSE;
4853 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4854 sampler_ci.minLod = 1.0;
4855 sampler_ci.maxLod = 1.0;
4856 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4857 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06004858
Tobin Ehlis3b780662015-05-28 12:11:26 -06004859 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004860 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004861 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004862
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004863 VkDescriptorImageInfo info = {};
4864 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004865
4866 VkWriteDescriptorSet descriptor_write;
4867 memset(&descriptor_write, 0, sizeof(descriptor_write));
4868 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004869 descriptor_write.dstSet = descriptorSet;
4870 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004871 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004872 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004873 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004874 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004875
4876 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4877
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004878 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004879
Chia-I Wuf7458c52015-10-26 21:10:41 +08004880 vkDestroySampler(m_device->device(), sampler, NULL);
4881 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4882 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004883}
4884
Karl Schultz6addd812016-02-02 17:17:23 -07004885TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
4886 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
4887 // types
4888 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004889
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004890 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004891 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004892
Tobin Ehlis3b780662015-05-28 12:11:26 -06004893 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004894
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004895 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004896 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4897 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004898
4899 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004900 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4901 ds_pool_ci.pNext = NULL;
4902 ds_pool_ci.maxSets = 1;
4903 ds_pool_ci.poolSizeCount = 1;
4904 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004905
Tobin Ehlis3b780662015-05-28 12:11:26 -06004906 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004907 err =
4908 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004909 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06004910 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004911 dsl_binding.binding = 0;
4912 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4913 dsl_binding.descriptorCount = 1;
4914 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4915 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004916
Tony Barboureb254902015-07-15 12:50:33 -06004917 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004918 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4919 ds_layout_ci.pNext = NULL;
4920 ds_layout_ci.bindingCount = 1;
4921 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004922
Tobin Ehlis3b780662015-05-28 12:11:26 -06004923 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004924 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4925 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004926 ASSERT_VK_SUCCESS(err);
4927
4928 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004929 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004930 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004931 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004932 alloc_info.descriptorPool = ds_pool;
4933 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004934 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4935 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004936 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004937
Tony Barboureb254902015-07-15 12:50:33 -06004938 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004939 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4940 sampler_ci.pNext = NULL;
4941 sampler_ci.magFilter = VK_FILTER_NEAREST;
4942 sampler_ci.minFilter = VK_FILTER_NEAREST;
4943 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4944 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4945 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4946 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4947 sampler_ci.mipLodBias = 1.0;
4948 sampler_ci.anisotropyEnable = VK_FALSE;
4949 sampler_ci.maxAnisotropy = 1;
4950 sampler_ci.compareEnable = VK_FALSE;
4951 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4952 sampler_ci.minLod = 1.0;
4953 sampler_ci.maxLod = 1.0;
4954 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4955 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004956 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004957 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004958 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004959
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004960 VkDescriptorImageInfo info = {};
4961 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004962
4963 VkWriteDescriptorSet descriptor_write;
4964 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07004965 descriptor_write.sType =
4966 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004967 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004968 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004969 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004970 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004971 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004972
4973 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4974
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004975 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004976
Chia-I Wuf7458c52015-10-26 21:10:41 +08004977 vkDestroySampler(m_device->device(), sampler, NULL);
4978 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4979 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004980}
4981
Karl Schultz6addd812016-02-02 17:17:23 -07004982TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004983 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07004984 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004985
Karl Schultz6addd812016-02-02 17:17:23 -07004986 m_errorMonitor->SetDesiredFailureMsg(
4987 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004988 "Attempt to update descriptor with invalid sampler 0xbaadbeef");
4989
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004990 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004991 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
4992 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004993 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004994 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
4995 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004996
4997 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004998 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4999 ds_pool_ci.pNext = NULL;
5000 ds_pool_ci.maxSets = 1;
5001 ds_pool_ci.poolSizeCount = 1;
5002 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005003
5004 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005005 err =
5006 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005007 ASSERT_VK_SUCCESS(err);
5008
5009 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005010 dsl_binding.binding = 0;
5011 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5012 dsl_binding.descriptorCount = 1;
5013 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5014 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005015
5016 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005017 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5018 ds_layout_ci.pNext = NULL;
5019 ds_layout_ci.bindingCount = 1;
5020 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005021 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005022 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5023 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005024 ASSERT_VK_SUCCESS(err);
5025
5026 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005027 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005028 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005029 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005030 alloc_info.descriptorPool = ds_pool;
5031 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005032 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5033 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005034 ASSERT_VK_SUCCESS(err);
5035
Karl Schultz6addd812016-02-02 17:17:23 -07005036 VkSampler sampler =
5037 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005038
5039 VkDescriptorImageInfo descriptor_info;
5040 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5041 descriptor_info.sampler = sampler;
5042
5043 VkWriteDescriptorSet descriptor_write;
5044 memset(&descriptor_write, 0, sizeof(descriptor_write));
5045 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005046 descriptor_write.dstSet = descriptorSet;
5047 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005048 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005049 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5050 descriptor_write.pImageInfo = &descriptor_info;
5051
5052 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5053
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005054 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005055
Chia-I Wuf7458c52015-10-26 21:10:41 +08005056 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5057 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005058}
5059
Karl Schultz6addd812016-02-02 17:17:23 -07005060TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
5061 // Create a single combined Image/Sampler descriptor and send it an invalid
5062 // imageView
5063 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005064
Karl Schultz6addd812016-02-02 17:17:23 -07005065 m_errorMonitor->SetDesiredFailureMsg(
5066 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005067 "Attempt to update descriptor with invalid imageView 0xbaadbeef");
5068
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005069 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005070 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005071 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5072 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005073
5074 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005075 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5076 ds_pool_ci.pNext = NULL;
5077 ds_pool_ci.maxSets = 1;
5078 ds_pool_ci.poolSizeCount = 1;
5079 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005080
5081 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005082 err =
5083 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005084 ASSERT_VK_SUCCESS(err);
5085
5086 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005087 dsl_binding.binding = 0;
5088 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5089 dsl_binding.descriptorCount = 1;
5090 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5091 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005092
5093 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005094 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5095 ds_layout_ci.pNext = NULL;
5096 ds_layout_ci.bindingCount = 1;
5097 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005098 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005099 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5100 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005101 ASSERT_VK_SUCCESS(err);
5102
5103 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005104 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005105 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005106 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005107 alloc_info.descriptorPool = ds_pool;
5108 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005109 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5110 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005111 ASSERT_VK_SUCCESS(err);
5112
5113 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005114 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5115 sampler_ci.pNext = NULL;
5116 sampler_ci.magFilter = VK_FILTER_NEAREST;
5117 sampler_ci.minFilter = VK_FILTER_NEAREST;
5118 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5119 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5120 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5121 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5122 sampler_ci.mipLodBias = 1.0;
5123 sampler_ci.anisotropyEnable = VK_FALSE;
5124 sampler_ci.maxAnisotropy = 1;
5125 sampler_ci.compareEnable = VK_FALSE;
5126 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5127 sampler_ci.minLod = 1.0;
5128 sampler_ci.maxLod = 1.0;
5129 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5130 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005131
5132 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005133 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005134 ASSERT_VK_SUCCESS(err);
5135
Karl Schultz6addd812016-02-02 17:17:23 -07005136 VkImageView view =
5137 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005138
5139 VkDescriptorImageInfo descriptor_info;
5140 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5141 descriptor_info.sampler = sampler;
5142 descriptor_info.imageView = view;
5143
5144 VkWriteDescriptorSet descriptor_write;
5145 memset(&descriptor_write, 0, sizeof(descriptor_write));
5146 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005147 descriptor_write.dstSet = descriptorSet;
5148 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005149 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005150 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5151 descriptor_write.pImageInfo = &descriptor_info;
5152
5153 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5154
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005155 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005156
Chia-I Wuf7458c52015-10-26 21:10:41 +08005157 vkDestroySampler(m_device->device(), sampler, NULL);
5158 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5159 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005160}
5161
Karl Schultz6addd812016-02-02 17:17:23 -07005162TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
5163 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
5164 // into the other
5165 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005166
Karl Schultz6addd812016-02-02 17:17:23 -07005167 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06005168 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5169 "Copy descriptor update index 0, has src update descriptor "
5170 "type VK_DESCRIPTOR_TYPE_SAMPLER that does not match overlapping "
5171 "dest ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005172
Tobin Ehlis04356f92015-10-27 16:35:27 -06005173 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005174 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005175 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005176 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5177 ds_type_count[0].descriptorCount = 1;
5178 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
5179 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005180
5181 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005182 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5183 ds_pool_ci.pNext = NULL;
5184 ds_pool_ci.maxSets = 1;
5185 ds_pool_ci.poolSizeCount = 2;
5186 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005187
5188 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005189 err =
5190 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005191 ASSERT_VK_SUCCESS(err);
5192 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005193 dsl_binding[0].binding = 0;
5194 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5195 dsl_binding[0].descriptorCount = 1;
5196 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
5197 dsl_binding[0].pImmutableSamplers = NULL;
5198 dsl_binding[1].binding = 1;
5199 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5200 dsl_binding[1].descriptorCount = 1;
5201 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
5202 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005203
5204 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005205 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5206 ds_layout_ci.pNext = NULL;
5207 ds_layout_ci.bindingCount = 2;
5208 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005209
5210 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005211 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5212 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005213 ASSERT_VK_SUCCESS(err);
5214
5215 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005216 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005217 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005218 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005219 alloc_info.descriptorPool = ds_pool;
5220 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005221 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5222 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005223 ASSERT_VK_SUCCESS(err);
5224
5225 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005226 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5227 sampler_ci.pNext = NULL;
5228 sampler_ci.magFilter = VK_FILTER_NEAREST;
5229 sampler_ci.minFilter = VK_FILTER_NEAREST;
5230 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5231 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5232 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5233 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5234 sampler_ci.mipLodBias = 1.0;
5235 sampler_ci.anisotropyEnable = VK_FALSE;
5236 sampler_ci.maxAnisotropy = 1;
5237 sampler_ci.compareEnable = VK_FALSE;
5238 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5239 sampler_ci.minLod = 1.0;
5240 sampler_ci.maxLod = 1.0;
5241 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5242 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005243
5244 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005245 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005246 ASSERT_VK_SUCCESS(err);
5247
5248 VkDescriptorImageInfo info = {};
5249 info.sampler = sampler;
5250
5251 VkWriteDescriptorSet descriptor_write;
5252 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
5253 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005254 descriptor_write.dstSet = descriptorSet;
5255 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08005256 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005257 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5258 descriptor_write.pImageInfo = &info;
5259 // This write update should succeed
5260 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5261 // Now perform a copy update that fails due to type mismatch
5262 VkCopyDescriptorSet copy_ds_update;
5263 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5264 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5265 copy_ds_update.srcSet = descriptorSet;
5266 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005267 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005268 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08005269 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005270 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5271
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005272 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005273 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005274 m_errorMonitor->SetDesiredFailureMsg(
5275 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005276 "Copy descriptor update 0 has srcBinding 3 which is out of bounds ");
Tobin Ehlis04356f92015-10-27 16:35:27 -06005277 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5278 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5279 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005280 copy_ds_update.srcBinding =
5281 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005282 copy_ds_update.dstSet = descriptorSet;
5283 copy_ds_update.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005284 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005285 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5286
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005287 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005288
Tobin Ehlis04356f92015-10-27 16:35:27 -06005289 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005290 m_errorMonitor->SetDesiredFailureMsg(
5291 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005292 "Copy descriptor src update is out of bounds for matching binding 1 ");
5293
Tobin Ehlis04356f92015-10-27 16:35:27 -06005294 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5295 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5296 copy_ds_update.srcSet = descriptorSet;
5297 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005298 copy_ds_update.dstSet = descriptorSet;
5299 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005300 copy_ds_update.descriptorCount =
5301 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06005302 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5303
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005304 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005305
Chia-I Wuf7458c52015-10-26 21:10:41 +08005306 vkDestroySampler(m_device->device(), sampler, NULL);
5307 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5308 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005309}
5310
Karl Schultz6addd812016-02-02 17:17:23 -07005311TEST_F(VkLayerTest, NumSamplesMismatch) {
5312 // Create CommandBuffer where MSAA samples doesn't match RenderPass
5313 // sampleCount
5314 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005315
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005316 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005317 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005318
Tobin Ehlis3b780662015-05-28 12:11:26 -06005319 ASSERT_NO_FATAL_FAILURE(InitState());
5320 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005321 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06005322 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005323 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005324
5325 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005326 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5327 ds_pool_ci.pNext = NULL;
5328 ds_pool_ci.maxSets = 1;
5329 ds_pool_ci.poolSizeCount = 1;
5330 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005331
Tobin Ehlis3b780662015-05-28 12:11:26 -06005332 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005333 err =
5334 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005335 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005336
Tony Barboureb254902015-07-15 12:50:33 -06005337 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08005338 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06005339 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08005340 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005341 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5342 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005343
Tony Barboureb254902015-07-15 12:50:33 -06005344 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5345 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5346 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005347 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07005348 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005349
Tobin Ehlis3b780662015-05-28 12:11:26 -06005350 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005351 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5352 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005353 ASSERT_VK_SUCCESS(err);
5354
5355 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005356 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005357 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005358 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005359 alloc_info.descriptorPool = ds_pool;
5360 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005361 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5362 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005363 ASSERT_VK_SUCCESS(err);
5364
Tony Barboureb254902015-07-15 12:50:33 -06005365 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005366 pipe_ms_state_ci.sType =
5367 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5368 pipe_ms_state_ci.pNext = NULL;
5369 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5370 pipe_ms_state_ci.sampleShadingEnable = 0;
5371 pipe_ms_state_ci.minSampleShading = 1.0;
5372 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005373
Tony Barboureb254902015-07-15 12:50:33 -06005374 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005375 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5376 pipeline_layout_ci.pNext = NULL;
5377 pipeline_layout_ci.setLayoutCount = 1;
5378 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005379
5380 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005381 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5382 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005383 ASSERT_VK_SUCCESS(err);
5384
Karl Schultz6addd812016-02-02 17:17:23 -07005385 VkShaderObj vs(m_device, bindStateVertShaderText,
5386 VK_SHADER_STAGE_VERTEX_BIT, this);
5387 VkShaderObj fs(m_device, bindStateFragShaderText,
5388 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005389 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005390 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005391 VkPipelineObj pipe(m_device);
5392 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005393 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005394 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005395 pipe.SetMSAA(&pipe_ms_state_ci);
5396 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005397
Tony Barbourfe3351b2015-07-28 10:17:20 -06005398 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005399 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5400 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005401
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005402 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005403
Chia-I Wuf7458c52015-10-26 21:10:41 +08005404 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5405 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5406 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005407}
Tobin Ehlis0f10db52016-04-04 10:00:21 -06005408#ifdef ADD_BACK_IN_WHEN_CHECK_IS_BACK // TODO : Re-enable when GH256 fixed
Mark Youngc89c6312016-03-31 16:03:20 -06005409TEST_F(VkLayerTest, NumBlendAttachMismatch) {
5410 // Create Pipeline where the number of blend attachments doesn't match the
5411 // number of color attachments. In this case, we don't add any color
5412 // blend attachments even though we have a color attachment.
5413 VkResult err;
5414
5415 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5416 "Mismatch between blend state attachment");
5417
5418 ASSERT_NO_FATAL_FAILURE(InitState());
5419 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5420 VkDescriptorPoolSize ds_type_count = {};
5421 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5422 ds_type_count.descriptorCount = 1;
5423
5424 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5425 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5426 ds_pool_ci.pNext = NULL;
5427 ds_pool_ci.maxSets = 1;
5428 ds_pool_ci.poolSizeCount = 1;
5429 ds_pool_ci.pPoolSizes = &ds_type_count;
5430
5431 VkDescriptorPool ds_pool;
5432 err =
5433 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5434 ASSERT_VK_SUCCESS(err);
5435
5436 VkDescriptorSetLayoutBinding dsl_binding = {};
5437 dsl_binding.binding = 0;
5438 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5439 dsl_binding.descriptorCount = 1;
5440 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5441 dsl_binding.pImmutableSamplers = NULL;
5442
5443 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5444 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5445 ds_layout_ci.pNext = NULL;
5446 ds_layout_ci.bindingCount = 1;
5447 ds_layout_ci.pBindings = &dsl_binding;
5448
5449 VkDescriptorSetLayout ds_layout;
5450 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5451 &ds_layout);
5452 ASSERT_VK_SUCCESS(err);
5453
5454 VkDescriptorSet descriptorSet;
5455 VkDescriptorSetAllocateInfo alloc_info = {};
5456 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5457 alloc_info.descriptorSetCount = 1;
5458 alloc_info.descriptorPool = ds_pool;
5459 alloc_info.pSetLayouts = &ds_layout;
5460 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5461 &descriptorSet);
5462 ASSERT_VK_SUCCESS(err);
5463
5464 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
5465 pipe_ms_state_ci.sType =
5466 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5467 pipe_ms_state_ci.pNext = NULL;
5468 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
5469 pipe_ms_state_ci.sampleShadingEnable = 0;
5470 pipe_ms_state_ci.minSampleShading = 1.0;
5471 pipe_ms_state_ci.pSampleMask = NULL;
5472
5473 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5474 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5475 pipeline_layout_ci.pNext = NULL;
5476 pipeline_layout_ci.setLayoutCount = 1;
5477 pipeline_layout_ci.pSetLayouts = &ds_layout;
5478
5479 VkPipelineLayout pipeline_layout;
5480 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5481 &pipeline_layout);
5482 ASSERT_VK_SUCCESS(err);
5483
5484 VkShaderObj vs(m_device, bindStateVertShaderText,
5485 VK_SHADER_STAGE_VERTEX_BIT, this);
5486 VkShaderObj fs(m_device, bindStateFragShaderText,
5487 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005488 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06005489 // but add it to be able to run on more devices
5490 VkPipelineObj pipe(m_device);
5491 pipe.AddShader(&vs);
5492 pipe.AddShader(&fs);
5493 pipe.SetMSAA(&pipe_ms_state_ci);
5494 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5495
5496 BeginCommandBuffer();
5497 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5498 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5499
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005500 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06005501
5502 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5503 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5504 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5505}
Tony Barbour4e81a202016-04-04 11:09:40 -06005506#endif //ADD_BACK_IN_WHEN_CHECK_IS_BACK
Karl Schultz6addd812016-02-02 17:17:23 -07005507TEST_F(VkLayerTest, ClearCmdNoDraw) {
5508 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
5509 // to issuing a Draw
5510 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005511
Karl Schultz6addd812016-02-02 17:17:23 -07005512 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07005513 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005514 "vkCmdClearAttachments() issued on CB object ");
5515
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005516 ASSERT_NO_FATAL_FAILURE(InitState());
5517 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06005518
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005519 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005520 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5521 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005522
5523 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005524 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5525 ds_pool_ci.pNext = NULL;
5526 ds_pool_ci.maxSets = 1;
5527 ds_pool_ci.poolSizeCount = 1;
5528 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005529
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005530 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005531 err =
5532 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005533 ASSERT_VK_SUCCESS(err);
5534
Tony Barboureb254902015-07-15 12:50:33 -06005535 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005536 dsl_binding.binding = 0;
5537 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5538 dsl_binding.descriptorCount = 1;
5539 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5540 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005541
Tony Barboureb254902015-07-15 12:50:33 -06005542 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005543 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5544 ds_layout_ci.pNext = NULL;
5545 ds_layout_ci.bindingCount = 1;
5546 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005547
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005548 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005549 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5550 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005551 ASSERT_VK_SUCCESS(err);
5552
5553 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005554 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005555 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005556 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005557 alloc_info.descriptorPool = ds_pool;
5558 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005559 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5560 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005561 ASSERT_VK_SUCCESS(err);
5562
Tony Barboureb254902015-07-15 12:50:33 -06005563 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005564 pipe_ms_state_ci.sType =
5565 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5566 pipe_ms_state_ci.pNext = NULL;
5567 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5568 pipe_ms_state_ci.sampleShadingEnable = 0;
5569 pipe_ms_state_ci.minSampleShading = 1.0;
5570 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005571
Tony Barboureb254902015-07-15 12:50:33 -06005572 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005573 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5574 pipeline_layout_ci.pNext = NULL;
5575 pipeline_layout_ci.setLayoutCount = 1;
5576 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005577
5578 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005579 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5580 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005581 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005582
Karl Schultz6addd812016-02-02 17:17:23 -07005583 VkShaderObj vs(m_device, bindStateVertShaderText,
5584 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06005585 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07005586 // on more devices
5587 VkShaderObj fs(m_device, bindStateFragShaderText,
5588 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005589
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005590 VkPipelineObj pipe(m_device);
5591 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005592 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005593 pipe.SetMSAA(&pipe_ms_state_ci);
5594 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06005595
5596 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005597
Karl Schultz6addd812016-02-02 17:17:23 -07005598 // Main thing we care about for this test is that the VkImage obj we're
5599 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005600 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005601 VkClearAttachment color_attachment;
5602 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5603 color_attachment.clearValue.color.float32[0] = 1.0;
5604 color_attachment.clearValue.color.float32[1] = 1.0;
5605 color_attachment.clearValue.color.float32[2] = 1.0;
5606 color_attachment.clearValue.color.float32[3] = 1.0;
5607 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005608 VkClearRect clear_rect = {
5609 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005610
Karl Schultz6addd812016-02-02 17:17:23 -07005611 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
5612 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005613
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005614 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005615
Chia-I Wuf7458c52015-10-26 21:10:41 +08005616 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5617 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5618 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005619}
5620
Karl Schultz6addd812016-02-02 17:17:23 -07005621TEST_F(VkLayerTest, VtxBufferBadIndex) {
5622 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005623
Karl Schultz6addd812016-02-02 17:17:23 -07005624 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005625 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07005626 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005627
Tobin Ehlis502480b2015-06-24 15:53:07 -06005628 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06005629 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06005630 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06005631
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005632 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005633 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5634 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005635
5636 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005637 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5638 ds_pool_ci.pNext = NULL;
5639 ds_pool_ci.maxSets = 1;
5640 ds_pool_ci.poolSizeCount = 1;
5641 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005642
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005643 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005644 err =
5645 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005646 ASSERT_VK_SUCCESS(err);
5647
Tony Barboureb254902015-07-15 12:50:33 -06005648 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005649 dsl_binding.binding = 0;
5650 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5651 dsl_binding.descriptorCount = 1;
5652 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5653 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005654
Tony Barboureb254902015-07-15 12:50:33 -06005655 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005656 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5657 ds_layout_ci.pNext = NULL;
5658 ds_layout_ci.bindingCount = 1;
5659 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005660
Tobin Ehlis502480b2015-06-24 15:53:07 -06005661 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005662 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5663 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005664 ASSERT_VK_SUCCESS(err);
5665
5666 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005667 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005668 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005669 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005670 alloc_info.descriptorPool = ds_pool;
5671 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005672 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5673 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005674 ASSERT_VK_SUCCESS(err);
5675
Tony Barboureb254902015-07-15 12:50:33 -06005676 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005677 pipe_ms_state_ci.sType =
5678 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5679 pipe_ms_state_ci.pNext = NULL;
5680 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
5681 pipe_ms_state_ci.sampleShadingEnable = 0;
5682 pipe_ms_state_ci.minSampleShading = 1.0;
5683 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005684
Tony Barboureb254902015-07-15 12:50:33 -06005685 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005686 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5687 pipeline_layout_ci.pNext = NULL;
5688 pipeline_layout_ci.setLayoutCount = 1;
5689 pipeline_layout_ci.pSetLayouts = &ds_layout;
5690 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005691
Karl Schultz6addd812016-02-02 17:17:23 -07005692 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5693 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005694 ASSERT_VK_SUCCESS(err);
5695
Karl Schultz6addd812016-02-02 17:17:23 -07005696 VkShaderObj vs(m_device, bindStateVertShaderText,
5697 VK_SHADER_STAGE_VERTEX_BIT, this);
5698 VkShaderObj fs(m_device, bindStateFragShaderText,
5699 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005700 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005701 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005702 VkPipelineObj pipe(m_device);
5703 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005704 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005705 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005706 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06005707 pipe.SetViewport(m_viewports);
5708 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005709 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06005710
5711 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005712 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5713 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06005714 // Don't care about actual data, just need to get to draw to flag error
5715 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07005716 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
5717 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06005718 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06005719 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005720
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005721 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005722
Chia-I Wuf7458c52015-10-26 21:10:41 +08005723 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5724 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5725 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005726}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005727#endif // DRAW_STATE_TESTS
5728
Tobin Ehlis0788f522015-05-26 16:11:58 -06005729#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06005730#if GTEST_IS_THREADSAFE
5731struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005732 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005733 VkEvent event;
5734 bool bailout;
5735};
5736
Karl Schultz6addd812016-02-02 17:17:23 -07005737extern "C" void *AddToCommandBuffer(void *arg) {
5738 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005739
Karl Schultz6addd812016-02-02 17:17:23 -07005740 for (int i = 0; i < 10000; i++) {
5741 vkCmdSetEvent(data->commandBuffer, data->event,
5742 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005743 if (data->bailout) {
5744 break;
5745 }
5746 }
5747 return NULL;
5748}
5749
Karl Schultz6addd812016-02-02 17:17:23 -07005750TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06005751 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005752
Karl Schultz6addd812016-02-02 17:17:23 -07005753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5754 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005755
Mike Stroyanaccf7692015-05-12 16:00:45 -06005756 ASSERT_NO_FATAL_FAILURE(InitState());
5757 ASSERT_NO_FATAL_FAILURE(InitViewport());
5758 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5759
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005760 // Calls AllocateCommandBuffers
5761 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06005762
5763 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005764 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005765
5766 VkEventCreateInfo event_info;
5767 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005768 VkResult err;
5769
5770 memset(&event_info, 0, sizeof(event_info));
5771 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5772
Chia-I Wuf7458c52015-10-26 21:10:41 +08005773 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005774 ASSERT_VK_SUCCESS(err);
5775
Mike Stroyanaccf7692015-05-12 16:00:45 -06005776 err = vkResetEvent(device(), event);
5777 ASSERT_VK_SUCCESS(err);
5778
5779 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005780 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005781 data.event = event;
5782 data.bailout = false;
5783 m_errorMonitor->SetBailout(&data.bailout);
5784 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06005785 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005786 // Add many entries to command buffer from this thread at the same time.
5787 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06005788
Mike Stroyan4268d1f2015-07-13 14:45:35 -06005789 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005790 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005791
Mike Stroyan10b8cb72016-01-22 15:22:03 -07005792 m_errorMonitor->SetBailout(NULL);
5793
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005794 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005795
Chia-I Wuf7458c52015-10-26 21:10:41 +08005796 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005797}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005798#endif // GTEST_IS_THREADSAFE
5799#endif // THREADING_TESTS
5800
Chris Forbes9f7ff632015-05-25 11:13:08 +12005801#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07005802TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005803 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12005804 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005805
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005806 ASSERT_NO_FATAL_FAILURE(InitState());
5807 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5808
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005809 VkShaderModule module;
5810 VkShaderModuleCreateInfo moduleCreateInfo;
5811 struct icd_spv_header spv;
5812
5813 spv.magic = ICD_SPV_MAGIC;
5814 spv.version = ICD_SPV_VERSION;
5815 spv.gen_magic = 0;
5816
5817 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
5818 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07005819 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005820 moduleCreateInfo.codeSize = 4;
5821 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005822 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005823
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005824 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005825}
5826
Karl Schultz6addd812016-02-02 17:17:23 -07005827TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005828 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12005829 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005830
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005831 ASSERT_NO_FATAL_FAILURE(InitState());
5832 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5833
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005834 VkShaderModule module;
5835 VkShaderModuleCreateInfo moduleCreateInfo;
5836 struct icd_spv_header spv;
5837
5838 spv.magic = ~ICD_SPV_MAGIC;
5839 spv.version = ICD_SPV_VERSION;
5840 spv.gen_magic = 0;
5841
5842 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
5843 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07005844 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005845 moduleCreateInfo.codeSize = sizeof(spv) + 10;
5846 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005847 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005848
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005849 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005850}
5851
Chris Forbesb4afd0f2016-04-04 10:48:35 +12005852#if 0
5853// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07005854TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005855 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12005856 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005857
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005858 ASSERT_NO_FATAL_FAILURE(InitState());
5859 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5860
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005861 VkShaderModule module;
5862 VkShaderModuleCreateInfo moduleCreateInfo;
5863 struct icd_spv_header spv;
5864
5865 spv.magic = ICD_SPV_MAGIC;
5866 spv.version = ~ICD_SPV_VERSION;
5867 spv.gen_magic = 0;
5868
5869 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
5870 moduleCreateInfo.pNext = NULL;
5871
Karl Schultz6addd812016-02-02 17:17:23 -07005872 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005873 moduleCreateInfo.codeSize = sizeof(spv) + 10;
5874 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005875 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005876
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005877 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005878}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12005879#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005880
Karl Schultz6addd812016-02-02 17:17:23 -07005881TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005882 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005883 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005884
Chris Forbes9f7ff632015-05-25 11:13:08 +12005885 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005886 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12005887
5888 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005889 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005890 "\n"
5891 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07005892 "out gl_PerVertex {\n"
5893 " vec4 gl_Position;\n"
5894 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005895 "void main(){\n"
5896 " gl_Position = vec4(1);\n"
5897 " x = 0;\n"
5898 "}\n";
5899 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005900 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005901 "\n"
5902 "layout(location=0) out vec4 color;\n"
5903 "void main(){\n"
5904 " color = vec4(1);\n"
5905 "}\n";
5906
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005907 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5908 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12005909
5910 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005911 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12005912 pipe.AddShader(&vs);
5913 pipe.AddShader(&fs);
5914
Chris Forbes9f7ff632015-05-25 11:13:08 +12005915 VkDescriptorSetObj descriptorSet(m_device);
5916 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005917 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12005918
Tony Barbour5781e8f2015-08-04 16:23:11 -06005919 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12005920
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005921 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12005922}
Chris Forbes9f7ff632015-05-25 11:13:08 +12005923
Karl Schultz6addd812016-02-02 17:17:23 -07005924TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005926 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005927
Chris Forbes59cb88d2015-05-25 11:13:13 +12005928 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005929 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12005930
5931 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005932 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005933 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005934 "out gl_PerVertex {\n"
5935 " vec4 gl_Position;\n"
5936 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005937 "void main(){\n"
5938 " gl_Position = vec4(1);\n"
5939 "}\n";
5940 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005941 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005942 "\n"
5943 "layout(location=0) in float x;\n"
5944 "layout(location=0) out vec4 color;\n"
5945 "void main(){\n"
5946 " color = vec4(x);\n"
5947 "}\n";
5948
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005949 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5950 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12005951
5952 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005953 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12005954 pipe.AddShader(&vs);
5955 pipe.AddShader(&fs);
5956
Chris Forbes59cb88d2015-05-25 11:13:13 +12005957 VkDescriptorSetObj descriptorSet(m_device);
5958 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005959 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12005960
Tony Barbour5781e8f2015-08-04 16:23:11 -06005961 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12005962
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005963 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12005964}
5965
Karl Schultz6addd812016-02-02 17:17:23 -07005966TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13005967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005968 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13005969
5970 ASSERT_NO_FATAL_FAILURE(InitState());
5971 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5972
5973 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005974 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13005975 "\n"
5976 "out gl_PerVertex {\n"
5977 " vec4 gl_Position;\n"
5978 "};\n"
5979 "void main(){\n"
5980 " gl_Position = vec4(1);\n"
5981 "}\n";
5982 char const *fsSource =
5983 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13005984 "\n"
5985 "in block { layout(location=0) float x; } ins;\n"
5986 "layout(location=0) out vec4 color;\n"
5987 "void main(){\n"
5988 " color = vec4(ins.x);\n"
5989 "}\n";
5990
5991 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5992 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5993
5994 VkPipelineObj pipe(m_device);
5995 pipe.AddColorAttachment();
5996 pipe.AddShader(&vs);
5997 pipe.AddShader(&fs);
5998
5999 VkDescriptorSetObj descriptorSet(m_device);
6000 descriptorSet.AppendDummy();
6001 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6002
6003 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6004
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006005 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006006}
6007
Karl Schultz6addd812016-02-02 17:17:23 -07006008TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13006009 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13006010 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07006011 "output arr[2] of float32' vs 'ptr to "
6012 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13006013
6014 ASSERT_NO_FATAL_FAILURE(InitState());
6015 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6016
6017 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006018 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006019 "\n"
6020 "layout(location=0) out float x[2];\n"
6021 "out gl_PerVertex {\n"
6022 " vec4 gl_Position;\n"
6023 "};\n"
6024 "void main(){\n"
6025 " x[0] = 0; x[1] = 0;\n"
6026 " gl_Position = vec4(1);\n"
6027 "}\n";
6028 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006029 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006030 "\n"
6031 "layout(location=0) in float x[3];\n"
6032 "layout(location=0) out vec4 color;\n"
6033 "void main(){\n"
6034 " color = vec4(x[0] + x[1] + x[2]);\n"
6035 "}\n";
6036
6037 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6038 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6039
6040 VkPipelineObj pipe(m_device);
6041 pipe.AddColorAttachment();
6042 pipe.AddShader(&vs);
6043 pipe.AddShader(&fs);
6044
6045 VkDescriptorSetObj descriptorSet(m_device);
6046 descriptorSet.AppendDummy();
6047 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6048
6049 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6050
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006051 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13006052}
6053
Karl Schultz6addd812016-02-02 17:17:23 -07006054TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006055 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006056 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006057
Chris Forbesb56af562015-05-25 11:13:17 +12006058 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006059 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12006060
6061 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006062 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006063 "\n"
6064 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006065 "out gl_PerVertex {\n"
6066 " vec4 gl_Position;\n"
6067 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006068 "void main(){\n"
6069 " x = 0;\n"
6070 " gl_Position = vec4(1);\n"
6071 "}\n";
6072 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006073 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006074 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006075 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12006076 "layout(location=0) out vec4 color;\n"
6077 "void main(){\n"
6078 " color = vec4(x);\n"
6079 "}\n";
6080
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006081 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6082 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12006083
6084 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006085 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12006086 pipe.AddShader(&vs);
6087 pipe.AddShader(&fs);
6088
Chris Forbesb56af562015-05-25 11:13:17 +12006089 VkDescriptorSetObj descriptorSet(m_device);
6090 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006091 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12006092
Tony Barbour5781e8f2015-08-04 16:23:11 -06006093 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12006094
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006095 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12006096}
6097
Karl Schultz6addd812016-02-02 17:17:23 -07006098TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006099 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006100 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006101
6102 ASSERT_NO_FATAL_FAILURE(InitState());
6103 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6104
6105 char const *vsSource =
6106 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006107 "\n"
6108 "out block { layout(location=0) int x; } outs;\n"
6109 "out gl_PerVertex {\n"
6110 " vec4 gl_Position;\n"
6111 "};\n"
6112 "void main(){\n"
6113 " outs.x = 0;\n"
6114 " gl_Position = vec4(1);\n"
6115 "}\n";
6116 char const *fsSource =
6117 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006118 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006119 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13006120 "layout(location=0) out vec4 color;\n"
6121 "void main(){\n"
6122 " color = vec4(ins.x);\n"
6123 "}\n";
6124
6125 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6126 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6127
6128 VkPipelineObj pipe(m_device);
6129 pipe.AddColorAttachment();
6130 pipe.AddShader(&vs);
6131 pipe.AddShader(&fs);
6132
6133 VkDescriptorSetObj descriptorSet(m_device);
6134 descriptorSet.AppendDummy();
6135 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6136
6137 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6138
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006139 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006140}
6141
6142TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
6143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6144 "location 0.0 which is not written by vertex shader");
6145
6146 ASSERT_NO_FATAL_FAILURE(InitState());
6147 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6148
6149 char const *vsSource =
6150 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006151 "\n"
6152 "out block { layout(location=1) float x; } outs;\n"
6153 "out gl_PerVertex {\n"
6154 " vec4 gl_Position;\n"
6155 "};\n"
6156 "void main(){\n"
6157 " outs.x = 0;\n"
6158 " gl_Position = vec4(1);\n"
6159 "}\n";
6160 char const *fsSource =
6161 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006162 "\n"
6163 "in block { layout(location=0) float x; } ins;\n"
6164 "layout(location=0) out vec4 color;\n"
6165 "void main(){\n"
6166 " color = vec4(ins.x);\n"
6167 "}\n";
6168
6169 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6170 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6171
6172 VkPipelineObj pipe(m_device);
6173 pipe.AddColorAttachment();
6174 pipe.AddShader(&vs);
6175 pipe.AddShader(&fs);
6176
6177 VkDescriptorSetObj descriptorSet(m_device);
6178 descriptorSet.AppendDummy();
6179 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6180
6181 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6182
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006183 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006184}
6185
6186TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
6187 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6188 "location 0.1 which is not written by vertex shader");
6189
6190 ASSERT_NO_FATAL_FAILURE(InitState());
6191 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6192
6193 char const *vsSource =
6194 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006195 "\n"
6196 "out block { layout(location=0, component=0) float x; } outs;\n"
6197 "out gl_PerVertex {\n"
6198 " vec4 gl_Position;\n"
6199 "};\n"
6200 "void main(){\n"
6201 " outs.x = 0;\n"
6202 " gl_Position = vec4(1);\n"
6203 "}\n";
6204 char const *fsSource =
6205 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006206 "\n"
6207 "in block { layout(location=0, component=1) float x; } ins;\n"
6208 "layout(location=0) out vec4 color;\n"
6209 "void main(){\n"
6210 " color = vec4(ins.x);\n"
6211 "}\n";
6212
6213 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6214 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6215
6216 VkPipelineObj pipe(m_device);
6217 pipe.AddColorAttachment();
6218 pipe.AddShader(&vs);
6219 pipe.AddShader(&fs);
6220
6221 VkDescriptorSetObj descriptorSet(m_device);
6222 descriptorSet.AppendDummy();
6223 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6224
6225 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6226
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006227 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006228}
6229
Karl Schultz6addd812016-02-02 17:17:23 -07006230TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006232 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006233
Chris Forbesde136e02015-05-25 11:13:28 +12006234 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006235 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12006236
6237 VkVertexInputBindingDescription input_binding;
6238 memset(&input_binding, 0, sizeof(input_binding));
6239
6240 VkVertexInputAttributeDescription input_attrib;
6241 memset(&input_attrib, 0, sizeof(input_attrib));
6242 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6243
6244 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006245 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006246 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006247 "out gl_PerVertex {\n"
6248 " vec4 gl_Position;\n"
6249 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006250 "void main(){\n"
6251 " gl_Position = vec4(1);\n"
6252 "}\n";
6253 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006254 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006255 "\n"
6256 "layout(location=0) out vec4 color;\n"
6257 "void main(){\n"
6258 " color = vec4(1);\n"
6259 "}\n";
6260
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006261 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6262 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12006263
6264 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006265 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12006266 pipe.AddShader(&vs);
6267 pipe.AddShader(&fs);
6268
6269 pipe.AddVertexInputBindings(&input_binding, 1);
6270 pipe.AddVertexInputAttribs(&input_attrib, 1);
6271
Chris Forbesde136e02015-05-25 11:13:28 +12006272 VkDescriptorSetObj descriptorSet(m_device);
6273 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006274 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12006275
Tony Barbour5781e8f2015-08-04 16:23:11 -06006276 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12006277
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006278 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12006279}
6280
Karl Schultz6addd812016-02-02 17:17:23 -07006281TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006283 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13006284
6285 ASSERT_NO_FATAL_FAILURE(InitState());
6286 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6287
6288 VkVertexInputBindingDescription input_binding;
6289 memset(&input_binding, 0, sizeof(input_binding));
6290
6291 VkVertexInputAttributeDescription input_attrib;
6292 memset(&input_attrib, 0, sizeof(input_attrib));
6293 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6294
6295 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006296 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006297 "\n"
6298 "layout(location=1) in float x;\n"
6299 "out gl_PerVertex {\n"
6300 " vec4 gl_Position;\n"
6301 "};\n"
6302 "void main(){\n"
6303 " gl_Position = vec4(x);\n"
6304 "}\n";
6305 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006306 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006307 "\n"
6308 "layout(location=0) out vec4 color;\n"
6309 "void main(){\n"
6310 " color = vec4(1);\n"
6311 "}\n";
6312
6313 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6314 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6315
6316 VkPipelineObj pipe(m_device);
6317 pipe.AddColorAttachment();
6318 pipe.AddShader(&vs);
6319 pipe.AddShader(&fs);
6320
6321 pipe.AddVertexInputBindings(&input_binding, 1);
6322 pipe.AddVertexInputAttribs(&input_attrib, 1);
6323
6324 VkDescriptorSetObj descriptorSet(m_device);
6325 descriptorSet.AppendDummy();
6326 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6327
6328 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6329
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006330 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13006331}
6332
Karl Schultz6addd812016-02-02 17:17:23 -07006333TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
6334 m_errorMonitor->SetDesiredFailureMsg(
6335 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006336 "VS consumes input at location 0 but not provided");
6337
Chris Forbes62e8e502015-05-25 11:13:29 +12006338 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006339 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12006340
6341 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006342 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006343 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006344 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07006345 "out gl_PerVertex {\n"
6346 " vec4 gl_Position;\n"
6347 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006348 "void main(){\n"
6349 " gl_Position = x;\n"
6350 "}\n";
6351 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006352 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006353 "\n"
6354 "layout(location=0) out vec4 color;\n"
6355 "void main(){\n"
6356 " color = vec4(1);\n"
6357 "}\n";
6358
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006359 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6360 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12006361
6362 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006363 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12006364 pipe.AddShader(&vs);
6365 pipe.AddShader(&fs);
6366
Chris Forbes62e8e502015-05-25 11:13:29 +12006367 VkDescriptorSetObj descriptorSet(m_device);
6368 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006369 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12006370
Tony Barbour5781e8f2015-08-04 16:23:11 -06006371 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12006372
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006373 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12006374}
6375
Karl Schultz6addd812016-02-02 17:17:23 -07006376TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
6377 m_errorMonitor->SetDesiredFailureMsg(
6378 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006379 "location 0 does not match VS input type");
6380
Chris Forbesc97d98e2015-05-25 11:13:31 +12006381 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006382 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006383
6384 VkVertexInputBindingDescription input_binding;
6385 memset(&input_binding, 0, sizeof(input_binding));
6386
6387 VkVertexInputAttributeDescription input_attrib;
6388 memset(&input_attrib, 0, sizeof(input_attrib));
6389 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6390
6391 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006392 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006393 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006394 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07006395 "out gl_PerVertex {\n"
6396 " vec4 gl_Position;\n"
6397 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006398 "void main(){\n"
6399 " gl_Position = vec4(x);\n"
6400 "}\n";
6401 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006402 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006403 "\n"
6404 "layout(location=0) out vec4 color;\n"
6405 "void main(){\n"
6406 " color = vec4(1);\n"
6407 "}\n";
6408
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006409 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6410 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006411
6412 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006413 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006414 pipe.AddShader(&vs);
6415 pipe.AddShader(&fs);
6416
6417 pipe.AddVertexInputBindings(&input_binding, 1);
6418 pipe.AddVertexInputAttribs(&input_attrib, 1);
6419
Chris Forbesc97d98e2015-05-25 11:13:31 +12006420 VkDescriptorSetObj descriptorSet(m_device);
6421 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006422 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006423
Tony Barbour5781e8f2015-08-04 16:23:11 -06006424 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006425
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006426 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006427}
6428
Chris Forbesc68b43c2016-04-06 11:18:47 +12006429TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
6430 m_errorMonitor->SetDesiredFailureMsg(
6431 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6432 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
6433
6434 ASSERT_NO_FATAL_FAILURE(InitState());
6435 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6436
6437 char const *vsSource =
6438 "#version 450\n"
6439 "\n"
6440 "out gl_PerVertex {\n"
6441 " vec4 gl_Position;\n"
6442 "};\n"
6443 "void main(){\n"
6444 " gl_Position = vec4(1);\n"
6445 "}\n";
6446 char const *fsSource =
6447 "#version 450\n"
6448 "\n"
6449 "layout(location=0) out vec4 color;\n"
6450 "void main(){\n"
6451 " color = vec4(1);\n"
6452 "}\n";
6453
6454 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6455 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6456
6457 VkPipelineObj pipe(m_device);
6458 pipe.AddColorAttachment();
6459 pipe.AddShader(&vs);
6460 pipe.AddShader(&vs);
6461 pipe.AddShader(&fs);
6462
6463 VkDescriptorSetObj descriptorSet(m_device);
6464 descriptorSet.AppendDummy();
6465 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6466
6467 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6468
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006469 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12006470}
6471
Karl Schultz6addd812016-02-02 17:17:23 -07006472TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006473 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13006474
6475 ASSERT_NO_FATAL_FAILURE(InitState());
6476 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6477
6478 VkVertexInputBindingDescription input_binding;
6479 memset(&input_binding, 0, sizeof(input_binding));
6480
6481 VkVertexInputAttributeDescription input_attribs[2];
6482 memset(input_attribs, 0, sizeof(input_attribs));
6483
6484 for (int i = 0; i < 2; i++) {
6485 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
6486 input_attribs[i].location = i;
6487 }
6488
6489 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006490 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006491 "\n"
6492 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006493 "out gl_PerVertex {\n"
6494 " vec4 gl_Position;\n"
6495 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006496 "void main(){\n"
6497 " gl_Position = x[0] + x[1];\n"
6498 "}\n";
6499 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006500 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006501 "\n"
6502 "layout(location=0) out vec4 color;\n"
6503 "void main(){\n"
6504 " color = vec4(1);\n"
6505 "}\n";
6506
6507 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6508 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6509
6510 VkPipelineObj pipe(m_device);
6511 pipe.AddColorAttachment();
6512 pipe.AddShader(&vs);
6513 pipe.AddShader(&fs);
6514
6515 pipe.AddVertexInputBindings(&input_binding, 1);
6516 pipe.AddVertexInputAttribs(input_attribs, 2);
6517
6518 VkDescriptorSetObj descriptorSet(m_device);
6519 descriptorSet.AppendDummy();
6520 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6521
6522 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6523
6524 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006525 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13006526}
6527
Chris Forbes2682b242015-11-24 11:13:14 +13006528TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
6529{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006530 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13006531
6532 ASSERT_NO_FATAL_FAILURE(InitState());
6533 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6534
6535 VkVertexInputBindingDescription input_binding;
6536 memset(&input_binding, 0, sizeof(input_binding));
6537
6538 VkVertexInputAttributeDescription input_attribs[2];
6539 memset(input_attribs, 0, sizeof(input_attribs));
6540
6541 for (int i = 0; i < 2; i++) {
6542 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
6543 input_attribs[i].location = i;
6544 }
6545
6546 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006547 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006548 "\n"
6549 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07006550 "out gl_PerVertex {\n"
6551 " vec4 gl_Position;\n"
6552 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006553 "void main(){\n"
6554 " gl_Position = x[0] + x[1];\n"
6555 "}\n";
6556 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006557 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006558 "\n"
6559 "layout(location=0) out vec4 color;\n"
6560 "void main(){\n"
6561 " color = vec4(1);\n"
6562 "}\n";
6563
6564 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6565 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6566
6567 VkPipelineObj pipe(m_device);
6568 pipe.AddColorAttachment();
6569 pipe.AddShader(&vs);
6570 pipe.AddShader(&fs);
6571
6572 pipe.AddVertexInputBindings(&input_binding, 1);
6573 pipe.AddVertexInputAttribs(input_attribs, 2);
6574
6575 VkDescriptorSetObj descriptorSet(m_device);
6576 descriptorSet.AppendDummy();
6577 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6578
6579 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6580
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006581 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13006582}
Chris Forbes2682b242015-11-24 11:13:14 +13006583
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006584TEST_F(VkLayerTest, CreatePipelineSimplePositive)
6585{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006586 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006587
6588 ASSERT_NO_FATAL_FAILURE(InitState());
6589 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6590
6591 char const *vsSource =
6592 "#version 450\n"
6593 "out gl_PerVertex {\n"
6594 " vec4 gl_Position;\n"
6595 "};\n"
6596 "void main(){\n"
6597 " gl_Position = vec4(0);\n"
6598 "}\n";
6599 char const *fsSource =
6600 "#version 450\n"
6601 "\n"
6602 "layout(location=0) out vec4 color;\n"
6603 "void main(){\n"
6604 " color = vec4(1);\n"
6605 "}\n";
6606
6607 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6608 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6609
6610 VkPipelineObj pipe(m_device);
6611 pipe.AddColorAttachment();
6612 pipe.AddShader(&vs);
6613 pipe.AddShader(&fs);
6614
6615 VkDescriptorSetObj descriptorSet(m_device);
6616 descriptorSet.AppendDummy();
6617 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6618
6619 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6620
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006621 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006622}
6623
Chris Forbes912c9192016-04-05 17:50:35 +12006624TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
6625{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006626 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12006627
6628 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
6629
6630 ASSERT_NO_FATAL_FAILURE(InitState());
6631 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6632
6633 char const *vsSource =
6634 "#version 450\n"
6635 "out gl_PerVertex {\n"
6636 " vec4 gl_Position;\n"
6637 "};\n"
6638 "layout(location=0) out vec3 x;\n"
6639 "layout(location=1) out ivec3 y;\n"
6640 "layout(location=2) out vec3 z;\n"
6641 "void main(){\n"
6642 " gl_Position = vec4(0);\n"
6643 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
6644 "}\n";
6645 char const *fsSource =
6646 "#version 450\n"
6647 "\n"
6648 "layout(location=0) out vec4 color;\n"
6649 "layout(location=0) in float x;\n"
6650 "layout(location=1) flat in int y;\n"
6651 "layout(location=2) in vec2 z;\n"
6652 "void main(){\n"
6653 " color = vec4(1 + x + y + z.x);\n"
6654 "}\n";
6655
6656 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6657 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6658
6659 VkPipelineObj pipe(m_device);
6660 pipe.AddColorAttachment();
6661 pipe.AddShader(&vs);
6662 pipe.AddShader(&fs);
6663
6664 VkDescriptorSetObj descriptorSet(m_device);
6665 descriptorSet.AppendDummy();
6666 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6667
6668 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6669
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006670 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12006671}
6672
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006673TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
6674{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006675 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006676
6677 ASSERT_NO_FATAL_FAILURE(InitState());
6678 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6679
Chris Forbesc1e852d2016-04-04 19:26:42 +12006680 if (!m_device->phy().features().tessellationShader) {
6681 printf("Device does not support tessellation shaders; skipped.\n");
6682 return;
6683 }
6684
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006685 char const *vsSource =
6686 "#version 450\n"
6687 "void main(){}\n";
6688 char const *tcsSource =
6689 "#version 450\n"
6690 "layout(location=0) out int x[];\n"
6691 "layout(vertices=3) out;\n"
6692 "void main(){\n"
6693 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
6694 " gl_TessLevelInner[0] = 1;\n"
6695 " x[gl_InvocationID] = gl_InvocationID;\n"
6696 "}\n";
6697 char const *tesSource =
6698 "#version 450\n"
6699 "layout(triangles, equal_spacing, cw) in;\n"
6700 "layout(location=0) in int x[];\n"
6701 "out gl_PerVertex { vec4 gl_Position; };\n"
6702 "void main(){\n"
6703 " gl_Position.xyz = gl_TessCoord;\n"
6704 " gl_Position.w = x[0] + x[1] + x[2];\n"
6705 "}\n";
6706 char const *fsSource =
6707 "#version 450\n"
6708 "layout(location=0) out vec4 color;\n"
6709 "void main(){\n"
6710 " color = vec4(1);\n"
6711 "}\n";
6712
6713 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6714 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
6715 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
6716 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6717
6718 VkPipelineInputAssemblyStateCreateInfo iasci{
6719 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
6720 nullptr,
6721 0,
6722 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
6723 VK_FALSE};
6724
Chris Forbesb4cacb62016-04-04 19:15:00 +12006725 VkPipelineTessellationStateCreateInfo tsci{
6726 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
6727 nullptr,
6728 0,
6729 3};
6730
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006731 VkPipelineObj pipe(m_device);
6732 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12006733 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006734 pipe.AddColorAttachment();
6735 pipe.AddShader(&vs);
6736 pipe.AddShader(&tcs);
6737 pipe.AddShader(&tes);
6738 pipe.AddShader(&fs);
6739
6740 VkDescriptorSetObj descriptorSet(m_device);
6741 descriptorSet.AppendDummy();
6742 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6743
6744 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6745
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006746 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006747}
6748
Chris Forbesa0ab8152016-04-20 13:34:27 +12006749TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
6750{
6751 m_errorMonitor->ExpectSuccess();
6752
6753 ASSERT_NO_FATAL_FAILURE(InitState());
6754 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6755
6756 if (!m_device->phy().features().geometryShader) {
6757 printf("Device does not support geometry shaders; skipped.\n");
6758 return;
6759 }
6760
6761 char const *vsSource =
6762 "#version 450\n"
6763 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
6764 "void main(){\n"
6765 " vs_out.x = vec4(1);\n"
6766 "}\n";
6767 char const *gsSource =
6768 "#version 450\n"
6769 "layout(triangles) in;\n"
6770 "layout(triangle_strip, max_vertices=3) out;\n"
6771 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
6772 "out gl_PerVertex { vec4 gl_Position; };\n"
6773 "void main() {\n"
6774 " gl_Position = gs_in[0].x;\n"
6775 " EmitVertex();\n"
6776 "}\n";
6777 char const *fsSource =
6778 "#version 450\n"
6779 "layout(location=0) out vec4 color;\n"
6780 "void main(){\n"
6781 " color = vec4(1);\n"
6782 "}\n";
6783
6784 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6785 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
6786 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6787
6788 VkPipelineObj pipe(m_device);
6789 pipe.AddColorAttachment();
6790 pipe.AddShader(&vs);
6791 pipe.AddShader(&gs);
6792 pipe.AddShader(&fs);
6793
6794 VkDescriptorSetObj descriptorSet(m_device);
6795 descriptorSet.AppendDummy();
6796 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6797
6798 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6799
6800 m_errorMonitor->VerifyNotFound();
6801}
6802
Chris Forbesa0193bc2016-04-04 19:19:47 +12006803TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
6804{
6805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6806 "is per-vertex in tessellation control shader stage "
6807 "but per-patch in tessellation evaluation shader stage");
6808
6809 ASSERT_NO_FATAL_FAILURE(InitState());
6810 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6811
Chris Forbesc1e852d2016-04-04 19:26:42 +12006812 if (!m_device->phy().features().tessellationShader) {
6813 printf("Device does not support tessellation shaders; skipped.\n");
6814 return;
6815 }
6816
Chris Forbesa0193bc2016-04-04 19:19:47 +12006817 char const *vsSource =
6818 "#version 450\n"
6819 "void main(){}\n";
6820 char const *tcsSource =
6821 "#version 450\n"
6822 "layout(location=0) out int x[];\n"
6823 "layout(vertices=3) out;\n"
6824 "void main(){\n"
6825 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
6826 " gl_TessLevelInner[0] = 1;\n"
6827 " x[gl_InvocationID] = gl_InvocationID;\n"
6828 "}\n";
6829 char const *tesSource =
6830 "#version 450\n"
6831 "layout(triangles, equal_spacing, cw) in;\n"
6832 "layout(location=0) patch in int x;\n"
6833 "out gl_PerVertex { vec4 gl_Position; };\n"
6834 "void main(){\n"
6835 " gl_Position.xyz = gl_TessCoord;\n"
6836 " gl_Position.w = x;\n"
6837 "}\n";
6838 char const *fsSource =
6839 "#version 450\n"
6840 "layout(location=0) out vec4 color;\n"
6841 "void main(){\n"
6842 " color = vec4(1);\n"
6843 "}\n";
6844
6845 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6846 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
6847 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
6848 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6849
6850 VkPipelineInputAssemblyStateCreateInfo iasci{
6851 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
6852 nullptr,
6853 0,
6854 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
6855 VK_FALSE};
6856
6857 VkPipelineTessellationStateCreateInfo tsci{
6858 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
6859 nullptr,
6860 0,
6861 3};
6862
6863 VkPipelineObj pipe(m_device);
6864 pipe.SetInputAssembly(&iasci);
6865 pipe.SetTessellation(&tsci);
6866 pipe.AddColorAttachment();
6867 pipe.AddShader(&vs);
6868 pipe.AddShader(&tcs);
6869 pipe.AddShader(&tes);
6870 pipe.AddShader(&fs);
6871
6872 VkDescriptorSetObj descriptorSet(m_device);
6873 descriptorSet.AppendDummy();
6874 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6875
6876 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6877
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006878 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12006879}
6880
Karl Schultz6addd812016-02-02 17:17:23 -07006881TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
6882 m_errorMonitor->SetDesiredFailureMsg(
6883 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006884 "Duplicate vertex input binding descriptions for binding 0");
6885
Chris Forbes280ba2c2015-06-12 11:16:41 +12006886 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006887 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12006888
6889 /* Two binding descriptions for binding 0 */
6890 VkVertexInputBindingDescription input_bindings[2];
6891 memset(input_bindings, 0, sizeof(input_bindings));
6892
6893 VkVertexInputAttributeDescription input_attrib;
6894 memset(&input_attrib, 0, sizeof(input_attrib));
6895 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6896
6897 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006898 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12006899 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006900 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07006901 "out gl_PerVertex {\n"
6902 " vec4 gl_Position;\n"
6903 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12006904 "void main(){\n"
6905 " gl_Position = vec4(x);\n"
6906 "}\n";
6907 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006908 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12006909 "\n"
6910 "layout(location=0) out vec4 color;\n"
6911 "void main(){\n"
6912 " color = vec4(1);\n"
6913 "}\n";
6914
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006915 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6916 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12006917
6918 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006919 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12006920 pipe.AddShader(&vs);
6921 pipe.AddShader(&fs);
6922
6923 pipe.AddVertexInputBindings(input_bindings, 2);
6924 pipe.AddVertexInputAttribs(&input_attrib, 1);
6925
Chris Forbes280ba2c2015-06-12 11:16:41 +12006926 VkDescriptorSetObj descriptorSet(m_device);
6927 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006928 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12006929
Tony Barbour5781e8f2015-08-04 16:23:11 -06006930 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12006931
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006932 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12006933}
Chris Forbes8f68b562015-05-25 11:13:32 +12006934
Chris Forbes35efec72016-04-21 14:32:08 +12006935TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
6936 m_errorMonitor->ExpectSuccess();
6937
6938 ASSERT_NO_FATAL_FAILURE(InitState());
6939 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6940
6941 if (!m_device->phy().features().tessellationShader) {
6942 printf("Device does not support 64bit vertex attributes; skipped.\n");
6943 return;
6944 }
6945
6946 VkVertexInputBindingDescription input_bindings[1];
6947 memset(input_bindings, 0, sizeof(input_bindings));
6948
6949 VkVertexInputAttributeDescription input_attribs[4];
6950 memset(input_attribs, 0, sizeof(input_attribs));
6951 input_attribs[0].location = 0;
6952 input_attribs[0].offset = 0;
6953 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
6954 input_attribs[1].location = 2;
6955 input_attribs[1].offset = 32;
6956 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
6957 input_attribs[2].location = 4;
6958 input_attribs[2].offset = 64;
6959 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
6960 input_attribs[3].location = 6;
6961 input_attribs[3].offset = 96;
6962 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
6963
6964 char const *vsSource =
6965 "#version 450\n"
6966 "\n"
6967 "layout(location=0) in dmat4 x;\n"
6968 "out gl_PerVertex {\n"
6969 " vec4 gl_Position;\n"
6970 "};\n"
6971 "void main(){\n"
6972 " gl_Position = vec4(x[0][0]);\n"
6973 "}\n";
6974 char const *fsSource =
6975 "#version 450\n"
6976 "\n"
6977 "layout(location=0) out vec4 color;\n"
6978 "void main(){\n"
6979 " color = vec4(1);\n"
6980 "}\n";
6981
6982 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6983 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6984
6985 VkPipelineObj pipe(m_device);
6986 pipe.AddColorAttachment();
6987 pipe.AddShader(&vs);
6988 pipe.AddShader(&fs);
6989
6990 pipe.AddVertexInputBindings(input_bindings, 1);
6991 pipe.AddVertexInputAttribs(input_attribs, 4);
6992
6993 VkDescriptorSetObj descriptorSet(m_device);
6994 descriptorSet.AppendDummy();
6995 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6996
6997 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6998
6999 m_errorMonitor->VerifyNotFound();
7000}
7001
Karl Schultz6addd812016-02-02 17:17:23 -07007002TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007003 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007004 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007005
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007006 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007007
7008 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007009 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007010 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007011 "out gl_PerVertex {\n"
7012 " vec4 gl_Position;\n"
7013 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007014 "void main(){\n"
7015 " gl_Position = vec4(1);\n"
7016 "}\n";
7017 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007018 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007019 "\n"
7020 "void main(){\n"
7021 "}\n";
7022
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007023 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7024 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007025
7026 VkPipelineObj pipe(m_device);
7027 pipe.AddShader(&vs);
7028 pipe.AddShader(&fs);
7029
Chia-I Wu08accc62015-07-07 11:50:03 +08007030 /* set up CB 0, not written */
7031 pipe.AddColorAttachment();
7032 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007033
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007034 VkDescriptorSetObj descriptorSet(m_device);
7035 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007036 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007037
Tony Barbour5781e8f2015-08-04 16:23:11 -06007038 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007039
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007040 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007041}
7042
Karl Schultz6addd812016-02-02 17:17:23 -07007043TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07007044 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007045 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007046 "FS writes to output location 1 with no matching attachment");
7047
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007048 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007049
7050 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007051 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007052 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007053 "out gl_PerVertex {\n"
7054 " vec4 gl_Position;\n"
7055 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007056 "void main(){\n"
7057 " gl_Position = vec4(1);\n"
7058 "}\n";
7059 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007060 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007061 "\n"
7062 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007063 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007064 "void main(){\n"
7065 " x = vec4(1);\n"
7066 " y = vec4(1);\n"
7067 "}\n";
7068
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007069 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7070 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007071
7072 VkPipelineObj pipe(m_device);
7073 pipe.AddShader(&vs);
7074 pipe.AddShader(&fs);
7075
Chia-I Wu08accc62015-07-07 11:50:03 +08007076 /* set up CB 0, not written */
7077 pipe.AddColorAttachment();
7078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007079 /* FS writes CB 1, but we don't configure it */
7080
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007081 VkDescriptorSetObj descriptorSet(m_device);
7082 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007083 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007084
Tony Barbour5781e8f2015-08-04 16:23:11 -06007085 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007086
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007087 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007088}
7089
Karl Schultz6addd812016-02-02 17:17:23 -07007090TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007091 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007092 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007093
Chris Forbesa36d69e2015-05-25 11:13:44 +12007094 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007095
7096 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007097 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007098 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007099 "out gl_PerVertex {\n"
7100 " vec4 gl_Position;\n"
7101 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007102 "void main(){\n"
7103 " gl_Position = vec4(1);\n"
7104 "}\n";
7105 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007106 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007107 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007108 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12007109 "void main(){\n"
7110 " x = ivec4(1);\n"
7111 "}\n";
7112
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007113 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7114 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007115
7116 VkPipelineObj pipe(m_device);
7117 pipe.AddShader(&vs);
7118 pipe.AddShader(&fs);
7119
Chia-I Wu08accc62015-07-07 11:50:03 +08007120 /* set up CB 0; type is UNORM by default */
7121 pipe.AddColorAttachment();
7122 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007123
Chris Forbesa36d69e2015-05-25 11:13:44 +12007124 VkDescriptorSetObj descriptorSet(m_device);
7125 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007126 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007127
Tony Barbour5781e8f2015-08-04 16:23:11 -06007128 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007129
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007130 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12007131}
Chris Forbes7b1b8932015-06-05 14:43:36 +12007132
Karl Schultz6addd812016-02-02 17:17:23 -07007133TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007134 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007135 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007136
Chris Forbes556c76c2015-08-14 12:04:59 +12007137 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12007138
7139 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007140 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007141 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007142 "out gl_PerVertex {\n"
7143 " vec4 gl_Position;\n"
7144 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007145 "void main(){\n"
7146 " gl_Position = vec4(1);\n"
7147 "}\n";
7148 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007149 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007150 "\n"
7151 "layout(location=0) out vec4 x;\n"
7152 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7153 "void main(){\n"
7154 " x = vec4(bar.y);\n"
7155 "}\n";
7156
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007157 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7158 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12007159
Chris Forbes556c76c2015-08-14 12:04:59 +12007160 VkPipelineObj pipe(m_device);
7161 pipe.AddShader(&vs);
7162 pipe.AddShader(&fs);
7163
7164 /* set up CB 0; type is UNORM by default */
7165 pipe.AddColorAttachment();
7166 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7167
7168 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007169 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12007170
7171 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7172
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007173 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12007174}
7175
Chris Forbes5c59e902016-02-26 16:56:09 +13007176TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
7177 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7178 "not declared in layout");
7179
7180 ASSERT_NO_FATAL_FAILURE(InitState());
7181
7182 char const *vsSource =
7183 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007184 "\n"
7185 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
7186 "out gl_PerVertex {\n"
7187 " vec4 gl_Position;\n"
7188 "};\n"
7189 "void main(){\n"
7190 " gl_Position = vec4(consts.x);\n"
7191 "}\n";
7192 char const *fsSource =
7193 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007194 "\n"
7195 "layout(location=0) out vec4 x;\n"
7196 "void main(){\n"
7197 " x = vec4(1);\n"
7198 "}\n";
7199
7200 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7201 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7202
7203 VkPipelineObj pipe(m_device);
7204 pipe.AddShader(&vs);
7205 pipe.AddShader(&fs);
7206
7207 /* set up CB 0; type is UNORM by default */
7208 pipe.AddColorAttachment();
7209 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7210
7211 VkDescriptorSetObj descriptorSet(m_device);
7212 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7213
7214 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7215
7216 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007217 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13007218}
7219
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007220#endif // SHADER_CHECKER_TESTS
7221
7222#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06007223TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07007224 m_errorMonitor->SetDesiredFailureMsg(
7225 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007226 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007227
7228 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007229
7230 // Create an image
7231 VkImage image;
7232
Karl Schultz6addd812016-02-02 17:17:23 -07007233 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7234 const int32_t tex_width = 32;
7235 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007236
7237 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007238 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7239 image_create_info.pNext = NULL;
7240 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7241 image_create_info.format = tex_format;
7242 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007243 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07007244 image_create_info.extent.depth = 1;
7245 image_create_info.mipLevels = 1;
7246 image_create_info.arrayLayers = 1;
7247 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7248 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7249 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7250 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007251
7252 // Introduce error by sending down a bogus width extent
7253 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007254 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007255
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007256 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007257}
7258
Mark Youngc48c4c12016-04-11 14:26:49 -06007259TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
7260 m_errorMonitor->SetDesiredFailureMsg(
7261 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7262 "CreateImage extents is 0 for at least one required dimension");
7263
7264 ASSERT_NO_FATAL_FAILURE(InitState());
7265
7266 // Create an image
7267 VkImage image;
7268
7269 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7270 const int32_t tex_width = 32;
7271 const int32_t tex_height = 32;
7272
7273 VkImageCreateInfo image_create_info = {};
7274 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7275 image_create_info.pNext = NULL;
7276 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7277 image_create_info.format = tex_format;
7278 image_create_info.extent.width = tex_width;
7279 image_create_info.extent.height = tex_height;
7280 image_create_info.extent.depth = 1;
7281 image_create_info.mipLevels = 1;
7282 image_create_info.arrayLayers = 1;
7283 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7284 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7285 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7286 image_create_info.flags = 0;
7287
7288 // Introduce error by sending down a bogus width extent
7289 image_create_info.extent.width = 0;
7290 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7291
7292 m_errorMonitor->VerifyFound();
7293}
7294
Karl Schultz6addd812016-02-02 17:17:23 -07007295TEST_F(VkLayerTest, UpdateBufferAlignment) {
7296 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06007297
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007298 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007299 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007300
Mike Stroyana3082432015-09-25 13:39:21 -06007301 ASSERT_NO_FATAL_FAILURE(InitState());
7302
7303 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7304 vk_testing::Buffer buffer;
7305 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7306
7307 BeginCommandBuffer();
7308 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007309 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007310 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007311
Mike Stroyana3082432015-09-25 13:39:21 -06007312 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007313 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007314 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007315
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007316 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007317 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007318 EndCommandBuffer();
7319}
7320
Karl Schultz6addd812016-02-02 17:17:23 -07007321TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007322 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007323 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06007324
7325 ASSERT_NO_FATAL_FAILURE(InitState());
7326
7327 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7328 vk_testing::Buffer buffer;
7329 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7330
7331 BeginCommandBuffer();
7332 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007333 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007334 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007335
Mike Stroyana3082432015-09-25 13:39:21 -06007336 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007337 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007338 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007339
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007340 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007341
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007342 m_errorMonitor->VerifyFound();
7343
Mike Stroyana3082432015-09-25 13:39:21 -06007344 EndCommandBuffer();
7345}
7346
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007347#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12007348
Tobin Ehliscde08892015-09-22 10:11:37 -06007349#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07007350TEST_F(VkLayerTest, InvalidImageView) {
7351 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06007352
Karl Schultz6addd812016-02-02 17:17:23 -07007353 m_errorMonitor->SetDesiredFailureMsg(
7354 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007355 "vkCreateImageView called with baseMipLevel 10 ");
7356
Tobin Ehliscde08892015-09-22 10:11:37 -06007357 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06007358
Mike Stroyana3082432015-09-25 13:39:21 -06007359 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07007360 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06007361
Karl Schultz6addd812016-02-02 17:17:23 -07007362 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7363 const int32_t tex_width = 32;
7364 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06007365
7366 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007367 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7368 image_create_info.pNext = NULL;
7369 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7370 image_create_info.format = tex_format;
7371 image_create_info.extent.width = tex_width;
7372 image_create_info.extent.height = tex_height;
7373 image_create_info.extent.depth = 1;
7374 image_create_info.mipLevels = 1;
7375 image_create_info.arrayLayers = 1;
7376 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7377 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7378 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7379 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06007380
Chia-I Wuf7458c52015-10-26 21:10:41 +08007381 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06007382 ASSERT_VK_SUCCESS(err);
7383
7384 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007385 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7386 image_view_create_info.image = image;
7387 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7388 image_view_create_info.format = tex_format;
7389 image_view_create_info.subresourceRange.layerCount = 1;
7390 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
7391 image_view_create_info.subresourceRange.levelCount = 1;
7392 image_view_create_info.subresourceRange.aspectMask =
7393 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06007394
7395 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007396 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7397 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06007398
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007399 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06007400}
Mike Stroyana3082432015-09-25 13:39:21 -06007401
Karl Schultz6addd812016-02-02 17:17:23 -07007402TEST_F(VkLayerTest, InvalidImageViewAspect) {
7403 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007404
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007406 "vkCreateImageView: Color image "
7407 "formats must have ONLY the "
7408 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007409
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007410 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007411
7412 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07007413 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007414
Karl Schultz6addd812016-02-02 17:17:23 -07007415 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7416 const int32_t tex_width = 32;
7417 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007418
7419 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007420 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7421 image_create_info.pNext = NULL;
7422 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7423 image_create_info.format = tex_format;
7424 image_create_info.extent.width = tex_width;
7425 image_create_info.extent.height = tex_height;
7426 image_create_info.extent.depth = 1;
7427 image_create_info.mipLevels = 1;
7428 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7429 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7430 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7431 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007432
Chia-I Wuf7458c52015-10-26 21:10:41 +08007433 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007434 ASSERT_VK_SUCCESS(err);
7435
7436 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007437 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7438 image_view_create_info.image = image;
7439 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7440 image_view_create_info.format = tex_format;
7441 image_view_create_info.subresourceRange.baseMipLevel = 0;
7442 image_view_create_info.subresourceRange.levelCount = 1;
7443 // Cause an error by setting an invalid image aspect
7444 image_view_create_info.subresourceRange.aspectMask =
7445 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007446
7447 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007448 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7449 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007450
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007451 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007452}
7453
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007454TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07007455 VkResult err;
7456 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007457
Karl Schultz6addd812016-02-02 17:17:23 -07007458 m_errorMonitor->SetDesiredFailureMsg(
7459 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007460 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007461
Mike Stroyana3082432015-09-25 13:39:21 -06007462 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007463
7464 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007465 VkImage srcImage;
7466 VkImage dstImage;
7467 VkDeviceMemory srcMem;
7468 VkDeviceMemory destMem;
7469 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007470
7471 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007472 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7473 image_create_info.pNext = NULL;
7474 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7475 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7476 image_create_info.extent.width = 32;
7477 image_create_info.extent.height = 32;
7478 image_create_info.extent.depth = 1;
7479 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007480 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07007481 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7482 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7483 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7484 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007485
Karl Schultz6addd812016-02-02 17:17:23 -07007486 err =
7487 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007488 ASSERT_VK_SUCCESS(err);
7489
Karl Schultz6addd812016-02-02 17:17:23 -07007490 err =
7491 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007492 ASSERT_VK_SUCCESS(err);
7493
7494 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007495 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007496 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7497 memAlloc.pNext = NULL;
7498 memAlloc.allocationSize = 0;
7499 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007500
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007501 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007502 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007503 pass =
7504 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007505 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007506 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007507 ASSERT_VK_SUCCESS(err);
7508
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007509 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007510 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007511 pass =
7512 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007513 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007514 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007515 ASSERT_VK_SUCCESS(err);
7516
7517 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7518 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007519 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007520 ASSERT_VK_SUCCESS(err);
7521
7522 BeginCommandBuffer();
7523 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007524 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007525 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007526 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007527 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06007528 copyRegion.srcOffset.x = 0;
7529 copyRegion.srcOffset.y = 0;
7530 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007531 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007532 copyRegion.dstSubresource.mipLevel = 0;
7533 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007534 // Introduce failure by forcing the dst layerCount to differ from src
7535 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007536 copyRegion.dstOffset.x = 0;
7537 copyRegion.dstOffset.y = 0;
7538 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007539 copyRegion.extent.width = 1;
7540 copyRegion.extent.height = 1;
7541 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007542 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7543 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007544 EndCommandBuffer();
7545
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007546 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007547
Chia-I Wuf7458c52015-10-26 21:10:41 +08007548 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007549 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007550 vkFreeMemory(m_device->device(), srcMem, NULL);
7551 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007552}
7553
Karl Schultz6addd812016-02-02 17:17:23 -07007554TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06007555 VkResult err;
7556 bool pass;
7557
7558 // Create color images with different format sizes and try to copy between them
7559 m_errorMonitor->SetDesiredFailureMsg(
7560 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7561 "vkCmdCopyImage called with unmatched source and dest image format sizes");
7562
7563 ASSERT_NO_FATAL_FAILURE(InitState());
7564
7565 // Create two images of different types and try to copy between them
7566 VkImage srcImage;
7567 VkImage dstImage;
7568 VkDeviceMemory srcMem;
7569 VkDeviceMemory destMem;
7570 VkMemoryRequirements memReqs;
7571
7572 VkImageCreateInfo image_create_info = {};
7573 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7574 image_create_info.pNext = NULL;
7575 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7576 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7577 image_create_info.extent.width = 32;
7578 image_create_info.extent.height = 32;
7579 image_create_info.extent.depth = 1;
7580 image_create_info.mipLevels = 1;
7581 image_create_info.arrayLayers = 1;
7582 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7583 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7584 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7585 image_create_info.flags = 0;
7586
7587 err =
7588 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
7589 ASSERT_VK_SUCCESS(err);
7590
7591 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7592 // Introduce failure by creating second image with a different-sized format.
7593 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
7594
7595 err =
7596 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
7597 ASSERT_VK_SUCCESS(err);
7598
7599 // Allocate memory
7600 VkMemoryAllocateInfo memAlloc = {};
7601 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7602 memAlloc.pNext = NULL;
7603 memAlloc.allocationSize = 0;
7604 memAlloc.memoryTypeIndex = 0;
7605
7606 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
7607 memAlloc.allocationSize = memReqs.size;
7608 pass =
7609 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
7610 ASSERT_TRUE(pass);
7611 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
7612 ASSERT_VK_SUCCESS(err);
7613
7614 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
7615 memAlloc.allocationSize = memReqs.size;
7616 pass =
7617 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
7618 ASSERT_TRUE(pass);
7619 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
7620 ASSERT_VK_SUCCESS(err);
7621
7622 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7623 ASSERT_VK_SUCCESS(err);
7624 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
7625 ASSERT_VK_SUCCESS(err);
7626
7627 BeginCommandBuffer();
7628 VkImageCopy copyRegion;
7629 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7630 copyRegion.srcSubresource.mipLevel = 0;
7631 copyRegion.srcSubresource.baseArrayLayer = 0;
7632 copyRegion.srcSubresource.layerCount = 0;
7633 copyRegion.srcOffset.x = 0;
7634 copyRegion.srcOffset.y = 0;
7635 copyRegion.srcOffset.z = 0;
7636 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7637 copyRegion.dstSubresource.mipLevel = 0;
7638 copyRegion.dstSubresource.baseArrayLayer = 0;
7639 copyRegion.dstSubresource.layerCount = 0;
7640 copyRegion.dstOffset.x = 0;
7641 copyRegion.dstOffset.y = 0;
7642 copyRegion.dstOffset.z = 0;
7643 copyRegion.extent.width = 1;
7644 copyRegion.extent.height = 1;
7645 copyRegion.extent.depth = 1;
7646 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7647 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7648 EndCommandBuffer();
7649
7650 m_errorMonitor->VerifyFound();
7651
7652 vkDestroyImage(m_device->device(), srcImage, NULL);
7653 vkDestroyImage(m_device->device(), dstImage, NULL);
7654 vkFreeMemory(m_device->device(), srcMem, NULL);
7655 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007656}
7657
Karl Schultz6addd812016-02-02 17:17:23 -07007658TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
7659 VkResult err;
7660 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007661
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007662 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007663 m_errorMonitor->SetDesiredFailureMsg(
7664 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007665 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007666
Mike Stroyana3082432015-09-25 13:39:21 -06007667 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007668
7669 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007670 VkImage srcImage;
7671 VkImage dstImage;
7672 VkDeviceMemory srcMem;
7673 VkDeviceMemory destMem;
7674 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007675
7676 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007677 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7678 image_create_info.pNext = NULL;
7679 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7680 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7681 image_create_info.extent.width = 32;
7682 image_create_info.extent.height = 32;
7683 image_create_info.extent.depth = 1;
7684 image_create_info.mipLevels = 1;
7685 image_create_info.arrayLayers = 1;
7686 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7687 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7688 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7689 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007690
Karl Schultz6addd812016-02-02 17:17:23 -07007691 err =
7692 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007693 ASSERT_VK_SUCCESS(err);
7694
Karl Schultzbdb75952016-04-19 11:36:49 -06007695 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7696
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007697 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07007698 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007699 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
7700 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007701
Karl Schultz6addd812016-02-02 17:17:23 -07007702 err =
7703 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007704 ASSERT_VK_SUCCESS(err);
7705
7706 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007707 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007708 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7709 memAlloc.pNext = NULL;
7710 memAlloc.allocationSize = 0;
7711 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007712
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007713 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007714 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007715 pass =
7716 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007717 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007718 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007719 ASSERT_VK_SUCCESS(err);
7720
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007721 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007722 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007723 pass =
7724 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007725 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007726 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007727 ASSERT_VK_SUCCESS(err);
7728
7729 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7730 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007731 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007732 ASSERT_VK_SUCCESS(err);
7733
7734 BeginCommandBuffer();
7735 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007736 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007737 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007738 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007739 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007740 copyRegion.srcOffset.x = 0;
7741 copyRegion.srcOffset.y = 0;
7742 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007743 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007744 copyRegion.dstSubresource.mipLevel = 0;
7745 copyRegion.dstSubresource.baseArrayLayer = 0;
7746 copyRegion.dstSubresource.layerCount = 0;
7747 copyRegion.dstOffset.x = 0;
7748 copyRegion.dstOffset.y = 0;
7749 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007750 copyRegion.extent.width = 1;
7751 copyRegion.extent.height = 1;
7752 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007753 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7754 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007755 EndCommandBuffer();
7756
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007757 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007758
Chia-I Wuf7458c52015-10-26 21:10:41 +08007759 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007760 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007761 vkFreeMemory(m_device->device(), srcMem, NULL);
7762 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007763}
7764
Karl Schultz6addd812016-02-02 17:17:23 -07007765TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
7766 VkResult err;
7767 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007768
Karl Schultz6addd812016-02-02 17:17:23 -07007769 m_errorMonitor->SetDesiredFailureMsg(
7770 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007771 "vkCmdResolveImage called with source sample count less than 2.");
7772
Mike Stroyana3082432015-09-25 13:39:21 -06007773 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007774
7775 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07007776 VkImage srcImage;
7777 VkImage dstImage;
7778 VkDeviceMemory srcMem;
7779 VkDeviceMemory destMem;
7780 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007781
7782 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007783 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7784 image_create_info.pNext = NULL;
7785 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7786 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7787 image_create_info.extent.width = 32;
7788 image_create_info.extent.height = 1;
7789 image_create_info.extent.depth = 1;
7790 image_create_info.mipLevels = 1;
7791 image_create_info.arrayLayers = 1;
7792 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7793 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7794 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7795 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007796
Karl Schultz6addd812016-02-02 17:17:23 -07007797 err =
7798 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007799 ASSERT_VK_SUCCESS(err);
7800
Karl Schultz6addd812016-02-02 17:17:23 -07007801 image_create_info.imageType = VK_IMAGE_TYPE_1D;
7802 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007803
Karl Schultz6addd812016-02-02 17:17:23 -07007804 err =
7805 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007806 ASSERT_VK_SUCCESS(err);
7807
7808 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007809 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007810 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7811 memAlloc.pNext = NULL;
7812 memAlloc.allocationSize = 0;
7813 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007814
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007815 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007816 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007817 pass =
7818 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007819 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007820 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007821 ASSERT_VK_SUCCESS(err);
7822
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007823 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007824 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007825 pass =
7826 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007827 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007828 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007829 ASSERT_VK_SUCCESS(err);
7830
7831 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7832 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007833 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007834 ASSERT_VK_SUCCESS(err);
7835
7836 BeginCommandBuffer();
7837 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07007838 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
7839 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06007840 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007841 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007842 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007843 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007844 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007845 resolveRegion.srcOffset.x = 0;
7846 resolveRegion.srcOffset.y = 0;
7847 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007848 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007849 resolveRegion.dstSubresource.mipLevel = 0;
7850 resolveRegion.dstSubresource.baseArrayLayer = 0;
7851 resolveRegion.dstSubresource.layerCount = 0;
7852 resolveRegion.dstOffset.x = 0;
7853 resolveRegion.dstOffset.y = 0;
7854 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007855 resolveRegion.extent.width = 1;
7856 resolveRegion.extent.height = 1;
7857 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007858 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7859 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007860 EndCommandBuffer();
7861
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007862 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007863
Chia-I Wuf7458c52015-10-26 21:10:41 +08007864 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007865 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007866 vkFreeMemory(m_device->device(), srcMem, NULL);
7867 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007868}
7869
Karl Schultz6addd812016-02-02 17:17:23 -07007870TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
7871 VkResult err;
7872 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007873
Karl Schultz6addd812016-02-02 17:17:23 -07007874 m_errorMonitor->SetDesiredFailureMsg(
7875 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007876 "vkCmdResolveImage called with dest sample count greater than 1.");
7877
Mike Stroyana3082432015-09-25 13:39:21 -06007878 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007879
7880 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07007881 VkImage srcImage;
7882 VkImage dstImage;
7883 VkDeviceMemory srcMem;
7884 VkDeviceMemory destMem;
7885 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007886
7887 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007888 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7889 image_create_info.pNext = NULL;
7890 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7891 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7892 image_create_info.extent.width = 32;
7893 image_create_info.extent.height = 1;
7894 image_create_info.extent.depth = 1;
7895 image_create_info.mipLevels = 1;
7896 image_create_info.arrayLayers = 1;
7897 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
7898 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7899 // Note: Some implementations expect color attachment usage for any
7900 // multisample surface
7901 image_create_info.usage =
7902 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
7903 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007904
Karl Schultz6addd812016-02-02 17:17:23 -07007905 err =
7906 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007907 ASSERT_VK_SUCCESS(err);
7908
Karl Schultz6addd812016-02-02 17:17:23 -07007909 image_create_info.imageType = VK_IMAGE_TYPE_1D;
7910 // Note: Some implementations expect color attachment usage for any
7911 // multisample surface
7912 image_create_info.usage =
7913 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007914
Karl Schultz6addd812016-02-02 17:17:23 -07007915 err =
7916 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007917 ASSERT_VK_SUCCESS(err);
7918
7919 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007920 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007921 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7922 memAlloc.pNext = NULL;
7923 memAlloc.allocationSize = 0;
7924 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007925
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007926 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007927 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007928 pass =
7929 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007930 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007931 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007932 ASSERT_VK_SUCCESS(err);
7933
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007934 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007935 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007936 pass =
7937 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007938 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007939 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007940 ASSERT_VK_SUCCESS(err);
7941
7942 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7943 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007944 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007945 ASSERT_VK_SUCCESS(err);
7946
7947 BeginCommandBuffer();
7948 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07007949 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
7950 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06007951 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007952 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007953 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007954 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007955 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007956 resolveRegion.srcOffset.x = 0;
7957 resolveRegion.srcOffset.y = 0;
7958 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007959 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007960 resolveRegion.dstSubresource.mipLevel = 0;
7961 resolveRegion.dstSubresource.baseArrayLayer = 0;
7962 resolveRegion.dstSubresource.layerCount = 0;
7963 resolveRegion.dstOffset.x = 0;
7964 resolveRegion.dstOffset.y = 0;
7965 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007966 resolveRegion.extent.width = 1;
7967 resolveRegion.extent.height = 1;
7968 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007969 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7970 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007971 EndCommandBuffer();
7972
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007973 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007974
Chia-I Wuf7458c52015-10-26 21:10:41 +08007975 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007976 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007977 vkFreeMemory(m_device->device(), srcMem, NULL);
7978 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007979}
7980
Karl Schultz6addd812016-02-02 17:17:23 -07007981TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
7982 VkResult err;
7983 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007984
Karl Schultz6addd812016-02-02 17:17:23 -07007985 m_errorMonitor->SetDesiredFailureMsg(
7986 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007987 "vkCmdResolveImage called with unmatched source and dest formats.");
7988
Mike Stroyana3082432015-09-25 13:39:21 -06007989 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007990
7991 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007992 VkImage srcImage;
7993 VkImage dstImage;
7994 VkDeviceMemory srcMem;
7995 VkDeviceMemory destMem;
7996 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007997
7998 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007999 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8000 image_create_info.pNext = NULL;
8001 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8002 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8003 image_create_info.extent.width = 32;
8004 image_create_info.extent.height = 1;
8005 image_create_info.extent.depth = 1;
8006 image_create_info.mipLevels = 1;
8007 image_create_info.arrayLayers = 1;
8008 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8009 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8010 // Note: Some implementations expect color attachment usage for any
8011 // multisample surface
8012 image_create_info.usage =
8013 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8014 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008015
Karl Schultz6addd812016-02-02 17:17:23 -07008016 err =
8017 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008018 ASSERT_VK_SUCCESS(err);
8019
Karl Schultz6addd812016-02-02 17:17:23 -07008020 // Set format to something other than source image
8021 image_create_info.format = VK_FORMAT_R32_SFLOAT;
8022 // Note: Some implementations expect color attachment usage for any
8023 // multisample surface
8024 image_create_info.usage =
8025 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8026 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008027
Karl Schultz6addd812016-02-02 17:17:23 -07008028 err =
8029 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008030 ASSERT_VK_SUCCESS(err);
8031
8032 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008033 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008034 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8035 memAlloc.pNext = NULL;
8036 memAlloc.allocationSize = 0;
8037 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008038
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008039 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008040 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008041 pass =
8042 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008043 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008044 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008045 ASSERT_VK_SUCCESS(err);
8046
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008047 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008048 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008049 pass =
8050 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008051 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008052 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008053 ASSERT_VK_SUCCESS(err);
8054
8055 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8056 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008057 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008058 ASSERT_VK_SUCCESS(err);
8059
8060 BeginCommandBuffer();
8061 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008062 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8063 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008064 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008065 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008066 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008067 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008068 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008069 resolveRegion.srcOffset.x = 0;
8070 resolveRegion.srcOffset.y = 0;
8071 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008072 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008073 resolveRegion.dstSubresource.mipLevel = 0;
8074 resolveRegion.dstSubresource.baseArrayLayer = 0;
8075 resolveRegion.dstSubresource.layerCount = 0;
8076 resolveRegion.dstOffset.x = 0;
8077 resolveRegion.dstOffset.y = 0;
8078 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008079 resolveRegion.extent.width = 1;
8080 resolveRegion.extent.height = 1;
8081 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008082 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8083 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008084 EndCommandBuffer();
8085
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008086 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008087
Chia-I Wuf7458c52015-10-26 21:10:41 +08008088 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008089 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008090 vkFreeMemory(m_device->device(), srcMem, NULL);
8091 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008092}
8093
Karl Schultz6addd812016-02-02 17:17:23 -07008094TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
8095 VkResult err;
8096 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008097
Karl Schultz6addd812016-02-02 17:17:23 -07008098 m_errorMonitor->SetDesiredFailureMsg(
8099 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008100 "vkCmdResolveImage called with unmatched source and dest image types.");
8101
Mike Stroyana3082432015-09-25 13:39:21 -06008102 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008103
8104 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008105 VkImage srcImage;
8106 VkImage dstImage;
8107 VkDeviceMemory srcMem;
8108 VkDeviceMemory destMem;
8109 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008110
8111 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008112 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8113 image_create_info.pNext = NULL;
8114 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8115 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8116 image_create_info.extent.width = 32;
8117 image_create_info.extent.height = 1;
8118 image_create_info.extent.depth = 1;
8119 image_create_info.mipLevels = 1;
8120 image_create_info.arrayLayers = 1;
8121 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8122 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8123 // Note: Some implementations expect color attachment usage for any
8124 // multisample surface
8125 image_create_info.usage =
8126 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8127 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008128
Karl Schultz6addd812016-02-02 17:17:23 -07008129 err =
8130 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008131 ASSERT_VK_SUCCESS(err);
8132
Karl Schultz6addd812016-02-02 17:17:23 -07008133 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8134 // Note: Some implementations expect color attachment usage for any
8135 // multisample surface
8136 image_create_info.usage =
8137 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8138 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008139
Karl Schultz6addd812016-02-02 17:17:23 -07008140 err =
8141 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008142 ASSERT_VK_SUCCESS(err);
8143
8144 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008145 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008146 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8147 memAlloc.pNext = NULL;
8148 memAlloc.allocationSize = 0;
8149 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008150
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008151 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008152 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008153 pass =
8154 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008155 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008156 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008157 ASSERT_VK_SUCCESS(err);
8158
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008159 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008160 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008161 pass =
8162 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008163 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008164 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008165 ASSERT_VK_SUCCESS(err);
8166
8167 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8168 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008169 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008170 ASSERT_VK_SUCCESS(err);
8171
8172 BeginCommandBuffer();
8173 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008174 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8175 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008176 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008177 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008178 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008179 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008180 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008181 resolveRegion.srcOffset.x = 0;
8182 resolveRegion.srcOffset.y = 0;
8183 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008184 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008185 resolveRegion.dstSubresource.mipLevel = 0;
8186 resolveRegion.dstSubresource.baseArrayLayer = 0;
8187 resolveRegion.dstSubresource.layerCount = 0;
8188 resolveRegion.dstOffset.x = 0;
8189 resolveRegion.dstOffset.y = 0;
8190 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008191 resolveRegion.extent.width = 1;
8192 resolveRegion.extent.height = 1;
8193 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008194 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8195 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008196 EndCommandBuffer();
8197
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008198 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008199
Chia-I Wuf7458c52015-10-26 21:10:41 +08008200 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008201 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008202 vkFreeMemory(m_device->device(), srcMem, NULL);
8203 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008204}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008205
Karl Schultz6addd812016-02-02 17:17:23 -07008206TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008207 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07008208 // to using a DS format, then cause it to hit error due to COLOR_BIT not
8209 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008210 // The image format check comes 2nd in validation so we trigger it first,
8211 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07008212 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008213
Karl Schultz6addd812016-02-02 17:17:23 -07008214 m_errorMonitor->SetDesiredFailureMsg(
8215 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008216 "Combination depth/stencil image formats can have only the ");
8217
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008218 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008219
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008220 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008221 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8222 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008223
8224 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008225 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8226 ds_pool_ci.pNext = NULL;
8227 ds_pool_ci.maxSets = 1;
8228 ds_pool_ci.poolSizeCount = 1;
8229 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008230
8231 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008232 err =
8233 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008234 ASSERT_VK_SUCCESS(err);
8235
8236 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008237 dsl_binding.binding = 0;
8238 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8239 dsl_binding.descriptorCount = 1;
8240 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8241 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008242
8243 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008244 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8245 ds_layout_ci.pNext = NULL;
8246 ds_layout_ci.bindingCount = 1;
8247 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008248 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008249 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8250 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008251 ASSERT_VK_SUCCESS(err);
8252
8253 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008254 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008255 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008256 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008257 alloc_info.descriptorPool = ds_pool;
8258 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008259 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8260 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008261 ASSERT_VK_SUCCESS(err);
8262
Karl Schultz6addd812016-02-02 17:17:23 -07008263 VkImage image_bad;
8264 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008265 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07008266 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008267 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07008268 const int32_t tex_width = 32;
8269 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008270
8271 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008272 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8273 image_create_info.pNext = NULL;
8274 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8275 image_create_info.format = tex_format_bad;
8276 image_create_info.extent.width = tex_width;
8277 image_create_info.extent.height = tex_height;
8278 image_create_info.extent.depth = 1;
8279 image_create_info.mipLevels = 1;
8280 image_create_info.arrayLayers = 1;
8281 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8282 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8283 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
8284 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
8285 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008286
Karl Schultz6addd812016-02-02 17:17:23 -07008287 err =
8288 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008289 ASSERT_VK_SUCCESS(err);
8290 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07008291 image_create_info.usage =
8292 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8293 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
8294 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008295 ASSERT_VK_SUCCESS(err);
8296
8297 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008298 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8299 image_view_create_info.image = image_bad;
8300 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8301 image_view_create_info.format = tex_format_bad;
8302 image_view_create_info.subresourceRange.baseArrayLayer = 0;
8303 image_view_create_info.subresourceRange.baseMipLevel = 0;
8304 image_view_create_info.subresourceRange.layerCount = 1;
8305 image_view_create_info.subresourceRange.levelCount = 1;
8306 image_view_create_info.subresourceRange.aspectMask =
8307 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008308
8309 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008310 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8311 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008312
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008313 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008314
Chia-I Wuf7458c52015-10-26 21:10:41 +08008315 vkDestroyImage(m_device->device(), image_bad, NULL);
8316 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008317 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8318 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008319}
Tobin Ehliscde08892015-09-22 10:11:37 -06008320#endif // IMAGE_TESTS
8321
Tony Barbour300a6082015-04-07 13:44:53 -06008322int main(int argc, char **argv) {
8323 int result;
8324
Cody Northrop8e54a402016-03-08 22:25:52 -07008325#ifdef ANDROID
8326 int vulkanSupport = InitVulkan();
8327 if (vulkanSupport == 0)
8328 return 1;
8329#endif
8330
Tony Barbour300a6082015-04-07 13:44:53 -06008331 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06008332 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06008333
8334 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
8335
8336 result = RUN_ALL_TESTS();
8337
Tony Barbour6918cd52015-04-09 12:58:51 -06008338 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06008339 return result;
8340}