blob: b1a1b5b7dd43e91fe8cb1a930daacb20fdb5febe [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");
Ian Elliotte48a1382016-04-28 14:22:58 -0600288 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700289 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600290
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700291 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600292 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800293 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700294 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800295 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
296 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600297 device_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700298 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600299
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600300 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600301 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800302 this->app_info.pApplicationName = "layer_tests";
303 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600304 this->app_info.pEngineName = "unittest";
305 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600306 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600307
Tony Barbour15524c32015-04-29 17:34:29 -0600308 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600309 InitFramework(instance_layer_names, device_layer_names,
310 instance_extension_names, device_extension_names,
311 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600312 }
313
314 virtual void TearDown() {
315 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600316 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600317 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600318 }
319};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500320
Karl Schultz6addd812016-02-02 17:17:23 -0700321VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600322 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600323
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800324 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600325
326 /*
327 * For render test all drawing happens in a single render pass
328 * on a single command buffer.
329 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200330 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800331 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600332 }
333
334 return result;
335}
336
Karl Schultz6addd812016-02-02 17:17:23 -0700337VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600338 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600339
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200340 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800341 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200342 }
Tony Barbour300a6082015-04-07 13:44:53 -0600343
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800344 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600345
346 return result;
347}
348
Karl Schultz6addd812016-02-02 17:17:23 -0700349void VkLayerTest::VKTriangleTest(const char *vertShaderText,
350 const char *fragShaderText,
351 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500352 // Create identity matrix
353 int i;
354 struct vktriangle_vs_uniform data;
355
356 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700357 glm::mat4 View = glm::mat4(1.0f);
358 glm::mat4 Model = glm::mat4(1.0f);
359 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500360 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700361 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500362
363 memcpy(&data.mvp, &MVP[0][0], matrixSize);
364
Karl Schultz6addd812016-02-02 17:17:23 -0700365 static const Vertex tri_data[] = {
366 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
367 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
368 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500369 };
370
Karl Schultz6addd812016-02-02 17:17:23 -0700371 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500372 data.position[i][0] = tri_data[i].posX;
373 data.position[i][1] = tri_data[i].posY;
374 data.position[i][2] = tri_data[i].posZ;
375 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700376 data.color[i][0] = tri_data[i].r;
377 data.color[i][1] = tri_data[i].g;
378 data.color[i][2] = tri_data[i].b;
379 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500380 }
381
382 ASSERT_NO_FATAL_FAILURE(InitState());
383 ASSERT_NO_FATAL_FAILURE(InitViewport());
384
Karl Schultz6addd812016-02-02 17:17:23 -0700385 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
386 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500387
Karl Schultz6addd812016-02-02 17:17:23 -0700388 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
389 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
390 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500391
392 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800393 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500394 pipelineobj.AddShader(&vs);
395 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600396 if (failMask & BsoFailLineWidth) {
397 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600398 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
399 ia_state.sType =
400 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
401 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
402 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600403 }
404 if (failMask & BsoFailDepthBias) {
405 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600406 VkPipelineRasterizationStateCreateInfo rs_state = {};
407 rs_state.sType =
408 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
409 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600410 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600411 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600412 }
Karl Schultz6addd812016-02-02 17:17:23 -0700413 // Viewport and scissors must stay in synch or other errors will occur than
414 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600415 if (failMask & BsoFailViewport) {
416 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600417 m_viewports.clear();
418 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600419 }
420 if (failMask & BsoFailScissor) {
421 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600422 m_scissors.clear();
423 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600424 }
425 if (failMask & BsoFailBlend) {
426 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600427 VkPipelineColorBlendAttachmentState att_state = {};
428 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
429 att_state.blendEnable = VK_TRUE;
430 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600431 }
432 if (failMask & BsoFailDepthBounds) {
433 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
434 }
435 if (failMask & BsoFailStencilReadMask) {
436 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
437 }
438 if (failMask & BsoFailStencilWriteMask) {
439 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
440 }
441 if (failMask & BsoFailStencilReference) {
442 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
443 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500444
445 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700446 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
447 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500448
449 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600450 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500451
Tony Barbourfe3351b2015-07-28 10:17:20 -0600452 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500453
454 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600455 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500456
457 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600458 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500459
Tony Barbourfe3351b2015-07-28 10:17:20 -0600460 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500461}
462
Karl Schultz6addd812016-02-02 17:17:23 -0700463void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
464 VkPipelineObj &pipelineobj,
465 VkDescriptorSetObj &descriptorSet,
466 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500467 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700468 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
469 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500470 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700471 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
472 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500473 }
474
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800475 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700476 // Make sure depthWriteEnable is set so that Depth fail test will work
477 // correctly
478 // Make sure stencilTestEnable is set so that Stencil fail test will work
479 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600480 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800481 stencil.failOp = VK_STENCIL_OP_KEEP;
482 stencil.passOp = VK_STENCIL_OP_KEEP;
483 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
484 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600485
486 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
487 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600488 ds_ci.pNext = NULL;
489 ds_ci.depthTestEnable = VK_FALSE;
490 ds_ci.depthWriteEnable = VK_TRUE;
491 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
492 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600493 if (failMask & BsoFailDepthBounds) {
494 ds_ci.depthBoundsTestEnable = VK_TRUE;
495 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600496 ds_ci.stencilTestEnable = VK_TRUE;
497 ds_ci.front = stencil;
498 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600499
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600500 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600501 pipelineobj.SetViewport(m_viewports);
502 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800503 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700504 VkResult err = pipelineobj.CreateVKPipeline(
505 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600506 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800507 commandBuffer->BindPipeline(pipelineobj);
508 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500509}
510
511// ********************************************************************************************************************
512// ********************************************************************************************************************
513// ********************************************************************************************************************
514// ********************************************************************************************************************
Tobin Ehlis0788f522015-05-26 16:11:58 -0600515#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700516#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800517TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500518{
519 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500520 VkFenceCreateInfo fenceInfo = {};
521 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
522 fenceInfo.pNext = NULL;
523 fenceInfo.flags = 0;
524
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600526
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500527 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600528
529 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
530 vk_testing::Buffer buffer;
531 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500532
Tony Barbourfe3351b2015-07-28 10:17:20 -0600533 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800534 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600535 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500536
537 testFence.init(*m_device, fenceInfo);
538
539 // Bypass framework since it does the waits automatically
540 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600541 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800542 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
543 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800544 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600545 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700546 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800547 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800548 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800549 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600550 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600551
552 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500553 ASSERT_VK_SUCCESS( err );
554
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500555 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800556 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500557
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200558 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500559}
560
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800561TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500562{
563 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500564 VkFenceCreateInfo fenceInfo = {};
565 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
566 fenceInfo.pNext = NULL;
567 fenceInfo.flags = 0;
568
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600570
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500571 ASSERT_NO_FATAL_FAILURE(InitState());
572 ASSERT_NO_FATAL_FAILURE(InitViewport());
573 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
574
Tony Barbourfe3351b2015-07-28 10:17:20 -0600575 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800576 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600577 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500578
579 testFence.init(*m_device, fenceInfo);
580
581 // Bypass framework since it does the waits automatically
582 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600583 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800584 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
585 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800586 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600587 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700588 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800589 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800590 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800591 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600592 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600593
594 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500595 ASSERT_VK_SUCCESS( err );
596
Jon Ashburnf19916e2016-01-11 13:12:43 -0700597 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800598 VkCommandBufferBeginInfo info = {};
599 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
600 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600601 info.renderPass = VK_NULL_HANDLE;
602 info.subpass = 0;
603 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +0800604 info.occlusionQueryEnable = VK_FALSE;
605 info.queryFlags = 0;
606 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600607
608 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800609 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500610
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200611 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500612}
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700613#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200614
Ian Elliott1c32c772016-04-28 14:47:13 -0600615TEST_F(VkLayerTest, EnableWsiBeforeUse) {
616 VkResult err;
617 bool pass;
618
619 VkSurfaceKHR surface = VK_NULL_HANDLE;
620 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
621 VkSwapchainCreateInfoKHR swapchain_create_info = {};
622 uint32_t swapchain_image_count = 0;
623// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
624 uint32_t image_index = 0;
625// VkPresentInfoKHR present_info = {};
626
627 ASSERT_NO_FATAL_FAILURE(InitState());
628
Ian Elliott3f06ce52016-04-29 14:46:21 -0600629#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
630#if defined(VK_USE_PLATFORM_ANDROID_KHR)
631 // Use the functions from the VK_KHR_android_surface extension without
632 // enabling that extension:
633
634 // Create a surface:
635 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
636#if 0
637#endif
638 m_errorMonitor->SetDesiredFailureMsg(
639 VK_DEBUG_REPORT_ERROR_BIT_EXT,
640 "extension was not enabled for this");
641 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
642 &surface);
643 pass = (err != VK_SUCCESS);
644 ASSERT_TRUE(pass);
645 m_errorMonitor->VerifyFound();
646#endif // VK_USE_PLATFORM_ANDROID_KHR
647
648
649#if defined(VK_USE_PLATFORM_MIR_KHR)
650 // Use the functions from the VK_KHR_mir_surface extension without enabling
651 // that extension:
652
653 // Create a surface:
654 VkMirSurfaceCreateInfoKHR mir_create_info = {};
655#if 0
656#endif
657 m_errorMonitor->SetDesiredFailureMsg(
658 VK_DEBUG_REPORT_ERROR_BIT_EXT,
659 "extension was not enabled for this");
660 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
661 pass = (err != VK_SUCCESS);
662 ASSERT_TRUE(pass);
663 m_errorMonitor->VerifyFound();
664
665 // Tell whether an mir_connection supports presentation:
666 MirConnection *mir_connection = NULL;
667 m_errorMonitor->SetDesiredFailureMsg(
668 VK_DEBUG_REPORT_ERROR_BIT_EXT,
669 "extension was not enabled for this");
670 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
671 visual_id);
672 m_errorMonitor->VerifyFound();
673#endif // VK_USE_PLATFORM_MIR_KHR
674
675
676#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
677 // Use the functions from the VK_KHR_wayland_surface extension without
678 // enabling that extension:
679
680 // Create a surface:
681 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
682#if 0
683#endif
684 m_errorMonitor->SetDesiredFailureMsg(
685 VK_DEBUG_REPORT_ERROR_BIT_EXT,
686 "extension was not enabled for this");
687 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
688 &surface);
689 pass = (err != VK_SUCCESS);
690 ASSERT_TRUE(pass);
691 m_errorMonitor->VerifyFound();
692
693 // Tell whether an wayland_display supports presentation:
694 struct wl_display wayland_display = {};
695 m_errorMonitor->SetDesiredFailureMsg(
696 VK_DEBUG_REPORT_ERROR_BIT_EXT,
697 "extension was not enabled for this");
698 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
699 &wayland_display);
700 m_errorMonitor->VerifyFound();
701#endif // VK_USE_PLATFORM_WAYLAND_KHR
702
703
704#if defined(VK_USE_PLATFORM_WIN32_KHR)
705 // Use the functions from the VK_KHR_win32_surface extension without
706 // enabling that extension:
707
708 // Create a surface:
709 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
710#if 0
711#endif
712 m_errorMonitor->SetDesiredFailureMsg(
713 VK_DEBUG_REPORT_ERROR_BIT_EXT,
714 "extension was not enabled for this");
715 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
716 &surface);
717 pass = (err != VK_SUCCESS);
718 ASSERT_TRUE(pass);
719 m_errorMonitor->VerifyFound();
720
721 // Tell whether win32 supports presentation:
722 struct wl_display win32_display = {};
723 m_errorMonitor->SetDesiredFailureMsg(
724 VK_DEBUG_REPORT_ERROR_BIT_EXT,
725 "extension was not enabled for this");
726 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0,
727 &win32_display);
728 m_errorMonitor->VerifyFound();
729#endif // VK_USE_PLATFORM_WAYLAND_KHR
730#endif // NEED_TO_TEST_THIS_ON_PLATFORM
731
732
Ian Elliott1c32c772016-04-28 14:47:13 -0600733#if defined(VK_USE_PLATFORM_XCB_KHR)
734 // Use the functions from the VK_KHR_xcb_surface extension without enabling
735 // that extension:
736
737 // Create a surface:
738 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
739#if 0
740#endif
741 m_errorMonitor->SetDesiredFailureMsg(
742 VK_DEBUG_REPORT_ERROR_BIT_EXT,
743 "extension was not enabled for this");
744 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
745 pass = (err != VK_SUCCESS);
746 ASSERT_TRUE(pass);
747 m_errorMonitor->VerifyFound();
748
749 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -0600750 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -0600751 xcb_visualid_t visual_id = 0;
752 m_errorMonitor->SetDesiredFailureMsg(
753 VK_DEBUG_REPORT_ERROR_BIT_EXT,
754 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -0600755 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -0600756 visual_id);
757 m_errorMonitor->VerifyFound();
758#endif // VK_USE_PLATFORM_XCB_KHR
759
760
Ian Elliott12630812016-04-29 14:35:43 -0600761#if defined(VK_USE_PLATFORM_XLIB_KHR)
762 // Use the functions from the VK_KHR_xlib_surface extension without enabling
763 // that extension:
764
765 // Create a surface:
766 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
767#if 0
768#endif
769 m_errorMonitor->SetDesiredFailureMsg(
770 VK_DEBUG_REPORT_ERROR_BIT_EXT,
771 "extension was not enabled for this");
772 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
773 pass = (err != VK_SUCCESS);
774 ASSERT_TRUE(pass);
775 m_errorMonitor->VerifyFound();
776
777 // Tell whether an Xlib VisualID supports presentation:
778 Display *dpy = NULL;
779 VisualID visual = 0;
780 m_errorMonitor->SetDesiredFailureMsg(
781 VK_DEBUG_REPORT_ERROR_BIT_EXT,
782 "extension was not enabled for this");
783 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
784 m_errorMonitor->VerifyFound();
785#endif // VK_USE_PLATFORM_XLIB_KHR
786
787
Ian Elliott1c32c772016-04-28 14:47:13 -0600788 // Use the functions from the VK_KHR_surface extension without enabling
789 // that extension:
790
791 // Destroy a surface:
792 m_errorMonitor->SetDesiredFailureMsg(
793 VK_DEBUG_REPORT_ERROR_BIT_EXT,
794 "extension was not enabled for this");
795 vkDestroySurfaceKHR(instance(), surface, NULL);
796 m_errorMonitor->VerifyFound();
797
798 // Check if surface supports presentation:
799 VkBool32 supported = false;
800 m_errorMonitor->SetDesiredFailureMsg(
801 VK_DEBUG_REPORT_ERROR_BIT_EXT,
802 "extension was not enabled for this");
803 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
804 pass = (err != VK_SUCCESS);
805 ASSERT_TRUE(pass);
806 m_errorMonitor->VerifyFound();
807
808 // Check surface capabilities:
809 VkSurfaceCapabilitiesKHR capabilities = {};
810 m_errorMonitor->SetDesiredFailureMsg(
811 VK_DEBUG_REPORT_ERROR_BIT_EXT,
812 "extension was not enabled for this");
813 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
814 &capabilities);
815 pass = (err != VK_SUCCESS);
816 ASSERT_TRUE(pass);
817 m_errorMonitor->VerifyFound();
818
819 // Check surface formats:
820 uint32_t format_count = 0;
821 VkSurfaceFormatKHR *formats = NULL;
822 m_errorMonitor->SetDesiredFailureMsg(
823 VK_DEBUG_REPORT_ERROR_BIT_EXT,
824 "extension was not enabled for this");
825 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
826 &format_count, formats);
827 pass = (err != VK_SUCCESS);
828 ASSERT_TRUE(pass);
829 m_errorMonitor->VerifyFound();
830
831 // Check surface present modes:
832 uint32_t present_mode_count = 0;
833 VkSurfaceFormatKHR *present_modes = NULL;
834 m_errorMonitor->SetDesiredFailureMsg(
835 VK_DEBUG_REPORT_ERROR_BIT_EXT,
836 "extension was not enabled for this");
837 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
838 &present_mode_count, present_modes);
839 pass = (err != VK_SUCCESS);
840 ASSERT_TRUE(pass);
841 m_errorMonitor->VerifyFound();
842
843
844 // Use the functions from the VK_KHR_swapchain extension without enabling
845 // that extension:
846
847 // Create a swapchain:
848 m_errorMonitor->SetDesiredFailureMsg(
849 VK_DEBUG_REPORT_ERROR_BIT_EXT,
850 "extension was not enabled for this");
851 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
852 swapchain_create_info.pNext = NULL;
853#if 0
854 swapchain_create_info.flags = 0;
855 swapchain_create_info.surface = 0;
856 swapchain_create_info.minImageCount = 0;
857 swapchain_create_info.imageFormat = 0;
858 swapchain_create_info.imageColorSpace = 0;
859 swapchain_create_info.imageExtent.width = 0;
860 swapchain_create_info.imageExtent.height = 0;
861 swapchain_create_info.imageArrayLayers = 0;
862 swapchain_create_info.imageUsage = 0;
863 swapchain_create_info.imageSharingMode = 0;
864 swapchain_create_info.queueFamilyIndexCount = 0;
865 swapchain_create_info.preTransform = 0;
866 swapchain_create_info.compositeAlpha = 0;
867 swapchain_create_info.presentMode = 0;
868 swapchain_create_info.clipped = 0;
869 swapchain_create_info.oldSwapchain = NULL;
870#endif
871 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
872 NULL, &swapchain);
873 pass = (err != VK_SUCCESS);
874 ASSERT_TRUE(pass);
875 m_errorMonitor->VerifyFound();
876
877 // Get the images from the swapchain:
878 m_errorMonitor->SetDesiredFailureMsg(
879 VK_DEBUG_REPORT_ERROR_BIT_EXT,
880 "extension was not enabled for this");
881 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
882 &swapchain_image_count, NULL);
883 pass = (err != VK_SUCCESS);
884 ASSERT_TRUE(pass);
885 m_errorMonitor->VerifyFound();
886
887 // Try to acquire an image:
888 m_errorMonitor->SetDesiredFailureMsg(
889 VK_DEBUG_REPORT_ERROR_BIT_EXT,
890 "extension was not enabled for this");
891 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
892 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
893 pass = (err != VK_SUCCESS);
894 ASSERT_TRUE(pass);
895 m_errorMonitor->VerifyFound();
896
897 // Try to present an image:
898#if 0 // NOTE: Currently can't test this because a real swapchain is needed
899 // (as opposed to the fake one we created) in order for the layer to
900 // lookup the VkDevice used to enable the extension:
901 m_errorMonitor->SetDesiredFailureMsg(
902 VK_DEBUG_REPORT_ERROR_BIT_EXT,
903 "extension was not enabled for this");
904 present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
905 present_info.pNext = NULL;
906#if 0
907#endif
908 err = vkQueuePresentKHR(m_device->m_queue, &present_info);
909 pass = (err != VK_SUCCESS);
910 ASSERT_TRUE(pass);
911 m_errorMonitor->VerifyFound();
912#endif
913
914 // Destroy the swapchain:
915 m_errorMonitor->SetDesiredFailureMsg(
916 VK_DEBUG_REPORT_ERROR_BIT_EXT,
917 "extension was not enabled for this");
918 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
919 m_errorMonitor->VerifyFound();
920}
921
Karl Schultz6addd812016-02-02 17:17:23 -0700922TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
923 VkResult err;
924 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500925
Karl Schultz6addd812016-02-02 17:17:23 -0700926 m_errorMonitor->SetDesiredFailureMsg(
927 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600928 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
929
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500930 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500931
932 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700933 VkImage image;
934 VkDeviceMemory mem;
935 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500936
Karl Schultz6addd812016-02-02 17:17:23 -0700937 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
938 const int32_t tex_width = 32;
939 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500940
Tony Barboureb254902015-07-15 12:50:33 -0600941 VkImageCreateInfo image_create_info = {};
942 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700943 image_create_info.pNext = NULL;
944 image_create_info.imageType = VK_IMAGE_TYPE_2D;
945 image_create_info.format = tex_format;
946 image_create_info.extent.width = tex_width;
947 image_create_info.extent.height = tex_height;
948 image_create_info.extent.depth = 1;
949 image_create_info.mipLevels = 1;
950 image_create_info.arrayLayers = 1;
951 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
952 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
953 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
954 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600955
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800956 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800957 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700958 mem_alloc.pNext = NULL;
959 mem_alloc.allocationSize = 0;
960 // Introduce failure, do NOT set memProps to
961 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
962 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500963
Chia-I Wuf7458c52015-10-26 21:10:41 +0800964 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500965 ASSERT_VK_SUCCESS(err);
966
Karl Schultz6addd812016-02-02 17:17:23 -0700967 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500968
Mark Lobodzinski23065352015-05-29 09:32:35 -0500969 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500970
Karl Schultz6addd812016-02-02 17:17:23 -0700971 pass =
972 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
973 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
974 if (!pass) { // If we can't find any unmappable memory this test doesn't
975 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +0800976 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -0600977 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -0600978 }
Mike Stroyan713b2d72015-08-04 10:49:29 -0600979
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500980 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800981 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500982 ASSERT_VK_SUCCESS(err);
983
984 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -0600985 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500986 ASSERT_VK_SUCCESS(err);
987
988 // Map memory as if to initialize the image
989 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -0700990 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
991 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500992
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200993 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600994
Chia-I Wuf7458c52015-10-26 21:10:41 +0800995 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500996}
997
Karl Schultz6addd812016-02-02 17:17:23 -0700998TEST_F(VkLayerTest, RebindMemory) {
999 VkResult err;
1000 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001001
Karl Schultz6addd812016-02-02 17:17:23 -07001002 m_errorMonitor->SetDesiredFailureMsg(
1003 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001004 "which has already been bound to mem object");
1005
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001006 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001007
1008 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001009 VkImage image;
1010 VkDeviceMemory mem1;
1011 VkDeviceMemory mem2;
1012 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001013
Karl Schultz6addd812016-02-02 17:17:23 -07001014 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1015 const int32_t tex_width = 32;
1016 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001017
Tony Barboureb254902015-07-15 12:50:33 -06001018 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001019 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1020 image_create_info.pNext = NULL;
1021 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1022 image_create_info.format = tex_format;
1023 image_create_info.extent.width = tex_width;
1024 image_create_info.extent.height = tex_height;
1025 image_create_info.extent.depth = 1;
1026 image_create_info.mipLevels = 1;
1027 image_create_info.arrayLayers = 1;
1028 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1029 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1030 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1031 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001032
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001033 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001034 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1035 mem_alloc.pNext = NULL;
1036 mem_alloc.allocationSize = 0;
1037 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06001038
Karl Schultz6addd812016-02-02 17:17:23 -07001039 // Introduce failure, do NOT set memProps to
1040 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06001041 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08001042 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001043 ASSERT_VK_SUCCESS(err);
1044
Karl Schultz6addd812016-02-02 17:17:23 -07001045 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001046
1047 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001048 pass =
1049 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001050 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001051
1052 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001053 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001054 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001055 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001056 ASSERT_VK_SUCCESS(err);
1057
1058 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06001059 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001060 ASSERT_VK_SUCCESS(err);
1061
Karl Schultz6addd812016-02-02 17:17:23 -07001062 // Introduce validation failure, try to bind a different memory object to
1063 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06001064 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001065
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001066 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001067
Chia-I Wuf7458c52015-10-26 21:10:41 +08001068 vkDestroyImage(m_device->device(), image, NULL);
1069 vkFreeMemory(m_device->device(), mem1, NULL);
1070 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001071}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001072
Karl Schultz6addd812016-02-02 17:17:23 -07001073TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001074 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001075
Karl Schultz6addd812016-02-02 17:17:23 -07001076 m_errorMonitor->SetDesiredFailureMsg(
1077 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
1078 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001079
1080 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001081 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1082 fenceInfo.pNext = NULL;
1083 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06001084
Tony Barbour300a6082015-04-07 13:44:53 -06001085 ASSERT_NO_FATAL_FAILURE(InitState());
1086 ASSERT_NO_FATAL_FAILURE(InitViewport());
1087 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1088
Tony Barbourfe3351b2015-07-28 10:17:20 -06001089 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001090 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
1091 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001092 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06001093
1094 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001095
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001096 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001097 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1098 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001099 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001100 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001101 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001102 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001103 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001104 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001105 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001106
1107 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07001108 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001109
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001110 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001111}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001112// This is a positive test. We used to expect error in this case but spec now
1113// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07001114TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001115 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001116 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001117 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001118 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1119 fenceInfo.pNext = NULL;
1120
Tony Barbour0b4d9562015-04-09 10:48:04 -06001121 ASSERT_NO_FATAL_FAILURE(InitState());
1122 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08001123 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001124 VkResult result = vkResetFences(m_device->device(), 1, fences);
1125 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06001126
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001127 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06001128}
Tobin Ehlis41376e12015-07-03 08:45:14 -06001129
1130TEST_F(VkLayerTest, InvalidUsageBits)
1131{
Tony Barbourf92621a2016-05-02 14:28:12 -06001132 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001133 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06001134 "Initialize buffer with wrong usage then perform copy expecting errors "
1135 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001137 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06001138
1139 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06001140 VkImageObj image(m_device);
1141 // Initialize image with USAGE_INPUT_ATTACHMENT
1142 image.init(128, 128, VK_FORMAT_D32_SFLOAT_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001143 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1144 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06001145
Tony Barbourf92621a2016-05-02 14:28:12 -06001146 VkImageView dsv;
1147 VkImageViewCreateInfo dsvci = {};
1148 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1149 dsvci.image = image.handle();
1150 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
1151 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
1152 dsvci.subresourceRange.layerCount = 1;
1153 dsvci.subresourceRange.baseMipLevel = 0;
1154 dsvci.subresourceRange.levelCount = 1;
1155 dsvci.subresourceRange.aspectMask =
1156 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06001157
Tony Barbourf92621a2016-05-02 14:28:12 -06001158 // Create a view with depth / stencil aspect for image with different usage
1159 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001160
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001161 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06001162
1163 // Initialize buffer with TRANSFER_DST usage
1164 vk_testing::Buffer buffer;
1165 VkMemoryPropertyFlags reqs = 0;
1166 buffer.init_as_dst(*m_device, 128 * 128, reqs);
1167 VkBufferImageCopy region = {};
1168 region.bufferRowLength = 128;
1169 region.bufferImageHeight = 128;
1170 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1171 region.imageSubresource.layerCount = 1;
1172 region.imageExtent.height = 16;
1173 region.imageExtent.width = 16;
1174 region.imageExtent.depth = 1;
1175
1176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1177 "Invalid usage flag for buffer ");
1178 // Buffer usage not set to TRANSFER_SRC and image usage not set to
1179 // TRANSFER_DST
1180 BeginCommandBuffer();
1181 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1182 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1183 1, &region);
1184 m_errorMonitor->VerifyFound();
1185
1186 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1187 "Invalid usage flag for image ");
1188 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1189 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1190 1, &region);
1191 m_errorMonitor->VerifyFound();
1192
1193 vkDestroyImageView(m_device->device(), dsv, NULL);
Tobin Ehlis41376e12015-07-03 08:45:14 -06001194}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001195#endif // MEM_TRACKER_TESTS
1196
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06001197#if OBJ_TRACKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07001198TEST_F(VkLayerTest, PipelineNotBound) {
1199 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001200
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001202 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001203
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001204 ASSERT_NO_FATAL_FAILURE(InitState());
1205 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001206
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001207 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001208 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1209 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001210
1211 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001212 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1213 ds_pool_ci.pNext = NULL;
1214 ds_pool_ci.maxSets = 1;
1215 ds_pool_ci.poolSizeCount = 1;
1216 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001217
1218 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001219 err =
1220 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001221 ASSERT_VK_SUCCESS(err);
1222
1223 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001224 dsl_binding.binding = 0;
1225 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1226 dsl_binding.descriptorCount = 1;
1227 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1228 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001229
1230 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001231 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1232 ds_layout_ci.pNext = NULL;
1233 ds_layout_ci.bindingCount = 1;
1234 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001235
1236 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001237 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1238 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001239 ASSERT_VK_SUCCESS(err);
1240
1241 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001242 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001243 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001244 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001245 alloc_info.descriptorPool = ds_pool;
1246 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001247 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1248 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001249 ASSERT_VK_SUCCESS(err);
1250
1251 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001252 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1253 pipeline_layout_ci.pNext = NULL;
1254 pipeline_layout_ci.setLayoutCount = 1;
1255 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001256
1257 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001258 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1259 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001260 ASSERT_VK_SUCCESS(err);
1261
Mark Youngad779052016-01-06 14:26:04 -07001262 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001263
1264 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001265 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1266 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001267
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001268 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001269
Chia-I Wuf7458c52015-10-26 21:10:41 +08001270 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1271 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1272 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001273}
1274
Karl Schultz6addd812016-02-02 17:17:23 -07001275TEST_F(VkLayerTest, BindInvalidMemory) {
1276 VkResult err;
1277 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001278
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001280 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001281
Tobin Ehlisec598302015-09-15 15:02:17 -06001282 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001283
1284 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001285 VkImage image;
1286 VkDeviceMemory mem;
1287 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001288
Karl Schultz6addd812016-02-02 17:17:23 -07001289 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1290 const int32_t tex_width = 32;
1291 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001292
1293 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001294 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1295 image_create_info.pNext = NULL;
1296 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1297 image_create_info.format = tex_format;
1298 image_create_info.extent.width = tex_width;
1299 image_create_info.extent.height = tex_height;
1300 image_create_info.extent.depth = 1;
1301 image_create_info.mipLevels = 1;
1302 image_create_info.arrayLayers = 1;
1303 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1304 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1305 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1306 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001307
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001308 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001309 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1310 mem_alloc.pNext = NULL;
1311 mem_alloc.allocationSize = 0;
1312 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001313
Chia-I Wuf7458c52015-10-26 21:10:41 +08001314 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001315 ASSERT_VK_SUCCESS(err);
1316
Karl Schultz6addd812016-02-02 17:17:23 -07001317 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001318
1319 mem_alloc.allocationSize = mem_reqs.size;
1320
Karl Schultz6addd812016-02-02 17:17:23 -07001321 pass =
1322 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001323 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001324
1325 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001326 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001327 ASSERT_VK_SUCCESS(err);
1328
1329 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001330 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001331
1332 // Try to bind free memory that has been freed
1333 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1334 // This may very well return an error.
1335 (void)err;
1336
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001337 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001338
Chia-I Wuf7458c52015-10-26 21:10:41 +08001339 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001340}
1341
Karl Schultz6addd812016-02-02 17:17:23 -07001342TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1343 VkResult err;
1344 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001345
Karl Schultz6addd812016-02-02 17:17:23 -07001346 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1347 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001348
Tobin Ehlisec598302015-09-15 15:02:17 -06001349 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001350
Karl Schultz6addd812016-02-02 17:17:23 -07001351 // Create an image object, allocate memory, destroy the object and then try
1352 // to bind it
1353 VkImage image;
1354 VkDeviceMemory mem;
1355 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001356
Karl Schultz6addd812016-02-02 17:17:23 -07001357 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1358 const int32_t tex_width = 32;
1359 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001360
1361 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001362 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1363 image_create_info.pNext = NULL;
1364 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1365 image_create_info.format = tex_format;
1366 image_create_info.extent.width = tex_width;
1367 image_create_info.extent.height = tex_height;
1368 image_create_info.extent.depth = 1;
1369 image_create_info.mipLevels = 1;
1370 image_create_info.arrayLayers = 1;
1371 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1372 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1373 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1374 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001375
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001376 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001377 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1378 mem_alloc.pNext = NULL;
1379 mem_alloc.allocationSize = 0;
1380 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001381
Chia-I Wuf7458c52015-10-26 21:10:41 +08001382 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001383 ASSERT_VK_SUCCESS(err);
1384
Karl Schultz6addd812016-02-02 17:17:23 -07001385 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001386
1387 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001388 pass =
1389 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001390 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001391
1392 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001393 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001394 ASSERT_VK_SUCCESS(err);
1395
1396 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001397 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001398 ASSERT_VK_SUCCESS(err);
1399
1400 // Now Try to bind memory to this destroyed object
1401 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1402 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001403 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001404
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001405 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001406
Chia-I Wuf7458c52015-10-26 21:10:41 +08001407 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001408}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001409
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001410#endif // OBJ_TRACKER_TESTS
1411
Tobin Ehlis0788f522015-05-26 16:11:58 -06001412#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001413
1414// This is a positive test. No errors should be generated.
1415TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
1416
1417 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1418 "submitted on separate queues followed by a QueueWaitIdle.");
1419
Dustin Graves48458142016-04-29 16:11:55 -06001420 if ((m_device->queue_props.empty()) ||
1421 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001422 return;
1423
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001424 m_errorMonitor->ExpectSuccess();
1425
1426 VkSemaphore semaphore;
1427 VkSemaphoreCreateInfo semaphore_create_info{};
1428 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1429 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1430 &semaphore);
1431
1432 VkCommandPool command_pool;
1433 VkCommandPoolCreateInfo pool_create_info{};
1434 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1435 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1436 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1437 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1438 &command_pool);
1439
1440 VkCommandBuffer command_buffer[2];
1441 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1442 command_buffer_allocate_info.sType =
1443 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1444 command_buffer_allocate_info.commandPool = command_pool;
1445 command_buffer_allocate_info.commandBufferCount = 2;
1446 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1447 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1448 command_buffer);
1449
1450 VkQueue queue = VK_NULL_HANDLE;
1451 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1452 1, &queue);
1453
1454 {
1455 VkCommandBufferBeginInfo begin_info{};
1456 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1457 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1458
1459 vkCmdPipelineBarrier(command_buffer[0],
1460 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1461 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1462 0, nullptr, 0, nullptr);
1463
1464 VkViewport viewport{};
1465 viewport.maxDepth = 1.0f;
1466 viewport.minDepth = 0.0f;
1467 viewport.width = 512;
1468 viewport.height = 512;
1469 viewport.x = 0;
1470 viewport.y = 0;
1471 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1472 vkEndCommandBuffer(command_buffer[0]);
1473 }
1474 {
1475 VkCommandBufferBeginInfo begin_info{};
1476 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1477 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1478
1479 VkViewport viewport{};
1480 viewport.maxDepth = 1.0f;
1481 viewport.minDepth = 0.0f;
1482 viewport.width = 512;
1483 viewport.height = 512;
1484 viewport.x = 0;
1485 viewport.y = 0;
1486 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1487 vkEndCommandBuffer(command_buffer[1]);
1488 }
1489 {
1490 VkSubmitInfo submit_info{};
1491 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1492 submit_info.commandBufferCount = 1;
1493 submit_info.pCommandBuffers = &command_buffer[0];
1494 submit_info.signalSemaphoreCount = 1;
1495 submit_info.pSignalSemaphores = &semaphore;
1496 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1497 }
1498 {
1499 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1500 VkSubmitInfo submit_info{};
1501 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1502 submit_info.commandBufferCount = 1;
1503 submit_info.pCommandBuffers = &command_buffer[1];
1504 submit_info.waitSemaphoreCount = 1;
1505 submit_info.pWaitSemaphores = &semaphore;
1506 submit_info.pWaitDstStageMask = flags;
1507 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1508 }
1509
1510 vkQueueWaitIdle(m_device->m_queue);
1511
1512 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1513 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1514 &command_buffer[0]);
1515 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1516
1517 m_errorMonitor->VerifyNotFound();
1518}
1519
1520// This is a positive test. No errors should be generated.
1521TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
1522
1523 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1524 "submitted on separate queues, the second having a fence"
1525 "followed by a QueueWaitIdle.");
1526
Dustin Graves48458142016-04-29 16:11:55 -06001527 if ((m_device->queue_props.empty()) ||
1528 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001529 return;
1530
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001531 m_errorMonitor->ExpectSuccess();
1532
1533 VkFence fence;
1534 VkFenceCreateInfo fence_create_info{};
1535 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1536 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1537
1538 VkSemaphore semaphore;
1539 VkSemaphoreCreateInfo semaphore_create_info{};
1540 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1541 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1542 &semaphore);
1543
1544 VkCommandPool command_pool;
1545 VkCommandPoolCreateInfo pool_create_info{};
1546 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1547 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1548 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1549 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1550 &command_pool);
1551
1552 VkCommandBuffer command_buffer[2];
1553 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1554 command_buffer_allocate_info.sType =
1555 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1556 command_buffer_allocate_info.commandPool = command_pool;
1557 command_buffer_allocate_info.commandBufferCount = 2;
1558 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1559 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1560 command_buffer);
1561
1562 VkQueue queue = VK_NULL_HANDLE;
1563 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1564 1, &queue);
1565
1566 {
1567 VkCommandBufferBeginInfo begin_info{};
1568 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1569 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1570
1571 vkCmdPipelineBarrier(command_buffer[0],
1572 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1573 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1574 0, nullptr, 0, nullptr);
1575
1576 VkViewport viewport{};
1577 viewport.maxDepth = 1.0f;
1578 viewport.minDepth = 0.0f;
1579 viewport.width = 512;
1580 viewport.height = 512;
1581 viewport.x = 0;
1582 viewport.y = 0;
1583 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1584 vkEndCommandBuffer(command_buffer[0]);
1585 }
1586 {
1587 VkCommandBufferBeginInfo begin_info{};
1588 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1589 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1590
1591 VkViewport viewport{};
1592 viewport.maxDepth = 1.0f;
1593 viewport.minDepth = 0.0f;
1594 viewport.width = 512;
1595 viewport.height = 512;
1596 viewport.x = 0;
1597 viewport.y = 0;
1598 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1599 vkEndCommandBuffer(command_buffer[1]);
1600 }
1601 {
1602 VkSubmitInfo submit_info{};
1603 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1604 submit_info.commandBufferCount = 1;
1605 submit_info.pCommandBuffers = &command_buffer[0];
1606 submit_info.signalSemaphoreCount = 1;
1607 submit_info.pSignalSemaphores = &semaphore;
1608 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1609 }
1610 {
1611 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1612 VkSubmitInfo submit_info{};
1613 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1614 submit_info.commandBufferCount = 1;
1615 submit_info.pCommandBuffers = &command_buffer[1];
1616 submit_info.waitSemaphoreCount = 1;
1617 submit_info.pWaitSemaphores = &semaphore;
1618 submit_info.pWaitDstStageMask = flags;
1619 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1620 }
1621
1622 vkQueueWaitIdle(m_device->m_queue);
1623
1624 vkDestroyFence(m_device->device(), fence, nullptr);
1625 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1626 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1627 &command_buffer[0]);
1628 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1629
1630 m_errorMonitor->VerifyNotFound();
1631}
1632
1633// This is a positive test. No errors should be generated.
1634TEST_F(VkLayerTest,
1635 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
1636
1637 TEST_DESCRIPTION(
1638 "Two command buffers, each in a separate QueueSubmit call "
1639 "submitted on separate queues, the second having a fence"
1640 "followed by two consecutive WaitForFences calls on the same fence.");
1641
Dustin Graves48458142016-04-29 16:11:55 -06001642 if ((m_device->queue_props.empty()) ||
1643 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001644 return;
1645
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001646 m_errorMonitor->ExpectSuccess();
1647
1648 VkFence fence;
1649 VkFenceCreateInfo fence_create_info{};
1650 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1651 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1652
1653 VkSemaphore semaphore;
1654 VkSemaphoreCreateInfo semaphore_create_info{};
1655 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1656 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1657 &semaphore);
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 VkQueue queue = VK_NULL_HANDLE;
1678 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1679 1, &queue);
1680
1681 {
1682 VkCommandBufferBeginInfo begin_info{};
1683 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1684 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1685
1686 vkCmdPipelineBarrier(command_buffer[0],
1687 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1688 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1689 0, nullptr, 0, nullptr);
1690
1691 VkViewport viewport{};
1692 viewport.maxDepth = 1.0f;
1693 viewport.minDepth = 0.0f;
1694 viewport.width = 512;
1695 viewport.height = 512;
1696 viewport.x = 0;
1697 viewport.y = 0;
1698 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1699 vkEndCommandBuffer(command_buffer[0]);
1700 }
1701 {
1702 VkCommandBufferBeginInfo begin_info{};
1703 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1704 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1705
1706 VkViewport viewport{};
1707 viewport.maxDepth = 1.0f;
1708 viewport.minDepth = 0.0f;
1709 viewport.width = 512;
1710 viewport.height = 512;
1711 viewport.x = 0;
1712 viewport.y = 0;
1713 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1714 vkEndCommandBuffer(command_buffer[1]);
1715 }
1716 {
1717 VkSubmitInfo submit_info{};
1718 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1719 submit_info.commandBufferCount = 1;
1720 submit_info.pCommandBuffers = &command_buffer[0];
1721 submit_info.signalSemaphoreCount = 1;
1722 submit_info.pSignalSemaphores = &semaphore;
1723 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1724 }
1725 {
1726 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1727 VkSubmitInfo submit_info{};
1728 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1729 submit_info.commandBufferCount = 1;
1730 submit_info.pCommandBuffers = &command_buffer[1];
1731 submit_info.waitSemaphoreCount = 1;
1732 submit_info.pWaitSemaphores = &semaphore;
1733 submit_info.pWaitDstStageMask = flags;
1734 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1735 }
1736
1737 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1738 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1739
1740 vkDestroyFence(m_device->device(), fence, nullptr);
1741 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1742 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1743 &command_buffer[0]);
1744 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1745
1746 m_errorMonitor->VerifyNotFound();
1747}
1748
1749// This is a positive test. No errors should be generated.
1750TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
1751
1752 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1753 "submitted on separate queues, the second having a fence, "
1754 "followed by a WaitForFences call.");
1755
Dustin Graves48458142016-04-29 16:11:55 -06001756 if ((m_device->queue_props.empty()) ||
1757 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001758 return;
1759
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001760 m_errorMonitor->ExpectSuccess();
1761
1762 VkFence fence;
1763 VkFenceCreateInfo fence_create_info{};
1764 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1765 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1766
1767 VkSemaphore semaphore;
1768 VkSemaphoreCreateInfo semaphore_create_info{};
1769 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1770 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1771 &semaphore);
1772
1773 VkCommandPool command_pool;
1774 VkCommandPoolCreateInfo pool_create_info{};
1775 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1776 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1777 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1778 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1779 &command_pool);
1780
1781 VkCommandBuffer command_buffer[2];
1782 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1783 command_buffer_allocate_info.sType =
1784 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1785 command_buffer_allocate_info.commandPool = command_pool;
1786 command_buffer_allocate_info.commandBufferCount = 2;
1787 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1788 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1789 command_buffer);
1790
1791 VkQueue queue = VK_NULL_HANDLE;
1792 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1793 1, &queue);
1794
1795
1796 {
1797 VkCommandBufferBeginInfo begin_info{};
1798 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1799 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1800
1801 vkCmdPipelineBarrier(command_buffer[0],
1802 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1803 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1804 0, nullptr, 0, nullptr);
1805
1806 VkViewport viewport{};
1807 viewport.maxDepth = 1.0f;
1808 viewport.minDepth = 0.0f;
1809 viewport.width = 512;
1810 viewport.height = 512;
1811 viewport.x = 0;
1812 viewport.y = 0;
1813 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1814 vkEndCommandBuffer(command_buffer[0]);
1815 }
1816 {
1817 VkCommandBufferBeginInfo begin_info{};
1818 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1819 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1820
1821 VkViewport viewport{};
1822 viewport.maxDepth = 1.0f;
1823 viewport.minDepth = 0.0f;
1824 viewport.width = 512;
1825 viewport.height = 512;
1826 viewport.x = 0;
1827 viewport.y = 0;
1828 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1829 vkEndCommandBuffer(command_buffer[1]);
1830 }
1831 {
1832 VkSubmitInfo submit_info{};
1833 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1834 submit_info.commandBufferCount = 1;
1835 submit_info.pCommandBuffers = &command_buffer[0];
1836 submit_info.signalSemaphoreCount = 1;
1837 submit_info.pSignalSemaphores = &semaphore;
1838 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1839 }
1840 {
1841 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1842 VkSubmitInfo submit_info{};
1843 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1844 submit_info.commandBufferCount = 1;
1845 submit_info.pCommandBuffers = &command_buffer[1];
1846 submit_info.waitSemaphoreCount = 1;
1847 submit_info.pWaitSemaphores = &semaphore;
1848 submit_info.pWaitDstStageMask = flags;
1849 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1850 }
1851
1852 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1853
1854 vkDestroyFence(m_device->device(), fence, nullptr);
1855 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1856 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1857 &command_buffer[0]);
1858 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1859
1860 m_errorMonitor->VerifyNotFound();
1861}
1862
1863// This is a positive test. No errors should be generated.
1864TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
1865
1866 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1867 "on the same queue, sharing a signal/wait semaphore, the "
1868 "second having a fence, "
1869 "followed by a WaitForFences call.");
1870
1871 m_errorMonitor->ExpectSuccess();
1872
1873 VkFence fence;
1874 VkFenceCreateInfo fence_create_info{};
1875 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1876 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1877
1878 VkSemaphore semaphore;
1879 VkSemaphoreCreateInfo semaphore_create_info{};
1880 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1881 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1882 &semaphore);
1883
1884 VkCommandPool command_pool;
1885 VkCommandPoolCreateInfo pool_create_info{};
1886 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1887 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1888 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1889 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1890 &command_pool);
1891
1892 VkCommandBuffer command_buffer[2];
1893 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1894 command_buffer_allocate_info.sType =
1895 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1896 command_buffer_allocate_info.commandPool = command_pool;
1897 command_buffer_allocate_info.commandBufferCount = 2;
1898 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1899 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1900 command_buffer);
1901
1902 {
1903 VkCommandBufferBeginInfo begin_info{};
1904 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1905 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1906
1907 vkCmdPipelineBarrier(command_buffer[0],
1908 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1909 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1910 0, nullptr, 0, nullptr);
1911
1912 VkViewport viewport{};
1913 viewport.maxDepth = 1.0f;
1914 viewport.minDepth = 0.0f;
1915 viewport.width = 512;
1916 viewport.height = 512;
1917 viewport.x = 0;
1918 viewport.y = 0;
1919 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1920 vkEndCommandBuffer(command_buffer[0]);
1921 }
1922 {
1923 VkCommandBufferBeginInfo begin_info{};
1924 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1925 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1926
1927 VkViewport viewport{};
1928 viewport.maxDepth = 1.0f;
1929 viewport.minDepth = 0.0f;
1930 viewport.width = 512;
1931 viewport.height = 512;
1932 viewport.x = 0;
1933 viewport.y = 0;
1934 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1935 vkEndCommandBuffer(command_buffer[1]);
1936 }
1937 {
1938 VkSubmitInfo submit_info{};
1939 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1940 submit_info.commandBufferCount = 1;
1941 submit_info.pCommandBuffers = &command_buffer[0];
1942 submit_info.signalSemaphoreCount = 1;
1943 submit_info.pSignalSemaphores = &semaphore;
1944 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1945 }
1946 {
1947 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1948 VkSubmitInfo submit_info{};
1949 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1950 submit_info.commandBufferCount = 1;
1951 submit_info.pCommandBuffers = &command_buffer[1];
1952 submit_info.waitSemaphoreCount = 1;
1953 submit_info.pWaitSemaphores = &semaphore;
1954 submit_info.pWaitDstStageMask = flags;
1955 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1956 }
1957
1958 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1959
1960 vkDestroyFence(m_device->device(), fence, nullptr);
1961 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1962 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1963 &command_buffer[0]);
1964 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1965
1966 m_errorMonitor->VerifyNotFound();
1967}
1968
1969// This is a positive test. No errors should be generated.
1970TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
1971
1972 TEST_DESCRIPTION(
1973 "Two command buffers, each in a separate QueueSubmit call "
1974 "on the same queue, no fences, followed by a third QueueSubmit with NO "
1975 "SubmitInfos but with a fence, followed by a WaitForFences call.");
1976
1977 m_errorMonitor->ExpectSuccess();
1978
1979 VkFence fence;
1980 VkFenceCreateInfo fence_create_info{};
1981 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1982 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1983
1984 VkCommandPool command_pool;
1985 VkCommandPoolCreateInfo pool_create_info{};
1986 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1987 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1988 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1989 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1990 &command_pool);
1991
1992 VkCommandBuffer command_buffer[2];
1993 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1994 command_buffer_allocate_info.sType =
1995 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1996 command_buffer_allocate_info.commandPool = command_pool;
1997 command_buffer_allocate_info.commandBufferCount = 2;
1998 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1999 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2000 command_buffer);
2001
2002 {
2003 VkCommandBufferBeginInfo begin_info{};
2004 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2005 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2006
2007 vkCmdPipelineBarrier(command_buffer[0],
2008 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2009 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2010 0, nullptr, 0, nullptr);
2011
2012 VkViewport viewport{};
2013 viewport.maxDepth = 1.0f;
2014 viewport.minDepth = 0.0f;
2015 viewport.width = 512;
2016 viewport.height = 512;
2017 viewport.x = 0;
2018 viewport.y = 0;
2019 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2020 vkEndCommandBuffer(command_buffer[0]);
2021 }
2022 {
2023 VkCommandBufferBeginInfo begin_info{};
2024 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2025 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2026
2027 VkViewport viewport{};
2028 viewport.maxDepth = 1.0f;
2029 viewport.minDepth = 0.0f;
2030 viewport.width = 512;
2031 viewport.height = 512;
2032 viewport.x = 0;
2033 viewport.y = 0;
2034 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2035 vkEndCommandBuffer(command_buffer[1]);
2036 }
2037 {
2038 VkSubmitInfo submit_info{};
2039 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2040 submit_info.commandBufferCount = 1;
2041 submit_info.pCommandBuffers = &command_buffer[0];
2042 submit_info.signalSemaphoreCount = 0;
2043 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2044 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2045 }
2046 {
2047 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2048 VkSubmitInfo submit_info{};
2049 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2050 submit_info.commandBufferCount = 1;
2051 submit_info.pCommandBuffers = &command_buffer[1];
2052 submit_info.waitSemaphoreCount = 0;
2053 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2054 submit_info.pWaitDstStageMask = flags;
2055 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2056 }
2057
2058 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
2059
2060 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2061
2062 vkDestroyFence(m_device->device(), fence, nullptr);
2063 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2064 &command_buffer[0]);
2065 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2066
2067 m_errorMonitor->VerifyNotFound();
2068}
2069
2070// This is a positive test. No errors should be generated.
2071TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
2072
2073 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2074 "on the same queue, the second having a fence, followed "
2075 "by a WaitForFences call.");
2076
2077 m_errorMonitor->ExpectSuccess();
2078
2079 VkFence fence;
2080 VkFenceCreateInfo fence_create_info{};
2081 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2082 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2083
2084 VkCommandPool command_pool;
2085 VkCommandPoolCreateInfo pool_create_info{};
2086 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2087 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2088 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2089 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2090 &command_pool);
2091
2092 VkCommandBuffer command_buffer[2];
2093 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2094 command_buffer_allocate_info.sType =
2095 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2096 command_buffer_allocate_info.commandPool = command_pool;
2097 command_buffer_allocate_info.commandBufferCount = 2;
2098 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2099 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2100 command_buffer);
2101
2102 {
2103 VkCommandBufferBeginInfo begin_info{};
2104 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2105 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2106
2107 vkCmdPipelineBarrier(command_buffer[0],
2108 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2109 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2110 0, nullptr, 0, nullptr);
2111
2112 VkViewport viewport{};
2113 viewport.maxDepth = 1.0f;
2114 viewport.minDepth = 0.0f;
2115 viewport.width = 512;
2116 viewport.height = 512;
2117 viewport.x = 0;
2118 viewport.y = 0;
2119 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2120 vkEndCommandBuffer(command_buffer[0]);
2121 }
2122 {
2123 VkCommandBufferBeginInfo begin_info{};
2124 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2125 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2126
2127 VkViewport viewport{};
2128 viewport.maxDepth = 1.0f;
2129 viewport.minDepth = 0.0f;
2130 viewport.width = 512;
2131 viewport.height = 512;
2132 viewport.x = 0;
2133 viewport.y = 0;
2134 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2135 vkEndCommandBuffer(command_buffer[1]);
2136 }
2137 {
2138 VkSubmitInfo submit_info{};
2139 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2140 submit_info.commandBufferCount = 1;
2141 submit_info.pCommandBuffers = &command_buffer[0];
2142 submit_info.signalSemaphoreCount = 0;
2143 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2144 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2145 }
2146 {
2147 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2148 VkSubmitInfo submit_info{};
2149 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2150 submit_info.commandBufferCount = 1;
2151 submit_info.pCommandBuffers = &command_buffer[1];
2152 submit_info.waitSemaphoreCount = 0;
2153 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2154 submit_info.pWaitDstStageMask = flags;
2155 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2156 }
2157
2158 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2159
2160 vkDestroyFence(m_device->device(), fence, nullptr);
2161 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2162 &command_buffer[0]);
2163 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2164
2165 m_errorMonitor->VerifyNotFound();
2166}
2167
2168// This is a positive test. No errors should be generated.
2169TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
2170
2171 TEST_DESCRIPTION(
2172 "Two command buffers each in a separate SubmitInfo sent in a single "
2173 "QueueSubmit call followed by a WaitForFences call.");
2174
2175 m_errorMonitor->ExpectSuccess();
2176
2177 VkFence fence;
2178 VkFenceCreateInfo fence_create_info{};
2179 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2180 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2181
2182 VkSemaphore semaphore;
2183 VkSemaphoreCreateInfo semaphore_create_info{};
2184 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2185 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2186 &semaphore);
2187
2188 VkCommandPool command_pool;
2189 VkCommandPoolCreateInfo pool_create_info{};
2190 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2191 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2192 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2193 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2194 &command_pool);
2195
2196 VkCommandBuffer command_buffer[2];
2197 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2198 command_buffer_allocate_info.sType =
2199 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2200 command_buffer_allocate_info.commandPool = command_pool;
2201 command_buffer_allocate_info.commandBufferCount = 2;
2202 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2203 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2204 command_buffer);
2205
2206 {
2207 VkCommandBufferBeginInfo begin_info{};
2208 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2209 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2210
2211 vkCmdPipelineBarrier(command_buffer[0],
2212 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2213 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2214 0, nullptr, 0, nullptr);
2215
2216 VkViewport viewport{};
2217 viewport.maxDepth = 1.0f;
2218 viewport.minDepth = 0.0f;
2219 viewport.width = 512;
2220 viewport.height = 512;
2221 viewport.x = 0;
2222 viewport.y = 0;
2223 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2224 vkEndCommandBuffer(command_buffer[0]);
2225 }
2226 {
2227 VkCommandBufferBeginInfo begin_info{};
2228 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2229 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2230
2231 VkViewport viewport{};
2232 viewport.maxDepth = 1.0f;
2233 viewport.minDepth = 0.0f;
2234 viewport.width = 512;
2235 viewport.height = 512;
2236 viewport.x = 0;
2237 viewport.y = 0;
2238 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2239 vkEndCommandBuffer(command_buffer[1]);
2240 }
2241 {
2242 VkSubmitInfo submit_info[2];
2243 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2244
2245 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2246 submit_info[0].pNext = NULL;
2247 submit_info[0].commandBufferCount = 1;
2248 submit_info[0].pCommandBuffers = &command_buffer[0];
2249 submit_info[0].signalSemaphoreCount = 1;
2250 submit_info[0].pSignalSemaphores = &semaphore;
2251 submit_info[0].waitSemaphoreCount = 0;
2252 submit_info[0].pWaitSemaphores = NULL;
2253 submit_info[0].pWaitDstStageMask = 0;
2254
2255 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2256 submit_info[1].pNext = NULL;
2257 submit_info[1].commandBufferCount = 1;
2258 submit_info[1].pCommandBuffers = &command_buffer[1];
2259 submit_info[1].waitSemaphoreCount = 1;
2260 submit_info[1].pWaitSemaphores = &semaphore;
2261 submit_info[1].pWaitDstStageMask = flags;
2262 submit_info[1].signalSemaphoreCount = 0;
2263 submit_info[1].pSignalSemaphores = NULL;
2264 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
2265 }
2266
2267 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2268
2269 vkDestroyFence(m_device->device(), fence, nullptr);
2270 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2271 &command_buffer[0]);
2272 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2273
2274 m_errorMonitor->VerifyNotFound();
2275}
2276
Karl Schultz6addd812016-02-02 17:17:23 -07002277TEST_F(VkLayerTest, LineWidthStateNotBound) {
2278 m_errorMonitor->SetDesiredFailureMsg(
2279 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002280 "Dynamic line width state not set for this command buffer");
2281
Karl Schultz6addd812016-02-02 17:17:23 -07002282 TEST_DESCRIPTION("Simple Draw Call that validates failure when a line "
2283 "width state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002284
Karl Schultz6addd812016-02-02 17:17:23 -07002285 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2286 BsoFailLineWidth);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002287
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002288 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002289}
2290
Karl Schultz6addd812016-02-02 17:17:23 -07002291TEST_F(VkLayerTest, DepthBiasStateNotBound) {
2292 m_errorMonitor->SetDesiredFailureMsg(
2293 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002294 "Dynamic depth bias state not set for this command buffer");
2295
Karl Schultz6addd812016-02-02 17:17:23 -07002296 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
2297 "bias state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002298
Karl Schultz6addd812016-02-02 17:17:23 -07002299 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2300 BsoFailDepthBias);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002301
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002302 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002303}
2304
Karl Schultz6addd812016-02-02 17:17:23 -07002305// Disable these two tests until we can sort out how to track multiple layer
2306// errors
2307TEST_F(VkLayerTest, ViewportStateNotBound) {
2308 m_errorMonitor->SetDesiredFailureMsg(
2309 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002310 "Dynamic viewport state not set for this command buffer");
2311
Karl Schultz6addd812016-02-02 17:17:23 -07002312 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
2313 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002314
Karl Schultz6addd812016-02-02 17:17:23 -07002315 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2316 BsoFailViewport);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002317
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002318 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002319}
2320
Karl Schultz6addd812016-02-02 17:17:23 -07002321TEST_F(VkLayerTest, ScissorStateNotBound) {
2322 m_errorMonitor->SetDesiredFailureMsg(
2323 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002324 "Dynamic scissor state not set for this command buffer");
2325
Karl Schultz6addd812016-02-02 17:17:23 -07002326 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
2327 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002328
Karl Schultz6addd812016-02-02 17:17:23 -07002329 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2330 BsoFailScissor);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002331
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002332 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002333}
2334
Karl Schultz6addd812016-02-02 17:17:23 -07002335TEST_F(VkLayerTest, BlendStateNotBound) {
2336 m_errorMonitor->SetDesiredFailureMsg(
2337 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7a1d2352016-03-28 11:18:19 -06002338 "Dynamic blend constants state not set for this command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002339
Karl Schultz6addd812016-02-02 17:17:23 -07002340 TEST_DESCRIPTION("Simple Draw Call that validates failure when a blend "
2341 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002342
Karl Schultz6addd812016-02-02 17:17:23 -07002343 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2344 BsoFailBlend);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002345
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002346 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002347}
2348
Karl Schultz6addd812016-02-02 17:17:23 -07002349TEST_F(VkLayerTest, DepthBoundsStateNotBound) {
2350 m_errorMonitor->SetDesiredFailureMsg(
2351 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002352 "Dynamic depth bounds state not set for this command buffer");
2353
Karl Schultz6addd812016-02-02 17:17:23 -07002354 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
2355 "bounds state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002356
Karl Schultz6addd812016-02-02 17:17:23 -07002357 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2358 BsoFailDepthBounds);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002359
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002360 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002361}
2362
Karl Schultz6addd812016-02-02 17:17:23 -07002363TEST_F(VkLayerTest, StencilReadMaskNotSet) {
2364 m_errorMonitor->SetDesiredFailureMsg(
2365 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002366 "Dynamic stencil read mask state not set for this command buffer");
2367
Tobin Ehlis963a4042015-09-29 08:18:34 -06002368 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002369
Karl Schultz6addd812016-02-02 17:17:23 -07002370 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2371 "read mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002372
Karl Schultz6addd812016-02-02 17:17:23 -07002373 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2374 BsoFailStencilReadMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002375
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002376 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002377}
2378
Karl Schultz6addd812016-02-02 17:17:23 -07002379TEST_F(VkLayerTest, StencilWriteMaskNotSet) {
2380 m_errorMonitor->SetDesiredFailureMsg(
2381 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002382 "Dynamic stencil write mask state not set for this command buffer");
2383
Tobin Ehlis963a4042015-09-29 08:18:34 -06002384 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002385
Karl Schultz6addd812016-02-02 17:17:23 -07002386 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2387 "write mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002388
Karl Schultz6addd812016-02-02 17:17:23 -07002389 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2390 BsoFailStencilWriteMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002391
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002392 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002393}
2394
Karl Schultz6addd812016-02-02 17:17:23 -07002395TEST_F(VkLayerTest, StencilReferenceNotSet) {
2396 m_errorMonitor->SetDesiredFailureMsg(
2397 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002398 "Dynamic stencil reference state not set for this command buffer");
2399
Karl Schultz6addd812016-02-02 17:17:23 -07002400 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2401 "reference is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002402
Karl Schultz6addd812016-02-02 17:17:23 -07002403 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2404 BsoFailStencilReference);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002405
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002406 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002407}
2408
Karl Schultz6addd812016-02-02 17:17:23 -07002409TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002410 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002411
Karl Schultz6addd812016-02-02 17:17:23 -07002412 m_errorMonitor->SetDesiredFailureMsg(
2413 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2414 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
2415 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002416
2417 VkFenceCreateInfo fenceInfo = {};
2418 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2419 fenceInfo.pNext = NULL;
2420 fenceInfo.flags = 0;
2421
2422 ASSERT_NO_FATAL_FAILURE(InitState());
2423 ASSERT_NO_FATAL_FAILURE(InitViewport());
2424 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2425
Karl Schultz6addd812016-02-02 17:17:23 -07002426 // We luck out b/c by default the framework creates CB w/ the
2427 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002428 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002429 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2430 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002431 EndCommandBuffer();
2432
2433 testFence.init(*m_device, fenceInfo);
2434
2435 // Bypass framework since it does the waits automatically
2436 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002437 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002438 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2439 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002440 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002441 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002442 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002443 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002444 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002445 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002446 submit_info.pSignalSemaphores = NULL;
2447
Karl Schultz6addd812016-02-02 17:17:23 -07002448 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
2449 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002450
Karl Schultz6addd812016-02-02 17:17:23 -07002451 // Cause validation error by re-submitting cmd buffer that should only be
2452 // submitted once
2453 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002454
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002455 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002456}
2457
Karl Schultz6addd812016-02-02 17:17:23 -07002458TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002459 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07002460 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002461
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002463 "Unable to allocate 1 descriptors of "
2464 "type "
2465 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002466
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002467 ASSERT_NO_FATAL_FAILURE(InitState());
2468 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002469
Karl Schultz6addd812016-02-02 17:17:23 -07002470 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
2471 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002472 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002473 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2474 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002475
2476 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002477 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2478 ds_pool_ci.pNext = NULL;
2479 ds_pool_ci.flags = 0;
2480 ds_pool_ci.maxSets = 1;
2481 ds_pool_ci.poolSizeCount = 1;
2482 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002483
2484 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002485 err =
2486 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002487 ASSERT_VK_SUCCESS(err);
2488
2489 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002490 dsl_binding.binding = 0;
2491 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2492 dsl_binding.descriptorCount = 1;
2493 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2494 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002495
2496 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002497 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2498 ds_layout_ci.pNext = NULL;
2499 ds_layout_ci.bindingCount = 1;
2500 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002501
2502 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002503 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2504 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002505 ASSERT_VK_SUCCESS(err);
2506
2507 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002508 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002509 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002510 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002511 alloc_info.descriptorPool = ds_pool;
2512 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002513 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2514 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002515
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002516 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002517
Chia-I Wuf7458c52015-10-26 21:10:41 +08002518 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2519 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002520}
2521
Karl Schultz6addd812016-02-02 17:17:23 -07002522TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
2523 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06002524
Karl Schultz6addd812016-02-02 17:17:23 -07002525 m_errorMonitor->SetDesiredFailureMsg(
2526 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2527 "It is invalid to call vkFreeDescriptorSets() with a pool created "
2528 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002529
Tobin Ehlise735c692015-10-08 13:13:50 -06002530 ASSERT_NO_FATAL_FAILURE(InitState());
2531 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06002532
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002533 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002534 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2535 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06002536
2537 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002538 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2539 ds_pool_ci.pNext = NULL;
2540 ds_pool_ci.maxSets = 1;
2541 ds_pool_ci.poolSizeCount = 1;
2542 ds_pool_ci.flags = 0;
2543 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
2544 // app can only call vkResetDescriptorPool on this pool.;
2545 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06002546
2547 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002548 err =
2549 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06002550 ASSERT_VK_SUCCESS(err);
2551
2552 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002553 dsl_binding.binding = 0;
2554 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2555 dsl_binding.descriptorCount = 1;
2556 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2557 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06002558
2559 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002560 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2561 ds_layout_ci.pNext = NULL;
2562 ds_layout_ci.bindingCount = 1;
2563 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06002564
2565 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002566 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2567 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06002568 ASSERT_VK_SUCCESS(err);
2569
2570 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002571 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002572 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002573 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002574 alloc_info.descriptorPool = ds_pool;
2575 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002576 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2577 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06002578 ASSERT_VK_SUCCESS(err);
2579
2580 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002581 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06002582
Chia-I Wuf7458c52015-10-26 21:10:41 +08002583 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2584 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06002585}
2586
Karl Schultz6addd812016-02-02 17:17:23 -07002587TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002588 // Attempt to clear Descriptor Pool with bad object.
2589 // ObjectTracker should catch this.
2590 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2591 "Invalid VkDescriptorPool Object 0xbaad6001");
2592 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
2593 vkResetDescriptorPool(device(), badPool, 0);
2594 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002595}
2596
Karl Schultz6addd812016-02-02 17:17:23 -07002597TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002598 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
2599 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002600 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06002601 // call vkCmdBindDescriptorSets w/ false Descriptor Set
2602 VkDescriptorSet badSet = (VkDescriptorSet)0xbaad6001;
2603 VkResult err;
2604 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2605 "Invalid VkDescriptorSet Object 0xbaad6001");
2606
2607 ASSERT_NO_FATAL_FAILURE(InitState());
2608
2609 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
2610 layout_bindings[0].binding = 0;
2611 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2612 layout_bindings[0].descriptorCount = 1;
2613 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2614 layout_bindings[0].pImmutableSamplers = NULL;
2615
2616 VkDescriptorSetLayout descriptor_set_layout;
2617 VkDescriptorSetLayoutCreateInfo dslci = {};
2618 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2619 dslci.pNext = NULL;
2620 dslci.bindingCount = 1;
2621 dslci.pBindings = layout_bindings;
2622 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002623 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002624
2625 VkPipelineLayout pipeline_layout;
2626 VkPipelineLayoutCreateInfo plci = {};
2627 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2628 plci.pNext = NULL;
2629 plci.setLayoutCount = 1;
2630 plci.pSetLayouts = &descriptor_set_layout;
2631 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002632 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002633
2634 BeginCommandBuffer();
2635 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2636 pipeline_layout, 0, 1, &badSet, 0, NULL);
2637 m_errorMonitor->VerifyFound();
2638 EndCommandBuffer();
2639 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
2640 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002641}
2642
Karl Schultz6addd812016-02-02 17:17:23 -07002643TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002644 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
2645 // ObjectTracker should catch this.
2646 VkDescriptorSetLayout bad_layout = (VkDescriptorSetLayout)0xbaad6001;
2647 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2648 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
2649
2650 VkPipelineLayout pipeline_layout;
2651 VkPipelineLayoutCreateInfo plci = {};
2652 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2653 plci.pNext = NULL;
2654 plci.setLayoutCount = 1;
2655 plci.pSetLayouts = &bad_layout;
2656 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
2657
2658 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002659}
2660
Karl Schultz6addd812016-02-02 17:17:23 -07002661TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002662 // Attempt to bind an invalid Pipeline to a valid Command Buffer
2663 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002664 // Create a valid cmd buffer
2665 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultzbdb75952016-04-19 11:36:49 -06002666 VkPipeline bad_pipeline = (VkPipeline)0xbaad6001;
2667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2668 "Invalid VkPipeline Object 0xbaad6001");
2669 ASSERT_NO_FATAL_FAILURE(InitState());
2670 BeginCommandBuffer();
2671 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2672 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
2673 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06002674
2675 // Now issue a draw call with no pipeline bound
2676 m_errorMonitor->SetDesiredFailureMsg(
2677 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2678 "At Draw/Dispatch time no valid VkPipeline is bound!");
2679 ASSERT_NO_FATAL_FAILURE(InitState());
2680 BeginCommandBuffer();
2681 Draw(1, 0, 0, 0);
2682 m_errorMonitor->VerifyFound();
2683 // Finally same check once more but with Dispatch/Compute
2684 m_errorMonitor->SetDesiredFailureMsg(
2685 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2686 "At Draw/Dispatch time no valid VkPipeline is bound!");
2687 ASSERT_NO_FATAL_FAILURE(InitState());
2688 BeginCommandBuffer();
2689 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
2690 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002691}
2692
Karl Schultz6addd812016-02-02 17:17:23 -07002693TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
2694 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
2695 // CommandBuffer
2696 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002697
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002699 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002700
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002701 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06002702 ASSERT_NO_FATAL_FAILURE(InitViewport());
2703 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002704 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002705 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2706 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06002707
2708 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002709 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2710 ds_pool_ci.pNext = NULL;
2711 ds_pool_ci.maxSets = 1;
2712 ds_pool_ci.poolSizeCount = 1;
2713 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06002714
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002715 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002716 err =
2717 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002718 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002719
Tony Barboureb254902015-07-15 12:50:33 -06002720 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002721 dsl_binding.binding = 0;
2722 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2723 dsl_binding.descriptorCount = 1;
2724 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2725 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002726
Tony Barboureb254902015-07-15 12:50:33 -06002727 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002728 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2729 ds_layout_ci.pNext = NULL;
2730 ds_layout_ci.bindingCount = 1;
2731 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002732 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002733 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2734 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002735 ASSERT_VK_SUCCESS(err);
2736
2737 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002738 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002739 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002740 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002741 alloc_info.descriptorPool = ds_pool;
2742 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002743 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2744 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002745 ASSERT_VK_SUCCESS(err);
2746
Tony Barboureb254902015-07-15 12:50:33 -06002747 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002748 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2749 pipeline_layout_ci.pNext = NULL;
2750 pipeline_layout_ci.setLayoutCount = 1;
2751 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002752
2753 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002754 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2755 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002756 ASSERT_VK_SUCCESS(err);
2757
Karl Schultz6addd812016-02-02 17:17:23 -07002758 VkShaderObj vs(m_device, bindStateVertShaderText,
2759 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06002760 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07002761 // on more devices
2762 VkShaderObj fs(m_device, bindStateFragShaderText,
2763 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002764
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002765 VkPipelineObj pipe(m_device);
2766 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06002767 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06002768 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002769 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06002770
2771 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002772 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2773 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2774 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2775 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2776 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002777
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002778 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002779
Chia-I Wuf7458c52015-10-26 21:10:41 +08002780 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2781 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2782 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002783}
2784
Karl Schultz6addd812016-02-02 17:17:23 -07002785TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002786 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07002787 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002788
Karl Schultz6addd812016-02-02 17:17:23 -07002789 m_errorMonitor->SetDesiredFailureMsg(
2790 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002791 "Attempt to update descriptor with invalid bufferView ");
2792
2793 ASSERT_NO_FATAL_FAILURE(InitState());
2794 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002795 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2796 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002797
2798 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002799 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2800 ds_pool_ci.pNext = NULL;
2801 ds_pool_ci.maxSets = 1;
2802 ds_pool_ci.poolSizeCount = 1;
2803 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002804
2805 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002806 err =
2807 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002808 ASSERT_VK_SUCCESS(err);
2809
2810 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002811 dsl_binding.binding = 0;
2812 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2813 dsl_binding.descriptorCount = 1;
2814 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2815 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002816
2817 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002818 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2819 ds_layout_ci.pNext = NULL;
2820 ds_layout_ci.bindingCount = 1;
2821 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002822 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002823 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2824 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002825 ASSERT_VK_SUCCESS(err);
2826
2827 VkDescriptorSet descriptorSet;
2828 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002829 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002830 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -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 Ehlisba31cab2015-11-02 15:24:32 -07002835 ASSERT_VK_SUCCESS(err);
2836
Karl Schultz6addd812016-02-02 17:17:23 -07002837 VkBufferView view =
2838 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002839 VkWriteDescriptorSet descriptor_write;
2840 memset(&descriptor_write, 0, sizeof(descriptor_write));
2841 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2842 descriptor_write.dstSet = descriptorSet;
2843 descriptor_write.dstBinding = 0;
2844 descriptor_write.descriptorCount = 1;
2845 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2846 descriptor_write.pTexelBufferView = &view;
2847
2848 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2849
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002850 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002851
2852 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2853 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2854}
2855
Karl Schultz6addd812016-02-02 17:17:23 -07002856TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
2857 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
2858 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07002859 // 1. No dynamicOffset supplied
2860 // 2. Too many dynamicOffsets supplied
2861 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07002862 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002864 " requires 1 dynamicOffsets, but only "
2865 "0 dynamicOffsets are left in "
2866 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002867
2868 ASSERT_NO_FATAL_FAILURE(InitState());
2869 ASSERT_NO_FATAL_FAILURE(InitViewport());
2870 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2871
2872 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002873 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2874 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002875
2876 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002877 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2878 ds_pool_ci.pNext = NULL;
2879 ds_pool_ci.maxSets = 1;
2880 ds_pool_ci.poolSizeCount = 1;
2881 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002882
2883 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002884 err =
2885 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002886 ASSERT_VK_SUCCESS(err);
2887
2888 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002889 dsl_binding.binding = 0;
2890 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2891 dsl_binding.descriptorCount = 1;
2892 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2893 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002894
2895 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002896 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2897 ds_layout_ci.pNext = NULL;
2898 ds_layout_ci.bindingCount = 1;
2899 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002900 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002901 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2902 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002903 ASSERT_VK_SUCCESS(err);
2904
2905 VkDescriptorSet descriptorSet;
2906 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002907 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002908 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002909 alloc_info.descriptorPool = ds_pool;
2910 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002911 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2912 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002913 ASSERT_VK_SUCCESS(err);
2914
2915 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002916 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2917 pipeline_layout_ci.pNext = NULL;
2918 pipeline_layout_ci.setLayoutCount = 1;
2919 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002920
2921 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002922 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2923 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002924 ASSERT_VK_SUCCESS(err);
2925
2926 // Create a buffer to update the descriptor with
2927 uint32_t qfi = 0;
2928 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002929 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2930 buffCI.size = 1024;
2931 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2932 buffCI.queueFamilyIndexCount = 1;
2933 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002934
2935 VkBuffer dyub;
2936 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2937 ASSERT_VK_SUCCESS(err);
2938 // Correctly update descriptor to avoid "NOT_UPDATED" error
2939 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002940 buffInfo.buffer = dyub;
2941 buffInfo.offset = 0;
2942 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002943
2944 VkWriteDescriptorSet descriptor_write;
2945 memset(&descriptor_write, 0, sizeof(descriptor_write));
2946 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2947 descriptor_write.dstSet = descriptorSet;
2948 descriptor_write.dstBinding = 0;
2949 descriptor_write.descriptorCount = 1;
2950 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2951 descriptor_write.pBufferInfo = &buffInfo;
2952
2953 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2954
2955 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002956 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2957 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2958 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002959 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07002960 uint32_t pDynOff[2] = {512, 756};
2961 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07002962 m_errorMonitor->SetDesiredFailureMsg(
2963 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07002964 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07002965 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2966 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2967 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12002968 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07002969 // Finally cause error due to dynamicOffset being too big
Karl Schultz6addd812016-02-02 17:17:23 -07002970 m_errorMonitor->SetDesiredFailureMsg(
2971 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07002972 " from its update, this oversteps its buffer (");
2973 // Create PSO to be used for draw-time errors below
2974 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002975 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002976 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07002977 "out gl_PerVertex { \n"
2978 " vec4 gl_Position;\n"
2979 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002980 "void main(){\n"
2981 " gl_Position = vec4(1);\n"
2982 "}\n";
2983 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002984 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002985 "\n"
2986 "layout(location=0) out vec4 x;\n"
2987 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2988 "void main(){\n"
2989 " x = vec4(bar.y);\n"
2990 "}\n";
2991 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2992 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2993 VkPipelineObj pipe(m_device);
2994 pipe.AddShader(&vs);
2995 pipe.AddShader(&fs);
2996 pipe.AddColorAttachment();
2997 pipe.CreateVKPipeline(pipeline_layout, renderPass());
2998
Karl Schultz6addd812016-02-02 17:17:23 -07002999 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3000 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3001 // This update should succeed, but offset size of 512 will overstep buffer
3002 // /w range 1024 & size 1024
3003 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3004 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3005 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07003006 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003007 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003008
3009 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3010 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3011}
3012
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003013TEST_F(VkLayerTest, InvalidPushConstants) {
3014 // Hit push constant error cases:
3015 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
3016 // 2. Incorrectly set push constant size to 0
3017 // 3. Incorrectly set push constant size to non-multiple of 4
3018 // 4. Attempt push constant update that exceeds maxPushConstantSize
3019 VkResult err;
3020 m_errorMonitor->SetDesiredFailureMsg(
3021 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3022 "vkCreatePipelineLayout() call has push constants with offset ");
3023
3024 ASSERT_NO_FATAL_FAILURE(InitState());
3025 ASSERT_NO_FATAL_FAILURE(InitViewport());
3026 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3027
3028 VkPushConstantRange pc_range = {};
3029 pc_range.size = 0xFFFFFFFFu;
3030 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3031 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3032 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3033 pipeline_layout_ci.pushConstantRangeCount = 1;
3034 pipeline_layout_ci.pPushConstantRanges = &pc_range;
3035
3036 VkPipelineLayout pipeline_layout;
3037 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3038 &pipeline_layout);
3039
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003040 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003041 // Now cause errors due to size 0 and non-4 byte aligned size
3042 pc_range.size = 0;
3043 m_errorMonitor->SetDesiredFailureMsg(
3044 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3045 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
3046 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3047 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003048 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003049 pc_range.size = 1;
3050 m_errorMonitor->SetDesiredFailureMsg(
3051 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3052 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
3053 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3054 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003055 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003056 // Cause error due to bad size in vkCmdPushConstants() call
3057 m_errorMonitor->SetDesiredFailureMsg(
3058 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3059 "vkCmdPushConstants() call has push constants with offset ");
3060 pipeline_layout_ci.pushConstantRangeCount = 0;
3061 pipeline_layout_ci.pPushConstantRanges = NULL;
3062 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3063 &pipeline_layout);
3064 ASSERT_VK_SUCCESS(err);
3065 BeginCommandBuffer();
3066 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
3067 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003068 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003069 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3070}
3071
Karl Schultz6addd812016-02-02 17:17:23 -07003072TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003073 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07003074 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003075
3076 ASSERT_NO_FATAL_FAILURE(InitState());
3077 ASSERT_NO_FATAL_FAILURE(InitViewport());
3078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3079
3080 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
3081 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003082 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3083 ds_type_count[0].descriptorCount = 10;
3084 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3085 ds_type_count[1].descriptorCount = 2;
3086 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3087 ds_type_count[2].descriptorCount = 2;
3088 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
3089 ds_type_count[3].descriptorCount = 5;
3090 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
3091 // type
3092 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
3093 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
3094 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003095
3096 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003097 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3098 ds_pool_ci.pNext = NULL;
3099 ds_pool_ci.maxSets = 5;
3100 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
3101 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003102
3103 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003104 err =
3105 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003106 ASSERT_VK_SUCCESS(err);
3107
3108 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
3109 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003110 dsl_binding[0].binding = 0;
3111 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3112 dsl_binding[0].descriptorCount = 5;
3113 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
3114 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003115
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003116 // Create layout identical to set0 layout but w/ different stageFlags
3117 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003118 dsl_fs_stage_only.binding = 0;
3119 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3120 dsl_fs_stage_only.descriptorCount = 5;
3121 dsl_fs_stage_only.stageFlags =
3122 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
3123 // bind time
3124 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003125 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003126 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3127 ds_layout_ci.pNext = NULL;
3128 ds_layout_ci.bindingCount = 1;
3129 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003130 static const uint32_t NUM_LAYOUTS = 4;
3131 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003132 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003133 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
3134 // layout for error case
3135 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3136 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003137 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003138 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003139 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3140 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003141 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003142 dsl_binding[0].binding = 0;
3143 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003144 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003145 dsl_binding[1].binding = 1;
3146 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3147 dsl_binding[1].descriptorCount = 2;
3148 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
3149 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003150 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003151 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003152 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3153 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003154 ASSERT_VK_SUCCESS(err);
3155 dsl_binding[0].binding = 0;
3156 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003157 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003158 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07003159 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3160 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003161 ASSERT_VK_SUCCESS(err);
3162 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003163 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003164 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3165 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003166 ASSERT_VK_SUCCESS(err);
3167
3168 static const uint32_t NUM_SETS = 4;
3169 VkDescriptorSet descriptorSet[NUM_SETS] = {};
3170 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003171 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003172 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003173 alloc_info.descriptorPool = ds_pool;
3174 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003175 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3176 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003177 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003178 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003179 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003180 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003181 err =
3182 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003183 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003184
3185 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003186 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3187 pipeline_layout_ci.pNext = NULL;
3188 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
3189 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003190
3191 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003192 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3193 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003194 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003195 // Create pipelineLayout with only one setLayout
3196 pipeline_layout_ci.setLayoutCount = 1;
3197 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003198 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3199 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003200 ASSERT_VK_SUCCESS(err);
3201 // Create pipelineLayout with 2 descriptor setLayout at index 0
3202 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
3203 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07003204 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3205 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003206 ASSERT_VK_SUCCESS(err);
3207 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
3208 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
3209 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07003210 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3211 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003212 ASSERT_VK_SUCCESS(err);
3213 // Create pipelineLayout with UB type, but stageFlags for FS only
3214 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
3215 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003216 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3217 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003218 ASSERT_VK_SUCCESS(err);
3219 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
3220 VkDescriptorSetLayout pl_bad_s0[2] = {};
3221 pl_bad_s0[0] = ds_layout_fs_only;
3222 pl_bad_s0[1] = ds_layout[1];
3223 pipeline_layout_ci.setLayoutCount = 2;
3224 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
3225 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07003226 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3227 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003228 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003229
3230 // Create a buffer to update the descriptor with
3231 uint32_t qfi = 0;
3232 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003233 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3234 buffCI.size = 1024;
3235 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3236 buffCI.queueFamilyIndexCount = 1;
3237 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003238
3239 VkBuffer dyub;
3240 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3241 ASSERT_VK_SUCCESS(err);
3242 // Correctly update descriptor to avoid "NOT_UPDATED" error
3243 static const uint32_t NUM_BUFFS = 5;
3244 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003245 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003246 buffInfo[i].buffer = dyub;
3247 buffInfo[i].offset = 0;
3248 buffInfo[i].range = 1024;
3249 }
Karl Schultz6addd812016-02-02 17:17:23 -07003250 VkImage image;
3251 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3252 const int32_t tex_width = 32;
3253 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003254 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003255 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3256 image_create_info.pNext = NULL;
3257 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3258 image_create_info.format = tex_format;
3259 image_create_info.extent.width = tex_width;
3260 image_create_info.extent.height = tex_height;
3261 image_create_info.extent.depth = 1;
3262 image_create_info.mipLevels = 1;
3263 image_create_info.arrayLayers = 1;
3264 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3265 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3266 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3267 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003268 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3269 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003270
Karl Schultz6addd812016-02-02 17:17:23 -07003271 VkMemoryRequirements memReqs;
3272 VkDeviceMemory imageMem;
3273 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003274 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003275 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3276 memAlloc.pNext = NULL;
3277 memAlloc.allocationSize = 0;
3278 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003279 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
3280 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003281 pass =
3282 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003283 ASSERT_TRUE(pass);
3284 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
3285 ASSERT_VK_SUCCESS(err);
3286 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
3287 ASSERT_VK_SUCCESS(err);
3288
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003289 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003290 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3291 image_view_create_info.image = image;
3292 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
3293 image_view_create_info.format = tex_format;
3294 image_view_create_info.subresourceRange.layerCount = 1;
3295 image_view_create_info.subresourceRange.baseMipLevel = 0;
3296 image_view_create_info.subresourceRange.levelCount = 1;
3297 image_view_create_info.subresourceRange.aspectMask =
3298 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003299
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003300 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07003301 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
3302 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003303 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003304 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003305 imageInfo[0].imageView = view;
3306 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3307 imageInfo[1].imageView = view;
3308 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003309 imageInfo[2].imageView = view;
3310 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3311 imageInfo[3].imageView = view;
3312 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003313
3314 static const uint32_t NUM_SET_UPDATES = 3;
3315 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
3316 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3317 descriptor_write[0].dstSet = descriptorSet[0];
3318 descriptor_write[0].dstBinding = 0;
3319 descriptor_write[0].descriptorCount = 5;
3320 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3321 descriptor_write[0].pBufferInfo = buffInfo;
3322 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3323 descriptor_write[1].dstSet = descriptorSet[1];
3324 descriptor_write[1].dstBinding = 0;
3325 descriptor_write[1].descriptorCount = 2;
3326 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3327 descriptor_write[1].pImageInfo = imageInfo;
3328 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3329 descriptor_write[2].dstSet = descriptorSet[1];
3330 descriptor_write[2].dstBinding = 1;
3331 descriptor_write[2].descriptorCount = 2;
3332 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003333 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003334
3335 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003336
Tobin Ehlis88452832015-12-03 09:40:56 -07003337 // Create PSO to be used for draw-time errors below
3338 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003339 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003340 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003341 "out gl_PerVertex {\n"
3342 " vec4 gl_Position;\n"
3343 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003344 "void main(){\n"
3345 " gl_Position = vec4(1);\n"
3346 "}\n";
3347 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003348 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003349 "\n"
3350 "layout(location=0) out vec4 x;\n"
3351 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3352 "void main(){\n"
3353 " x = vec4(bar.y);\n"
3354 "}\n";
3355 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3356 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003357 VkPipelineObj pipe(m_device);
3358 pipe.AddShader(&vs);
3359 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07003360 pipe.AddColorAttachment();
3361 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07003362
3363 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07003364
Karl Schultz6addd812016-02-02 17:17:23 -07003365 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3366 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3367 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
3368 // of PSO
3369 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
3370 // cmd_pipeline.c
3371 // due to the fact that cmd_alloc_dset_data() has not been called in
3372 // cmd_bind_graphics_pipeline()
3373 // TODO : Want to cause various binding incompatibility issues here to test
3374 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07003375 // First cause various verify_layout_compatibility() fails
3376 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003377 // verify_set_layout_compatibility fail cases:
3378 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07003379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3380 " due to: invalid VkPipelineLayout ");
3381 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3382 VK_PIPELINE_BIND_POINT_GRAPHICS,
3383 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
3384 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003385 m_errorMonitor->VerifyFound();
3386
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003387 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07003388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3389 " attempting to bind set to index 1");
3390 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3391 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
3392 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003393 m_errorMonitor->VerifyFound();
3394
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003395 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003396 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
3397 // descriptors
3398 m_errorMonitor->SetDesiredFailureMsg(
3399 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003400 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003401 vkCmdBindDescriptorSets(
3402 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3403 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003404 m_errorMonitor->VerifyFound();
3405
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003406 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
3407 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07003408 m_errorMonitor->SetDesiredFailureMsg(
3409 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003410 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07003411 vkCmdBindDescriptorSets(
3412 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3413 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003414 m_errorMonitor->VerifyFound();
3415
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003416 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
3417 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07003418 m_errorMonitor->SetDesiredFailureMsg(
3419 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003420 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003421 vkCmdBindDescriptorSets(
3422 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3423 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003424 m_errorMonitor->VerifyFound();
3425
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003426 // Cause INFO messages due to disturbing previously bound Sets
3427 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07003428 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3429 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3430 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003431 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07003432 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003433 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003434 " previously bound as set #0 was disturbed ");
3435 vkCmdBindDescriptorSets(
3436 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3437 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003438 m_errorMonitor->VerifyFound();
3439
Karl Schultz6addd812016-02-02 17:17:23 -07003440 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3441 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3442 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003443 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003444 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003445 " newly bound as set #0 so set #1 and "
3446 "any subsequent sets were disturbed ");
3447 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3448 VK_PIPELINE_BIND_POINT_GRAPHICS,
3449 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003450 m_errorMonitor->VerifyFound();
3451
Tobin Ehlis88452832015-12-03 09:40:56 -07003452 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07003453 // 1. Error due to not binding required set (we actually use same code as
3454 // above to disturb set0)
3455 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3456 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3457 2, &descriptorSet[0], 0, NULL);
3458 vkCmdBindDescriptorSets(
3459 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3460 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
3461 m_errorMonitor->SetDesiredFailureMsg(
3462 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3463 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07003464 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003465 m_errorMonitor->VerifyFound();
3466
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003467 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003468 // 2. Error due to bound set not being compatible with PSO's
3469 // VkPipelineLayout (diff stageFlags in this case)
3470 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3471 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3472 2, &descriptorSet[0], 0, NULL);
3473 m_errorMonitor->SetDesiredFailureMsg(
3474 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3475 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07003476 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003477 m_errorMonitor->VerifyFound();
3478
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003479 // Remaining clean-up
3480 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003481 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003482 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
3483 }
3484 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
3485 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, descriptorSet);
3486 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003487 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3488 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3489}
Tobin Ehlis559c6382015-11-05 09:52:49 -07003490
Karl Schultz6addd812016-02-02 17:17:23 -07003491TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003492
Karl Schultz6addd812016-02-02 17:17:23 -07003493 m_errorMonitor->SetDesiredFailureMsg(
3494 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003495 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003496
3497 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003498 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003499 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003500 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003501
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003502 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003503}
3504
Karl Schultz6addd812016-02-02 17:17:23 -07003505TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
3506 VkResult err;
3507 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003508
Karl Schultz6addd812016-02-02 17:17:23 -07003509 m_errorMonitor->SetDesiredFailureMsg(
3510 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07003511 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003512
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003513 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003514
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003515 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003516 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003517 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003518 cmd.commandPool = m_commandPool;
3519 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003520 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06003521
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003522 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06003523 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003524
3525 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003526 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003527 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003528 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003529 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07003530 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
3531 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003532 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003533
3534 // The error should be caught by validation of the BeginCommandBuffer call
3535 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
3536
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003537 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003538 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003539}
3540
Karl Schultz6addd812016-02-02 17:17:23 -07003541TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003542 // Cause error due to Begin while recording CB
3543 // Then cause 2 errors for attempting to reset CB w/o having
3544 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
3545 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003546 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003547 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003548
3549 ASSERT_NO_FATAL_FAILURE(InitState());
3550
3551 // Calls AllocateCommandBuffers
3552 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
3553
Karl Schultz6addd812016-02-02 17:17:23 -07003554 // Force the failure by setting the Renderpass and Framebuffer fields with
3555 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003556 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003557 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003558 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3559 cmd_buf_info.pNext = NULL;
3560 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003561 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003562
3563 // Begin CB to transition to recording state
3564 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
3565 // Can't re-begin. This should trigger error
3566 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003567 m_errorMonitor->VerifyFound();
3568
Karl Schultz6addd812016-02-02 17:17:23 -07003569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3570 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003571 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
3572 // Reset attempt will trigger error due to incorrect CommandPool state
3573 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003574 m_errorMonitor->VerifyFound();
3575
Karl Schultz6addd812016-02-02 17:17:23 -07003576 m_errorMonitor->SetDesiredFailureMsg(
3577 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3578 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003579 // Transition CB to RECORDED state
3580 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
3581 // Now attempting to Begin will implicitly reset, which triggers error
3582 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003583 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003584}
3585
Karl Schultz6addd812016-02-02 17:17:23 -07003586TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003587 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003588 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003589
Karl Schultz6addd812016-02-02 17:17:23 -07003590 m_errorMonitor->SetDesiredFailureMsg(
3591 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003592 "Invalid Pipeline CreateInfo State: Vtx Shader required");
3593
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003594 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003595 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003596
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003597 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003598 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3599 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003600
3601 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003602 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3603 ds_pool_ci.pNext = NULL;
3604 ds_pool_ci.maxSets = 1;
3605 ds_pool_ci.poolSizeCount = 1;
3606 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003607
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003608 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003609 err =
3610 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003611 ASSERT_VK_SUCCESS(err);
3612
Tony Barboureb254902015-07-15 12:50:33 -06003613 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003614 dsl_binding.binding = 0;
3615 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3616 dsl_binding.descriptorCount = 1;
3617 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3618 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003619
Tony Barboureb254902015-07-15 12:50:33 -06003620 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003621 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3622 ds_layout_ci.pNext = NULL;
3623 ds_layout_ci.bindingCount = 1;
3624 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003625
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003626 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003627 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3628 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003629 ASSERT_VK_SUCCESS(err);
3630
3631 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003632 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003633 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003634 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003635 alloc_info.descriptorPool = ds_pool;
3636 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003637 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3638 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003639 ASSERT_VK_SUCCESS(err);
3640
Tony Barboureb254902015-07-15 12:50:33 -06003641 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003642 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3643 pipeline_layout_ci.setLayoutCount = 1;
3644 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003645
3646 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003647 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3648 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003649 ASSERT_VK_SUCCESS(err);
3650
Tobin Ehlise68360f2015-10-01 11:15:13 -06003651 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07003652 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06003653
3654 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003655 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3656 vp_state_ci.scissorCount = 1;
3657 vp_state_ci.pScissors = &sc;
3658 vp_state_ci.viewportCount = 1;
3659 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003660
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003661 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3662 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3663 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3664 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3665 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3666 rs_state_ci.depthClampEnable = VK_FALSE;
3667 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3668 rs_state_ci.depthBiasEnable = VK_FALSE;
3669
Tony Barboureb254902015-07-15 12:50:33 -06003670 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003671 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3672 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003673 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003674 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3675 gp_ci.layout = pipeline_layout;
3676 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06003677
3678 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003679 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3680 pc_ci.initialDataSize = 0;
3681 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003682
3683 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003684 VkPipelineCache pipelineCache;
3685
Karl Schultz6addd812016-02-02 17:17:23 -07003686 err =
3687 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06003688 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003689 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3690 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003691
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003692 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003693
Chia-I Wuf7458c52015-10-26 21:10:41 +08003694 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3695 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3696 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3697 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003698}
Tobin Ehlis912df022015-09-17 08:46:18 -06003699/*// TODO : This test should be good, but needs Tess support in compiler to run
3700TEST_F(VkLayerTest, InvalidPatchControlPoints)
3701{
3702 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06003703 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003704
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003705 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003706 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
3707primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003708
Tobin Ehlis912df022015-09-17 08:46:18 -06003709 ASSERT_NO_FATAL_FAILURE(InitState());
3710 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06003711
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003712 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06003713 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003714 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003715
3716 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3717 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3718 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003719 ds_pool_ci.poolSizeCount = 1;
3720 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06003721
3722 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003723 err = vkCreateDescriptorPool(m_device->device(),
3724VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06003725 ASSERT_VK_SUCCESS(err);
3726
3727 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08003728 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06003729 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08003730 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003731 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3732 dsl_binding.pImmutableSamplers = NULL;
3733
3734 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003735 ds_layout_ci.sType =
3736VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003737 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003738 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003739 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06003740
3741 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003742 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3743&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003744 ASSERT_VK_SUCCESS(err);
3745
3746 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07003747 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
3748VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06003749 ASSERT_VK_SUCCESS(err);
3750
3751 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003752 pipeline_layout_ci.sType =
3753VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003754 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003755 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003756 pipeline_layout_ci.pSetLayouts = &ds_layout;
3757
3758 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003759 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3760&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003761 ASSERT_VK_SUCCESS(err);
3762
3763 VkPipelineShaderStageCreateInfo shaderStages[3];
3764 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
3765
Karl Schultz6addd812016-02-02 17:17:23 -07003766 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
3767this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003768 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07003769 VkShaderObj
3770tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
3771this);
3772 VkShaderObj
3773te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
3774this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003775
Karl Schultz6addd812016-02-02 17:17:23 -07003776 shaderStages[0].sType =
3777VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003778 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003779 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003780 shaderStages[1].sType =
3781VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003782 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003783 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003784 shaderStages[2].sType =
3785VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003786 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003787 shaderStages[2].shader = te.handle();
3788
3789 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003790 iaCI.sType =
3791VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08003792 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06003793
3794 VkPipelineTessellationStateCreateInfo tsCI = {};
3795 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
3796 tsCI.patchControlPoints = 0; // This will cause an error
3797
3798 VkGraphicsPipelineCreateInfo gp_ci = {};
3799 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3800 gp_ci.pNext = NULL;
3801 gp_ci.stageCount = 3;
3802 gp_ci.pStages = shaderStages;
3803 gp_ci.pVertexInputState = NULL;
3804 gp_ci.pInputAssemblyState = &iaCI;
3805 gp_ci.pTessellationState = &tsCI;
3806 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003807 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06003808 gp_ci.pMultisampleState = NULL;
3809 gp_ci.pDepthStencilState = NULL;
3810 gp_ci.pColorBlendState = NULL;
3811 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3812 gp_ci.layout = pipeline_layout;
3813 gp_ci.renderPass = renderPass();
3814
3815 VkPipelineCacheCreateInfo pc_ci = {};
3816 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3817 pc_ci.pNext = NULL;
3818 pc_ci.initialSize = 0;
3819 pc_ci.initialData = 0;
3820 pc_ci.maxSize = 0;
3821
3822 VkPipeline pipeline;
3823 VkPipelineCache pipelineCache;
3824
Karl Schultz6addd812016-02-02 17:17:23 -07003825 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
3826&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06003827 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003828 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3829&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06003830
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003831 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003832
Chia-I Wuf7458c52015-10-26 21:10:41 +08003833 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3834 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3835 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3836 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06003837}
3838*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06003839// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07003840TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07003841 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003842
Karl Schultz6addd812016-02-02 17:17:23 -07003843 m_errorMonitor->SetDesiredFailureMsg(
3844 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003845 "Gfx Pipeline viewport count (1) must match scissor count (0).");
3846
Tobin Ehlise68360f2015-10-01 11:15:13 -06003847 ASSERT_NO_FATAL_FAILURE(InitState());
3848 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003849
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003850 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003851 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3852 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003853
3854 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003855 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3856 ds_pool_ci.maxSets = 1;
3857 ds_pool_ci.poolSizeCount = 1;
3858 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003859
3860 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003861 err =
3862 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003863 ASSERT_VK_SUCCESS(err);
3864
3865 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003866 dsl_binding.binding = 0;
3867 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3868 dsl_binding.descriptorCount = 1;
3869 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003870
3871 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003872 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3873 ds_layout_ci.bindingCount = 1;
3874 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003875
3876 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003877 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3878 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003879 ASSERT_VK_SUCCESS(err);
3880
3881 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003882 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003883 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003884 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003885 alloc_info.descriptorPool = ds_pool;
3886 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003887 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3888 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003889 ASSERT_VK_SUCCESS(err);
3890
3891 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003892 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3893 pipeline_layout_ci.setLayoutCount = 1;
3894 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003895
3896 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003897 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3898 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003899 ASSERT_VK_SUCCESS(err);
3900
3901 VkViewport vp = {}; // Just need dummy vp to point to
3902
3903 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003904 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3905 vp_state_ci.scissorCount = 0;
3906 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
3907 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003908
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003909 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3910 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3911 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3912 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3913 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3914 rs_state_ci.depthClampEnable = VK_FALSE;
3915 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3916 rs_state_ci.depthBiasEnable = VK_FALSE;
3917
Cody Northropeb3a6c12015-10-05 14:44:45 -06003918 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003919 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003920
Karl Schultz6addd812016-02-02 17:17:23 -07003921 VkShaderObj vs(m_device, bindStateVertShaderText,
3922 VK_SHADER_STAGE_VERTEX_BIT, this);
3923 VkShaderObj fs(m_device, bindStateFragShaderText,
3924 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003925 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003926 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003927 shaderStages[0] = vs.GetStageCreateInfo();
3928 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003929
3930 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003931 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3932 gp_ci.stageCount = 2;
3933 gp_ci.pStages = shaderStages;
3934 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003935 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003936 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3937 gp_ci.layout = pipeline_layout;
3938 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003939
3940 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003941 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003942
3943 VkPipeline pipeline;
3944 VkPipelineCache pipelineCache;
3945
Karl Schultz6addd812016-02-02 17:17:23 -07003946 err =
3947 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003948 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003949 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3950 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003951
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003952 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003953
Chia-I Wuf7458c52015-10-26 21:10:41 +08003954 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3955 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3956 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3957 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003958}
Karl Schultz6addd812016-02-02 17:17:23 -07003959// Don't set viewport state in PSO. This is an error b/c we always need this
3960// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06003961// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07003962TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06003963 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003964 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003965
Karl Schultz6addd812016-02-02 17:17:23 -07003966 m_errorMonitor->SetDesiredFailureMsg(
3967 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003968 "Gfx Pipeline pViewportState is null. Even if ");
3969
Tobin Ehlise68360f2015-10-01 11:15:13 -06003970 ASSERT_NO_FATAL_FAILURE(InitState());
3971 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003972
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003973 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003974 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3975 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003976
3977 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003978 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3979 ds_pool_ci.maxSets = 1;
3980 ds_pool_ci.poolSizeCount = 1;
3981 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003982
3983 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003984 err =
3985 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003986 ASSERT_VK_SUCCESS(err);
3987
3988 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003989 dsl_binding.binding = 0;
3990 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3991 dsl_binding.descriptorCount = 1;
3992 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003993
3994 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003995 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3996 ds_layout_ci.bindingCount = 1;
3997 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003998
3999 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004000 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4001 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004002 ASSERT_VK_SUCCESS(err);
4003
4004 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004005 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004006 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004007 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004008 alloc_info.descriptorPool = ds_pool;
4009 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004010 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4011 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004012 ASSERT_VK_SUCCESS(err);
4013
4014 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004015 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4016 pipeline_layout_ci.setLayoutCount = 1;
4017 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004018
4019 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004020 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4021 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004022 ASSERT_VK_SUCCESS(err);
4023
4024 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4025 // Set scissor as dynamic to avoid second error
4026 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004027 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4028 dyn_state_ci.dynamicStateCount = 1;
4029 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004030
Cody Northropeb3a6c12015-10-05 14:44:45 -06004031 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004032 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004033
Karl Schultz6addd812016-02-02 17:17:23 -07004034 VkShaderObj vs(m_device, bindStateVertShaderText,
4035 VK_SHADER_STAGE_VERTEX_BIT, this);
4036 VkShaderObj fs(m_device, bindStateFragShaderText,
4037 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004038 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004039 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004040 shaderStages[0] = vs.GetStageCreateInfo();
4041 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004042
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004043
4044 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4045 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4046 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4047 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4048 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4049 rs_state_ci.depthClampEnable = VK_FALSE;
4050 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4051 rs_state_ci.depthBiasEnable = VK_FALSE;
4052
Tobin Ehlise68360f2015-10-01 11:15:13 -06004053 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004054 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4055 gp_ci.stageCount = 2;
4056 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004057 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004058 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
4059 // should cause validation error
4060 gp_ci.pDynamicState = &dyn_state_ci;
4061 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4062 gp_ci.layout = pipeline_layout;
4063 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004064
4065 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004066 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004067
4068 VkPipeline pipeline;
4069 VkPipelineCache pipelineCache;
4070
Karl Schultz6addd812016-02-02 17:17:23 -07004071 err =
4072 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004073 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004074 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4075 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004076
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004077 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004078
Chia-I Wuf7458c52015-10-26 21:10:41 +08004079 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4080 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4081 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4082 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004083}
4084// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07004085// Then run second test where dynamic scissor count doesn't match PSO scissor
4086// count
4087TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
4088 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004089
Karl Schultz6addd812016-02-02 17:17:23 -07004090 m_errorMonitor->SetDesiredFailureMsg(
4091 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004092 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
4093
Tobin Ehlise68360f2015-10-01 11:15:13 -06004094 ASSERT_NO_FATAL_FAILURE(InitState());
4095 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004096
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004097 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004098 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4099 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004100
4101 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004102 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4103 ds_pool_ci.maxSets = 1;
4104 ds_pool_ci.poolSizeCount = 1;
4105 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004106
4107 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004108 err =
4109 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004110 ASSERT_VK_SUCCESS(err);
4111
4112 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004113 dsl_binding.binding = 0;
4114 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4115 dsl_binding.descriptorCount = 1;
4116 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004117
4118 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004119 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4120 ds_layout_ci.bindingCount = 1;
4121 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004122
4123 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004124 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4125 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004126 ASSERT_VK_SUCCESS(err);
4127
4128 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004129 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004130 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004131 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004132 alloc_info.descriptorPool = ds_pool;
4133 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004134 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4135 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004136 ASSERT_VK_SUCCESS(err);
4137
4138 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004139 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4140 pipeline_layout_ci.setLayoutCount = 1;
4141 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004142
4143 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004144 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4145 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004146 ASSERT_VK_SUCCESS(err);
4147
4148 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004149 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4150 vp_state_ci.viewportCount = 1;
4151 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
4152 vp_state_ci.scissorCount = 1;
4153 vp_state_ci.pScissors =
4154 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06004155
4156 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4157 // Set scissor as dynamic to avoid that error
4158 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004159 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4160 dyn_state_ci.dynamicStateCount = 1;
4161 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004162
Cody Northropeb3a6c12015-10-05 14:44:45 -06004163 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004164 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004165
Karl Schultz6addd812016-02-02 17:17:23 -07004166 VkShaderObj vs(m_device, bindStateVertShaderText,
4167 VK_SHADER_STAGE_VERTEX_BIT, this);
4168 VkShaderObj fs(m_device, bindStateFragShaderText,
4169 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004170 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004171 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004172 shaderStages[0] = vs.GetStageCreateInfo();
4173 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004174
Cody Northropf6622dc2015-10-06 10:33:21 -06004175 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4176 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4177 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004178 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004179 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004180 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004181 vi_ci.pVertexAttributeDescriptions = nullptr;
4182
4183 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4184 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4185 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4186
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004187 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004188 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06004189 rs_ci.pNext = nullptr;
4190
Mark Youngc89c6312016-03-31 16:03:20 -06004191 VkPipelineColorBlendAttachmentState att = {};
4192 att.blendEnable = VK_FALSE;
4193 att.colorWriteMask = 0xf;
4194
Cody Northropf6622dc2015-10-06 10:33:21 -06004195 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4196 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4197 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004198 cb_ci.attachmentCount = 1;
4199 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06004200
Tobin Ehlise68360f2015-10-01 11:15:13 -06004201 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004202 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4203 gp_ci.stageCount = 2;
4204 gp_ci.pStages = shaderStages;
4205 gp_ci.pVertexInputState = &vi_ci;
4206 gp_ci.pInputAssemblyState = &ia_ci;
4207 gp_ci.pViewportState = &vp_state_ci;
4208 gp_ci.pRasterizationState = &rs_ci;
4209 gp_ci.pColorBlendState = &cb_ci;
4210 gp_ci.pDynamicState = &dyn_state_ci;
4211 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4212 gp_ci.layout = pipeline_layout;
4213 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004214
4215 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004216 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004217
4218 VkPipeline pipeline;
4219 VkPipelineCache pipelineCache;
4220
Karl Schultz6addd812016-02-02 17:17:23 -07004221 err =
4222 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004223 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004224 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4225 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004226
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004227 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004228
Tobin Ehlisd332f282015-10-02 11:00:56 -06004229 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07004230 // First need to successfully create the PSO from above by setting
4231 // pViewports
4232 m_errorMonitor->SetDesiredFailureMsg(
4233 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4234 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
4235 "scissorCount is 1. These counts must match.");
4236
4237 VkViewport vp = {}; // Just need dummy vp to point to
4238 vp_state_ci.pViewports = &vp;
4239 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4240 &gp_ci, NULL, &pipeline);
4241 ASSERT_VK_SUCCESS(err);
4242 BeginCommandBuffer();
4243 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4244 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4245 VkRect2D scissors[2] = {}; // don't care about data
4246 // Count of 2 doesn't match PSO count of 1
4247 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
4248 Draw(1, 0, 0, 0);
4249
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004250 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004251
4252 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4253 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4254 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4255 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4256}
4257// Create PSO w/o non-zero scissorCount but no scissor data
4258// Then run second test where dynamic viewportCount doesn't match PSO
4259// viewportCount
4260TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
4261 VkResult err;
4262
4263 m_errorMonitor->SetDesiredFailureMsg(
4264 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4265 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
4266
4267 ASSERT_NO_FATAL_FAILURE(InitState());
4268 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4269
4270 VkDescriptorPoolSize ds_type_count = {};
4271 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4272 ds_type_count.descriptorCount = 1;
4273
4274 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4275 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4276 ds_pool_ci.maxSets = 1;
4277 ds_pool_ci.poolSizeCount = 1;
4278 ds_pool_ci.pPoolSizes = &ds_type_count;
4279
4280 VkDescriptorPool ds_pool;
4281 err =
4282 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4283 ASSERT_VK_SUCCESS(err);
4284
4285 VkDescriptorSetLayoutBinding dsl_binding = {};
4286 dsl_binding.binding = 0;
4287 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4288 dsl_binding.descriptorCount = 1;
4289 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4290
4291 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4292 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4293 ds_layout_ci.bindingCount = 1;
4294 ds_layout_ci.pBindings = &dsl_binding;
4295
4296 VkDescriptorSetLayout ds_layout;
4297 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4298 &ds_layout);
4299 ASSERT_VK_SUCCESS(err);
4300
4301 VkDescriptorSet descriptorSet;
4302 VkDescriptorSetAllocateInfo alloc_info = {};
4303 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4304 alloc_info.descriptorSetCount = 1;
4305 alloc_info.descriptorPool = ds_pool;
4306 alloc_info.pSetLayouts = &ds_layout;
4307 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4308 &descriptorSet);
4309 ASSERT_VK_SUCCESS(err);
4310
4311 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4312 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4313 pipeline_layout_ci.setLayoutCount = 1;
4314 pipeline_layout_ci.pSetLayouts = &ds_layout;
4315
4316 VkPipelineLayout pipeline_layout;
4317 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4318 &pipeline_layout);
4319 ASSERT_VK_SUCCESS(err);
4320
4321 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4322 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4323 vp_state_ci.scissorCount = 1;
4324 vp_state_ci.pScissors =
4325 NULL; // Null scissor w/ count of 1 should cause error
4326 vp_state_ci.viewportCount = 1;
4327 vp_state_ci.pViewports =
4328 NULL; // vp is dynamic (below) so this won't cause error
4329
4330 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
4331 // Set scissor as dynamic to avoid that error
4332 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4333 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4334 dyn_state_ci.dynamicStateCount = 1;
4335 dyn_state_ci.pDynamicStates = &vp_state;
4336
4337 VkPipelineShaderStageCreateInfo shaderStages[2];
4338 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4339
4340 VkShaderObj vs(m_device, bindStateVertShaderText,
4341 VK_SHADER_STAGE_VERTEX_BIT, this);
4342 VkShaderObj fs(m_device, bindStateFragShaderText,
4343 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004344 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004345 // but add it to be able to run on more devices
4346 shaderStages[0] = vs.GetStageCreateInfo();
4347 shaderStages[1] = fs.GetStageCreateInfo();
4348
4349 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4350 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4351 vi_ci.pNext = nullptr;
4352 vi_ci.vertexBindingDescriptionCount = 0;
4353 vi_ci.pVertexBindingDescriptions = nullptr;
4354 vi_ci.vertexAttributeDescriptionCount = 0;
4355 vi_ci.pVertexAttributeDescriptions = nullptr;
4356
4357 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4358 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4359 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4360
4361 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4362 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4363 rs_ci.pNext = nullptr;
4364
Mark Youngc89c6312016-03-31 16:03:20 -06004365 VkPipelineColorBlendAttachmentState att = {};
4366 att.blendEnable = VK_FALSE;
4367 att.colorWriteMask = 0xf;
4368
Karl Schultz6addd812016-02-02 17:17:23 -07004369 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4370 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4371 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004372 cb_ci.attachmentCount = 1;
4373 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07004374
4375 VkGraphicsPipelineCreateInfo gp_ci = {};
4376 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4377 gp_ci.stageCount = 2;
4378 gp_ci.pStages = shaderStages;
4379 gp_ci.pVertexInputState = &vi_ci;
4380 gp_ci.pInputAssemblyState = &ia_ci;
4381 gp_ci.pViewportState = &vp_state_ci;
4382 gp_ci.pRasterizationState = &rs_ci;
4383 gp_ci.pColorBlendState = &cb_ci;
4384 gp_ci.pDynamicState = &dyn_state_ci;
4385 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4386 gp_ci.layout = pipeline_layout;
4387 gp_ci.renderPass = renderPass();
4388
4389 VkPipelineCacheCreateInfo pc_ci = {};
4390 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4391
4392 VkPipeline pipeline;
4393 VkPipelineCache pipelineCache;
4394
4395 err =
4396 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4397 ASSERT_VK_SUCCESS(err);
4398 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4399 &gp_ci, NULL, &pipeline);
4400
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004401 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004402
4403 // Now hit second fail case where we set scissor w/ different count than PSO
4404 // First need to successfully create the PSO from above by setting
4405 // pViewports
4406 m_errorMonitor->SetDesiredFailureMsg(
4407 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4408 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
4409 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004410
Tobin Ehlisd332f282015-10-02 11:00:56 -06004411 VkRect2D sc = {}; // Just need dummy vp to point to
4412 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07004413 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4414 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004415 ASSERT_VK_SUCCESS(err);
4416 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004417 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4418 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004419 VkViewport viewports[2] = {}; // don't care about data
4420 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07004421 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004422 Draw(1, 0, 0, 0);
4423
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004424 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004425
Chia-I Wuf7458c52015-10-26 21:10:41 +08004426 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4427 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4428 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4429 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004430}
4431
Mark Young7394fdd2016-03-31 14:56:43 -06004432TEST_F(VkLayerTest, PSOLineWidthInvalid) {
4433 VkResult err;
4434
4435 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004436 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004437
4438 ASSERT_NO_FATAL_FAILURE(InitState());
4439 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4440
4441 VkDescriptorPoolSize ds_type_count = {};
4442 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4443 ds_type_count.descriptorCount = 1;
4444
4445 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4446 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4447 ds_pool_ci.maxSets = 1;
4448 ds_pool_ci.poolSizeCount = 1;
4449 ds_pool_ci.pPoolSizes = &ds_type_count;
4450
4451 VkDescriptorPool ds_pool;
4452 err =
4453 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4454 ASSERT_VK_SUCCESS(err);
4455
4456 VkDescriptorSetLayoutBinding dsl_binding = {};
4457 dsl_binding.binding = 0;
4458 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4459 dsl_binding.descriptorCount = 1;
4460 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4461
4462 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4463 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4464 ds_layout_ci.bindingCount = 1;
4465 ds_layout_ci.pBindings = &dsl_binding;
4466
4467 VkDescriptorSetLayout ds_layout;
4468 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4469 &ds_layout);
4470 ASSERT_VK_SUCCESS(err);
4471
4472 VkDescriptorSet descriptorSet;
4473 VkDescriptorSetAllocateInfo alloc_info = {};
4474 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4475 alloc_info.descriptorSetCount = 1;
4476 alloc_info.descriptorPool = ds_pool;
4477 alloc_info.pSetLayouts = &ds_layout;
4478 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4479 &descriptorSet);
4480 ASSERT_VK_SUCCESS(err);
4481
4482 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4483 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4484 pipeline_layout_ci.setLayoutCount = 1;
4485 pipeline_layout_ci.pSetLayouts = &ds_layout;
4486
4487 VkPipelineLayout pipeline_layout;
4488 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4489 &pipeline_layout);
4490 ASSERT_VK_SUCCESS(err);
4491
4492 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4493 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4494 vp_state_ci.scissorCount = 1;
4495 vp_state_ci.pScissors = NULL;
4496 vp_state_ci.viewportCount = 1;
4497 vp_state_ci.pViewports = NULL;
4498
4499 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
4500 VK_DYNAMIC_STATE_SCISSOR,
4501 VK_DYNAMIC_STATE_LINE_WIDTH};
4502 // Set scissor as dynamic to avoid that error
4503 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4504 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4505 dyn_state_ci.dynamicStateCount = 2;
4506 dyn_state_ci.pDynamicStates = dynamic_states;
4507
4508 VkPipelineShaderStageCreateInfo shaderStages[2];
4509 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4510
4511 VkShaderObj vs(m_device, bindStateVertShaderText,
4512 VK_SHADER_STAGE_VERTEX_BIT, this);
4513 VkShaderObj fs(m_device, bindStateFragShaderText,
4514 VK_SHADER_STAGE_FRAGMENT_BIT,
4515 this); // TODO - We shouldn't need a fragment shader
4516 // but add it to be able to run on more devices
4517 shaderStages[0] = vs.GetStageCreateInfo();
4518 shaderStages[1] = fs.GetStageCreateInfo();
4519
4520 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4521 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4522 vi_ci.pNext = nullptr;
4523 vi_ci.vertexBindingDescriptionCount = 0;
4524 vi_ci.pVertexBindingDescriptions = nullptr;
4525 vi_ci.vertexAttributeDescriptionCount = 0;
4526 vi_ci.pVertexAttributeDescriptions = nullptr;
4527
4528 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4529 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4530 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4531
4532 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4533 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4534 rs_ci.pNext = nullptr;
4535
Mark Young47107952016-05-02 15:59:55 -06004536 // Check too low (line width of -1.0f).
4537 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06004538
4539 VkPipelineColorBlendAttachmentState att = {};
4540 att.blendEnable = VK_FALSE;
4541 att.colorWriteMask = 0xf;
4542
4543 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4544 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4545 cb_ci.pNext = nullptr;
4546 cb_ci.attachmentCount = 1;
4547 cb_ci.pAttachments = &att;
4548
4549 VkGraphicsPipelineCreateInfo gp_ci = {};
4550 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4551 gp_ci.stageCount = 2;
4552 gp_ci.pStages = shaderStages;
4553 gp_ci.pVertexInputState = &vi_ci;
4554 gp_ci.pInputAssemblyState = &ia_ci;
4555 gp_ci.pViewportState = &vp_state_ci;
4556 gp_ci.pRasterizationState = &rs_ci;
4557 gp_ci.pColorBlendState = &cb_ci;
4558 gp_ci.pDynamicState = &dyn_state_ci;
4559 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4560 gp_ci.layout = pipeline_layout;
4561 gp_ci.renderPass = renderPass();
4562
4563 VkPipelineCacheCreateInfo pc_ci = {};
4564 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4565
4566 VkPipeline pipeline;
4567 VkPipelineCache pipelineCache;
4568
4569 err =
4570 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4571 ASSERT_VK_SUCCESS(err);
4572 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4573 &gp_ci, NULL, &pipeline);
4574
4575 m_errorMonitor->VerifyFound();
4576
4577 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4578 "Attempt to set lineWidth to 65536");
4579
4580 // Check too high (line width of 65536.0f).
4581 rs_ci.lineWidth = 65536.0f;
4582
4583 err =
4584 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4585 ASSERT_VK_SUCCESS(err);
4586 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4587 &gp_ci, NULL, &pipeline);
4588
4589 m_errorMonitor->VerifyFound();
4590
4591 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004592 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004593
4594 dyn_state_ci.dynamicStateCount = 3;
4595
4596 rs_ci.lineWidth = 1.0f;
4597
4598 err =
4599 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4600 ASSERT_VK_SUCCESS(err);
4601 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4602 &gp_ci, NULL, &pipeline);
4603 BeginCommandBuffer();
4604 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4605 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4606
4607 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06004608 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06004609 m_errorMonitor->VerifyFound();
4610
4611 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4612 "Attempt to set lineWidth to 65536");
4613
4614 // Check too high with dynamic setting.
4615 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
4616 m_errorMonitor->VerifyFound();
4617 EndCommandBuffer();
4618
4619 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4620 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4621 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4622 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4623}
4624
Karl Schultz6addd812016-02-02 17:17:23 -07004625TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004626 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004627 m_errorMonitor->SetDesiredFailureMsg(
4628 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004629 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004630
4631 ASSERT_NO_FATAL_FAILURE(InitState());
4632 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004633
Tony Barbourfe3351b2015-07-28 10:17:20 -06004634 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004635 // Don't care about RenderPass handle b/c error should be flagged before
4636 // that
4637 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
4638 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004639
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004640 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004641}
4642
Karl Schultz6addd812016-02-02 17:17:23 -07004643TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004644 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004645 m_errorMonitor->SetDesiredFailureMsg(
4646 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004647 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004648
4649 ASSERT_NO_FATAL_FAILURE(InitState());
4650 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004651
Tony Barbourfe3351b2015-07-28 10:17:20 -06004652 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004653 // Just create a dummy Renderpass that's non-NULL so we can get to the
4654 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06004655 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004656 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4657 rp_begin.pNext = NULL;
4658 rp_begin.renderPass = renderPass();
4659 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004660
Karl Schultz6addd812016-02-02 17:17:23 -07004661 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
4662 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004663
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004664 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004665}
4666
Karl Schultz6addd812016-02-02 17:17:23 -07004667TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004668 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004669 m_errorMonitor->SetDesiredFailureMsg(
4670 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004671 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004672
4673 ASSERT_NO_FATAL_FAILURE(InitState());
4674 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004675
4676 // Renderpass is started here
4677 BeginCommandBuffer();
4678
4679 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004680 vk_testing::Buffer dstBuffer;
4681 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004682
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004683 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004684
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004685 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004686}
4687
Karl Schultz6addd812016-02-02 17:17:23 -07004688TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004689 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004690 m_errorMonitor->SetDesiredFailureMsg(
4691 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004692 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004693
4694 ASSERT_NO_FATAL_FAILURE(InitState());
4695 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004696
4697 // Renderpass is started here
4698 BeginCommandBuffer();
4699
4700 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004701 vk_testing::Buffer dstBuffer;
4702 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004703
Karl Schultz6addd812016-02-02 17:17:23 -07004704 VkDeviceSize dstOffset = 0;
4705 VkDeviceSize dataSize = 1024;
4706 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004707
Karl Schultz6addd812016-02-02 17:17:23 -07004708 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
4709 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004710
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004711 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004712}
4713
Karl Schultz6addd812016-02-02 17:17:23 -07004714TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004715 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004716 m_errorMonitor->SetDesiredFailureMsg(
4717 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004718 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004719
4720 ASSERT_NO_FATAL_FAILURE(InitState());
4721 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004722
4723 // Renderpass is started here
4724 BeginCommandBuffer();
4725
Michael Lentine0a369f62016-02-03 16:51:46 -06004726 VkClearColorValue clear_color;
4727 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07004728 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
4729 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4730 const int32_t tex_width = 32;
4731 const int32_t tex_height = 32;
4732 VkImageCreateInfo image_create_info = {};
4733 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4734 image_create_info.pNext = NULL;
4735 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4736 image_create_info.format = tex_format;
4737 image_create_info.extent.width = tex_width;
4738 image_create_info.extent.height = tex_height;
4739 image_create_info.extent.depth = 1;
4740 image_create_info.mipLevels = 1;
4741 image_create_info.arrayLayers = 1;
4742 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4743 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4744 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004745
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004746 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004747 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4748 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004749
Karl Schultz6addd812016-02-02 17:17:23 -07004750 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4751 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004752
Karl Schultz6addd812016-02-02 17:17:23 -07004753 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4754 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004755
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004756 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004757}
4758
Karl Schultz6addd812016-02-02 17:17:23 -07004759TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004760 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004761 m_errorMonitor->SetDesiredFailureMsg(
4762 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004763 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004764
4765 ASSERT_NO_FATAL_FAILURE(InitState());
4766 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004767
4768 // Renderpass is started here
4769 BeginCommandBuffer();
4770
4771 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07004772 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004773 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
4774 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4775 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
4776 image_create_info.extent.width = 64;
4777 image_create_info.extent.height = 64;
4778 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4779 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004780
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004781 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004782 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4783 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004784
Karl Schultz6addd812016-02-02 17:17:23 -07004785 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4786 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004787
Karl Schultz6addd812016-02-02 17:17:23 -07004788 vkCmdClearDepthStencilImage(
4789 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4790 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
4791 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004792
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004793 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004794}
4795
Karl Schultz6addd812016-02-02 17:17:23 -07004796TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004797 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004798 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004799
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004801 "vkCmdClearAttachments: This call "
4802 "must be issued inside an active "
4803 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004804
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004805 ASSERT_NO_FATAL_FAILURE(InitState());
4806 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004807
4808 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004809 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004810 ASSERT_VK_SUCCESS(err);
4811
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004812 VkClearAttachment color_attachment;
4813 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4814 color_attachment.clearValue.color.float32[0] = 0;
4815 color_attachment.clearValue.color.float32[1] = 0;
4816 color_attachment.clearValue.color.float32[2] = 0;
4817 color_attachment.clearValue.color.float32[3] = 0;
4818 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004819 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
4820 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
4821 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004822
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004823 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004824}
4825
Karl Schultz9e66a292016-04-21 15:57:51 -06004826TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
4827 // Try to add a buffer memory barrier with no buffer.
4828 m_errorMonitor->SetDesiredFailureMsg(
4829 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4830 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
4831
4832 ASSERT_NO_FATAL_FAILURE(InitState());
4833 BeginCommandBuffer();
4834
4835 VkBufferMemoryBarrier buf_barrier = {};
4836 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
4837 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4838 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4839 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4840 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4841 buf_barrier.buffer = VK_NULL_HANDLE;
4842 buf_barrier.offset = 0;
4843 buf_barrier.size = VK_WHOLE_SIZE;
4844 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4845 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
4846 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
4847
4848 m_errorMonitor->VerifyFound();
4849}
4850
Karl Schultz6addd812016-02-02 17:17:23 -07004851TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004852 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004853 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004854
Karl Schultz6addd812016-02-02 17:17:23 -07004855 m_errorMonitor->SetDesiredFailureMsg(
4856 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004857 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
4858
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004859 ASSERT_NO_FATAL_FAILURE(InitState());
4860 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004861 uint32_t qfi = 0;
4862 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004863 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4864 buffCI.size = 1024;
4865 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
4866 buffCI.queueFamilyIndexCount = 1;
4867 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004868
4869 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004870 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004871 ASSERT_VK_SUCCESS(err);
4872
4873 BeginCommandBuffer();
4874 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004875 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4876 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004877 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07004878 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
4879 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004880
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004881 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004882
Chia-I Wuf7458c52015-10-26 21:10:41 +08004883 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004884}
4885
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004886TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
4887 // Create an out-of-range queueFamilyIndex
4888 m_errorMonitor->SetDesiredFailureMsg(
4889 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06004890 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004891
4892 ASSERT_NO_FATAL_FAILURE(InitState());
4893 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4894 VkBufferCreateInfo buffCI = {};
4895 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4896 buffCI.size = 1024;
4897 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
4898 buffCI.queueFamilyIndexCount = 1;
4899 // Introduce failure by specifying invalid queue_family_index
4900 uint32_t qfi = 777;
4901 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06004902 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004903
4904 VkBuffer ib;
4905 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
4906
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004907 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004908}
4909
Karl Schultz6addd812016-02-02 17:17:23 -07004910TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
4911 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
4912 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004913
Karl Schultz6addd812016-02-02 17:17:23 -07004914 m_errorMonitor->SetDesiredFailureMsg(
4915 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004916 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004917
4918 ASSERT_NO_FATAL_FAILURE(InitState());
4919 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004920
4921 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004922 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004923 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
4924 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004925
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004926 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004927}
4928
Karl Schultz6addd812016-02-02 17:17:23 -07004929TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004930 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07004931 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004932
Karl Schultz6addd812016-02-02 17:17:23 -07004933 m_errorMonitor->SetDesiredFailureMsg(
4934 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Write descriptor update has descriptor "
4935 "type VK_DESCRIPTOR_TYPE_SAMPLER that "
4936 "does not match ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004937
Tobin Ehlis3b780662015-05-28 12:11:26 -06004938 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004939 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004940 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004941 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4942 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004943
4944 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004945 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4946 ds_pool_ci.pNext = NULL;
4947 ds_pool_ci.maxSets = 1;
4948 ds_pool_ci.poolSizeCount = 1;
4949 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004950
Tobin Ehlis3b780662015-05-28 12:11:26 -06004951 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004952 err =
4953 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004954 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06004955 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004956 dsl_binding.binding = 0;
4957 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4958 dsl_binding.descriptorCount = 1;
4959 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4960 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004961
Tony Barboureb254902015-07-15 12:50:33 -06004962 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004963 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4964 ds_layout_ci.pNext = NULL;
4965 ds_layout_ci.bindingCount = 1;
4966 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004967
Tobin Ehlis3b780662015-05-28 12:11:26 -06004968 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004969 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4970 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004971 ASSERT_VK_SUCCESS(err);
4972
4973 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004974 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004975 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004976 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004977 alloc_info.descriptorPool = ds_pool;
4978 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004979 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4980 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004981 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004982
Tony Barboureb254902015-07-15 12:50:33 -06004983 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004984 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4985 sampler_ci.pNext = NULL;
4986 sampler_ci.magFilter = VK_FILTER_NEAREST;
4987 sampler_ci.minFilter = VK_FILTER_NEAREST;
4988 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4989 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4990 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4991 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4992 sampler_ci.mipLodBias = 1.0;
4993 sampler_ci.anisotropyEnable = VK_FALSE;
4994 sampler_ci.maxAnisotropy = 1;
4995 sampler_ci.compareEnable = VK_FALSE;
4996 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4997 sampler_ci.minLod = 1.0;
4998 sampler_ci.maxLod = 1.0;
4999 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5000 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Mark Lobodzinski52ac6582015-09-01 15:42:56 -06005001
Tobin Ehlis3b780662015-05-28 12:11:26 -06005002 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005003 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005004 ASSERT_VK_SUCCESS(err);
5005
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005006 VkDescriptorImageInfo info = {};
5007 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005008
5009 VkWriteDescriptorSet descriptor_write;
5010 memset(&descriptor_write, 0, sizeof(descriptor_write));
5011 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005012 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005013 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005014 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005015 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005016 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005017
5018 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5019
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005020 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005021
Chia-I Wuf7458c52015-10-26 21:10:41 +08005022 vkDestroySampler(m_device->device(), sampler, NULL);
5023 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5024 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005025}
5026
Karl Schultz6addd812016-02-02 17:17:23 -07005027TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005028 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07005029 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005030
Karl Schultz6addd812016-02-02 17:17:23 -07005031 m_errorMonitor->SetDesiredFailureMsg(
5032 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Descriptor update type of "
5033 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET "
5034 "is out of bounds for matching binding");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005035
Tobin Ehlis3b780662015-05-28 12:11:26 -06005036 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005037 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005038 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005039 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5040 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005041
5042 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005043 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5044 ds_pool_ci.pNext = NULL;
5045 ds_pool_ci.maxSets = 1;
5046 ds_pool_ci.poolSizeCount = 1;
5047 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005048
Tobin Ehlis3b780662015-05-28 12:11:26 -06005049 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005050 err =
5051 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005052 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005053
Tony Barboureb254902015-07-15 12:50:33 -06005054 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005055 dsl_binding.binding = 0;
5056 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5057 dsl_binding.descriptorCount = 1;
5058 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5059 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005060
5061 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005062 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5063 ds_layout_ci.pNext = NULL;
5064 ds_layout_ci.bindingCount = 1;
5065 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005066
Tobin Ehlis3b780662015-05-28 12:11:26 -06005067 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005068 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5069 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005070 ASSERT_VK_SUCCESS(err);
5071
5072 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005073 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005074 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005075 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005076 alloc_info.descriptorPool = ds_pool;
5077 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005078 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5079 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005080 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005081
Tony Barboureb254902015-07-15 12:50:33 -06005082 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005083 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5084 sampler_ci.pNext = NULL;
5085 sampler_ci.magFilter = VK_FILTER_NEAREST;
5086 sampler_ci.minFilter = VK_FILTER_NEAREST;
5087 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5088 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5089 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5090 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5091 sampler_ci.mipLodBias = 1.0;
5092 sampler_ci.anisotropyEnable = VK_FALSE;
5093 sampler_ci.maxAnisotropy = 1;
5094 sampler_ci.compareEnable = VK_FALSE;
5095 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5096 sampler_ci.minLod = 1.0;
5097 sampler_ci.maxLod = 1.0;
5098 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5099 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005100
Tobin Ehlis3b780662015-05-28 12:11:26 -06005101 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005102 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005103 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005104
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005105 VkDescriptorImageInfo info = {};
5106 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005107
5108 VkWriteDescriptorSet descriptor_write;
5109 memset(&descriptor_write, 0, sizeof(descriptor_write));
5110 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005111 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005112 descriptor_write.dstArrayElement =
5113 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08005114 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005115 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005116 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005117 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005118
5119 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5120
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005121 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005122
Chia-I Wuf7458c52015-10-26 21:10:41 +08005123 vkDestroySampler(m_device->device(), sampler, NULL);
5124 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5125 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005126}
5127
Karl Schultz6addd812016-02-02 17:17:23 -07005128TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
5129 // Create layout w/ count of 1 and attempt update to that layout w/ binding
5130 // index 2
5131 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005132
Karl Schultz6addd812016-02-02 17:17:23 -07005133 m_errorMonitor->SetDesiredFailureMsg(
5134 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005135 " does not have binding to match update binding ");
5136
Tobin Ehlis3b780662015-05-28 12:11:26 -06005137 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005138 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005139 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005140 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5141 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005142
5143 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005144 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5145 ds_pool_ci.pNext = NULL;
5146 ds_pool_ci.maxSets = 1;
5147 ds_pool_ci.poolSizeCount = 1;
5148 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005149
Tobin Ehlis3b780662015-05-28 12:11:26 -06005150 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005151 err =
5152 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005153 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005154
Tony Barboureb254902015-07-15 12:50:33 -06005155 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005156 dsl_binding.binding = 0;
5157 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5158 dsl_binding.descriptorCount = 1;
5159 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5160 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005161
5162 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005163 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5164 ds_layout_ci.pNext = NULL;
5165 ds_layout_ci.bindingCount = 1;
5166 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005167 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005168 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5169 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005170 ASSERT_VK_SUCCESS(err);
5171
5172 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005173 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005174 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005175 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005176 alloc_info.descriptorPool = ds_pool;
5177 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005178 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5179 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005180 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005181
Tony Barboureb254902015-07-15 12:50:33 -06005182 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005183 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5184 sampler_ci.pNext = NULL;
5185 sampler_ci.magFilter = VK_FILTER_NEAREST;
5186 sampler_ci.minFilter = VK_FILTER_NEAREST;
5187 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5188 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5189 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5190 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5191 sampler_ci.mipLodBias = 1.0;
5192 sampler_ci.anisotropyEnable = VK_FALSE;
5193 sampler_ci.maxAnisotropy = 1;
5194 sampler_ci.compareEnable = VK_FALSE;
5195 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5196 sampler_ci.minLod = 1.0;
5197 sampler_ci.maxLod = 1.0;
5198 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5199 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005200
Tobin Ehlis3b780662015-05-28 12:11:26 -06005201 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005202 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005203 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005204
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005205 VkDescriptorImageInfo info = {};
5206 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005207
5208 VkWriteDescriptorSet descriptor_write;
5209 memset(&descriptor_write, 0, sizeof(descriptor_write));
5210 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005211 descriptor_write.dstSet = descriptorSet;
5212 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005213 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005214 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005215 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005216 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005217
5218 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5219
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005220 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005221
Chia-I Wuf7458c52015-10-26 21:10:41 +08005222 vkDestroySampler(m_device->device(), sampler, NULL);
5223 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5224 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005225}
5226
Karl Schultz6addd812016-02-02 17:17:23 -07005227TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
5228 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
5229 // types
5230 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005231
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005233 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005234
Tobin Ehlis3b780662015-05-28 12:11:26 -06005235 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005236
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005237 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005238 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5239 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005240
5241 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005242 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5243 ds_pool_ci.pNext = NULL;
5244 ds_pool_ci.maxSets = 1;
5245 ds_pool_ci.poolSizeCount = 1;
5246 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005247
Tobin Ehlis3b780662015-05-28 12:11:26 -06005248 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005249 err =
5250 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005251 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005252 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005253 dsl_binding.binding = 0;
5254 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5255 dsl_binding.descriptorCount = 1;
5256 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5257 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005258
Tony Barboureb254902015-07-15 12:50:33 -06005259 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005260 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5261 ds_layout_ci.pNext = NULL;
5262 ds_layout_ci.bindingCount = 1;
5263 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005264
Tobin Ehlis3b780662015-05-28 12:11:26 -06005265 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005266 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5267 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005268 ASSERT_VK_SUCCESS(err);
5269
5270 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005271 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005272 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005273 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005274 alloc_info.descriptorPool = ds_pool;
5275 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005276 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5277 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005278 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005279
Tony Barboureb254902015-07-15 12:50:33 -06005280 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005281 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5282 sampler_ci.pNext = NULL;
5283 sampler_ci.magFilter = VK_FILTER_NEAREST;
5284 sampler_ci.minFilter = VK_FILTER_NEAREST;
5285 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5286 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5287 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5288 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5289 sampler_ci.mipLodBias = 1.0;
5290 sampler_ci.anisotropyEnable = VK_FALSE;
5291 sampler_ci.maxAnisotropy = 1;
5292 sampler_ci.compareEnable = VK_FALSE;
5293 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5294 sampler_ci.minLod = 1.0;
5295 sampler_ci.maxLod = 1.0;
5296 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5297 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005298 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005299 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005300 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005301
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005302 VkDescriptorImageInfo info = {};
5303 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005304
5305 VkWriteDescriptorSet descriptor_write;
5306 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07005307 descriptor_write.sType =
5308 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005309 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005310 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005311 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005312 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005313 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005314
5315 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5316
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005317 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005318
Chia-I Wuf7458c52015-10-26 21:10:41 +08005319 vkDestroySampler(m_device->device(), sampler, NULL);
5320 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5321 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005322}
5323
Karl Schultz6addd812016-02-02 17:17:23 -07005324TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005325 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07005326 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005327
Karl Schultz6addd812016-02-02 17:17:23 -07005328 m_errorMonitor->SetDesiredFailureMsg(
5329 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005330 "Attempt to update descriptor with invalid sampler 0xbaadbeef");
5331
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005332 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005333 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
5334 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005335 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005336 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
5337 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005338
5339 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005340 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5341 ds_pool_ci.pNext = NULL;
5342 ds_pool_ci.maxSets = 1;
5343 ds_pool_ci.poolSizeCount = 1;
5344 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005345
5346 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005347 err =
5348 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005349 ASSERT_VK_SUCCESS(err);
5350
5351 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005352 dsl_binding.binding = 0;
5353 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5354 dsl_binding.descriptorCount = 1;
5355 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5356 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005357
5358 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005359 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5360 ds_layout_ci.pNext = NULL;
5361 ds_layout_ci.bindingCount = 1;
5362 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005363 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005364 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5365 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005366 ASSERT_VK_SUCCESS(err);
5367
5368 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005369 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005370 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005371 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005372 alloc_info.descriptorPool = ds_pool;
5373 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005374 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5375 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005376 ASSERT_VK_SUCCESS(err);
5377
Karl Schultz6addd812016-02-02 17:17:23 -07005378 VkSampler sampler =
5379 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005380
5381 VkDescriptorImageInfo descriptor_info;
5382 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5383 descriptor_info.sampler = sampler;
5384
5385 VkWriteDescriptorSet descriptor_write;
5386 memset(&descriptor_write, 0, sizeof(descriptor_write));
5387 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005388 descriptor_write.dstSet = descriptorSet;
5389 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005390 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005391 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5392 descriptor_write.pImageInfo = &descriptor_info;
5393
5394 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5395
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005396 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005397
Chia-I Wuf7458c52015-10-26 21:10:41 +08005398 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5399 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005400}
5401
Karl Schultz6addd812016-02-02 17:17:23 -07005402TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
5403 // Create a single combined Image/Sampler descriptor and send it an invalid
5404 // imageView
5405 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005406
Karl Schultz6addd812016-02-02 17:17:23 -07005407 m_errorMonitor->SetDesiredFailureMsg(
5408 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005409 "Attempt to update descriptor with invalid imageView 0xbaadbeef");
5410
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005411 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005412 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005413 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5414 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005415
5416 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005417 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5418 ds_pool_ci.pNext = NULL;
5419 ds_pool_ci.maxSets = 1;
5420 ds_pool_ci.poolSizeCount = 1;
5421 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005422
5423 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005424 err =
5425 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005426 ASSERT_VK_SUCCESS(err);
5427
5428 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005429 dsl_binding.binding = 0;
5430 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5431 dsl_binding.descriptorCount = 1;
5432 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5433 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005434
5435 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005436 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5437 ds_layout_ci.pNext = NULL;
5438 ds_layout_ci.bindingCount = 1;
5439 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005440 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005441 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5442 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005443 ASSERT_VK_SUCCESS(err);
5444
5445 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005446 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005447 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005448 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005449 alloc_info.descriptorPool = ds_pool;
5450 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005451 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5452 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005453 ASSERT_VK_SUCCESS(err);
5454
5455 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005456 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5457 sampler_ci.pNext = NULL;
5458 sampler_ci.magFilter = VK_FILTER_NEAREST;
5459 sampler_ci.minFilter = VK_FILTER_NEAREST;
5460 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5461 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5462 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5463 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5464 sampler_ci.mipLodBias = 1.0;
5465 sampler_ci.anisotropyEnable = VK_FALSE;
5466 sampler_ci.maxAnisotropy = 1;
5467 sampler_ci.compareEnable = VK_FALSE;
5468 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5469 sampler_ci.minLod = 1.0;
5470 sampler_ci.maxLod = 1.0;
5471 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5472 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005473
5474 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005475 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005476 ASSERT_VK_SUCCESS(err);
5477
Karl Schultz6addd812016-02-02 17:17:23 -07005478 VkImageView view =
5479 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005480
5481 VkDescriptorImageInfo descriptor_info;
5482 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5483 descriptor_info.sampler = sampler;
5484 descriptor_info.imageView = view;
5485
5486 VkWriteDescriptorSet descriptor_write;
5487 memset(&descriptor_write, 0, sizeof(descriptor_write));
5488 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005489 descriptor_write.dstSet = descriptorSet;
5490 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005491 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005492 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5493 descriptor_write.pImageInfo = &descriptor_info;
5494
5495 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5496
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005497 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005498
Chia-I Wuf7458c52015-10-26 21:10:41 +08005499 vkDestroySampler(m_device->device(), sampler, NULL);
5500 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5501 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005502}
5503
Karl Schultz6addd812016-02-02 17:17:23 -07005504TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
5505 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
5506 // into the other
5507 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005508
Karl Schultz6addd812016-02-02 17:17:23 -07005509 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06005510 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5511 "Copy descriptor update index 0, has src update descriptor "
5512 "type VK_DESCRIPTOR_TYPE_SAMPLER that does not match overlapping "
5513 "dest ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005514
Tobin Ehlis04356f92015-10-27 16:35:27 -06005515 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005516 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005517 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005518 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5519 ds_type_count[0].descriptorCount = 1;
5520 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
5521 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -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 = 2;
5528 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005529
5530 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005531 err =
5532 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005533 ASSERT_VK_SUCCESS(err);
5534 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005535 dsl_binding[0].binding = 0;
5536 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5537 dsl_binding[0].descriptorCount = 1;
5538 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
5539 dsl_binding[0].pImmutableSamplers = NULL;
5540 dsl_binding[1].binding = 1;
5541 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5542 dsl_binding[1].descriptorCount = 1;
5543 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
5544 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005545
5546 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005547 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5548 ds_layout_ci.pNext = NULL;
5549 ds_layout_ci.bindingCount = 2;
5550 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005551
5552 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005553 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5554 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005555 ASSERT_VK_SUCCESS(err);
5556
5557 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005558 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005559 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005560 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005561 alloc_info.descriptorPool = ds_pool;
5562 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005563 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5564 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005565 ASSERT_VK_SUCCESS(err);
5566
5567 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005568 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5569 sampler_ci.pNext = NULL;
5570 sampler_ci.magFilter = VK_FILTER_NEAREST;
5571 sampler_ci.minFilter = VK_FILTER_NEAREST;
5572 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5573 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5574 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5575 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5576 sampler_ci.mipLodBias = 1.0;
5577 sampler_ci.anisotropyEnable = VK_FALSE;
5578 sampler_ci.maxAnisotropy = 1;
5579 sampler_ci.compareEnable = VK_FALSE;
5580 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5581 sampler_ci.minLod = 1.0;
5582 sampler_ci.maxLod = 1.0;
5583 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5584 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005585
5586 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005587 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005588 ASSERT_VK_SUCCESS(err);
5589
5590 VkDescriptorImageInfo info = {};
5591 info.sampler = sampler;
5592
5593 VkWriteDescriptorSet descriptor_write;
5594 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
5595 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005596 descriptor_write.dstSet = descriptorSet;
5597 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08005598 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005599 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5600 descriptor_write.pImageInfo = &info;
5601 // This write update should succeed
5602 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5603 // Now perform a copy update that fails due to type mismatch
5604 VkCopyDescriptorSet copy_ds_update;
5605 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5606 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5607 copy_ds_update.srcSet = descriptorSet;
5608 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005609 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005610 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08005611 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005612 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5613
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005614 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005615 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005616 m_errorMonitor->SetDesiredFailureMsg(
5617 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005618 "Copy descriptor update 0 has srcBinding 3 which is out of bounds ");
Tobin Ehlis04356f92015-10-27 16:35:27 -06005619 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5620 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5621 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005622 copy_ds_update.srcBinding =
5623 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005624 copy_ds_update.dstSet = descriptorSet;
5625 copy_ds_update.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005626 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005627 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5628
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005629 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005630
Tobin Ehlis04356f92015-10-27 16:35:27 -06005631 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005632 m_errorMonitor->SetDesiredFailureMsg(
5633 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005634 "Copy descriptor src update is out of bounds for matching binding 1 ");
5635
Tobin Ehlis04356f92015-10-27 16:35:27 -06005636 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5637 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5638 copy_ds_update.srcSet = descriptorSet;
5639 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005640 copy_ds_update.dstSet = descriptorSet;
5641 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005642 copy_ds_update.descriptorCount =
5643 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06005644 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5645
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005646 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005647
Chia-I Wuf7458c52015-10-26 21:10:41 +08005648 vkDestroySampler(m_device->device(), sampler, NULL);
5649 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5650 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005651}
5652
Karl Schultz6addd812016-02-02 17:17:23 -07005653TEST_F(VkLayerTest, NumSamplesMismatch) {
5654 // Create CommandBuffer where MSAA samples doesn't match RenderPass
5655 // sampleCount
5656 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005657
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005659 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005660
Tobin Ehlis3b780662015-05-28 12:11:26 -06005661 ASSERT_NO_FATAL_FAILURE(InitState());
5662 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005663 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06005664 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005665 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005666
5667 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005668 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5669 ds_pool_ci.pNext = NULL;
5670 ds_pool_ci.maxSets = 1;
5671 ds_pool_ci.poolSizeCount = 1;
5672 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005673
Tobin Ehlis3b780662015-05-28 12:11:26 -06005674 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005675 err =
5676 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005677 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005678
Tony Barboureb254902015-07-15 12:50:33 -06005679 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08005680 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06005681 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08005682 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005683 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5684 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005685
Tony Barboureb254902015-07-15 12:50:33 -06005686 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5687 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5688 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005689 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07005690 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005691
Tobin Ehlis3b780662015-05-28 12:11:26 -06005692 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005693 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5694 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005695 ASSERT_VK_SUCCESS(err);
5696
5697 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005698 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005699 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005700 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005701 alloc_info.descriptorPool = ds_pool;
5702 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005703 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5704 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005705 ASSERT_VK_SUCCESS(err);
5706
Tony Barboureb254902015-07-15 12:50:33 -06005707 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005708 pipe_ms_state_ci.sType =
5709 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5710 pipe_ms_state_ci.pNext = NULL;
5711 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5712 pipe_ms_state_ci.sampleShadingEnable = 0;
5713 pipe_ms_state_ci.minSampleShading = 1.0;
5714 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005715
Tony Barboureb254902015-07-15 12:50:33 -06005716 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005717 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5718 pipeline_layout_ci.pNext = NULL;
5719 pipeline_layout_ci.setLayoutCount = 1;
5720 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005721
5722 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005723 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5724 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005725 ASSERT_VK_SUCCESS(err);
5726
Karl Schultz6addd812016-02-02 17:17:23 -07005727 VkShaderObj vs(m_device, bindStateVertShaderText,
5728 VK_SHADER_STAGE_VERTEX_BIT, this);
5729 VkShaderObj fs(m_device, bindStateFragShaderText,
5730 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005731 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005732 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005733 VkPipelineObj pipe(m_device);
5734 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005735 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005736 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005737 pipe.SetMSAA(&pipe_ms_state_ci);
5738 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005739
Tony Barbourfe3351b2015-07-28 10:17:20 -06005740 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005741 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5742 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005743
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005744 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005745
Chia-I Wuf7458c52015-10-26 21:10:41 +08005746 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5747 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5748 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005749}
Tobin Ehlis0f10db52016-04-04 10:00:21 -06005750#ifdef ADD_BACK_IN_WHEN_CHECK_IS_BACK // TODO : Re-enable when GH256 fixed
Mark Youngc89c6312016-03-31 16:03:20 -06005751TEST_F(VkLayerTest, NumBlendAttachMismatch) {
5752 // Create Pipeline where the number of blend attachments doesn't match the
5753 // number of color attachments. In this case, we don't add any color
5754 // blend attachments even though we have a color attachment.
5755 VkResult err;
5756
5757 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5758 "Mismatch between blend state attachment");
5759
5760 ASSERT_NO_FATAL_FAILURE(InitState());
5761 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5762 VkDescriptorPoolSize ds_type_count = {};
5763 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5764 ds_type_count.descriptorCount = 1;
5765
5766 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5767 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5768 ds_pool_ci.pNext = NULL;
5769 ds_pool_ci.maxSets = 1;
5770 ds_pool_ci.poolSizeCount = 1;
5771 ds_pool_ci.pPoolSizes = &ds_type_count;
5772
5773 VkDescriptorPool ds_pool;
5774 err =
5775 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5776 ASSERT_VK_SUCCESS(err);
5777
5778 VkDescriptorSetLayoutBinding dsl_binding = {};
5779 dsl_binding.binding = 0;
5780 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5781 dsl_binding.descriptorCount = 1;
5782 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5783 dsl_binding.pImmutableSamplers = NULL;
5784
5785 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5786 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5787 ds_layout_ci.pNext = NULL;
5788 ds_layout_ci.bindingCount = 1;
5789 ds_layout_ci.pBindings = &dsl_binding;
5790
5791 VkDescriptorSetLayout ds_layout;
5792 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5793 &ds_layout);
5794 ASSERT_VK_SUCCESS(err);
5795
5796 VkDescriptorSet descriptorSet;
5797 VkDescriptorSetAllocateInfo alloc_info = {};
5798 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5799 alloc_info.descriptorSetCount = 1;
5800 alloc_info.descriptorPool = ds_pool;
5801 alloc_info.pSetLayouts = &ds_layout;
5802 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5803 &descriptorSet);
5804 ASSERT_VK_SUCCESS(err);
5805
5806 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
5807 pipe_ms_state_ci.sType =
5808 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5809 pipe_ms_state_ci.pNext = NULL;
5810 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
5811 pipe_ms_state_ci.sampleShadingEnable = 0;
5812 pipe_ms_state_ci.minSampleShading = 1.0;
5813 pipe_ms_state_ci.pSampleMask = NULL;
5814
5815 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5816 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5817 pipeline_layout_ci.pNext = NULL;
5818 pipeline_layout_ci.setLayoutCount = 1;
5819 pipeline_layout_ci.pSetLayouts = &ds_layout;
5820
5821 VkPipelineLayout pipeline_layout;
5822 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5823 &pipeline_layout);
5824 ASSERT_VK_SUCCESS(err);
5825
5826 VkShaderObj vs(m_device, bindStateVertShaderText,
5827 VK_SHADER_STAGE_VERTEX_BIT, this);
5828 VkShaderObj fs(m_device, bindStateFragShaderText,
5829 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005830 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06005831 // but add it to be able to run on more devices
5832 VkPipelineObj pipe(m_device);
5833 pipe.AddShader(&vs);
5834 pipe.AddShader(&fs);
5835 pipe.SetMSAA(&pipe_ms_state_ci);
5836 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5837
5838 BeginCommandBuffer();
5839 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5840 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5841
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005842 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06005843
5844 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5845 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5846 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5847}
Tony Barbour4e81a202016-04-04 11:09:40 -06005848#endif //ADD_BACK_IN_WHEN_CHECK_IS_BACK
Karl Schultz6addd812016-02-02 17:17:23 -07005849TEST_F(VkLayerTest, ClearCmdNoDraw) {
5850 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
5851 // to issuing a Draw
5852 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005853
Karl Schultz6addd812016-02-02 17:17:23 -07005854 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07005855 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005856 "vkCmdClearAttachments() issued on CB object ");
5857
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005858 ASSERT_NO_FATAL_FAILURE(InitState());
5859 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06005860
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005861 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005862 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5863 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005864
5865 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005866 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5867 ds_pool_ci.pNext = NULL;
5868 ds_pool_ci.maxSets = 1;
5869 ds_pool_ci.poolSizeCount = 1;
5870 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005871
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005872 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005873 err =
5874 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005875 ASSERT_VK_SUCCESS(err);
5876
Tony Barboureb254902015-07-15 12:50:33 -06005877 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005878 dsl_binding.binding = 0;
5879 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5880 dsl_binding.descriptorCount = 1;
5881 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5882 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005883
Tony Barboureb254902015-07-15 12:50:33 -06005884 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005885 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5886 ds_layout_ci.pNext = NULL;
5887 ds_layout_ci.bindingCount = 1;
5888 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005889
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005890 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005891 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5892 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005893 ASSERT_VK_SUCCESS(err);
5894
5895 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005896 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005897 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005898 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005899 alloc_info.descriptorPool = ds_pool;
5900 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005901 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5902 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005903 ASSERT_VK_SUCCESS(err);
5904
Tony Barboureb254902015-07-15 12:50:33 -06005905 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005906 pipe_ms_state_ci.sType =
5907 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5908 pipe_ms_state_ci.pNext = NULL;
5909 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5910 pipe_ms_state_ci.sampleShadingEnable = 0;
5911 pipe_ms_state_ci.minSampleShading = 1.0;
5912 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005913
Tony Barboureb254902015-07-15 12:50:33 -06005914 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005915 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5916 pipeline_layout_ci.pNext = NULL;
5917 pipeline_layout_ci.setLayoutCount = 1;
5918 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005919
5920 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005921 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5922 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005923 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005924
Karl Schultz6addd812016-02-02 17:17:23 -07005925 VkShaderObj vs(m_device, bindStateVertShaderText,
5926 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06005927 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07005928 // on more devices
5929 VkShaderObj fs(m_device, bindStateFragShaderText,
5930 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005931
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005932 VkPipelineObj pipe(m_device);
5933 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005934 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005935 pipe.SetMSAA(&pipe_ms_state_ci);
5936 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06005937
5938 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005939
Karl Schultz6addd812016-02-02 17:17:23 -07005940 // Main thing we care about for this test is that the VkImage obj we're
5941 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005942 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005943 VkClearAttachment color_attachment;
5944 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5945 color_attachment.clearValue.color.float32[0] = 1.0;
5946 color_attachment.clearValue.color.float32[1] = 1.0;
5947 color_attachment.clearValue.color.float32[2] = 1.0;
5948 color_attachment.clearValue.color.float32[3] = 1.0;
5949 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005950 VkClearRect clear_rect = {
5951 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005952
Karl Schultz6addd812016-02-02 17:17:23 -07005953 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
5954 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005955
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005956 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005957
Chia-I Wuf7458c52015-10-26 21:10:41 +08005958 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5959 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5960 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005961}
5962
Karl Schultz6addd812016-02-02 17:17:23 -07005963TEST_F(VkLayerTest, VtxBufferBadIndex) {
5964 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005965
Karl Schultz6addd812016-02-02 17:17:23 -07005966 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005967 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07005968 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005969
Tobin Ehlis502480b2015-06-24 15:53:07 -06005970 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06005971 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06005972 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06005973
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005974 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005975 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5976 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005977
5978 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005979 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5980 ds_pool_ci.pNext = NULL;
5981 ds_pool_ci.maxSets = 1;
5982 ds_pool_ci.poolSizeCount = 1;
5983 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005984
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005985 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005986 err =
5987 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005988 ASSERT_VK_SUCCESS(err);
5989
Tony Barboureb254902015-07-15 12:50:33 -06005990 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005991 dsl_binding.binding = 0;
5992 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5993 dsl_binding.descriptorCount = 1;
5994 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5995 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005996
Tony Barboureb254902015-07-15 12:50:33 -06005997 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005998 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5999 ds_layout_ci.pNext = NULL;
6000 ds_layout_ci.bindingCount = 1;
6001 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006002
Tobin Ehlis502480b2015-06-24 15:53:07 -06006003 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006004 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6005 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006006 ASSERT_VK_SUCCESS(err);
6007
6008 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006009 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006010 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006011 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006012 alloc_info.descriptorPool = ds_pool;
6013 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006014 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6015 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006016 ASSERT_VK_SUCCESS(err);
6017
Tony Barboureb254902015-07-15 12:50:33 -06006018 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006019 pipe_ms_state_ci.sType =
6020 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6021 pipe_ms_state_ci.pNext = NULL;
6022 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6023 pipe_ms_state_ci.sampleShadingEnable = 0;
6024 pipe_ms_state_ci.minSampleShading = 1.0;
6025 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006026
Tony Barboureb254902015-07-15 12:50:33 -06006027 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006028 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6029 pipeline_layout_ci.pNext = NULL;
6030 pipeline_layout_ci.setLayoutCount = 1;
6031 pipeline_layout_ci.pSetLayouts = &ds_layout;
6032 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006033
Karl Schultz6addd812016-02-02 17:17:23 -07006034 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6035 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006036 ASSERT_VK_SUCCESS(err);
6037
Karl Schultz6addd812016-02-02 17:17:23 -07006038 VkShaderObj vs(m_device, bindStateVertShaderText,
6039 VK_SHADER_STAGE_VERTEX_BIT, this);
6040 VkShaderObj fs(m_device, bindStateFragShaderText,
6041 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006042 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006043 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006044 VkPipelineObj pipe(m_device);
6045 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006046 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006047 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006048 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006049 pipe.SetViewport(m_viewports);
6050 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006051 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006052
6053 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006054 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6055 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006056 // Don't care about actual data, just need to get to draw to flag error
6057 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07006058 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
6059 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006060 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06006061 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006062
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006063 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006064
Chia-I Wuf7458c52015-10-26 21:10:41 +08006065 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6066 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6067 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006068}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006069#endif // DRAW_STATE_TESTS
6070
Tobin Ehlis0788f522015-05-26 16:11:58 -06006071#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06006072#if GTEST_IS_THREADSAFE
6073struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006074 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006075 VkEvent event;
6076 bool bailout;
6077};
6078
Karl Schultz6addd812016-02-02 17:17:23 -07006079extern "C" void *AddToCommandBuffer(void *arg) {
6080 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006081
Karl Schultz6addd812016-02-02 17:17:23 -07006082 for (int i = 0; i < 10000; i++) {
6083 vkCmdSetEvent(data->commandBuffer, data->event,
6084 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006085 if (data->bailout) {
6086 break;
6087 }
6088 }
6089 return NULL;
6090}
6091
Karl Schultz6addd812016-02-02 17:17:23 -07006092TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006093 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006094
Karl Schultz6addd812016-02-02 17:17:23 -07006095 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6096 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006097
Mike Stroyanaccf7692015-05-12 16:00:45 -06006098 ASSERT_NO_FATAL_FAILURE(InitState());
6099 ASSERT_NO_FATAL_FAILURE(InitViewport());
6100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6101
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006102 // Calls AllocateCommandBuffers
6103 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006104
6105 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006106 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006107
6108 VkEventCreateInfo event_info;
6109 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006110 VkResult err;
6111
6112 memset(&event_info, 0, sizeof(event_info));
6113 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
6114
Chia-I Wuf7458c52015-10-26 21:10:41 +08006115 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006116 ASSERT_VK_SUCCESS(err);
6117
Mike Stroyanaccf7692015-05-12 16:00:45 -06006118 err = vkResetEvent(device(), event);
6119 ASSERT_VK_SUCCESS(err);
6120
6121 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006122 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006123 data.event = event;
6124 data.bailout = false;
6125 m_errorMonitor->SetBailout(&data.bailout);
6126 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006127 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006128 // Add many entries to command buffer from this thread at the same time.
6129 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006130
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006131 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006132 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006133
Mike Stroyan10b8cb72016-01-22 15:22:03 -07006134 m_errorMonitor->SetBailout(NULL);
6135
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006136 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006137
Chia-I Wuf7458c52015-10-26 21:10:41 +08006138 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006139}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006140#endif // GTEST_IS_THREADSAFE
6141#endif // THREADING_TESTS
6142
Chris Forbes9f7ff632015-05-25 11:13:08 +12006143#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006144TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006145 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006146 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006147
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006148 ASSERT_NO_FATAL_FAILURE(InitState());
6149 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6150
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006151 VkShaderModule module;
6152 VkShaderModuleCreateInfo moduleCreateInfo;
6153 struct icd_spv_header spv;
6154
6155 spv.magic = ICD_SPV_MAGIC;
6156 spv.version = ICD_SPV_VERSION;
6157 spv.gen_magic = 0;
6158
6159 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6160 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006161 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006162 moduleCreateInfo.codeSize = 4;
6163 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006164 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006165
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006166 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006167}
6168
Karl Schultz6addd812016-02-02 17:17:23 -07006169TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006170 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006171 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006172
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006173 ASSERT_NO_FATAL_FAILURE(InitState());
6174 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6175
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006176 VkShaderModule module;
6177 VkShaderModuleCreateInfo moduleCreateInfo;
6178 struct icd_spv_header spv;
6179
6180 spv.magic = ~ICD_SPV_MAGIC;
6181 spv.version = ICD_SPV_VERSION;
6182 spv.gen_magic = 0;
6183
6184 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6185 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006186 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006187 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6188 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006189 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006190
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006191 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006192}
6193
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006194#if 0
6195// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07006196TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006197 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006198 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006199
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006200 ASSERT_NO_FATAL_FAILURE(InitState());
6201 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6202
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006203 VkShaderModule module;
6204 VkShaderModuleCreateInfo moduleCreateInfo;
6205 struct icd_spv_header spv;
6206
6207 spv.magic = ICD_SPV_MAGIC;
6208 spv.version = ~ICD_SPV_VERSION;
6209 spv.gen_magic = 0;
6210
6211 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6212 moduleCreateInfo.pNext = NULL;
6213
Karl Schultz6addd812016-02-02 17:17:23 -07006214 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006215 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6216 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006217 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006218
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006219 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006220}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006221#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006222
Karl Schultz6addd812016-02-02 17:17:23 -07006223TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006225 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006226
Chris Forbes9f7ff632015-05-25 11:13:08 +12006227 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006228 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006229
6230 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006231 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006232 "\n"
6233 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006234 "out gl_PerVertex {\n"
6235 " vec4 gl_Position;\n"
6236 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006237 "void main(){\n"
6238 " gl_Position = vec4(1);\n"
6239 " x = 0;\n"
6240 "}\n";
6241 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006242 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006243 "\n"
6244 "layout(location=0) out vec4 color;\n"
6245 "void main(){\n"
6246 " color = vec4(1);\n"
6247 "}\n";
6248
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006249 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6250 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006251
6252 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006253 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006254 pipe.AddShader(&vs);
6255 pipe.AddShader(&fs);
6256
Chris Forbes9f7ff632015-05-25 11:13:08 +12006257 VkDescriptorSetObj descriptorSet(m_device);
6258 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006259 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006260
Tony Barbour5781e8f2015-08-04 16:23:11 -06006261 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006262
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006263 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006264}
Chris Forbes9f7ff632015-05-25 11:13:08 +12006265
Karl Schultz6addd812016-02-02 17:17:23 -07006266TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006267 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006268 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006269
Chris Forbes59cb88d2015-05-25 11:13:13 +12006270 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006271 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006272
6273 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006274 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006275 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006276 "out gl_PerVertex {\n"
6277 " vec4 gl_Position;\n"
6278 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006279 "void main(){\n"
6280 " gl_Position = vec4(1);\n"
6281 "}\n";
6282 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006283 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006284 "\n"
6285 "layout(location=0) in float x;\n"
6286 "layout(location=0) out vec4 color;\n"
6287 "void main(){\n"
6288 " color = vec4(x);\n"
6289 "}\n";
6290
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006291 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6292 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006293
6294 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006295 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006296 pipe.AddShader(&vs);
6297 pipe.AddShader(&fs);
6298
Chris Forbes59cb88d2015-05-25 11:13:13 +12006299 VkDescriptorSetObj descriptorSet(m_device);
6300 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006301 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006302
Tony Barbour5781e8f2015-08-04 16:23:11 -06006303 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006304
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006305 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006306}
6307
Karl Schultz6addd812016-02-02 17:17:23 -07006308TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006309 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006310 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006311
6312 ASSERT_NO_FATAL_FAILURE(InitState());
6313 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6314
6315 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006316 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006317 "\n"
6318 "out gl_PerVertex {\n"
6319 " vec4 gl_Position;\n"
6320 "};\n"
6321 "void main(){\n"
6322 " gl_Position = vec4(1);\n"
6323 "}\n";
6324 char const *fsSource =
6325 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006326 "\n"
6327 "in block { layout(location=0) float x; } ins;\n"
6328 "layout(location=0) out vec4 color;\n"
6329 "void main(){\n"
6330 " color = vec4(ins.x);\n"
6331 "}\n";
6332
6333 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6334 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6335
6336 VkPipelineObj pipe(m_device);
6337 pipe.AddColorAttachment();
6338 pipe.AddShader(&vs);
6339 pipe.AddShader(&fs);
6340
6341 VkDescriptorSetObj descriptorSet(m_device);
6342 descriptorSet.AppendDummy();
6343 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6344
6345 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6346
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006347 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006348}
6349
Karl Schultz6addd812016-02-02 17:17:23 -07006350TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13006351 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13006352 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07006353 "output arr[2] of float32' vs 'ptr to "
6354 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13006355
6356 ASSERT_NO_FATAL_FAILURE(InitState());
6357 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6358
6359 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006360 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006361 "\n"
6362 "layout(location=0) out float x[2];\n"
6363 "out gl_PerVertex {\n"
6364 " vec4 gl_Position;\n"
6365 "};\n"
6366 "void main(){\n"
6367 " x[0] = 0; x[1] = 0;\n"
6368 " gl_Position = vec4(1);\n"
6369 "}\n";
6370 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006371 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006372 "\n"
6373 "layout(location=0) in float x[3];\n"
6374 "layout(location=0) out vec4 color;\n"
6375 "void main(){\n"
6376 " color = vec4(x[0] + x[1] + x[2]);\n"
6377 "}\n";
6378
6379 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6380 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6381
6382 VkPipelineObj pipe(m_device);
6383 pipe.AddColorAttachment();
6384 pipe.AddShader(&vs);
6385 pipe.AddShader(&fs);
6386
6387 VkDescriptorSetObj descriptorSet(m_device);
6388 descriptorSet.AppendDummy();
6389 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6390
6391 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6392
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006393 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13006394}
6395
Karl Schultz6addd812016-02-02 17:17:23 -07006396TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006397 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006398 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006399
Chris Forbesb56af562015-05-25 11:13:17 +12006400 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006401 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12006402
6403 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006404 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006405 "\n"
6406 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006407 "out gl_PerVertex {\n"
6408 " vec4 gl_Position;\n"
6409 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006410 "void main(){\n"
6411 " x = 0;\n"
6412 " gl_Position = vec4(1);\n"
6413 "}\n";
6414 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006415 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006416 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006417 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12006418 "layout(location=0) out vec4 color;\n"
6419 "void main(){\n"
6420 " color = vec4(x);\n"
6421 "}\n";
6422
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006423 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6424 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12006425
6426 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006427 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12006428 pipe.AddShader(&vs);
6429 pipe.AddShader(&fs);
6430
Chris Forbesb56af562015-05-25 11:13:17 +12006431 VkDescriptorSetObj descriptorSet(m_device);
6432 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006433 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12006434
Tony Barbour5781e8f2015-08-04 16:23:11 -06006435 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12006436
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006437 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12006438}
6439
Karl Schultz6addd812016-02-02 17:17:23 -07006440TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006442 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006443
6444 ASSERT_NO_FATAL_FAILURE(InitState());
6445 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6446
6447 char const *vsSource =
6448 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006449 "\n"
6450 "out block { layout(location=0) int x; } outs;\n"
6451 "out gl_PerVertex {\n"
6452 " vec4 gl_Position;\n"
6453 "};\n"
6454 "void main(){\n"
6455 " outs.x = 0;\n"
6456 " gl_Position = vec4(1);\n"
6457 "}\n";
6458 char const *fsSource =
6459 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006460 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006461 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13006462 "layout(location=0) out vec4 color;\n"
6463 "void main(){\n"
6464 " color = vec4(ins.x);\n"
6465 "}\n";
6466
6467 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6468 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6469
6470 VkPipelineObj pipe(m_device);
6471 pipe.AddColorAttachment();
6472 pipe.AddShader(&vs);
6473 pipe.AddShader(&fs);
6474
6475 VkDescriptorSetObj descriptorSet(m_device);
6476 descriptorSet.AppendDummy();
6477 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6478
6479 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6480
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006481 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006482}
6483
6484TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
6485 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6486 "location 0.0 which is not written by vertex shader");
6487
6488 ASSERT_NO_FATAL_FAILURE(InitState());
6489 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6490
6491 char const *vsSource =
6492 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006493 "\n"
6494 "out block { layout(location=1) float x; } outs;\n"
6495 "out gl_PerVertex {\n"
6496 " vec4 gl_Position;\n"
6497 "};\n"
6498 "void main(){\n"
6499 " outs.x = 0;\n"
6500 " gl_Position = vec4(1);\n"
6501 "}\n";
6502 char const *fsSource =
6503 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006504 "\n"
6505 "in block { layout(location=0) float x; } ins;\n"
6506 "layout(location=0) out vec4 color;\n"
6507 "void main(){\n"
6508 " color = vec4(ins.x);\n"
6509 "}\n";
6510
6511 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6512 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6513
6514 VkPipelineObj pipe(m_device);
6515 pipe.AddColorAttachment();
6516 pipe.AddShader(&vs);
6517 pipe.AddShader(&fs);
6518
6519 VkDescriptorSetObj descriptorSet(m_device);
6520 descriptorSet.AppendDummy();
6521 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6522
6523 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6524
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006525 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006526}
6527
6528TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
6529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6530 "location 0.1 which is not written by vertex shader");
6531
6532 ASSERT_NO_FATAL_FAILURE(InitState());
6533 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6534
6535 char const *vsSource =
6536 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006537 "\n"
6538 "out block { layout(location=0, component=0) float x; } outs;\n"
6539 "out gl_PerVertex {\n"
6540 " vec4 gl_Position;\n"
6541 "};\n"
6542 "void main(){\n"
6543 " outs.x = 0;\n"
6544 " gl_Position = vec4(1);\n"
6545 "}\n";
6546 char const *fsSource =
6547 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006548 "\n"
6549 "in block { layout(location=0, component=1) float x; } ins;\n"
6550 "layout(location=0) out vec4 color;\n"
6551 "void main(){\n"
6552 " color = vec4(ins.x);\n"
6553 "}\n";
6554
6555 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6556 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6557
6558 VkPipelineObj pipe(m_device);
6559 pipe.AddColorAttachment();
6560 pipe.AddShader(&vs);
6561 pipe.AddShader(&fs);
6562
6563 VkDescriptorSetObj descriptorSet(m_device);
6564 descriptorSet.AppendDummy();
6565 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6566
6567 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6568
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006569 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006570}
6571
Karl Schultz6addd812016-02-02 17:17:23 -07006572TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006573 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006574 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006575
Chris Forbesde136e02015-05-25 11:13:28 +12006576 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006577 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12006578
6579 VkVertexInputBindingDescription input_binding;
6580 memset(&input_binding, 0, sizeof(input_binding));
6581
6582 VkVertexInputAttributeDescription input_attrib;
6583 memset(&input_attrib, 0, sizeof(input_attrib));
6584 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6585
6586 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006587 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006588 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006589 "out gl_PerVertex {\n"
6590 " vec4 gl_Position;\n"
6591 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006592 "void main(){\n"
6593 " gl_Position = vec4(1);\n"
6594 "}\n";
6595 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006596 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006597 "\n"
6598 "layout(location=0) out vec4 color;\n"
6599 "void main(){\n"
6600 " color = vec4(1);\n"
6601 "}\n";
6602
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006603 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6604 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12006605
6606 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006607 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12006608 pipe.AddShader(&vs);
6609 pipe.AddShader(&fs);
6610
6611 pipe.AddVertexInputBindings(&input_binding, 1);
6612 pipe.AddVertexInputAttribs(&input_attrib, 1);
6613
Chris Forbesde136e02015-05-25 11:13:28 +12006614 VkDescriptorSetObj descriptorSet(m_device);
6615 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006616 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12006617
Tony Barbour5781e8f2015-08-04 16:23:11 -06006618 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12006619
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006620 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12006621}
6622
Karl Schultz6addd812016-02-02 17:17:23 -07006623TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006625 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13006626
6627 ASSERT_NO_FATAL_FAILURE(InitState());
6628 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6629
6630 VkVertexInputBindingDescription input_binding;
6631 memset(&input_binding, 0, sizeof(input_binding));
6632
6633 VkVertexInputAttributeDescription input_attrib;
6634 memset(&input_attrib, 0, sizeof(input_attrib));
6635 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6636
6637 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006638 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006639 "\n"
6640 "layout(location=1) in float x;\n"
6641 "out gl_PerVertex {\n"
6642 " vec4 gl_Position;\n"
6643 "};\n"
6644 "void main(){\n"
6645 " gl_Position = vec4(x);\n"
6646 "}\n";
6647 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006648 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006649 "\n"
6650 "layout(location=0) out vec4 color;\n"
6651 "void main(){\n"
6652 " color = vec4(1);\n"
6653 "}\n";
6654
6655 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6656 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6657
6658 VkPipelineObj pipe(m_device);
6659 pipe.AddColorAttachment();
6660 pipe.AddShader(&vs);
6661 pipe.AddShader(&fs);
6662
6663 pipe.AddVertexInputBindings(&input_binding, 1);
6664 pipe.AddVertexInputAttribs(&input_attrib, 1);
6665
6666 VkDescriptorSetObj descriptorSet(m_device);
6667 descriptorSet.AppendDummy();
6668 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6669
6670 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6671
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006672 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13006673}
6674
Karl Schultz6addd812016-02-02 17:17:23 -07006675TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
6676 m_errorMonitor->SetDesiredFailureMsg(
6677 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006678 "VS consumes input at location 0 but not provided");
6679
Chris Forbes62e8e502015-05-25 11:13:29 +12006680 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006681 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12006682
6683 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006684 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006685 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006686 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07006687 "out gl_PerVertex {\n"
6688 " vec4 gl_Position;\n"
6689 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006690 "void main(){\n"
6691 " gl_Position = x;\n"
6692 "}\n";
6693 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006694 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006695 "\n"
6696 "layout(location=0) out vec4 color;\n"
6697 "void main(){\n"
6698 " color = vec4(1);\n"
6699 "}\n";
6700
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006701 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6702 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12006703
6704 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006705 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12006706 pipe.AddShader(&vs);
6707 pipe.AddShader(&fs);
6708
Chris Forbes62e8e502015-05-25 11:13:29 +12006709 VkDescriptorSetObj descriptorSet(m_device);
6710 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006711 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12006712
Tony Barbour5781e8f2015-08-04 16:23:11 -06006713 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12006714
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006715 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12006716}
6717
Karl Schultz6addd812016-02-02 17:17:23 -07006718TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
6719 m_errorMonitor->SetDesiredFailureMsg(
6720 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006721 "location 0 does not match VS input type");
6722
Chris Forbesc97d98e2015-05-25 11:13:31 +12006723 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006724 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006725
6726 VkVertexInputBindingDescription input_binding;
6727 memset(&input_binding, 0, sizeof(input_binding));
6728
6729 VkVertexInputAttributeDescription input_attrib;
6730 memset(&input_attrib, 0, sizeof(input_attrib));
6731 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6732
6733 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006734 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006735 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006736 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07006737 "out gl_PerVertex {\n"
6738 " vec4 gl_Position;\n"
6739 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006740 "void main(){\n"
6741 " gl_Position = vec4(x);\n"
6742 "}\n";
6743 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006744 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006745 "\n"
6746 "layout(location=0) out vec4 color;\n"
6747 "void main(){\n"
6748 " color = vec4(1);\n"
6749 "}\n";
6750
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006751 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6752 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006753
6754 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006755 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006756 pipe.AddShader(&vs);
6757 pipe.AddShader(&fs);
6758
6759 pipe.AddVertexInputBindings(&input_binding, 1);
6760 pipe.AddVertexInputAttribs(&input_attrib, 1);
6761
Chris Forbesc97d98e2015-05-25 11:13:31 +12006762 VkDescriptorSetObj descriptorSet(m_device);
6763 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006764 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006765
Tony Barbour5781e8f2015-08-04 16:23:11 -06006766 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006767
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006768 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006769}
6770
Chris Forbesc68b43c2016-04-06 11:18:47 +12006771TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
6772 m_errorMonitor->SetDesiredFailureMsg(
6773 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6774 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
6775
6776 ASSERT_NO_FATAL_FAILURE(InitState());
6777 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6778
6779 char const *vsSource =
6780 "#version 450\n"
6781 "\n"
6782 "out gl_PerVertex {\n"
6783 " vec4 gl_Position;\n"
6784 "};\n"
6785 "void main(){\n"
6786 " gl_Position = vec4(1);\n"
6787 "}\n";
6788 char const *fsSource =
6789 "#version 450\n"
6790 "\n"
6791 "layout(location=0) out vec4 color;\n"
6792 "void main(){\n"
6793 " color = vec4(1);\n"
6794 "}\n";
6795
6796 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6797 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6798
6799 VkPipelineObj pipe(m_device);
6800 pipe.AddColorAttachment();
6801 pipe.AddShader(&vs);
6802 pipe.AddShader(&vs);
6803 pipe.AddShader(&fs);
6804
6805 VkDescriptorSetObj descriptorSet(m_device);
6806 descriptorSet.AppendDummy();
6807 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6808
6809 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6810
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006811 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12006812}
6813
Karl Schultz6addd812016-02-02 17:17:23 -07006814TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006815 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13006816
6817 ASSERT_NO_FATAL_FAILURE(InitState());
6818 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6819
6820 VkVertexInputBindingDescription input_binding;
6821 memset(&input_binding, 0, sizeof(input_binding));
6822
6823 VkVertexInputAttributeDescription input_attribs[2];
6824 memset(input_attribs, 0, sizeof(input_attribs));
6825
6826 for (int i = 0; i < 2; i++) {
6827 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
6828 input_attribs[i].location = i;
6829 }
6830
6831 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006832 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006833 "\n"
6834 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006835 "out gl_PerVertex {\n"
6836 " vec4 gl_Position;\n"
6837 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006838 "void main(){\n"
6839 " gl_Position = x[0] + x[1];\n"
6840 "}\n";
6841 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006842 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006843 "\n"
6844 "layout(location=0) out vec4 color;\n"
6845 "void main(){\n"
6846 " color = vec4(1);\n"
6847 "}\n";
6848
6849 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6850 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6851
6852 VkPipelineObj pipe(m_device);
6853 pipe.AddColorAttachment();
6854 pipe.AddShader(&vs);
6855 pipe.AddShader(&fs);
6856
6857 pipe.AddVertexInputBindings(&input_binding, 1);
6858 pipe.AddVertexInputAttribs(input_attribs, 2);
6859
6860 VkDescriptorSetObj descriptorSet(m_device);
6861 descriptorSet.AppendDummy();
6862 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6863
6864 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6865
6866 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006867 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13006868}
6869
Chris Forbes2682b242015-11-24 11:13:14 +13006870TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
6871{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006872 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13006873
6874 ASSERT_NO_FATAL_FAILURE(InitState());
6875 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6876
6877 VkVertexInputBindingDescription input_binding;
6878 memset(&input_binding, 0, sizeof(input_binding));
6879
6880 VkVertexInputAttributeDescription input_attribs[2];
6881 memset(input_attribs, 0, sizeof(input_attribs));
6882
6883 for (int i = 0; i < 2; i++) {
6884 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
6885 input_attribs[i].location = i;
6886 }
6887
6888 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006889 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006890 "\n"
6891 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07006892 "out gl_PerVertex {\n"
6893 " vec4 gl_Position;\n"
6894 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006895 "void main(){\n"
6896 " gl_Position = x[0] + x[1];\n"
6897 "}\n";
6898 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006899 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006900 "\n"
6901 "layout(location=0) out vec4 color;\n"
6902 "void main(){\n"
6903 " color = vec4(1);\n"
6904 "}\n";
6905
6906 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6907 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6908
6909 VkPipelineObj pipe(m_device);
6910 pipe.AddColorAttachment();
6911 pipe.AddShader(&vs);
6912 pipe.AddShader(&fs);
6913
6914 pipe.AddVertexInputBindings(&input_binding, 1);
6915 pipe.AddVertexInputAttribs(input_attribs, 2);
6916
6917 VkDescriptorSetObj descriptorSet(m_device);
6918 descriptorSet.AppendDummy();
6919 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6920
6921 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6922
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006923 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13006924}
Chris Forbes2682b242015-11-24 11:13:14 +13006925
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006926TEST_F(VkLayerTest, CreatePipelineSimplePositive)
6927{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006928 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006929
6930 ASSERT_NO_FATAL_FAILURE(InitState());
6931 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6932
6933 char const *vsSource =
6934 "#version 450\n"
6935 "out gl_PerVertex {\n"
6936 " vec4 gl_Position;\n"
6937 "};\n"
6938 "void main(){\n"
6939 " gl_Position = vec4(0);\n"
6940 "}\n";
6941 char const *fsSource =
6942 "#version 450\n"
6943 "\n"
6944 "layout(location=0) out vec4 color;\n"
6945 "void main(){\n"
6946 " color = vec4(1);\n"
6947 "}\n";
6948
6949 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6950 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6951
6952 VkPipelineObj pipe(m_device);
6953 pipe.AddColorAttachment();
6954 pipe.AddShader(&vs);
6955 pipe.AddShader(&fs);
6956
6957 VkDescriptorSetObj descriptorSet(m_device);
6958 descriptorSet.AppendDummy();
6959 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6960
6961 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6962
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006963 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006964}
6965
Chris Forbes912c9192016-04-05 17:50:35 +12006966TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
6967{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006968 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12006969
6970 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
6971
6972 ASSERT_NO_FATAL_FAILURE(InitState());
6973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6974
6975 char const *vsSource =
6976 "#version 450\n"
6977 "out gl_PerVertex {\n"
6978 " vec4 gl_Position;\n"
6979 "};\n"
6980 "layout(location=0) out vec3 x;\n"
6981 "layout(location=1) out ivec3 y;\n"
6982 "layout(location=2) out vec3 z;\n"
6983 "void main(){\n"
6984 " gl_Position = vec4(0);\n"
6985 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
6986 "}\n";
6987 char const *fsSource =
6988 "#version 450\n"
6989 "\n"
6990 "layout(location=0) out vec4 color;\n"
6991 "layout(location=0) in float x;\n"
6992 "layout(location=1) flat in int y;\n"
6993 "layout(location=2) in vec2 z;\n"
6994 "void main(){\n"
6995 " color = vec4(1 + x + y + z.x);\n"
6996 "}\n";
6997
6998 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6999 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7000
7001 VkPipelineObj pipe(m_device);
7002 pipe.AddColorAttachment();
7003 pipe.AddShader(&vs);
7004 pipe.AddShader(&fs);
7005
7006 VkDescriptorSetObj descriptorSet(m_device);
7007 descriptorSet.AppendDummy();
7008 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7009
7010 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7011
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007012 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12007013}
7014
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007015TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
7016{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007017 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007018
7019 ASSERT_NO_FATAL_FAILURE(InitState());
7020 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7021
Chris Forbesc1e852d2016-04-04 19:26:42 +12007022 if (!m_device->phy().features().tessellationShader) {
7023 printf("Device does not support tessellation shaders; skipped.\n");
7024 return;
7025 }
7026
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007027 char const *vsSource =
7028 "#version 450\n"
7029 "void main(){}\n";
7030 char const *tcsSource =
7031 "#version 450\n"
7032 "layout(location=0) out int x[];\n"
7033 "layout(vertices=3) out;\n"
7034 "void main(){\n"
7035 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7036 " gl_TessLevelInner[0] = 1;\n"
7037 " x[gl_InvocationID] = gl_InvocationID;\n"
7038 "}\n";
7039 char const *tesSource =
7040 "#version 450\n"
7041 "layout(triangles, equal_spacing, cw) in;\n"
7042 "layout(location=0) in int x[];\n"
7043 "out gl_PerVertex { vec4 gl_Position; };\n"
7044 "void main(){\n"
7045 " gl_Position.xyz = gl_TessCoord;\n"
7046 " gl_Position.w = x[0] + x[1] + x[2];\n"
7047 "}\n";
7048 char const *fsSource =
7049 "#version 450\n"
7050 "layout(location=0) out vec4 color;\n"
7051 "void main(){\n"
7052 " color = vec4(1);\n"
7053 "}\n";
7054
7055 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7056 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7057 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7058 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7059
7060 VkPipelineInputAssemblyStateCreateInfo iasci{
7061 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7062 nullptr,
7063 0,
7064 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7065 VK_FALSE};
7066
Chris Forbesb4cacb62016-04-04 19:15:00 +12007067 VkPipelineTessellationStateCreateInfo tsci{
7068 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7069 nullptr,
7070 0,
7071 3};
7072
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007073 VkPipelineObj pipe(m_device);
7074 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12007075 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007076 pipe.AddColorAttachment();
7077 pipe.AddShader(&vs);
7078 pipe.AddShader(&tcs);
7079 pipe.AddShader(&tes);
7080 pipe.AddShader(&fs);
7081
7082 VkDescriptorSetObj descriptorSet(m_device);
7083 descriptorSet.AppendDummy();
7084 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7085
7086 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7087
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007088 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007089}
7090
Chris Forbesa0ab8152016-04-20 13:34:27 +12007091TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
7092{
7093 m_errorMonitor->ExpectSuccess();
7094
7095 ASSERT_NO_FATAL_FAILURE(InitState());
7096 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7097
7098 if (!m_device->phy().features().geometryShader) {
7099 printf("Device does not support geometry shaders; skipped.\n");
7100 return;
7101 }
7102
7103 char const *vsSource =
7104 "#version 450\n"
7105 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
7106 "void main(){\n"
7107 " vs_out.x = vec4(1);\n"
7108 "}\n";
7109 char const *gsSource =
7110 "#version 450\n"
7111 "layout(triangles) in;\n"
7112 "layout(triangle_strip, max_vertices=3) out;\n"
7113 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
7114 "out gl_PerVertex { vec4 gl_Position; };\n"
7115 "void main() {\n"
7116 " gl_Position = gs_in[0].x;\n"
7117 " EmitVertex();\n"
7118 "}\n";
7119 char const *fsSource =
7120 "#version 450\n"
7121 "layout(location=0) out vec4 color;\n"
7122 "void main(){\n"
7123 " color = vec4(1);\n"
7124 "}\n";
7125
7126 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7127 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
7128 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7129
7130 VkPipelineObj pipe(m_device);
7131 pipe.AddColorAttachment();
7132 pipe.AddShader(&vs);
7133 pipe.AddShader(&gs);
7134 pipe.AddShader(&fs);
7135
7136 VkDescriptorSetObj descriptorSet(m_device);
7137 descriptorSet.AppendDummy();
7138 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7139
7140 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7141
7142 m_errorMonitor->VerifyNotFound();
7143}
7144
Chris Forbesa0193bc2016-04-04 19:19:47 +12007145TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
7146{
7147 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7148 "is per-vertex in tessellation control shader stage "
7149 "but per-patch in tessellation evaluation shader stage");
7150
7151 ASSERT_NO_FATAL_FAILURE(InitState());
7152 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7153
Chris Forbesc1e852d2016-04-04 19:26:42 +12007154 if (!m_device->phy().features().tessellationShader) {
7155 printf("Device does not support tessellation shaders; skipped.\n");
7156 return;
7157 }
7158
Chris Forbesa0193bc2016-04-04 19:19:47 +12007159 char const *vsSource =
7160 "#version 450\n"
7161 "void main(){}\n";
7162 char const *tcsSource =
7163 "#version 450\n"
7164 "layout(location=0) out int x[];\n"
7165 "layout(vertices=3) out;\n"
7166 "void main(){\n"
7167 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7168 " gl_TessLevelInner[0] = 1;\n"
7169 " x[gl_InvocationID] = gl_InvocationID;\n"
7170 "}\n";
7171 char const *tesSource =
7172 "#version 450\n"
7173 "layout(triangles, equal_spacing, cw) in;\n"
7174 "layout(location=0) patch in int x;\n"
7175 "out gl_PerVertex { vec4 gl_Position; };\n"
7176 "void main(){\n"
7177 " gl_Position.xyz = gl_TessCoord;\n"
7178 " gl_Position.w = x;\n"
7179 "}\n";
7180 char const *fsSource =
7181 "#version 450\n"
7182 "layout(location=0) out vec4 color;\n"
7183 "void main(){\n"
7184 " color = vec4(1);\n"
7185 "}\n";
7186
7187 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7188 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7189 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7190 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7191
7192 VkPipelineInputAssemblyStateCreateInfo iasci{
7193 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7194 nullptr,
7195 0,
7196 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7197 VK_FALSE};
7198
7199 VkPipelineTessellationStateCreateInfo tsci{
7200 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7201 nullptr,
7202 0,
7203 3};
7204
7205 VkPipelineObj pipe(m_device);
7206 pipe.SetInputAssembly(&iasci);
7207 pipe.SetTessellation(&tsci);
7208 pipe.AddColorAttachment();
7209 pipe.AddShader(&vs);
7210 pipe.AddShader(&tcs);
7211 pipe.AddShader(&tes);
7212 pipe.AddShader(&fs);
7213
7214 VkDescriptorSetObj descriptorSet(m_device);
7215 descriptorSet.AppendDummy();
7216 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7217
7218 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7219
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007220 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12007221}
7222
Karl Schultz6addd812016-02-02 17:17:23 -07007223TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
7224 m_errorMonitor->SetDesiredFailureMsg(
7225 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007226 "Duplicate vertex input binding descriptions for binding 0");
7227
Chris Forbes280ba2c2015-06-12 11:16:41 +12007228 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007229 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007230
7231 /* Two binding descriptions for binding 0 */
7232 VkVertexInputBindingDescription input_bindings[2];
7233 memset(input_bindings, 0, sizeof(input_bindings));
7234
7235 VkVertexInputAttributeDescription input_attrib;
7236 memset(&input_attrib, 0, sizeof(input_attrib));
7237 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7238
7239 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007240 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007241 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007242 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007243 "out gl_PerVertex {\n"
7244 " vec4 gl_Position;\n"
7245 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007246 "void main(){\n"
7247 " gl_Position = vec4(x);\n"
7248 "}\n";
7249 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007250 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007251 "\n"
7252 "layout(location=0) out vec4 color;\n"
7253 "void main(){\n"
7254 " color = vec4(1);\n"
7255 "}\n";
7256
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007257 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7258 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007259
7260 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007261 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007262 pipe.AddShader(&vs);
7263 pipe.AddShader(&fs);
7264
7265 pipe.AddVertexInputBindings(input_bindings, 2);
7266 pipe.AddVertexInputAttribs(&input_attrib, 1);
7267
Chris Forbes280ba2c2015-06-12 11:16:41 +12007268 VkDescriptorSetObj descriptorSet(m_device);
7269 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007270 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007271
Tony Barbour5781e8f2015-08-04 16:23:11 -06007272 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007273
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007274 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007275}
Chris Forbes8f68b562015-05-25 11:13:32 +12007276
Chris Forbes35efec72016-04-21 14:32:08 +12007277TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
7278 m_errorMonitor->ExpectSuccess();
7279
7280 ASSERT_NO_FATAL_FAILURE(InitState());
7281 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7282
7283 if (!m_device->phy().features().tessellationShader) {
7284 printf("Device does not support 64bit vertex attributes; skipped.\n");
7285 return;
7286 }
7287
7288 VkVertexInputBindingDescription input_bindings[1];
7289 memset(input_bindings, 0, sizeof(input_bindings));
7290
7291 VkVertexInputAttributeDescription input_attribs[4];
7292 memset(input_attribs, 0, sizeof(input_attribs));
7293 input_attribs[0].location = 0;
7294 input_attribs[0].offset = 0;
7295 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7296 input_attribs[1].location = 2;
7297 input_attribs[1].offset = 32;
7298 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7299 input_attribs[2].location = 4;
7300 input_attribs[2].offset = 64;
7301 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7302 input_attribs[3].location = 6;
7303 input_attribs[3].offset = 96;
7304 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7305
7306 char const *vsSource =
7307 "#version 450\n"
7308 "\n"
7309 "layout(location=0) in dmat4 x;\n"
7310 "out gl_PerVertex {\n"
7311 " vec4 gl_Position;\n"
7312 "};\n"
7313 "void main(){\n"
7314 " gl_Position = vec4(x[0][0]);\n"
7315 "}\n";
7316 char const *fsSource =
7317 "#version 450\n"
7318 "\n"
7319 "layout(location=0) out vec4 color;\n"
7320 "void main(){\n"
7321 " color = vec4(1);\n"
7322 "}\n";
7323
7324 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7325 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7326
7327 VkPipelineObj pipe(m_device);
7328 pipe.AddColorAttachment();
7329 pipe.AddShader(&vs);
7330 pipe.AddShader(&fs);
7331
7332 pipe.AddVertexInputBindings(input_bindings, 1);
7333 pipe.AddVertexInputAttribs(input_attribs, 4);
7334
7335 VkDescriptorSetObj descriptorSet(m_device);
7336 descriptorSet.AppendDummy();
7337 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7338
7339 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7340
7341 m_errorMonitor->VerifyNotFound();
7342}
7343
Karl Schultz6addd812016-02-02 17:17:23 -07007344TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007346 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007347
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007348 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007349
7350 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007351 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007352 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007353 "out gl_PerVertex {\n"
7354 " vec4 gl_Position;\n"
7355 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007356 "void main(){\n"
7357 " gl_Position = vec4(1);\n"
7358 "}\n";
7359 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007360 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007361 "\n"
7362 "void main(){\n"
7363 "}\n";
7364
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007365 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7366 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007367
7368 VkPipelineObj pipe(m_device);
7369 pipe.AddShader(&vs);
7370 pipe.AddShader(&fs);
7371
Chia-I Wu08accc62015-07-07 11:50:03 +08007372 /* set up CB 0, not written */
7373 pipe.AddColorAttachment();
7374 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007375
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007376 VkDescriptorSetObj descriptorSet(m_device);
7377 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007378 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007379
Tony Barbour5781e8f2015-08-04 16:23:11 -06007380 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007381
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007382 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007383}
7384
Karl Schultz6addd812016-02-02 17:17:23 -07007385TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07007386 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007387 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007388 "FS writes to output location 1 with no matching attachment");
7389
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007390 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007391
7392 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007393 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007394 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007395 "out gl_PerVertex {\n"
7396 " vec4 gl_Position;\n"
7397 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007398 "void main(){\n"
7399 " gl_Position = vec4(1);\n"
7400 "}\n";
7401 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007402 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007403 "\n"
7404 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007405 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007406 "void main(){\n"
7407 " x = vec4(1);\n"
7408 " y = vec4(1);\n"
7409 "}\n";
7410
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007411 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7412 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007413
7414 VkPipelineObj pipe(m_device);
7415 pipe.AddShader(&vs);
7416 pipe.AddShader(&fs);
7417
Chia-I Wu08accc62015-07-07 11:50:03 +08007418 /* set up CB 0, not written */
7419 pipe.AddColorAttachment();
7420 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007421 /* FS writes CB 1, but we don't configure it */
7422
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007423 VkDescriptorSetObj descriptorSet(m_device);
7424 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007425 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007426
Tony Barbour5781e8f2015-08-04 16:23:11 -06007427 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007428
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007429 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007430}
7431
Karl Schultz6addd812016-02-02 17:17:23 -07007432TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007434 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007435
Chris Forbesa36d69e2015-05-25 11:13:44 +12007436 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007437
7438 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007439 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007440 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007441 "out gl_PerVertex {\n"
7442 " vec4 gl_Position;\n"
7443 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007444 "void main(){\n"
7445 " gl_Position = vec4(1);\n"
7446 "}\n";
7447 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007448 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007449 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007450 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12007451 "void main(){\n"
7452 " x = ivec4(1);\n"
7453 "}\n";
7454
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007455 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7456 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007457
7458 VkPipelineObj pipe(m_device);
7459 pipe.AddShader(&vs);
7460 pipe.AddShader(&fs);
7461
Chia-I Wu08accc62015-07-07 11:50:03 +08007462 /* set up CB 0; type is UNORM by default */
7463 pipe.AddColorAttachment();
7464 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007465
Chris Forbesa36d69e2015-05-25 11:13:44 +12007466 VkDescriptorSetObj descriptorSet(m_device);
7467 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007468 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007469
Tony Barbour5781e8f2015-08-04 16:23:11 -06007470 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007471
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007472 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12007473}
Chris Forbes7b1b8932015-06-05 14:43:36 +12007474
Karl Schultz6addd812016-02-02 17:17:23 -07007475TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007476 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007477 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007478
Chris Forbes556c76c2015-08-14 12:04:59 +12007479 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12007480
7481 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007482 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007483 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007484 "out gl_PerVertex {\n"
7485 " vec4 gl_Position;\n"
7486 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007487 "void main(){\n"
7488 " gl_Position = vec4(1);\n"
7489 "}\n";
7490 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007491 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007492 "\n"
7493 "layout(location=0) out vec4 x;\n"
7494 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7495 "void main(){\n"
7496 " x = vec4(bar.y);\n"
7497 "}\n";
7498
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007499 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7500 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12007501
Chris Forbes556c76c2015-08-14 12:04:59 +12007502 VkPipelineObj pipe(m_device);
7503 pipe.AddShader(&vs);
7504 pipe.AddShader(&fs);
7505
7506 /* set up CB 0; type is UNORM by default */
7507 pipe.AddColorAttachment();
7508 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7509
7510 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007511 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12007512
7513 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7514
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007515 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12007516}
7517
Chris Forbes5c59e902016-02-26 16:56:09 +13007518TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
7519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7520 "not declared in layout");
7521
7522 ASSERT_NO_FATAL_FAILURE(InitState());
7523
7524 char const *vsSource =
7525 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007526 "\n"
7527 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
7528 "out gl_PerVertex {\n"
7529 " vec4 gl_Position;\n"
7530 "};\n"
7531 "void main(){\n"
7532 " gl_Position = vec4(consts.x);\n"
7533 "}\n";
7534 char const *fsSource =
7535 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007536 "\n"
7537 "layout(location=0) out vec4 x;\n"
7538 "void main(){\n"
7539 " x = vec4(1);\n"
7540 "}\n";
7541
7542 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7543 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7544
7545 VkPipelineObj pipe(m_device);
7546 pipe.AddShader(&vs);
7547 pipe.AddShader(&fs);
7548
7549 /* set up CB 0; type is UNORM by default */
7550 pipe.AddColorAttachment();
7551 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7552
7553 VkDescriptorSetObj descriptorSet(m_device);
7554 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7555
7556 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7557
7558 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007559 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13007560}
7561
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007562#endif // SHADER_CHECKER_TESTS
7563
7564#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06007565TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07007566 m_errorMonitor->SetDesiredFailureMsg(
7567 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007568 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007569
7570 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007571
7572 // Create an image
7573 VkImage image;
7574
Karl Schultz6addd812016-02-02 17:17:23 -07007575 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7576 const int32_t tex_width = 32;
7577 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007578
7579 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007580 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7581 image_create_info.pNext = NULL;
7582 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7583 image_create_info.format = tex_format;
7584 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007585 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07007586 image_create_info.extent.depth = 1;
7587 image_create_info.mipLevels = 1;
7588 image_create_info.arrayLayers = 1;
7589 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7590 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7591 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7592 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007593
7594 // Introduce error by sending down a bogus width extent
7595 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007596 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007597
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007598 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007599}
7600
Mark Youngc48c4c12016-04-11 14:26:49 -06007601TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
7602 m_errorMonitor->SetDesiredFailureMsg(
7603 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7604 "CreateImage extents is 0 for at least one required dimension");
7605
7606 ASSERT_NO_FATAL_FAILURE(InitState());
7607
7608 // Create an image
7609 VkImage image;
7610
7611 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7612 const int32_t tex_width = 32;
7613 const int32_t tex_height = 32;
7614
7615 VkImageCreateInfo image_create_info = {};
7616 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7617 image_create_info.pNext = NULL;
7618 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7619 image_create_info.format = tex_format;
7620 image_create_info.extent.width = tex_width;
7621 image_create_info.extent.height = tex_height;
7622 image_create_info.extent.depth = 1;
7623 image_create_info.mipLevels = 1;
7624 image_create_info.arrayLayers = 1;
7625 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7626 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7627 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7628 image_create_info.flags = 0;
7629
7630 // Introduce error by sending down a bogus width extent
7631 image_create_info.extent.width = 0;
7632 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7633
7634 m_errorMonitor->VerifyFound();
7635}
7636
Karl Schultz6addd812016-02-02 17:17:23 -07007637TEST_F(VkLayerTest, UpdateBufferAlignment) {
7638 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06007639
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007640 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007641 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007642
Mike Stroyana3082432015-09-25 13:39:21 -06007643 ASSERT_NO_FATAL_FAILURE(InitState());
7644
7645 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7646 vk_testing::Buffer buffer;
7647 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7648
7649 BeginCommandBuffer();
7650 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007651 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007652 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007653
Mike Stroyana3082432015-09-25 13:39:21 -06007654 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007656 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007657
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007658 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007659 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007660 EndCommandBuffer();
7661}
7662
Karl Schultz6addd812016-02-02 17:17:23 -07007663TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007664 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007665 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06007666
7667 ASSERT_NO_FATAL_FAILURE(InitState());
7668
7669 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7670 vk_testing::Buffer buffer;
7671 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7672
7673 BeginCommandBuffer();
7674 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007675 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007676 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007677
Mike Stroyana3082432015-09-25 13:39:21 -06007678 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007680 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007681
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007682 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007683
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007684 m_errorMonitor->VerifyFound();
7685
Mike Stroyana3082432015-09-25 13:39:21 -06007686 EndCommandBuffer();
7687}
7688
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007689#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12007690
Tobin Ehliscde08892015-09-22 10:11:37 -06007691#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07007692TEST_F(VkLayerTest, InvalidImageView) {
7693 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06007694
Karl Schultz6addd812016-02-02 17:17:23 -07007695 m_errorMonitor->SetDesiredFailureMsg(
7696 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007697 "vkCreateImageView called with baseMipLevel 10 ");
7698
Tobin Ehliscde08892015-09-22 10:11:37 -06007699 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06007700
Mike Stroyana3082432015-09-25 13:39:21 -06007701 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07007702 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06007703
Karl Schultz6addd812016-02-02 17:17:23 -07007704 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7705 const int32_t tex_width = 32;
7706 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06007707
7708 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007709 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7710 image_create_info.pNext = NULL;
7711 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7712 image_create_info.format = tex_format;
7713 image_create_info.extent.width = tex_width;
7714 image_create_info.extent.height = tex_height;
7715 image_create_info.extent.depth = 1;
7716 image_create_info.mipLevels = 1;
7717 image_create_info.arrayLayers = 1;
7718 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7719 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7720 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7721 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06007722
Chia-I Wuf7458c52015-10-26 21:10:41 +08007723 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06007724 ASSERT_VK_SUCCESS(err);
7725
7726 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007727 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7728 image_view_create_info.image = image;
7729 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7730 image_view_create_info.format = tex_format;
7731 image_view_create_info.subresourceRange.layerCount = 1;
7732 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
7733 image_view_create_info.subresourceRange.levelCount = 1;
7734 image_view_create_info.subresourceRange.aspectMask =
7735 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06007736
7737 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007738 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7739 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06007740
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007741 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06007742}
Mike Stroyana3082432015-09-25 13:39:21 -06007743
Karl Schultz6addd812016-02-02 17:17:23 -07007744TEST_F(VkLayerTest, InvalidImageViewAspect) {
7745 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007746
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007747 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007748 "vkCreateImageView: Color image "
7749 "formats must have ONLY the "
7750 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007751
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007752 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007753
7754 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07007755 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007756
Karl Schultz6addd812016-02-02 17:17:23 -07007757 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7758 const int32_t tex_width = 32;
7759 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007760
7761 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007762 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7763 image_create_info.pNext = NULL;
7764 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7765 image_create_info.format = tex_format;
7766 image_create_info.extent.width = tex_width;
7767 image_create_info.extent.height = tex_height;
7768 image_create_info.extent.depth = 1;
7769 image_create_info.mipLevels = 1;
7770 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7771 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7772 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7773 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007774
Chia-I Wuf7458c52015-10-26 21:10:41 +08007775 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007776 ASSERT_VK_SUCCESS(err);
7777
7778 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007779 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7780 image_view_create_info.image = image;
7781 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7782 image_view_create_info.format = tex_format;
7783 image_view_create_info.subresourceRange.baseMipLevel = 0;
7784 image_view_create_info.subresourceRange.levelCount = 1;
7785 // Cause an error by setting an invalid image aspect
7786 image_view_create_info.subresourceRange.aspectMask =
7787 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007788
7789 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007790 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7791 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007792
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007793 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007794}
7795
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007796TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07007797 VkResult err;
7798 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007799
Karl Schultz6addd812016-02-02 17:17:23 -07007800 m_errorMonitor->SetDesiredFailureMsg(
7801 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007802 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007803
Mike Stroyana3082432015-09-25 13:39:21 -06007804 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007805
7806 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007807 VkImage srcImage;
7808 VkImage dstImage;
7809 VkDeviceMemory srcMem;
7810 VkDeviceMemory destMem;
7811 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007812
7813 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007814 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7815 image_create_info.pNext = NULL;
7816 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7817 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7818 image_create_info.extent.width = 32;
7819 image_create_info.extent.height = 32;
7820 image_create_info.extent.depth = 1;
7821 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007822 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07007823 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7824 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7825 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7826 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007827
Karl Schultz6addd812016-02-02 17:17:23 -07007828 err =
7829 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007830 ASSERT_VK_SUCCESS(err);
7831
Karl Schultz6addd812016-02-02 17:17:23 -07007832 err =
7833 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007834 ASSERT_VK_SUCCESS(err);
7835
7836 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007837 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007838 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7839 memAlloc.pNext = NULL;
7840 memAlloc.allocationSize = 0;
7841 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007842
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007843 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007844 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007845 pass =
7846 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007847 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007848 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007849 ASSERT_VK_SUCCESS(err);
7850
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007851 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007852 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007853 pass =
7854 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007855 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007856 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007857 ASSERT_VK_SUCCESS(err);
7858
7859 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7860 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007861 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007862 ASSERT_VK_SUCCESS(err);
7863
7864 BeginCommandBuffer();
7865 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007866 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007867 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007868 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007869 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06007870 copyRegion.srcOffset.x = 0;
7871 copyRegion.srcOffset.y = 0;
7872 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007873 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007874 copyRegion.dstSubresource.mipLevel = 0;
7875 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007876 // Introduce failure by forcing the dst layerCount to differ from src
7877 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007878 copyRegion.dstOffset.x = 0;
7879 copyRegion.dstOffset.y = 0;
7880 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007881 copyRegion.extent.width = 1;
7882 copyRegion.extent.height = 1;
7883 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007884 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7885 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007886 EndCommandBuffer();
7887
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007888 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007889
Chia-I Wuf7458c52015-10-26 21:10:41 +08007890 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007891 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007892 vkFreeMemory(m_device->device(), srcMem, NULL);
7893 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007894}
7895
Karl Schultz6addd812016-02-02 17:17:23 -07007896TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06007897 VkResult err;
7898 bool pass;
7899
7900 // Create color images with different format sizes and try to copy between them
7901 m_errorMonitor->SetDesiredFailureMsg(
7902 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7903 "vkCmdCopyImage called with unmatched source and dest image format sizes");
7904
7905 ASSERT_NO_FATAL_FAILURE(InitState());
7906
7907 // Create two images of different types and try to copy between them
7908 VkImage srcImage;
7909 VkImage dstImage;
7910 VkDeviceMemory srcMem;
7911 VkDeviceMemory destMem;
7912 VkMemoryRequirements memReqs;
7913
7914 VkImageCreateInfo image_create_info = {};
7915 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7916 image_create_info.pNext = NULL;
7917 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7918 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7919 image_create_info.extent.width = 32;
7920 image_create_info.extent.height = 32;
7921 image_create_info.extent.depth = 1;
7922 image_create_info.mipLevels = 1;
7923 image_create_info.arrayLayers = 1;
7924 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7925 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7926 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7927 image_create_info.flags = 0;
7928
7929 err =
7930 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
7931 ASSERT_VK_SUCCESS(err);
7932
7933 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7934 // Introduce failure by creating second image with a different-sized format.
7935 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
7936
7937 err =
7938 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
7939 ASSERT_VK_SUCCESS(err);
7940
7941 // Allocate memory
7942 VkMemoryAllocateInfo memAlloc = {};
7943 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7944 memAlloc.pNext = NULL;
7945 memAlloc.allocationSize = 0;
7946 memAlloc.memoryTypeIndex = 0;
7947
7948 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
7949 memAlloc.allocationSize = memReqs.size;
7950 pass =
7951 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
7952 ASSERT_TRUE(pass);
7953 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
7954 ASSERT_VK_SUCCESS(err);
7955
7956 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
7957 memAlloc.allocationSize = memReqs.size;
7958 pass =
7959 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
7960 ASSERT_TRUE(pass);
7961 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
7962 ASSERT_VK_SUCCESS(err);
7963
7964 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7965 ASSERT_VK_SUCCESS(err);
7966 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
7967 ASSERT_VK_SUCCESS(err);
7968
7969 BeginCommandBuffer();
7970 VkImageCopy copyRegion;
7971 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7972 copyRegion.srcSubresource.mipLevel = 0;
7973 copyRegion.srcSubresource.baseArrayLayer = 0;
7974 copyRegion.srcSubresource.layerCount = 0;
7975 copyRegion.srcOffset.x = 0;
7976 copyRegion.srcOffset.y = 0;
7977 copyRegion.srcOffset.z = 0;
7978 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7979 copyRegion.dstSubresource.mipLevel = 0;
7980 copyRegion.dstSubresource.baseArrayLayer = 0;
7981 copyRegion.dstSubresource.layerCount = 0;
7982 copyRegion.dstOffset.x = 0;
7983 copyRegion.dstOffset.y = 0;
7984 copyRegion.dstOffset.z = 0;
7985 copyRegion.extent.width = 1;
7986 copyRegion.extent.height = 1;
7987 copyRegion.extent.depth = 1;
7988 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7989 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7990 EndCommandBuffer();
7991
7992 m_errorMonitor->VerifyFound();
7993
7994 vkDestroyImage(m_device->device(), srcImage, NULL);
7995 vkDestroyImage(m_device->device(), dstImage, NULL);
7996 vkFreeMemory(m_device->device(), srcMem, NULL);
7997 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007998}
7999
Karl Schultz6addd812016-02-02 17:17:23 -07008000TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
8001 VkResult err;
8002 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008003
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008004 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008005 m_errorMonitor->SetDesiredFailureMsg(
8006 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008007 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008008
Mike Stroyana3082432015-09-25 13:39:21 -06008009 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008010
8011 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008012 VkImage srcImage;
8013 VkImage dstImage;
8014 VkDeviceMemory srcMem;
8015 VkDeviceMemory destMem;
8016 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008017
8018 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008019 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8020 image_create_info.pNext = NULL;
8021 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8022 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8023 image_create_info.extent.width = 32;
8024 image_create_info.extent.height = 32;
8025 image_create_info.extent.depth = 1;
8026 image_create_info.mipLevels = 1;
8027 image_create_info.arrayLayers = 1;
8028 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8029 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8030 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8031 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008032
Karl Schultz6addd812016-02-02 17:17:23 -07008033 err =
8034 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008035 ASSERT_VK_SUCCESS(err);
8036
Karl Schultzbdb75952016-04-19 11:36:49 -06008037 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
8038
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008039 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07008040 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008041 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
8042 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008043
Karl Schultz6addd812016-02-02 17:17:23 -07008044 err =
8045 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008046 ASSERT_VK_SUCCESS(err);
8047
8048 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008049 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008050 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8051 memAlloc.pNext = NULL;
8052 memAlloc.allocationSize = 0;
8053 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008054
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008055 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008056 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008057 pass =
8058 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008059 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008060 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008061 ASSERT_VK_SUCCESS(err);
8062
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008063 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008064 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008065 pass =
8066 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008067 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008068 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008069 ASSERT_VK_SUCCESS(err);
8070
8071 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8072 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008073 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008074 ASSERT_VK_SUCCESS(err);
8075
8076 BeginCommandBuffer();
8077 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008078 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008079 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008080 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008081 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008082 copyRegion.srcOffset.x = 0;
8083 copyRegion.srcOffset.y = 0;
8084 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008085 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008086 copyRegion.dstSubresource.mipLevel = 0;
8087 copyRegion.dstSubresource.baseArrayLayer = 0;
8088 copyRegion.dstSubresource.layerCount = 0;
8089 copyRegion.dstOffset.x = 0;
8090 copyRegion.dstOffset.y = 0;
8091 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008092 copyRegion.extent.width = 1;
8093 copyRegion.extent.height = 1;
8094 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008095 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8096 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008097 EndCommandBuffer();
8098
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008099 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008100
Chia-I Wuf7458c52015-10-26 21:10:41 +08008101 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008102 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008103 vkFreeMemory(m_device->device(), srcMem, NULL);
8104 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008105}
8106
Karl Schultz6addd812016-02-02 17:17:23 -07008107TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
8108 VkResult err;
8109 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008110
Karl Schultz6addd812016-02-02 17:17:23 -07008111 m_errorMonitor->SetDesiredFailureMsg(
8112 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008113 "vkCmdResolveImage called with source sample count less than 2.");
8114
Mike Stroyana3082432015-09-25 13:39:21 -06008115 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008116
8117 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008118 VkImage srcImage;
8119 VkImage dstImage;
8120 VkDeviceMemory srcMem;
8121 VkDeviceMemory destMem;
8122 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008123
8124 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008125 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8126 image_create_info.pNext = NULL;
8127 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8128 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8129 image_create_info.extent.width = 32;
8130 image_create_info.extent.height = 1;
8131 image_create_info.extent.depth = 1;
8132 image_create_info.mipLevels = 1;
8133 image_create_info.arrayLayers = 1;
8134 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8135 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8136 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8137 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008138
Karl Schultz6addd812016-02-02 17:17:23 -07008139 err =
8140 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008141 ASSERT_VK_SUCCESS(err);
8142
Karl Schultz6addd812016-02-02 17:17:23 -07008143 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8144 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008145
Karl Schultz6addd812016-02-02 17:17:23 -07008146 err =
8147 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008148 ASSERT_VK_SUCCESS(err);
8149
8150 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008151 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008152 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8153 memAlloc.pNext = NULL;
8154 memAlloc.allocationSize = 0;
8155 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008156
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008157 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008158 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008159 pass =
8160 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008161 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008162 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008163 ASSERT_VK_SUCCESS(err);
8164
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008165 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008166 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008167 pass =
8168 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008169 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008170 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008171 ASSERT_VK_SUCCESS(err);
8172
8173 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8174 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008175 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008176 ASSERT_VK_SUCCESS(err);
8177
8178 BeginCommandBuffer();
8179 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008180 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8181 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008182 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008183 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008184 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008185 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008186 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008187 resolveRegion.srcOffset.x = 0;
8188 resolveRegion.srcOffset.y = 0;
8189 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008190 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008191 resolveRegion.dstSubresource.mipLevel = 0;
8192 resolveRegion.dstSubresource.baseArrayLayer = 0;
8193 resolveRegion.dstSubresource.layerCount = 0;
8194 resolveRegion.dstOffset.x = 0;
8195 resolveRegion.dstOffset.y = 0;
8196 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008197 resolveRegion.extent.width = 1;
8198 resolveRegion.extent.height = 1;
8199 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008200 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8201 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008202 EndCommandBuffer();
8203
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008204 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008205
Chia-I Wuf7458c52015-10-26 21:10:41 +08008206 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008207 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008208 vkFreeMemory(m_device->device(), srcMem, NULL);
8209 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008210}
8211
Karl Schultz6addd812016-02-02 17:17:23 -07008212TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
8213 VkResult err;
8214 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008215
Karl Schultz6addd812016-02-02 17:17:23 -07008216 m_errorMonitor->SetDesiredFailureMsg(
8217 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008218 "vkCmdResolveImage called with dest sample count greater than 1.");
8219
Mike Stroyana3082432015-09-25 13:39:21 -06008220 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008221
8222 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008223 VkImage srcImage;
8224 VkImage dstImage;
8225 VkDeviceMemory srcMem;
8226 VkDeviceMemory destMem;
8227 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008228
8229 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008230 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8231 image_create_info.pNext = NULL;
8232 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8233 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8234 image_create_info.extent.width = 32;
8235 image_create_info.extent.height = 1;
8236 image_create_info.extent.depth = 1;
8237 image_create_info.mipLevels = 1;
8238 image_create_info.arrayLayers = 1;
8239 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8240 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8241 // Note: Some implementations expect color attachment usage for any
8242 // multisample surface
8243 image_create_info.usage =
8244 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8245 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008246
Karl Schultz6addd812016-02-02 17:17:23 -07008247 err =
8248 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008249 ASSERT_VK_SUCCESS(err);
8250
Karl Schultz6addd812016-02-02 17:17:23 -07008251 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8252 // Note: Some implementations expect color attachment usage for any
8253 // multisample surface
8254 image_create_info.usage =
8255 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008256
Karl Schultz6addd812016-02-02 17:17:23 -07008257 err =
8258 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008259 ASSERT_VK_SUCCESS(err);
8260
8261 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008262 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008263 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8264 memAlloc.pNext = NULL;
8265 memAlloc.allocationSize = 0;
8266 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008267
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008268 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008269 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008270 pass =
8271 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008272 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008273 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008274 ASSERT_VK_SUCCESS(err);
8275
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008276 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008277 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008278 pass =
8279 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008280 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008281 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008282 ASSERT_VK_SUCCESS(err);
8283
8284 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8285 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008286 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008287 ASSERT_VK_SUCCESS(err);
8288
8289 BeginCommandBuffer();
8290 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008291 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8292 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008293 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008294 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008295 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008296 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008297 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008298 resolveRegion.srcOffset.x = 0;
8299 resolveRegion.srcOffset.y = 0;
8300 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008301 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008302 resolveRegion.dstSubresource.mipLevel = 0;
8303 resolveRegion.dstSubresource.baseArrayLayer = 0;
8304 resolveRegion.dstSubresource.layerCount = 0;
8305 resolveRegion.dstOffset.x = 0;
8306 resolveRegion.dstOffset.y = 0;
8307 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008308 resolveRegion.extent.width = 1;
8309 resolveRegion.extent.height = 1;
8310 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008311 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8312 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008313 EndCommandBuffer();
8314
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008315 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008316
Chia-I Wuf7458c52015-10-26 21:10:41 +08008317 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008318 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008319 vkFreeMemory(m_device->device(), srcMem, NULL);
8320 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008321}
8322
Karl Schultz6addd812016-02-02 17:17:23 -07008323TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
8324 VkResult err;
8325 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008326
Karl Schultz6addd812016-02-02 17:17:23 -07008327 m_errorMonitor->SetDesiredFailureMsg(
8328 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008329 "vkCmdResolveImage called with unmatched source and dest formats.");
8330
Mike Stroyana3082432015-09-25 13:39:21 -06008331 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008332
8333 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008334 VkImage srcImage;
8335 VkImage dstImage;
8336 VkDeviceMemory srcMem;
8337 VkDeviceMemory destMem;
8338 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008339
8340 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008341 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8342 image_create_info.pNext = NULL;
8343 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8344 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8345 image_create_info.extent.width = 32;
8346 image_create_info.extent.height = 1;
8347 image_create_info.extent.depth = 1;
8348 image_create_info.mipLevels = 1;
8349 image_create_info.arrayLayers = 1;
8350 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8351 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8352 // Note: Some implementations expect color attachment usage for any
8353 // multisample surface
8354 image_create_info.usage =
8355 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8356 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008357
Karl Schultz6addd812016-02-02 17:17:23 -07008358 err =
8359 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008360 ASSERT_VK_SUCCESS(err);
8361
Karl Schultz6addd812016-02-02 17:17:23 -07008362 // Set format to something other than source image
8363 image_create_info.format = VK_FORMAT_R32_SFLOAT;
8364 // Note: Some implementations expect color attachment usage for any
8365 // multisample surface
8366 image_create_info.usage =
8367 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8368 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008369
Karl Schultz6addd812016-02-02 17:17:23 -07008370 err =
8371 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008372 ASSERT_VK_SUCCESS(err);
8373
8374 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008375 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008376 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8377 memAlloc.pNext = NULL;
8378 memAlloc.allocationSize = 0;
8379 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008380
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008381 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008382 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008383 pass =
8384 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008385 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008386 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008387 ASSERT_VK_SUCCESS(err);
8388
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008389 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008390 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008391 pass =
8392 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008393 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008394 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008395 ASSERT_VK_SUCCESS(err);
8396
8397 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8398 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008399 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008400 ASSERT_VK_SUCCESS(err);
8401
8402 BeginCommandBuffer();
8403 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008404 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8405 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008406 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008407 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008408 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008409 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008410 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008411 resolveRegion.srcOffset.x = 0;
8412 resolveRegion.srcOffset.y = 0;
8413 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008414 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008415 resolveRegion.dstSubresource.mipLevel = 0;
8416 resolveRegion.dstSubresource.baseArrayLayer = 0;
8417 resolveRegion.dstSubresource.layerCount = 0;
8418 resolveRegion.dstOffset.x = 0;
8419 resolveRegion.dstOffset.y = 0;
8420 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008421 resolveRegion.extent.width = 1;
8422 resolveRegion.extent.height = 1;
8423 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008424 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8425 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008426 EndCommandBuffer();
8427
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008428 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008429
Chia-I Wuf7458c52015-10-26 21:10:41 +08008430 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008431 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008432 vkFreeMemory(m_device->device(), srcMem, NULL);
8433 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008434}
8435
Karl Schultz6addd812016-02-02 17:17:23 -07008436TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
8437 VkResult err;
8438 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008439
Karl Schultz6addd812016-02-02 17:17:23 -07008440 m_errorMonitor->SetDesiredFailureMsg(
8441 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008442 "vkCmdResolveImage called with unmatched source and dest image types.");
8443
Mike Stroyana3082432015-09-25 13:39:21 -06008444 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008445
8446 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008447 VkImage srcImage;
8448 VkImage dstImage;
8449 VkDeviceMemory srcMem;
8450 VkDeviceMemory destMem;
8451 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008452
8453 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008454 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8455 image_create_info.pNext = NULL;
8456 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8457 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8458 image_create_info.extent.width = 32;
8459 image_create_info.extent.height = 1;
8460 image_create_info.extent.depth = 1;
8461 image_create_info.mipLevels = 1;
8462 image_create_info.arrayLayers = 1;
8463 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8464 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8465 // Note: Some implementations expect color attachment usage for any
8466 // multisample surface
8467 image_create_info.usage =
8468 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8469 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008470
Karl Schultz6addd812016-02-02 17:17:23 -07008471 err =
8472 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008473 ASSERT_VK_SUCCESS(err);
8474
Karl Schultz6addd812016-02-02 17:17:23 -07008475 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8476 // Note: Some implementations expect color attachment usage for any
8477 // multisample surface
8478 image_create_info.usage =
8479 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8480 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008481
Karl Schultz6addd812016-02-02 17:17:23 -07008482 err =
8483 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008484 ASSERT_VK_SUCCESS(err);
8485
8486 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008487 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008488 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8489 memAlloc.pNext = NULL;
8490 memAlloc.allocationSize = 0;
8491 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008492
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008493 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008494 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008495 pass =
8496 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008497 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008498 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008499 ASSERT_VK_SUCCESS(err);
8500
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008501 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008502 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008503 pass =
8504 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008505 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008506 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008507 ASSERT_VK_SUCCESS(err);
8508
8509 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8510 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008511 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008512 ASSERT_VK_SUCCESS(err);
8513
8514 BeginCommandBuffer();
8515 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008516 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8517 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008518 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008519 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008520 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008521 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008522 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008523 resolveRegion.srcOffset.x = 0;
8524 resolveRegion.srcOffset.y = 0;
8525 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008526 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008527 resolveRegion.dstSubresource.mipLevel = 0;
8528 resolveRegion.dstSubresource.baseArrayLayer = 0;
8529 resolveRegion.dstSubresource.layerCount = 0;
8530 resolveRegion.dstOffset.x = 0;
8531 resolveRegion.dstOffset.y = 0;
8532 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008533 resolveRegion.extent.width = 1;
8534 resolveRegion.extent.height = 1;
8535 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008536 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8537 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008538 EndCommandBuffer();
8539
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008540 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008541
Chia-I Wuf7458c52015-10-26 21:10:41 +08008542 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008543 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008544 vkFreeMemory(m_device->device(), srcMem, NULL);
8545 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008546}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008547
Karl Schultz6addd812016-02-02 17:17:23 -07008548TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008549 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07008550 // to using a DS format, then cause it to hit error due to COLOR_BIT not
8551 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008552 // The image format check comes 2nd in validation so we trigger it first,
8553 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07008554 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008555
Karl Schultz6addd812016-02-02 17:17:23 -07008556 m_errorMonitor->SetDesiredFailureMsg(
8557 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008558 "Combination depth/stencil image formats can have only the ");
8559
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008560 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008561
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008562 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008563 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8564 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008565
8566 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008567 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8568 ds_pool_ci.pNext = NULL;
8569 ds_pool_ci.maxSets = 1;
8570 ds_pool_ci.poolSizeCount = 1;
8571 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008572
8573 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008574 err =
8575 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008576 ASSERT_VK_SUCCESS(err);
8577
8578 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008579 dsl_binding.binding = 0;
8580 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8581 dsl_binding.descriptorCount = 1;
8582 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8583 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008584
8585 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008586 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8587 ds_layout_ci.pNext = NULL;
8588 ds_layout_ci.bindingCount = 1;
8589 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008590 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008591 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8592 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008593 ASSERT_VK_SUCCESS(err);
8594
8595 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008596 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008597 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008598 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008599 alloc_info.descriptorPool = ds_pool;
8600 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008601 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8602 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008603 ASSERT_VK_SUCCESS(err);
8604
Karl Schultz6addd812016-02-02 17:17:23 -07008605 VkImage image_bad;
8606 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008607 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07008608 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008609 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07008610 const int32_t tex_width = 32;
8611 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008612
8613 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008614 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8615 image_create_info.pNext = NULL;
8616 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8617 image_create_info.format = tex_format_bad;
8618 image_create_info.extent.width = tex_width;
8619 image_create_info.extent.height = tex_height;
8620 image_create_info.extent.depth = 1;
8621 image_create_info.mipLevels = 1;
8622 image_create_info.arrayLayers = 1;
8623 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8624 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8625 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
8626 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
8627 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008628
Karl Schultz6addd812016-02-02 17:17:23 -07008629 err =
8630 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008631 ASSERT_VK_SUCCESS(err);
8632 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07008633 image_create_info.usage =
8634 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8635 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
8636 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008637 ASSERT_VK_SUCCESS(err);
8638
8639 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008640 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8641 image_view_create_info.image = image_bad;
8642 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8643 image_view_create_info.format = tex_format_bad;
8644 image_view_create_info.subresourceRange.baseArrayLayer = 0;
8645 image_view_create_info.subresourceRange.baseMipLevel = 0;
8646 image_view_create_info.subresourceRange.layerCount = 1;
8647 image_view_create_info.subresourceRange.levelCount = 1;
8648 image_view_create_info.subresourceRange.aspectMask =
8649 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008650
8651 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008652 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8653 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008654
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008655 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008656
Chia-I Wuf7458c52015-10-26 21:10:41 +08008657 vkDestroyImage(m_device->device(), image_bad, NULL);
8658 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008659 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8660 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008661}
Tobin Ehliscde08892015-09-22 10:11:37 -06008662#endif // IMAGE_TESTS
8663
Tony Barbour300a6082015-04-07 13:44:53 -06008664int main(int argc, char **argv) {
8665 int result;
8666
Cody Northrop8e54a402016-03-08 22:25:52 -07008667#ifdef ANDROID
8668 int vulkanSupport = InitVulkan();
8669 if (vulkanSupport == 0)
8670 return 1;
8671#endif
8672
Tony Barbour300a6082015-04-07 13:44:53 -06008673 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06008674 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06008675
8676 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
8677
8678 result = RUN_ALL_TESTS();
8679
Tony Barbour6918cd52015-04-09 12:58:51 -06008680 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06008681 return result;
8682}