blob: 7b9e15827005d8b8de8d88b6a88e443a4e133b62 [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
Mark Lobodzinski152fe252016-05-03 16:49:15 -0600615// This is a positive test. No failures are expected.
616TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
617 VkResult err;
618 bool pass;
619
620 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
621 "the buffer, create an image, and bind the same memory to "
622 "it");
623
624 m_errorMonitor->ExpectSuccess();
625
626 ASSERT_NO_FATAL_FAILURE(InitState());
627
628 VkBuffer buffer;
629 VkImage image;
630 VkDeviceMemory mem;
631 VkMemoryRequirements mem_reqs;
632
633 VkBufferCreateInfo buf_info = {};
634 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
635 buf_info.pNext = NULL;
636 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
637 buf_info.size = 256;
638 buf_info.queueFamilyIndexCount = 0;
639 buf_info.pQueueFamilyIndices = NULL;
640 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
641 buf_info.flags = 0;
642 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
643 ASSERT_VK_SUCCESS(err);
644
645 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
646
647 VkMemoryAllocateInfo alloc_info = {};
648 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
649 alloc_info.pNext = NULL;
650 alloc_info.memoryTypeIndex = 0;
651
652 // Ensure memory is big enough for both bindings
653 alloc_info.allocationSize = 0x10000;
654
655 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
656 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
657 if (!pass) {
658 vkDestroyBuffer(m_device->device(), buffer, NULL);
659 return;
660 }
661
662 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
663 ASSERT_VK_SUCCESS(err);
664
665 uint8_t *pData;
666 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
667 (void **)&pData);
668 ASSERT_VK_SUCCESS(err);
669
Mark Lobodzinski2abefa92016-05-05 11:45:57 -0600670 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -0600671
672 vkUnmapMemory(m_device->device(), mem);
673
674 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
675 ASSERT_VK_SUCCESS(err);
676
677 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
678 // memory. In fact, it was never used by the GPU.
679 // Just be be sure, wait for idle.
680 vkDestroyBuffer(m_device->device(), buffer, NULL);
681 vkDeviceWaitIdle(m_device->device());
682
683 VkImageCreateInfo image_create_info = {};
684 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
685 image_create_info.pNext = NULL;
686 image_create_info.imageType = VK_IMAGE_TYPE_2D;
687 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
688 image_create_info.extent.width = 64;
689 image_create_info.extent.height = 64;
690 image_create_info.extent.depth = 1;
691 image_create_info.mipLevels = 1;
692 image_create_info.arrayLayers = 1;
693 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
694 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
695 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
696 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
697 image_create_info.queueFamilyIndexCount = 0;
698 image_create_info.pQueueFamilyIndices = NULL;
699 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
700 image_create_info.flags = 0;
701
702 VkMemoryAllocateInfo mem_alloc = {};
703 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
704 mem_alloc.pNext = NULL;
705 mem_alloc.allocationSize = 0;
706 mem_alloc.memoryTypeIndex = 0;
707
708 /* Create a mappable image. It will be the texture if linear images are ok
709 * to be textures or it will be the staging image if they are not.
710 */
711 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
712 ASSERT_VK_SUCCESS(err);
713
714 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
715
716 mem_alloc.allocationSize = mem_reqs.size;
717
718 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
719 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
720 if (!pass) {
721 vkDestroyImage(m_device->device(), image, NULL);
722 return;
723 }
724
725 // VALDIATION FAILURE:
726 err = vkBindImageMemory(m_device->device(), image, mem, 0);
727 ASSERT_VK_SUCCESS(err);
728
729 m_errorMonitor->VerifyNotFound();
730
731 vkDestroyBuffer(m_device->device(), buffer, NULL);
732 vkDestroyImage(m_device->device(), image, NULL);
733}
734
Ian Elliott1c32c772016-04-28 14:47:13 -0600735TEST_F(VkLayerTest, EnableWsiBeforeUse) {
736 VkResult err;
737 bool pass;
738
Ian Elliott489eec02016-05-05 14:12:44 -0600739// FIXME: After we turn on this code for non-Linux platforms, uncomment the
740// following declaration (which is temporarily being moved below):
741// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -0600742 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
743 VkSwapchainCreateInfoKHR swapchain_create_info = {};
744 uint32_t swapchain_image_count = 0;
745// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
746 uint32_t image_index = 0;
747// VkPresentInfoKHR present_info = {};
748
749 ASSERT_NO_FATAL_FAILURE(InitState());
750
Ian Elliott3f06ce52016-04-29 14:46:21 -0600751#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
752#if defined(VK_USE_PLATFORM_ANDROID_KHR)
753 // Use the functions from the VK_KHR_android_surface extension without
754 // enabling that extension:
755
756 // Create a surface:
757 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
758#if 0
759#endif
760 m_errorMonitor->SetDesiredFailureMsg(
761 VK_DEBUG_REPORT_ERROR_BIT_EXT,
762 "extension was not enabled for this");
763 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
764 &surface);
765 pass = (err != VK_SUCCESS);
766 ASSERT_TRUE(pass);
767 m_errorMonitor->VerifyFound();
768#endif // VK_USE_PLATFORM_ANDROID_KHR
769
770
771#if defined(VK_USE_PLATFORM_MIR_KHR)
772 // Use the functions from the VK_KHR_mir_surface extension without enabling
773 // that extension:
774
775 // Create a surface:
776 VkMirSurfaceCreateInfoKHR mir_create_info = {};
777#if 0
778#endif
779 m_errorMonitor->SetDesiredFailureMsg(
780 VK_DEBUG_REPORT_ERROR_BIT_EXT,
781 "extension was not enabled for this");
782 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
783 pass = (err != VK_SUCCESS);
784 ASSERT_TRUE(pass);
785 m_errorMonitor->VerifyFound();
786
787 // Tell whether an mir_connection supports presentation:
788 MirConnection *mir_connection = NULL;
789 m_errorMonitor->SetDesiredFailureMsg(
790 VK_DEBUG_REPORT_ERROR_BIT_EXT,
791 "extension was not enabled for this");
792 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
793 visual_id);
794 m_errorMonitor->VerifyFound();
795#endif // VK_USE_PLATFORM_MIR_KHR
796
797
798#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
799 // Use the functions from the VK_KHR_wayland_surface extension without
800 // enabling that extension:
801
802 // Create a surface:
803 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
804#if 0
805#endif
806 m_errorMonitor->SetDesiredFailureMsg(
807 VK_DEBUG_REPORT_ERROR_BIT_EXT,
808 "extension was not enabled for this");
809 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
810 &surface);
811 pass = (err != VK_SUCCESS);
812 ASSERT_TRUE(pass);
813 m_errorMonitor->VerifyFound();
814
815 // Tell whether an wayland_display supports presentation:
816 struct wl_display wayland_display = {};
817 m_errorMonitor->SetDesiredFailureMsg(
818 VK_DEBUG_REPORT_ERROR_BIT_EXT,
819 "extension was not enabled for this");
820 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
821 &wayland_display);
822 m_errorMonitor->VerifyFound();
823#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -0600824#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -0600825
826
827#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -0600828// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
829// TO NON-LINUX PLATFORMS:
830VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -0600831 // Use the functions from the VK_KHR_win32_surface extension without
832 // enabling that extension:
833
834 // Create a surface:
835 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
836#if 0
837#endif
838 m_errorMonitor->SetDesiredFailureMsg(
839 VK_DEBUG_REPORT_ERROR_BIT_EXT,
840 "extension was not enabled for this");
841 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
842 &surface);
843 pass = (err != VK_SUCCESS);
844 ASSERT_TRUE(pass);
845 m_errorMonitor->VerifyFound();
846
847 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -0600848 m_errorMonitor->SetDesiredFailureMsg(
849 VK_DEBUG_REPORT_ERROR_BIT_EXT,
850 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -0600851 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -0600852 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -0600853// Set this (for now, until all platforms are supported and tested):
854#define NEED_TO_TEST_THIS_ON_PLATFORM
855#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -0600856
857
Ian Elliott1c32c772016-04-28 14:47:13 -0600858#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -0600859// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
860// TO NON-LINUX PLATFORMS:
861VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -0600862 // Use the functions from the VK_KHR_xcb_surface extension without enabling
863 // that extension:
864
865 // Create a surface:
866 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
867#if 0
868#endif
869 m_errorMonitor->SetDesiredFailureMsg(
870 VK_DEBUG_REPORT_ERROR_BIT_EXT,
871 "extension was not enabled for this");
872 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
873 pass = (err != VK_SUCCESS);
874 ASSERT_TRUE(pass);
875 m_errorMonitor->VerifyFound();
876
877 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -0600878 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -0600879 xcb_visualid_t visual_id = 0;
880 m_errorMonitor->SetDesiredFailureMsg(
881 VK_DEBUG_REPORT_ERROR_BIT_EXT,
882 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -0600883 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -0600884 visual_id);
885 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -0600886// Set this (for now, until all platforms are supported and tested):
887#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -0600888#endif // VK_USE_PLATFORM_XCB_KHR
889
890
Ian Elliott12630812016-04-29 14:35:43 -0600891#if defined(VK_USE_PLATFORM_XLIB_KHR)
892 // Use the functions from the VK_KHR_xlib_surface extension without enabling
893 // that extension:
894
895 // Create a surface:
896 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
897#if 0
898#endif
899 m_errorMonitor->SetDesiredFailureMsg(
900 VK_DEBUG_REPORT_ERROR_BIT_EXT,
901 "extension was not enabled for this");
902 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
903 pass = (err != VK_SUCCESS);
904 ASSERT_TRUE(pass);
905 m_errorMonitor->VerifyFound();
906
907 // Tell whether an Xlib VisualID supports presentation:
908 Display *dpy = NULL;
909 VisualID visual = 0;
910 m_errorMonitor->SetDesiredFailureMsg(
911 VK_DEBUG_REPORT_ERROR_BIT_EXT,
912 "extension was not enabled for this");
913 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
914 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -0600915// Set this (for now, until all platforms are supported and tested):
916#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -0600917#endif // VK_USE_PLATFORM_XLIB_KHR
918
919
Ian Elliott1c32c772016-04-28 14:47:13 -0600920 // Use the functions from the VK_KHR_surface extension without enabling
921 // that extension:
922
Ian Elliott489eec02016-05-05 14:12:44 -0600923#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -0600924 // Destroy a surface:
925 m_errorMonitor->SetDesiredFailureMsg(
926 VK_DEBUG_REPORT_ERROR_BIT_EXT,
927 "extension was not enabled for this");
928 vkDestroySurfaceKHR(instance(), surface, NULL);
929 m_errorMonitor->VerifyFound();
930
931 // Check if surface supports presentation:
932 VkBool32 supported = false;
933 m_errorMonitor->SetDesiredFailureMsg(
934 VK_DEBUG_REPORT_ERROR_BIT_EXT,
935 "extension was not enabled for this");
936 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
937 pass = (err != VK_SUCCESS);
938 ASSERT_TRUE(pass);
939 m_errorMonitor->VerifyFound();
940
941 // Check surface capabilities:
942 VkSurfaceCapabilitiesKHR capabilities = {};
943 m_errorMonitor->SetDesiredFailureMsg(
944 VK_DEBUG_REPORT_ERROR_BIT_EXT,
945 "extension was not enabled for this");
946 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
947 &capabilities);
948 pass = (err != VK_SUCCESS);
949 ASSERT_TRUE(pass);
950 m_errorMonitor->VerifyFound();
951
952 // Check surface formats:
953 uint32_t format_count = 0;
954 VkSurfaceFormatKHR *formats = NULL;
955 m_errorMonitor->SetDesiredFailureMsg(
956 VK_DEBUG_REPORT_ERROR_BIT_EXT,
957 "extension was not enabled for this");
958 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
959 &format_count, formats);
960 pass = (err != VK_SUCCESS);
961 ASSERT_TRUE(pass);
962 m_errorMonitor->VerifyFound();
963
964 // Check surface present modes:
965 uint32_t present_mode_count = 0;
966 VkSurfaceFormatKHR *present_modes = NULL;
967 m_errorMonitor->SetDesiredFailureMsg(
968 VK_DEBUG_REPORT_ERROR_BIT_EXT,
969 "extension was not enabled for this");
970 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
971 &present_mode_count, present_modes);
972 pass = (err != VK_SUCCESS);
973 ASSERT_TRUE(pass);
974 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -0600975#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -0600976
977
978 // Use the functions from the VK_KHR_swapchain extension without enabling
979 // that extension:
980
981 // Create a swapchain:
982 m_errorMonitor->SetDesiredFailureMsg(
983 VK_DEBUG_REPORT_ERROR_BIT_EXT,
984 "extension was not enabled for this");
985 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
986 swapchain_create_info.pNext = NULL;
987#if 0
988 swapchain_create_info.flags = 0;
989 swapchain_create_info.surface = 0;
990 swapchain_create_info.minImageCount = 0;
991 swapchain_create_info.imageFormat = 0;
992 swapchain_create_info.imageColorSpace = 0;
993 swapchain_create_info.imageExtent.width = 0;
994 swapchain_create_info.imageExtent.height = 0;
995 swapchain_create_info.imageArrayLayers = 0;
996 swapchain_create_info.imageUsage = 0;
997 swapchain_create_info.imageSharingMode = 0;
998 swapchain_create_info.queueFamilyIndexCount = 0;
999 swapchain_create_info.preTransform = 0;
1000 swapchain_create_info.compositeAlpha = 0;
1001 swapchain_create_info.presentMode = 0;
1002 swapchain_create_info.clipped = 0;
1003 swapchain_create_info.oldSwapchain = NULL;
1004#endif
1005 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1006 NULL, &swapchain);
1007 pass = (err != VK_SUCCESS);
1008 ASSERT_TRUE(pass);
1009 m_errorMonitor->VerifyFound();
1010
1011 // Get the images from the swapchain:
1012 m_errorMonitor->SetDesiredFailureMsg(
1013 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1014 "extension was not enabled for this");
1015 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
1016 &swapchain_image_count, NULL);
1017 pass = (err != VK_SUCCESS);
1018 ASSERT_TRUE(pass);
1019 m_errorMonitor->VerifyFound();
1020
1021 // Try to acquire an image:
1022 m_errorMonitor->SetDesiredFailureMsg(
1023 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1024 "extension was not enabled for this");
1025 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
1026 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
1027 pass = (err != VK_SUCCESS);
1028 ASSERT_TRUE(pass);
1029 m_errorMonitor->VerifyFound();
1030
1031 // Try to present an image:
1032#if 0 // NOTE: Currently can't test this because a real swapchain is needed
1033 // (as opposed to the fake one we created) in order for the layer to
1034 // lookup the VkDevice used to enable the extension:
1035 m_errorMonitor->SetDesiredFailureMsg(
1036 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1037 "extension was not enabled for this");
1038 present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
1039 present_info.pNext = NULL;
1040#if 0
1041#endif
1042 err = vkQueuePresentKHR(m_device->m_queue, &present_info);
1043 pass = (err != VK_SUCCESS);
1044 ASSERT_TRUE(pass);
1045 m_errorMonitor->VerifyFound();
1046#endif
1047
1048 // Destroy the swapchain:
1049 m_errorMonitor->SetDesiredFailureMsg(
1050 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1051 "extension was not enabled for this");
1052 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1053 m_errorMonitor->VerifyFound();
1054}
1055
Karl Schultz6addd812016-02-02 17:17:23 -07001056TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1057 VkResult err;
1058 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001059
Karl Schultz6addd812016-02-02 17:17:23 -07001060 m_errorMonitor->SetDesiredFailureMsg(
1061 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001062 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
1063
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001064 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001065
1066 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001067 VkImage image;
1068 VkDeviceMemory mem;
1069 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001070
Karl Schultz6addd812016-02-02 17:17:23 -07001071 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1072 const int32_t tex_width = 32;
1073 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001074
Tony Barboureb254902015-07-15 12:50:33 -06001075 VkImageCreateInfo image_create_info = {};
1076 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001077 image_create_info.pNext = NULL;
1078 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1079 image_create_info.format = tex_format;
1080 image_create_info.extent.width = tex_width;
1081 image_create_info.extent.height = tex_height;
1082 image_create_info.extent.depth = 1;
1083 image_create_info.mipLevels = 1;
1084 image_create_info.arrayLayers = 1;
1085 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1086 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1087 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1088 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001089
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001090 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001091 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001092 mem_alloc.pNext = NULL;
1093 mem_alloc.allocationSize = 0;
1094 // Introduce failure, do NOT set memProps to
1095 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
1096 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001097
Chia-I Wuf7458c52015-10-26 21:10:41 +08001098 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001099 ASSERT_VK_SUCCESS(err);
1100
Karl Schultz6addd812016-02-02 17:17:23 -07001101 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001102
Mark Lobodzinski23065352015-05-29 09:32:35 -05001103 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001104
Karl Schultz6addd812016-02-02 17:17:23 -07001105 pass =
1106 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
1107 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1108 if (!pass) { // If we can't find any unmappable memory this test doesn't
1109 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08001110 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06001111 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06001112 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06001113
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001114 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001115 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001116 ASSERT_VK_SUCCESS(err);
1117
1118 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06001119 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001120 ASSERT_VK_SUCCESS(err);
1121
1122 // Map memory as if to initialize the image
1123 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07001124 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
1125 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001126
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001127 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001128
Chia-I Wuf7458c52015-10-26 21:10:41 +08001129 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001130}
1131
Karl Schultz6addd812016-02-02 17:17:23 -07001132TEST_F(VkLayerTest, RebindMemory) {
1133 VkResult err;
1134 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001135
Karl Schultz6addd812016-02-02 17:17:23 -07001136 m_errorMonitor->SetDesiredFailureMsg(
1137 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001138 "which has already been bound to mem object");
1139
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001140 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001141
1142 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001143 VkImage image;
1144 VkDeviceMemory mem1;
1145 VkDeviceMemory mem2;
1146 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001147
Karl Schultz6addd812016-02-02 17:17:23 -07001148 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1149 const int32_t tex_width = 32;
1150 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001151
Tony Barboureb254902015-07-15 12:50:33 -06001152 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001153 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1154 image_create_info.pNext = NULL;
1155 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1156 image_create_info.format = tex_format;
1157 image_create_info.extent.width = tex_width;
1158 image_create_info.extent.height = tex_height;
1159 image_create_info.extent.depth = 1;
1160 image_create_info.mipLevels = 1;
1161 image_create_info.arrayLayers = 1;
1162 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1163 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1164 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1165 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001166
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001167 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001168 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1169 mem_alloc.pNext = NULL;
1170 mem_alloc.allocationSize = 0;
1171 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06001172
Karl Schultz6addd812016-02-02 17:17:23 -07001173 // Introduce failure, do NOT set memProps to
1174 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06001175 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08001176 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001177 ASSERT_VK_SUCCESS(err);
1178
Karl Schultz6addd812016-02-02 17:17:23 -07001179 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001180
1181 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001182 pass =
1183 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001184 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001185
1186 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001187 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001188 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001189 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001190 ASSERT_VK_SUCCESS(err);
1191
1192 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06001193 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001194 ASSERT_VK_SUCCESS(err);
1195
Karl Schultz6addd812016-02-02 17:17:23 -07001196 // Introduce validation failure, try to bind a different memory object to
1197 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06001198 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001199
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001200 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001201
Chia-I Wuf7458c52015-10-26 21:10:41 +08001202 vkDestroyImage(m_device->device(), image, NULL);
1203 vkFreeMemory(m_device->device(), mem1, NULL);
1204 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001205}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001206
Karl Schultz6addd812016-02-02 17:17:23 -07001207TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001208 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001209
Karl Schultz6addd812016-02-02 17:17:23 -07001210 m_errorMonitor->SetDesiredFailureMsg(
1211 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
1212 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001213
1214 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001215 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1216 fenceInfo.pNext = NULL;
1217 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06001218
Tony Barbour300a6082015-04-07 13:44:53 -06001219 ASSERT_NO_FATAL_FAILURE(InitState());
1220 ASSERT_NO_FATAL_FAILURE(InitViewport());
1221 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1222
Tony Barbourfe3351b2015-07-28 10:17:20 -06001223 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001224 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
1225 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001226 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06001227
1228 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001229
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001230 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001231 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1232 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001233 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001234 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001235 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001236 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001237 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001238 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001239 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001240
1241 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07001242 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001243
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001244 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001245}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001246// This is a positive test. We used to expect error in this case but spec now
1247// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07001248TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001249 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001250 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001251 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001252 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1253 fenceInfo.pNext = NULL;
1254
Tony Barbour0b4d9562015-04-09 10:48:04 -06001255 ASSERT_NO_FATAL_FAILURE(InitState());
1256 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08001257 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001258 VkResult result = vkResetFences(m_device->device(), 1, fences);
1259 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06001260
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001261 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06001262}
Tobin Ehlis41376e12015-07-03 08:45:14 -06001263
1264TEST_F(VkLayerTest, InvalidUsageBits)
1265{
Tony Barbourf92621a2016-05-02 14:28:12 -06001266 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001267 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06001268 "Initialize buffer with wrong usage then perform copy expecting errors "
1269 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001271 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06001272
1273 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06001274 VkImageObj image(m_device);
1275 // Initialize image with USAGE_INPUT_ATTACHMENT
1276 image.init(128, 128, VK_FORMAT_D32_SFLOAT_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001277 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1278 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06001279
Tony Barbourf92621a2016-05-02 14:28:12 -06001280 VkImageView dsv;
1281 VkImageViewCreateInfo dsvci = {};
1282 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1283 dsvci.image = image.handle();
1284 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
1285 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
1286 dsvci.subresourceRange.layerCount = 1;
1287 dsvci.subresourceRange.baseMipLevel = 0;
1288 dsvci.subresourceRange.levelCount = 1;
1289 dsvci.subresourceRange.aspectMask =
1290 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06001291
Tony Barbourf92621a2016-05-02 14:28:12 -06001292 // Create a view with depth / stencil aspect for image with different usage
1293 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001294
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001295 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06001296
1297 // Initialize buffer with TRANSFER_DST usage
1298 vk_testing::Buffer buffer;
1299 VkMemoryPropertyFlags reqs = 0;
1300 buffer.init_as_dst(*m_device, 128 * 128, reqs);
1301 VkBufferImageCopy region = {};
1302 region.bufferRowLength = 128;
1303 region.bufferImageHeight = 128;
1304 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1305 region.imageSubresource.layerCount = 1;
1306 region.imageExtent.height = 16;
1307 region.imageExtent.width = 16;
1308 region.imageExtent.depth = 1;
1309
1310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1311 "Invalid usage flag for buffer ");
1312 // Buffer usage not set to TRANSFER_SRC and image usage not set to
1313 // TRANSFER_DST
1314 BeginCommandBuffer();
1315 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1316 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1317 1, &region);
1318 m_errorMonitor->VerifyFound();
1319
1320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1321 "Invalid usage flag for image ");
1322 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1323 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1324 1, &region);
1325 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06001326}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001327#endif // MEM_TRACKER_TESTS
1328
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06001329#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06001330
1331TEST_F(VkLayerTest, LeakAnObject) {
1332 VkResult err;
1333
1334 TEST_DESCRIPTION(
1335 "Create a fence and destroy its device without first destroying the fence.");
1336
1337 // Note that we have to create a new device since destroying the
1338 // framework's device causes Teardown() to fail and just calling Teardown
1339 // will destroy the errorMonitor.
1340
1341 m_errorMonitor->SetDesiredFailureMsg(
1342 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1343 "OBJ ERROR : VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT object");
1344
1345 ASSERT_NO_FATAL_FAILURE(InitState());
1346
1347 const std::vector<VkQueueFamilyProperties> queue_props =
1348 m_device->queue_props;
1349 std::vector<VkDeviceQueueCreateInfo> queue_info;
1350 queue_info.reserve(queue_props.size());
1351 std::vector<std::vector<float>> queue_priorities;
1352 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
1353 VkDeviceQueueCreateInfo qi = {};
1354 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
1355 qi.pNext = NULL;
1356 qi.queueFamilyIndex = i;
1357 qi.queueCount = queue_props[i].queueCount;
1358 queue_priorities.emplace_back(qi.queueCount, 0.0f);
1359 qi.pQueuePriorities = queue_priorities[i].data();
1360 queue_info.push_back(qi);
1361 }
1362
1363 std::vector<const char *> device_layer_names;
1364 std::vector<const char *> device_extension_names;
1365 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
1366 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
1367 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
1368 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
1369 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
1370 device_layer_names.push_back("VK_LAYER_LUNARG_image");
1371 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
1372
1373 // The sacrificial device object
1374 VkDevice testDevice;
1375 VkDeviceCreateInfo device_create_info = {};
1376 auto features = m_device->phy().features();
1377 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
1378 device_create_info.pNext = NULL;
1379 device_create_info.queueCreateInfoCount = queue_info.size();
1380 device_create_info.pQueueCreateInfos = queue_info.data();
1381 device_create_info.enabledLayerCount = device_layer_names.size();
1382 device_create_info.ppEnabledLayerNames = device_layer_names.data();
1383 device_create_info.pEnabledFeatures = &features;
1384 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
1385 ASSERT_VK_SUCCESS(err);
1386
1387 VkFence fence;
1388 VkFenceCreateInfo fence_create_info = {};
1389 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1390 fence_create_info.pNext = NULL;
1391 fence_create_info.flags = 0;
1392 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
1393 ASSERT_VK_SUCCESS(err);
1394
1395 // Induce failure by not calling vkDestroyFence
1396 vkDestroyDevice(testDevice, NULL);
1397 m_errorMonitor->VerifyFound();
1398}
1399
1400TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
1401
1402 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
1403 "attempt to delete them from another.");
1404
1405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1406 "FreeCommandBuffers is attempting to free Command Buffer");
1407
1408 VkCommandPool command_pool_one;
1409 VkCommandPool command_pool_two;
1410
1411 VkCommandPoolCreateInfo pool_create_info{};
1412 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1413 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1414 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1415
1416 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1417 &command_pool_one);
1418
1419 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1420 &command_pool_two);
1421
1422 VkCommandBuffer command_buffer[9];
1423 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1424 command_buffer_allocate_info.sType =
1425 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1426 command_buffer_allocate_info.commandPool = command_pool_one;
1427 command_buffer_allocate_info.commandBufferCount = 9;
1428 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1429 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1430 command_buffer);
1431
1432 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
1433 &command_buffer[3]);
1434
1435 m_errorMonitor->VerifyFound();
1436
1437 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
1438 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
1439}
1440
1441TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
1442 VkResult err;
1443
1444 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
1445 "attempt to delete them from another.");
1446
1447 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1448 "FreeDescriptorSets is attempting to free descriptorSet");
1449
1450 ASSERT_NO_FATAL_FAILURE(InitState());
1451 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1452
1453 VkDescriptorPoolSize ds_type_count = {};
1454 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
1455 ds_type_count.descriptorCount = 1;
1456
1457 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1458 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1459 ds_pool_ci.pNext = NULL;
1460 ds_pool_ci.flags = 0;
1461 ds_pool_ci.maxSets = 1;
1462 ds_pool_ci.poolSizeCount = 1;
1463 ds_pool_ci.pPoolSizes = &ds_type_count;
1464
1465 VkDescriptorPool ds_pool_one;
1466 err =
1467 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
1468 ASSERT_VK_SUCCESS(err);
1469
1470 // Create a second descriptor pool
1471 VkDescriptorPool ds_pool_two;
1472 err =
1473 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
1474 ASSERT_VK_SUCCESS(err);
1475
1476 VkDescriptorSetLayoutBinding dsl_binding = {};
1477 dsl_binding.binding = 0;
1478 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1479 dsl_binding.descriptorCount = 1;
1480 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1481 dsl_binding.pImmutableSamplers = NULL;
1482
1483 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1484 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1485 ds_layout_ci.pNext = NULL;
1486 ds_layout_ci.bindingCount = 1;
1487 ds_layout_ci.pBindings = &dsl_binding;
1488
1489 VkDescriptorSetLayout ds_layout;
1490 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1491 &ds_layout);
1492 ASSERT_VK_SUCCESS(err);
1493
1494 VkDescriptorSet descriptorSet;
1495 VkDescriptorSetAllocateInfo alloc_info = {};
1496 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1497 alloc_info.descriptorSetCount = 1;
1498 alloc_info.descriptorPool = ds_pool_one;
1499 alloc_info.pSetLayouts = &ds_layout;
1500 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1501 &descriptorSet);
1502 ASSERT_VK_SUCCESS(err);
1503
1504 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
1505
1506 m_errorMonitor->VerifyFound();
1507
1508 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1509 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
1510 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
1511}
1512
1513TEST_F(VkLayerTest, CreateUnknownObject) {
1514 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1515 "Invalid VkImage Object ");
1516
1517 TEST_DESCRIPTION(
1518 "Pass an invalid image object handle into a Vulkan API call.");
1519
1520 ASSERT_NO_FATAL_FAILURE(InitState());
1521
1522 // Pass bogus handle into GetImageMemoryRequirements
1523 VkMemoryRequirements mem_reqs;
1524 uint64_t fakeImageHandle = 0xCADECADE;
1525 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
1526
1527 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
1528
1529 m_errorMonitor->VerifyFound();
1530}
1531
Karl Schultz6addd812016-02-02 17:17:23 -07001532TEST_F(VkLayerTest, PipelineNotBound) {
1533 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001534
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06001535 TEST_DESCRIPTION(
1536 "Pass in an invalid pipeline object handle into a Vulkan API call.");
1537
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001538 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001539 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001540
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001541 ASSERT_NO_FATAL_FAILURE(InitState());
1542 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001543
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001544 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001545 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1546 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001547
1548 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001549 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1550 ds_pool_ci.pNext = NULL;
1551 ds_pool_ci.maxSets = 1;
1552 ds_pool_ci.poolSizeCount = 1;
1553 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001554
1555 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001556 err =
1557 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001558 ASSERT_VK_SUCCESS(err);
1559
1560 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001561 dsl_binding.binding = 0;
1562 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1563 dsl_binding.descriptorCount = 1;
1564 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1565 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001566
1567 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001568 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1569 ds_layout_ci.pNext = NULL;
1570 ds_layout_ci.bindingCount = 1;
1571 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001572
1573 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001574 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1575 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001576 ASSERT_VK_SUCCESS(err);
1577
1578 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001579 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001580 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001581 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001582 alloc_info.descriptorPool = ds_pool;
1583 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001584 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1585 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001586 ASSERT_VK_SUCCESS(err);
1587
1588 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001589 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1590 pipeline_layout_ci.pNext = NULL;
1591 pipeline_layout_ci.setLayoutCount = 1;
1592 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001593
1594 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001595 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1596 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001597 ASSERT_VK_SUCCESS(err);
1598
Mark Youngad779052016-01-06 14:26:04 -07001599 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001600
1601 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001602 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1603 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001604
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001605 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001606
Chia-I Wuf7458c52015-10-26 21:10:41 +08001607 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1608 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1609 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001610}
1611
Karl Schultz6addd812016-02-02 17:17:23 -07001612TEST_F(VkLayerTest, BindInvalidMemory) {
1613 VkResult err;
1614 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001615
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001617 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001618
Tobin Ehlisec598302015-09-15 15:02:17 -06001619 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001620
1621 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001622 VkImage image;
1623 VkDeviceMemory mem;
1624 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001625
Karl Schultz6addd812016-02-02 17:17:23 -07001626 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1627 const int32_t tex_width = 32;
1628 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001629
1630 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001631 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1632 image_create_info.pNext = NULL;
1633 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1634 image_create_info.format = tex_format;
1635 image_create_info.extent.width = tex_width;
1636 image_create_info.extent.height = tex_height;
1637 image_create_info.extent.depth = 1;
1638 image_create_info.mipLevels = 1;
1639 image_create_info.arrayLayers = 1;
1640 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1641 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1642 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1643 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001644
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001645 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001646 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1647 mem_alloc.pNext = NULL;
1648 mem_alloc.allocationSize = 0;
1649 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001650
Chia-I Wuf7458c52015-10-26 21:10:41 +08001651 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001652 ASSERT_VK_SUCCESS(err);
1653
Karl Schultz6addd812016-02-02 17:17:23 -07001654 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001655
1656 mem_alloc.allocationSize = mem_reqs.size;
1657
Karl Schultz6addd812016-02-02 17:17:23 -07001658 pass =
1659 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001660 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001661
1662 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001663 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001664 ASSERT_VK_SUCCESS(err);
1665
1666 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001667 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001668
1669 // Try to bind free memory that has been freed
1670 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1671 // This may very well return an error.
1672 (void)err;
1673
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001674 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001675
Chia-I Wuf7458c52015-10-26 21:10:41 +08001676 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001677}
1678
Karl Schultz6addd812016-02-02 17:17:23 -07001679TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1680 VkResult err;
1681 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001682
Karl Schultz6addd812016-02-02 17:17:23 -07001683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1684 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001685
Tobin Ehlisec598302015-09-15 15:02:17 -06001686 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001687
Karl Schultz6addd812016-02-02 17:17:23 -07001688 // Create an image object, allocate memory, destroy the object and then try
1689 // to bind it
1690 VkImage image;
1691 VkDeviceMemory mem;
1692 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001693
Karl Schultz6addd812016-02-02 17:17:23 -07001694 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1695 const int32_t tex_width = 32;
1696 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001697
1698 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001699 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1700 image_create_info.pNext = NULL;
1701 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1702 image_create_info.format = tex_format;
1703 image_create_info.extent.width = tex_width;
1704 image_create_info.extent.height = tex_height;
1705 image_create_info.extent.depth = 1;
1706 image_create_info.mipLevels = 1;
1707 image_create_info.arrayLayers = 1;
1708 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1709 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1710 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1711 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001712
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001713 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001714 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1715 mem_alloc.pNext = NULL;
1716 mem_alloc.allocationSize = 0;
1717 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001718
Chia-I Wuf7458c52015-10-26 21:10:41 +08001719 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001720 ASSERT_VK_SUCCESS(err);
1721
Karl Schultz6addd812016-02-02 17:17:23 -07001722 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001723
1724 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001725 pass =
1726 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001727 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001728
1729 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001730 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001731 ASSERT_VK_SUCCESS(err);
1732
1733 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001734 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001735 ASSERT_VK_SUCCESS(err);
1736
1737 // Now Try to bind memory to this destroyed object
1738 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1739 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001740 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001741
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001742 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001743
Chia-I Wuf7458c52015-10-26 21:10:41 +08001744 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001745}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001746
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001747#endif // OBJ_TRACKER_TESTS
1748
Tobin Ehlis0788f522015-05-26 16:11:58 -06001749#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001750
1751// This is a positive test. No errors should be generated.
1752TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
1753
1754 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1755 "submitted on separate queues followed by a QueueWaitIdle.");
1756
Dustin Graves48458142016-04-29 16:11:55 -06001757 if ((m_device->queue_props.empty()) ||
1758 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001759 return;
1760
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001761 m_errorMonitor->ExpectSuccess();
1762
1763 VkSemaphore semaphore;
1764 VkSemaphoreCreateInfo semaphore_create_info{};
1765 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1766 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1767 &semaphore);
1768
1769 VkCommandPool command_pool;
1770 VkCommandPoolCreateInfo pool_create_info{};
1771 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1772 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1773 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1774 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1775 &command_pool);
1776
1777 VkCommandBuffer command_buffer[2];
1778 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1779 command_buffer_allocate_info.sType =
1780 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1781 command_buffer_allocate_info.commandPool = command_pool;
1782 command_buffer_allocate_info.commandBufferCount = 2;
1783 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1784 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1785 command_buffer);
1786
1787 VkQueue queue = VK_NULL_HANDLE;
1788 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1789 1, &queue);
1790
1791 {
1792 VkCommandBufferBeginInfo begin_info{};
1793 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1794 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1795
1796 vkCmdPipelineBarrier(command_buffer[0],
1797 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1798 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1799 0, nullptr, 0, nullptr);
1800
1801 VkViewport viewport{};
1802 viewport.maxDepth = 1.0f;
1803 viewport.minDepth = 0.0f;
1804 viewport.width = 512;
1805 viewport.height = 512;
1806 viewport.x = 0;
1807 viewport.y = 0;
1808 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1809 vkEndCommandBuffer(command_buffer[0]);
1810 }
1811 {
1812 VkCommandBufferBeginInfo begin_info{};
1813 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1814 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1815
1816 VkViewport viewport{};
1817 viewport.maxDepth = 1.0f;
1818 viewport.minDepth = 0.0f;
1819 viewport.width = 512;
1820 viewport.height = 512;
1821 viewport.x = 0;
1822 viewport.y = 0;
1823 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1824 vkEndCommandBuffer(command_buffer[1]);
1825 }
1826 {
1827 VkSubmitInfo submit_info{};
1828 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1829 submit_info.commandBufferCount = 1;
1830 submit_info.pCommandBuffers = &command_buffer[0];
1831 submit_info.signalSemaphoreCount = 1;
1832 submit_info.pSignalSemaphores = &semaphore;
1833 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1834 }
1835 {
1836 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1837 VkSubmitInfo submit_info{};
1838 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1839 submit_info.commandBufferCount = 1;
1840 submit_info.pCommandBuffers = &command_buffer[1];
1841 submit_info.waitSemaphoreCount = 1;
1842 submit_info.pWaitSemaphores = &semaphore;
1843 submit_info.pWaitDstStageMask = flags;
1844 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1845 }
1846
1847 vkQueueWaitIdle(m_device->m_queue);
1848
1849 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1850 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1851 &command_buffer[0]);
1852 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1853
1854 m_errorMonitor->VerifyNotFound();
1855}
1856
1857// This is a positive test. No errors should be generated.
1858TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
1859
1860 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1861 "submitted on separate queues, the second having a fence"
1862 "followed by a QueueWaitIdle.");
1863
Dustin Graves48458142016-04-29 16:11:55 -06001864 if ((m_device->queue_props.empty()) ||
1865 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001866 return;
1867
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001868 m_errorMonitor->ExpectSuccess();
1869
1870 VkFence fence;
1871 VkFenceCreateInfo fence_create_info{};
1872 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1873 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1874
1875 VkSemaphore semaphore;
1876 VkSemaphoreCreateInfo semaphore_create_info{};
1877 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1878 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1879 &semaphore);
1880
1881 VkCommandPool command_pool;
1882 VkCommandPoolCreateInfo pool_create_info{};
1883 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1884 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1885 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1886 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1887 &command_pool);
1888
1889 VkCommandBuffer command_buffer[2];
1890 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1891 command_buffer_allocate_info.sType =
1892 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1893 command_buffer_allocate_info.commandPool = command_pool;
1894 command_buffer_allocate_info.commandBufferCount = 2;
1895 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1896 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1897 command_buffer);
1898
1899 VkQueue queue = VK_NULL_HANDLE;
1900 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1901 1, &queue);
1902
1903 {
1904 VkCommandBufferBeginInfo begin_info{};
1905 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1906 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1907
1908 vkCmdPipelineBarrier(command_buffer[0],
1909 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1910 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1911 0, nullptr, 0, nullptr);
1912
1913 VkViewport viewport{};
1914 viewport.maxDepth = 1.0f;
1915 viewport.minDepth = 0.0f;
1916 viewport.width = 512;
1917 viewport.height = 512;
1918 viewport.x = 0;
1919 viewport.y = 0;
1920 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1921 vkEndCommandBuffer(command_buffer[0]);
1922 }
1923 {
1924 VkCommandBufferBeginInfo begin_info{};
1925 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1926 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1927
1928 VkViewport viewport{};
1929 viewport.maxDepth = 1.0f;
1930 viewport.minDepth = 0.0f;
1931 viewport.width = 512;
1932 viewport.height = 512;
1933 viewport.x = 0;
1934 viewport.y = 0;
1935 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1936 vkEndCommandBuffer(command_buffer[1]);
1937 }
1938 {
1939 VkSubmitInfo submit_info{};
1940 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1941 submit_info.commandBufferCount = 1;
1942 submit_info.pCommandBuffers = &command_buffer[0];
1943 submit_info.signalSemaphoreCount = 1;
1944 submit_info.pSignalSemaphores = &semaphore;
1945 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1946 }
1947 {
1948 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1949 VkSubmitInfo submit_info{};
1950 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1951 submit_info.commandBufferCount = 1;
1952 submit_info.pCommandBuffers = &command_buffer[1];
1953 submit_info.waitSemaphoreCount = 1;
1954 submit_info.pWaitSemaphores = &semaphore;
1955 submit_info.pWaitDstStageMask = flags;
1956 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1957 }
1958
1959 vkQueueWaitIdle(m_device->m_queue);
1960
1961 vkDestroyFence(m_device->device(), fence, nullptr);
1962 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1963 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1964 &command_buffer[0]);
1965 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1966
1967 m_errorMonitor->VerifyNotFound();
1968}
1969
1970// This is a positive test. No errors should be generated.
1971TEST_F(VkLayerTest,
1972 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
1973
1974 TEST_DESCRIPTION(
1975 "Two command buffers, each in a separate QueueSubmit call "
1976 "submitted on separate queues, the second having a fence"
1977 "followed by two consecutive WaitForFences calls on the same fence.");
1978
Dustin Graves48458142016-04-29 16:11:55 -06001979 if ((m_device->queue_props.empty()) ||
1980 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001981 return;
1982
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001983 m_errorMonitor->ExpectSuccess();
1984
1985 VkFence fence;
1986 VkFenceCreateInfo fence_create_info{};
1987 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1988 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1989
1990 VkSemaphore semaphore;
1991 VkSemaphoreCreateInfo semaphore_create_info{};
1992 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1993 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1994 &semaphore);
1995
1996 VkCommandPool command_pool;
1997 VkCommandPoolCreateInfo pool_create_info{};
1998 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1999 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2000 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2001 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2002 &command_pool);
2003
2004 VkCommandBuffer command_buffer[2];
2005 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2006 command_buffer_allocate_info.sType =
2007 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2008 command_buffer_allocate_info.commandPool = command_pool;
2009 command_buffer_allocate_info.commandBufferCount = 2;
2010 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2011 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2012 command_buffer);
2013
2014 VkQueue queue = VK_NULL_HANDLE;
2015 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2016 1, &queue);
2017
2018 {
2019 VkCommandBufferBeginInfo begin_info{};
2020 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2021 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2022
2023 vkCmdPipelineBarrier(command_buffer[0],
2024 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2025 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2026 0, nullptr, 0, nullptr);
2027
2028 VkViewport viewport{};
2029 viewport.maxDepth = 1.0f;
2030 viewport.minDepth = 0.0f;
2031 viewport.width = 512;
2032 viewport.height = 512;
2033 viewport.x = 0;
2034 viewport.y = 0;
2035 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2036 vkEndCommandBuffer(command_buffer[0]);
2037 }
2038 {
2039 VkCommandBufferBeginInfo begin_info{};
2040 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2041 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2042
2043 VkViewport viewport{};
2044 viewport.maxDepth = 1.0f;
2045 viewport.minDepth = 0.0f;
2046 viewport.width = 512;
2047 viewport.height = 512;
2048 viewport.x = 0;
2049 viewport.y = 0;
2050 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2051 vkEndCommandBuffer(command_buffer[1]);
2052 }
2053 {
2054 VkSubmitInfo submit_info{};
2055 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2056 submit_info.commandBufferCount = 1;
2057 submit_info.pCommandBuffers = &command_buffer[0];
2058 submit_info.signalSemaphoreCount = 1;
2059 submit_info.pSignalSemaphores = &semaphore;
2060 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2061 }
2062 {
2063 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2064 VkSubmitInfo submit_info{};
2065 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2066 submit_info.commandBufferCount = 1;
2067 submit_info.pCommandBuffers = &command_buffer[1];
2068 submit_info.waitSemaphoreCount = 1;
2069 submit_info.pWaitSemaphores = &semaphore;
2070 submit_info.pWaitDstStageMask = flags;
2071 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2072 }
2073
2074 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2075 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2076
2077 vkDestroyFence(m_device->device(), fence, nullptr);
2078 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2079 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2080 &command_buffer[0]);
2081 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2082
2083 m_errorMonitor->VerifyNotFound();
2084}
2085
2086// This is a positive test. No errors should be generated.
2087TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
2088
2089 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2090 "submitted on separate queues, the second having a fence, "
2091 "followed by a WaitForFences call.");
2092
Dustin Graves48458142016-04-29 16:11:55 -06002093 if ((m_device->queue_props.empty()) ||
2094 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002095 return;
2096
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002097 m_errorMonitor->ExpectSuccess();
2098
2099 VkFence fence;
2100 VkFenceCreateInfo fence_create_info{};
2101 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2102 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2103
2104 VkSemaphore semaphore;
2105 VkSemaphoreCreateInfo semaphore_create_info{};
2106 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2107 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2108 &semaphore);
2109
2110 VkCommandPool command_pool;
2111 VkCommandPoolCreateInfo pool_create_info{};
2112 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2113 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2114 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2115 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2116 &command_pool);
2117
2118 VkCommandBuffer command_buffer[2];
2119 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2120 command_buffer_allocate_info.sType =
2121 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2122 command_buffer_allocate_info.commandPool = command_pool;
2123 command_buffer_allocate_info.commandBufferCount = 2;
2124 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2125 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2126 command_buffer);
2127
2128 VkQueue queue = VK_NULL_HANDLE;
2129 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2130 1, &queue);
2131
2132
2133 {
2134 VkCommandBufferBeginInfo begin_info{};
2135 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2136 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2137
2138 vkCmdPipelineBarrier(command_buffer[0],
2139 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2140 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2141 0, nullptr, 0, nullptr);
2142
2143 VkViewport viewport{};
2144 viewport.maxDepth = 1.0f;
2145 viewport.minDepth = 0.0f;
2146 viewport.width = 512;
2147 viewport.height = 512;
2148 viewport.x = 0;
2149 viewport.y = 0;
2150 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2151 vkEndCommandBuffer(command_buffer[0]);
2152 }
2153 {
2154 VkCommandBufferBeginInfo begin_info{};
2155 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2156 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2157
2158 VkViewport viewport{};
2159 viewport.maxDepth = 1.0f;
2160 viewport.minDepth = 0.0f;
2161 viewport.width = 512;
2162 viewport.height = 512;
2163 viewport.x = 0;
2164 viewport.y = 0;
2165 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2166 vkEndCommandBuffer(command_buffer[1]);
2167 }
2168 {
2169 VkSubmitInfo submit_info{};
2170 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2171 submit_info.commandBufferCount = 1;
2172 submit_info.pCommandBuffers = &command_buffer[0];
2173 submit_info.signalSemaphoreCount = 1;
2174 submit_info.pSignalSemaphores = &semaphore;
2175 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2176 }
2177 {
2178 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2179 VkSubmitInfo submit_info{};
2180 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2181 submit_info.commandBufferCount = 1;
2182 submit_info.pCommandBuffers = &command_buffer[1];
2183 submit_info.waitSemaphoreCount = 1;
2184 submit_info.pWaitSemaphores = &semaphore;
2185 submit_info.pWaitDstStageMask = flags;
2186 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2187 }
2188
2189 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2190
2191 vkDestroyFence(m_device->device(), fence, nullptr);
2192 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2193 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2194 &command_buffer[0]);
2195 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2196
2197 m_errorMonitor->VerifyNotFound();
2198}
2199
2200// This is a positive test. No errors should be generated.
2201TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
2202
2203 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2204 "on the same queue, sharing a signal/wait semaphore, the "
2205 "second having a fence, "
2206 "followed by a WaitForFences call.");
2207
2208 m_errorMonitor->ExpectSuccess();
2209
2210 VkFence fence;
2211 VkFenceCreateInfo fence_create_info{};
2212 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2213 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2214
2215 VkSemaphore semaphore;
2216 VkSemaphoreCreateInfo semaphore_create_info{};
2217 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2218 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2219 &semaphore);
2220
2221 VkCommandPool command_pool;
2222 VkCommandPoolCreateInfo pool_create_info{};
2223 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2224 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2225 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2226 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2227 &command_pool);
2228
2229 VkCommandBuffer command_buffer[2];
2230 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2231 command_buffer_allocate_info.sType =
2232 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2233 command_buffer_allocate_info.commandPool = command_pool;
2234 command_buffer_allocate_info.commandBufferCount = 2;
2235 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2236 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2237 command_buffer);
2238
2239 {
2240 VkCommandBufferBeginInfo begin_info{};
2241 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2242 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2243
2244 vkCmdPipelineBarrier(command_buffer[0],
2245 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2246 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2247 0, nullptr, 0, nullptr);
2248
2249 VkViewport viewport{};
2250 viewport.maxDepth = 1.0f;
2251 viewport.minDepth = 0.0f;
2252 viewport.width = 512;
2253 viewport.height = 512;
2254 viewport.x = 0;
2255 viewport.y = 0;
2256 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2257 vkEndCommandBuffer(command_buffer[0]);
2258 }
2259 {
2260 VkCommandBufferBeginInfo begin_info{};
2261 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2262 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2263
2264 VkViewport viewport{};
2265 viewport.maxDepth = 1.0f;
2266 viewport.minDepth = 0.0f;
2267 viewport.width = 512;
2268 viewport.height = 512;
2269 viewport.x = 0;
2270 viewport.y = 0;
2271 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2272 vkEndCommandBuffer(command_buffer[1]);
2273 }
2274 {
2275 VkSubmitInfo submit_info{};
2276 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2277 submit_info.commandBufferCount = 1;
2278 submit_info.pCommandBuffers = &command_buffer[0];
2279 submit_info.signalSemaphoreCount = 1;
2280 submit_info.pSignalSemaphores = &semaphore;
2281 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2282 }
2283 {
2284 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2285 VkSubmitInfo submit_info{};
2286 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2287 submit_info.commandBufferCount = 1;
2288 submit_info.pCommandBuffers = &command_buffer[1];
2289 submit_info.waitSemaphoreCount = 1;
2290 submit_info.pWaitSemaphores = &semaphore;
2291 submit_info.pWaitDstStageMask = flags;
2292 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2293 }
2294
2295 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2296
2297 vkDestroyFence(m_device->device(), fence, nullptr);
2298 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2299 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2300 &command_buffer[0]);
2301 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2302
2303 m_errorMonitor->VerifyNotFound();
2304}
2305
2306// This is a positive test. No errors should be generated.
2307TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
2308
2309 TEST_DESCRIPTION(
2310 "Two command buffers, each in a separate QueueSubmit call "
2311 "on the same queue, no fences, followed by a third QueueSubmit with NO "
2312 "SubmitInfos but with a fence, followed by a WaitForFences call.");
2313
2314 m_errorMonitor->ExpectSuccess();
2315
2316 VkFence fence;
2317 VkFenceCreateInfo fence_create_info{};
2318 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2319 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2320
2321 VkCommandPool command_pool;
2322 VkCommandPoolCreateInfo pool_create_info{};
2323 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2324 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2325 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2326 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2327 &command_pool);
2328
2329 VkCommandBuffer command_buffer[2];
2330 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2331 command_buffer_allocate_info.sType =
2332 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2333 command_buffer_allocate_info.commandPool = command_pool;
2334 command_buffer_allocate_info.commandBufferCount = 2;
2335 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2336 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2337 command_buffer);
2338
2339 {
2340 VkCommandBufferBeginInfo begin_info{};
2341 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2342 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2343
2344 vkCmdPipelineBarrier(command_buffer[0],
2345 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2346 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2347 0, nullptr, 0, nullptr);
2348
2349 VkViewport viewport{};
2350 viewport.maxDepth = 1.0f;
2351 viewport.minDepth = 0.0f;
2352 viewport.width = 512;
2353 viewport.height = 512;
2354 viewport.x = 0;
2355 viewport.y = 0;
2356 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2357 vkEndCommandBuffer(command_buffer[0]);
2358 }
2359 {
2360 VkCommandBufferBeginInfo begin_info{};
2361 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2362 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2363
2364 VkViewport viewport{};
2365 viewport.maxDepth = 1.0f;
2366 viewport.minDepth = 0.0f;
2367 viewport.width = 512;
2368 viewport.height = 512;
2369 viewport.x = 0;
2370 viewport.y = 0;
2371 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2372 vkEndCommandBuffer(command_buffer[1]);
2373 }
2374 {
2375 VkSubmitInfo submit_info{};
2376 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2377 submit_info.commandBufferCount = 1;
2378 submit_info.pCommandBuffers = &command_buffer[0];
2379 submit_info.signalSemaphoreCount = 0;
2380 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2381 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2382 }
2383 {
2384 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2385 VkSubmitInfo submit_info{};
2386 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2387 submit_info.commandBufferCount = 1;
2388 submit_info.pCommandBuffers = &command_buffer[1];
2389 submit_info.waitSemaphoreCount = 0;
2390 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2391 submit_info.pWaitDstStageMask = flags;
2392 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2393 }
2394
2395 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
2396
2397 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2398
2399 vkDestroyFence(m_device->device(), fence, nullptr);
2400 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2401 &command_buffer[0]);
2402 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2403
2404 m_errorMonitor->VerifyNotFound();
2405}
2406
2407// This is a positive test. No errors should be generated.
2408TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
2409
2410 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2411 "on the same queue, the second having a fence, followed "
2412 "by a WaitForFences call.");
2413
2414 m_errorMonitor->ExpectSuccess();
2415
2416 VkFence fence;
2417 VkFenceCreateInfo fence_create_info{};
2418 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2419 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2420
2421 VkCommandPool command_pool;
2422 VkCommandPoolCreateInfo pool_create_info{};
2423 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2424 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2425 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2426 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2427 &command_pool);
2428
2429 VkCommandBuffer command_buffer[2];
2430 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2431 command_buffer_allocate_info.sType =
2432 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2433 command_buffer_allocate_info.commandPool = command_pool;
2434 command_buffer_allocate_info.commandBufferCount = 2;
2435 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2436 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2437 command_buffer);
2438
2439 {
2440 VkCommandBufferBeginInfo begin_info{};
2441 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2442 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2443
2444 vkCmdPipelineBarrier(command_buffer[0],
2445 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2446 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2447 0, nullptr, 0, nullptr);
2448
2449 VkViewport viewport{};
2450 viewport.maxDepth = 1.0f;
2451 viewport.minDepth = 0.0f;
2452 viewport.width = 512;
2453 viewport.height = 512;
2454 viewport.x = 0;
2455 viewport.y = 0;
2456 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2457 vkEndCommandBuffer(command_buffer[0]);
2458 }
2459 {
2460 VkCommandBufferBeginInfo begin_info{};
2461 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2462 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2463
2464 VkViewport viewport{};
2465 viewport.maxDepth = 1.0f;
2466 viewport.minDepth = 0.0f;
2467 viewport.width = 512;
2468 viewport.height = 512;
2469 viewport.x = 0;
2470 viewport.y = 0;
2471 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2472 vkEndCommandBuffer(command_buffer[1]);
2473 }
2474 {
2475 VkSubmitInfo submit_info{};
2476 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2477 submit_info.commandBufferCount = 1;
2478 submit_info.pCommandBuffers = &command_buffer[0];
2479 submit_info.signalSemaphoreCount = 0;
2480 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2481 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2482 }
2483 {
2484 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2485 VkSubmitInfo submit_info{};
2486 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2487 submit_info.commandBufferCount = 1;
2488 submit_info.pCommandBuffers = &command_buffer[1];
2489 submit_info.waitSemaphoreCount = 0;
2490 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2491 submit_info.pWaitDstStageMask = flags;
2492 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2493 }
2494
2495 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2496
2497 vkDestroyFence(m_device->device(), fence, nullptr);
2498 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2499 &command_buffer[0]);
2500 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2501
2502 m_errorMonitor->VerifyNotFound();
2503}
2504
2505// This is a positive test. No errors should be generated.
2506TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
2507
2508 TEST_DESCRIPTION(
2509 "Two command buffers each in a separate SubmitInfo sent in a single "
2510 "QueueSubmit call followed by a WaitForFences call.");
2511
2512 m_errorMonitor->ExpectSuccess();
2513
2514 VkFence fence;
2515 VkFenceCreateInfo fence_create_info{};
2516 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2517 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2518
2519 VkSemaphore semaphore;
2520 VkSemaphoreCreateInfo semaphore_create_info{};
2521 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2522 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2523 &semaphore);
2524
2525 VkCommandPool command_pool;
2526 VkCommandPoolCreateInfo pool_create_info{};
2527 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2528 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2529 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2530 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2531 &command_pool);
2532
2533 VkCommandBuffer command_buffer[2];
2534 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2535 command_buffer_allocate_info.sType =
2536 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2537 command_buffer_allocate_info.commandPool = command_pool;
2538 command_buffer_allocate_info.commandBufferCount = 2;
2539 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2540 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2541 command_buffer);
2542
2543 {
2544 VkCommandBufferBeginInfo begin_info{};
2545 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2546 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2547
2548 vkCmdPipelineBarrier(command_buffer[0],
2549 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2550 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2551 0, nullptr, 0, nullptr);
2552
2553 VkViewport viewport{};
2554 viewport.maxDepth = 1.0f;
2555 viewport.minDepth = 0.0f;
2556 viewport.width = 512;
2557 viewport.height = 512;
2558 viewport.x = 0;
2559 viewport.y = 0;
2560 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2561 vkEndCommandBuffer(command_buffer[0]);
2562 }
2563 {
2564 VkCommandBufferBeginInfo begin_info{};
2565 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2566 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2567
2568 VkViewport viewport{};
2569 viewport.maxDepth = 1.0f;
2570 viewport.minDepth = 0.0f;
2571 viewport.width = 512;
2572 viewport.height = 512;
2573 viewport.x = 0;
2574 viewport.y = 0;
2575 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2576 vkEndCommandBuffer(command_buffer[1]);
2577 }
2578 {
2579 VkSubmitInfo submit_info[2];
2580 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2581
2582 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2583 submit_info[0].pNext = NULL;
2584 submit_info[0].commandBufferCount = 1;
2585 submit_info[0].pCommandBuffers = &command_buffer[0];
2586 submit_info[0].signalSemaphoreCount = 1;
2587 submit_info[0].pSignalSemaphores = &semaphore;
2588 submit_info[0].waitSemaphoreCount = 0;
2589 submit_info[0].pWaitSemaphores = NULL;
2590 submit_info[0].pWaitDstStageMask = 0;
2591
2592 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2593 submit_info[1].pNext = NULL;
2594 submit_info[1].commandBufferCount = 1;
2595 submit_info[1].pCommandBuffers = &command_buffer[1];
2596 submit_info[1].waitSemaphoreCount = 1;
2597 submit_info[1].pWaitSemaphores = &semaphore;
2598 submit_info[1].pWaitDstStageMask = flags;
2599 submit_info[1].signalSemaphoreCount = 0;
2600 submit_info[1].pSignalSemaphores = NULL;
2601 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
2602 }
2603
2604 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2605
2606 vkDestroyFence(m_device->device(), fence, nullptr);
2607 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2608 &command_buffer[0]);
2609 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2610
2611 m_errorMonitor->VerifyNotFound();
2612}
2613
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002614TEST_F(VkLayerTest, DynamicStatesNotBound) {
2615 TEST_DESCRIPTION(
2616 "Run a series of simple draw calls to validate all the different "
2617 "failure cases that can occur when dynamic state is required but not "
2618 "correctly bound."
2619 "Here are the different dynamic state cases verified by this test:\n"
2620 "-Line Width\n-Depth Bias\n-Viewport State\n-Scissor State\n-Blend "
2621 "State\n-Depth Bounds\n-Stencil Read Mask\n-Stencil Write "
2622 "Mask\n-Stencil Reference");
2623
2624 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07002625 m_errorMonitor->SetDesiredFailureMsg(
2626 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002627 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002628 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2629 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002630 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002631 // Dynamic depth bias
Karl Schultz6addd812016-02-02 17:17:23 -07002632 m_errorMonitor->SetDesiredFailureMsg(
2633 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002634 "Dynamic depth bias state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002635 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2636 BsoFailDepthBias);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002637 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002638 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07002639 m_errorMonitor->SetDesiredFailureMsg(
2640 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002641 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002642 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2643 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002644 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002645 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07002646 m_errorMonitor->SetDesiredFailureMsg(
2647 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002648 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002649 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2650 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002651 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002652 // Dynamic blend state
Karl Schultz6addd812016-02-02 17:17:23 -07002653 m_errorMonitor->SetDesiredFailureMsg(
2654 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002655 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002656 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2657 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002658 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002659 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07002660 m_errorMonitor->SetDesiredFailureMsg(
2661 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002662 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002663 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2664 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002665 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002666 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07002667 m_errorMonitor->SetDesiredFailureMsg(
2668 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002669 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002670 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2671 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002672 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002673 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07002674 m_errorMonitor->SetDesiredFailureMsg(
2675 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002676 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002677 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2678 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002679 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002680}
2681
Karl Schultz6addd812016-02-02 17:17:23 -07002682TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002683 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002684
Karl Schultz6addd812016-02-02 17:17:23 -07002685 m_errorMonitor->SetDesiredFailureMsg(
2686 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2687 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
2688 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002689
2690 VkFenceCreateInfo fenceInfo = {};
2691 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2692 fenceInfo.pNext = NULL;
2693 fenceInfo.flags = 0;
2694
2695 ASSERT_NO_FATAL_FAILURE(InitState());
2696 ASSERT_NO_FATAL_FAILURE(InitViewport());
2697 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2698
Karl Schultz6addd812016-02-02 17:17:23 -07002699 // We luck out b/c by default the framework creates CB w/ the
2700 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002701 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002702 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2703 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002704 EndCommandBuffer();
2705
2706 testFence.init(*m_device, fenceInfo);
2707
2708 // Bypass framework since it does the waits automatically
2709 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002710 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002711 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2712 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002713 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002714 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002715 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002716 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002717 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002718 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002719 submit_info.pSignalSemaphores = NULL;
2720
Karl Schultz6addd812016-02-02 17:17:23 -07002721 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
2722 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002723
Karl Schultz6addd812016-02-02 17:17:23 -07002724 // Cause validation error by re-submitting cmd buffer that should only be
2725 // submitted once
2726 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002727
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002728 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002729}
2730
Karl Schultz6addd812016-02-02 17:17:23 -07002731TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002732 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07002733 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002734
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002735 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002736 "Unable to allocate 1 descriptors of "
2737 "type "
2738 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002739
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002740 ASSERT_NO_FATAL_FAILURE(InitState());
2741 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002742
Karl Schultz6addd812016-02-02 17:17:23 -07002743 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
2744 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002745 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002746 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2747 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002748
2749 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002750 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2751 ds_pool_ci.pNext = NULL;
2752 ds_pool_ci.flags = 0;
2753 ds_pool_ci.maxSets = 1;
2754 ds_pool_ci.poolSizeCount = 1;
2755 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002756
2757 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002758 err =
2759 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002760 ASSERT_VK_SUCCESS(err);
2761
2762 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002763 dsl_binding.binding = 0;
2764 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2765 dsl_binding.descriptorCount = 1;
2766 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2767 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002768
2769 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002770 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2771 ds_layout_ci.pNext = NULL;
2772 ds_layout_ci.bindingCount = 1;
2773 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002774
2775 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002776 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2777 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002778 ASSERT_VK_SUCCESS(err);
2779
2780 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002781 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002782 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002783 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002784 alloc_info.descriptorPool = ds_pool;
2785 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002786 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2787 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002788
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002789 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002790
Chia-I Wuf7458c52015-10-26 21:10:41 +08002791 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2792 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002793}
2794
Karl Schultz6addd812016-02-02 17:17:23 -07002795TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
2796 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06002797
Karl Schultz6addd812016-02-02 17:17:23 -07002798 m_errorMonitor->SetDesiredFailureMsg(
2799 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2800 "It is invalid to call vkFreeDescriptorSets() with a pool created "
2801 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002802
Tobin Ehlise735c692015-10-08 13:13:50 -06002803 ASSERT_NO_FATAL_FAILURE(InitState());
2804 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06002805
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002806 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002807 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2808 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06002809
2810 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002811 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2812 ds_pool_ci.pNext = NULL;
2813 ds_pool_ci.maxSets = 1;
2814 ds_pool_ci.poolSizeCount = 1;
2815 ds_pool_ci.flags = 0;
2816 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
2817 // app can only call vkResetDescriptorPool on this pool.;
2818 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06002819
2820 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002821 err =
2822 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06002823 ASSERT_VK_SUCCESS(err);
2824
2825 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002826 dsl_binding.binding = 0;
2827 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2828 dsl_binding.descriptorCount = 1;
2829 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2830 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06002831
2832 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002833 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2834 ds_layout_ci.pNext = NULL;
2835 ds_layout_ci.bindingCount = 1;
2836 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06002837
2838 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002839 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2840 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06002841 ASSERT_VK_SUCCESS(err);
2842
2843 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002844 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002845 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002846 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002847 alloc_info.descriptorPool = ds_pool;
2848 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002849 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2850 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06002851 ASSERT_VK_SUCCESS(err);
2852
2853 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002854 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06002855
Chia-I Wuf7458c52015-10-26 21:10:41 +08002856 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2857 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06002858}
2859
Karl Schultz6addd812016-02-02 17:17:23 -07002860TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002861 // Attempt to clear Descriptor Pool with bad object.
2862 // ObjectTracker should catch this.
2863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2864 "Invalid VkDescriptorPool Object 0xbaad6001");
2865 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
2866 vkResetDescriptorPool(device(), badPool, 0);
2867 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002868}
2869
Karl Schultz6addd812016-02-02 17:17:23 -07002870TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002871 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
2872 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002873 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06002874 // call vkCmdBindDescriptorSets w/ false Descriptor Set
2875 VkDescriptorSet badSet = (VkDescriptorSet)0xbaad6001;
2876 VkResult err;
2877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2878 "Invalid VkDescriptorSet Object 0xbaad6001");
2879
2880 ASSERT_NO_FATAL_FAILURE(InitState());
2881
2882 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
2883 layout_bindings[0].binding = 0;
2884 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2885 layout_bindings[0].descriptorCount = 1;
2886 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2887 layout_bindings[0].pImmutableSamplers = NULL;
2888
2889 VkDescriptorSetLayout descriptor_set_layout;
2890 VkDescriptorSetLayoutCreateInfo dslci = {};
2891 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2892 dslci.pNext = NULL;
2893 dslci.bindingCount = 1;
2894 dslci.pBindings = layout_bindings;
2895 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002896 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002897
2898 VkPipelineLayout pipeline_layout;
2899 VkPipelineLayoutCreateInfo plci = {};
2900 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2901 plci.pNext = NULL;
2902 plci.setLayoutCount = 1;
2903 plci.pSetLayouts = &descriptor_set_layout;
2904 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002905 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002906
2907 BeginCommandBuffer();
2908 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2909 pipeline_layout, 0, 1, &badSet, 0, NULL);
2910 m_errorMonitor->VerifyFound();
2911 EndCommandBuffer();
2912 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
2913 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002914}
2915
Karl Schultz6addd812016-02-02 17:17:23 -07002916TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002917 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
2918 // ObjectTracker should catch this.
2919 VkDescriptorSetLayout bad_layout = (VkDescriptorSetLayout)0xbaad6001;
2920 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2921 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
2922
2923 VkPipelineLayout pipeline_layout;
2924 VkPipelineLayoutCreateInfo plci = {};
2925 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2926 plci.pNext = NULL;
2927 plci.setLayoutCount = 1;
2928 plci.pSetLayouts = &bad_layout;
2929 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
2930
2931 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002932}
2933
Karl Schultz6addd812016-02-02 17:17:23 -07002934TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002935 // Attempt to bind an invalid Pipeline to a valid Command Buffer
2936 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002937 // Create a valid cmd buffer
2938 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultzbdb75952016-04-19 11:36:49 -06002939 VkPipeline bad_pipeline = (VkPipeline)0xbaad6001;
2940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2941 "Invalid VkPipeline Object 0xbaad6001");
2942 ASSERT_NO_FATAL_FAILURE(InitState());
2943 BeginCommandBuffer();
2944 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2945 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
2946 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06002947
2948 // Now issue a draw call with no pipeline bound
2949 m_errorMonitor->SetDesiredFailureMsg(
2950 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2951 "At Draw/Dispatch time no valid VkPipeline is bound!");
2952 ASSERT_NO_FATAL_FAILURE(InitState());
2953 BeginCommandBuffer();
2954 Draw(1, 0, 0, 0);
2955 m_errorMonitor->VerifyFound();
2956 // Finally same check once more but with Dispatch/Compute
2957 m_errorMonitor->SetDesiredFailureMsg(
2958 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2959 "At Draw/Dispatch time no valid VkPipeline is bound!");
2960 ASSERT_NO_FATAL_FAILURE(InitState());
2961 BeginCommandBuffer();
2962 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
2963 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002964}
2965
Karl Schultz6addd812016-02-02 17:17:23 -07002966TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
2967 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
2968 // CommandBuffer
2969 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002970
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002972 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002973
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002974 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06002975 ASSERT_NO_FATAL_FAILURE(InitViewport());
2976 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002977 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002978 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2979 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06002980
2981 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002982 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2983 ds_pool_ci.pNext = NULL;
2984 ds_pool_ci.maxSets = 1;
2985 ds_pool_ci.poolSizeCount = 1;
2986 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06002987
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002988 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002989 err =
2990 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002991 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002992
Tony Barboureb254902015-07-15 12:50:33 -06002993 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002994 dsl_binding.binding = 0;
2995 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2996 dsl_binding.descriptorCount = 1;
2997 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2998 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002999
Tony Barboureb254902015-07-15 12:50:33 -06003000 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003001 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3002 ds_layout_ci.pNext = NULL;
3003 ds_layout_ci.bindingCount = 1;
3004 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003005 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003006 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3007 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003008 ASSERT_VK_SUCCESS(err);
3009
3010 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003011 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003012 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003013 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003014 alloc_info.descriptorPool = ds_pool;
3015 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003016 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3017 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003018 ASSERT_VK_SUCCESS(err);
3019
Tony Barboureb254902015-07-15 12:50:33 -06003020 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003021 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3022 pipeline_layout_ci.pNext = NULL;
3023 pipeline_layout_ci.setLayoutCount = 1;
3024 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003025
3026 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003027 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3028 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003029 ASSERT_VK_SUCCESS(err);
3030
Karl Schultz6addd812016-02-02 17:17:23 -07003031 VkShaderObj vs(m_device, bindStateVertShaderText,
3032 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06003033 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07003034 // on more devices
3035 VkShaderObj fs(m_device, bindStateFragShaderText,
3036 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003037
Tony Barbourc95e4ac2015-08-04 17:05:26 -06003038 VkPipelineObj pipe(m_device);
3039 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06003040 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06003041 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06003042 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06003043
3044 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003045 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3046 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3047 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3048 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3049 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003050
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003051 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003052
Chia-I Wuf7458c52015-10-26 21:10:41 +08003053 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3054 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3055 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003056}
3057
Karl Schultz6addd812016-02-02 17:17:23 -07003058TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003059 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07003060 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003061
Karl Schultz6addd812016-02-02 17:17:23 -07003062 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003063 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
3064 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003065
3066 ASSERT_NO_FATAL_FAILURE(InitState());
3067 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003068 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3069 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003070
3071 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003072 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3073 ds_pool_ci.pNext = NULL;
3074 ds_pool_ci.maxSets = 1;
3075 ds_pool_ci.poolSizeCount = 1;
3076 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003077
3078 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003079 err =
3080 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003081 ASSERT_VK_SUCCESS(err);
3082
3083 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003084 dsl_binding.binding = 0;
3085 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3086 dsl_binding.descriptorCount = 1;
3087 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3088 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003089
3090 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003091 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3092 ds_layout_ci.pNext = NULL;
3093 ds_layout_ci.bindingCount = 1;
3094 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003095 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003096 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3097 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003098 ASSERT_VK_SUCCESS(err);
3099
3100 VkDescriptorSet descriptorSet;
3101 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003102 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003103 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003104 alloc_info.descriptorPool = ds_pool;
3105 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003106 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3107 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003108 ASSERT_VK_SUCCESS(err);
3109
Karl Schultz6addd812016-02-02 17:17:23 -07003110 VkBufferView view =
3111 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003112 VkWriteDescriptorSet descriptor_write;
3113 memset(&descriptor_write, 0, sizeof(descriptor_write));
3114 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3115 descriptor_write.dstSet = descriptorSet;
3116 descriptor_write.dstBinding = 0;
3117 descriptor_write.descriptorCount = 1;
3118 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3119 descriptor_write.pTexelBufferView = &view;
3120
3121 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3122
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003123 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003124
3125 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3126 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3127}
3128
Karl Schultz6addd812016-02-02 17:17:23 -07003129TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
3130 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
3131 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07003132 // 1. No dynamicOffset supplied
3133 // 2. Too many dynamicOffsets supplied
3134 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07003135 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003137 " requires 1 dynamicOffsets, but only "
3138 "0 dynamicOffsets are left in "
3139 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003140
3141 ASSERT_NO_FATAL_FAILURE(InitState());
3142 ASSERT_NO_FATAL_FAILURE(InitViewport());
3143 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3144
3145 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003146 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3147 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003148
3149 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003150 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3151 ds_pool_ci.pNext = NULL;
3152 ds_pool_ci.maxSets = 1;
3153 ds_pool_ci.poolSizeCount = 1;
3154 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003155
3156 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003157 err =
3158 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003159 ASSERT_VK_SUCCESS(err);
3160
3161 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003162 dsl_binding.binding = 0;
3163 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3164 dsl_binding.descriptorCount = 1;
3165 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3166 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003167
3168 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003169 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3170 ds_layout_ci.pNext = NULL;
3171 ds_layout_ci.bindingCount = 1;
3172 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003173 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003174 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3175 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003176 ASSERT_VK_SUCCESS(err);
3177
3178 VkDescriptorSet descriptorSet;
3179 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003180 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003181 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003182 alloc_info.descriptorPool = ds_pool;
3183 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003184 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3185 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003186 ASSERT_VK_SUCCESS(err);
3187
3188 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003189 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3190 pipeline_layout_ci.pNext = NULL;
3191 pipeline_layout_ci.setLayoutCount = 1;
3192 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003193
3194 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003195 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3196 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003197 ASSERT_VK_SUCCESS(err);
3198
3199 // Create a buffer to update the descriptor with
3200 uint32_t qfi = 0;
3201 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003202 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3203 buffCI.size = 1024;
3204 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3205 buffCI.queueFamilyIndexCount = 1;
3206 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003207
3208 VkBuffer dyub;
3209 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3210 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003211 // Allocate memory and bind to buffer so we can make it to the appropriate
3212 // error
3213 VkMemoryAllocateInfo mem_alloc = {};
3214 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3215 mem_alloc.pNext = NULL;
3216 mem_alloc.allocationSize = 1024;
3217 mem_alloc.memoryTypeIndex = 1;
3218 VkDeviceMemory mem;
3219 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3220 ASSERT_VK_SUCCESS(err);
3221 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
3222 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003223 // Correctly update descriptor to avoid "NOT_UPDATED" error
3224 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003225 buffInfo.buffer = dyub;
3226 buffInfo.offset = 0;
3227 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003228
3229 VkWriteDescriptorSet descriptor_write;
3230 memset(&descriptor_write, 0, sizeof(descriptor_write));
3231 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3232 descriptor_write.dstSet = descriptorSet;
3233 descriptor_write.dstBinding = 0;
3234 descriptor_write.descriptorCount = 1;
3235 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3236 descriptor_write.pBufferInfo = &buffInfo;
3237
3238 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3239
3240 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003241 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3242 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3243 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003244 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003245 uint32_t pDynOff[2] = {512, 756};
3246 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07003247 m_errorMonitor->SetDesiredFailureMsg(
3248 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07003249 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07003250 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3251 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3252 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12003253 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003254 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3256 " dynamic offset 512 combined with "
3257 "offset 0 and range 1024 that "
3258 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07003259 // Create PSO to be used for draw-time errors below
3260 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003261 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003262 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003263 "out gl_PerVertex { \n"
3264 " vec4 gl_Position;\n"
3265 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003266 "void main(){\n"
3267 " gl_Position = vec4(1);\n"
3268 "}\n";
3269 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003270 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003271 "\n"
3272 "layout(location=0) out vec4 x;\n"
3273 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3274 "void main(){\n"
3275 " x = vec4(bar.y);\n"
3276 "}\n";
3277 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3278 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3279 VkPipelineObj pipe(m_device);
3280 pipe.AddShader(&vs);
3281 pipe.AddShader(&fs);
3282 pipe.AddColorAttachment();
3283 pipe.CreateVKPipeline(pipeline_layout, renderPass());
3284
Karl Schultz6addd812016-02-02 17:17:23 -07003285 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3286 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3287 // This update should succeed, but offset size of 512 will overstep buffer
3288 // /w range 1024 & size 1024
3289 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3290 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3291 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07003292 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003293 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003294
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003295 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06003296 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003297
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003298 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3299 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3300}
3301
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003302TEST_F(VkLayerTest, InvalidPushConstants) {
3303 // Hit push constant error cases:
3304 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
3305 // 2. Incorrectly set push constant size to 0
3306 // 3. Incorrectly set push constant size to non-multiple of 4
3307 // 4. Attempt push constant update that exceeds maxPushConstantSize
3308 VkResult err;
3309 m_errorMonitor->SetDesiredFailureMsg(
3310 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3311 "vkCreatePipelineLayout() call has push constants with offset ");
3312
3313 ASSERT_NO_FATAL_FAILURE(InitState());
3314 ASSERT_NO_FATAL_FAILURE(InitViewport());
3315 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3316
3317 VkPushConstantRange pc_range = {};
3318 pc_range.size = 0xFFFFFFFFu;
3319 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3320 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3321 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3322 pipeline_layout_ci.pushConstantRangeCount = 1;
3323 pipeline_layout_ci.pPushConstantRanges = &pc_range;
3324
3325 VkPipelineLayout pipeline_layout;
3326 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3327 &pipeline_layout);
3328
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003329 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003330 // Now cause errors due to size 0 and non-4 byte aligned size
3331 pc_range.size = 0;
3332 m_errorMonitor->SetDesiredFailureMsg(
3333 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3334 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
3335 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3336 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003337 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003338 pc_range.size = 1;
3339 m_errorMonitor->SetDesiredFailureMsg(
3340 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3341 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
3342 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3343 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003344 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003345 // Cause error due to bad size in vkCmdPushConstants() call
3346 m_errorMonitor->SetDesiredFailureMsg(
3347 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3348 "vkCmdPushConstants() call has push constants with offset ");
3349 pipeline_layout_ci.pushConstantRangeCount = 0;
3350 pipeline_layout_ci.pPushConstantRanges = NULL;
3351 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3352 &pipeline_layout);
3353 ASSERT_VK_SUCCESS(err);
3354 BeginCommandBuffer();
3355 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
3356 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003357 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003358 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3359}
3360
Karl Schultz6addd812016-02-02 17:17:23 -07003361TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003362 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07003363 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003364
3365 ASSERT_NO_FATAL_FAILURE(InitState());
3366 ASSERT_NO_FATAL_FAILURE(InitViewport());
3367 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3368
3369 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
3370 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003371 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3372 ds_type_count[0].descriptorCount = 10;
3373 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3374 ds_type_count[1].descriptorCount = 2;
3375 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3376 ds_type_count[2].descriptorCount = 2;
3377 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
3378 ds_type_count[3].descriptorCount = 5;
3379 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
3380 // type
3381 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
3382 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
3383 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003384
3385 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003386 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3387 ds_pool_ci.pNext = NULL;
3388 ds_pool_ci.maxSets = 5;
3389 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
3390 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003391
3392 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003393 err =
3394 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003395 ASSERT_VK_SUCCESS(err);
3396
3397 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
3398 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003399 dsl_binding[0].binding = 0;
3400 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3401 dsl_binding[0].descriptorCount = 5;
3402 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
3403 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003404
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003405 // Create layout identical to set0 layout but w/ different stageFlags
3406 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003407 dsl_fs_stage_only.binding = 0;
3408 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3409 dsl_fs_stage_only.descriptorCount = 5;
3410 dsl_fs_stage_only.stageFlags =
3411 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
3412 // bind time
3413 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003414 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003415 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3416 ds_layout_ci.pNext = NULL;
3417 ds_layout_ci.bindingCount = 1;
3418 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003419 static const uint32_t NUM_LAYOUTS = 4;
3420 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003421 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003422 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
3423 // layout for error case
3424 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3425 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003426 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003427 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003428 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3429 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003430 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003431 dsl_binding[0].binding = 0;
3432 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003433 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003434 dsl_binding[1].binding = 1;
3435 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3436 dsl_binding[1].descriptorCount = 2;
3437 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
3438 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003439 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003440 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003441 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3442 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003443 ASSERT_VK_SUCCESS(err);
3444 dsl_binding[0].binding = 0;
3445 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003446 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003447 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07003448 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3449 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003450 ASSERT_VK_SUCCESS(err);
3451 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003452 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003453 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3454 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003455 ASSERT_VK_SUCCESS(err);
3456
3457 static const uint32_t NUM_SETS = 4;
3458 VkDescriptorSet descriptorSet[NUM_SETS] = {};
3459 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003460 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003461 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003462 alloc_info.descriptorPool = ds_pool;
3463 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003464 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3465 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003466 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003467 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003468 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003469 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003470 err =
3471 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003472 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003473
3474 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003475 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3476 pipeline_layout_ci.pNext = NULL;
3477 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
3478 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003479
3480 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003481 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3482 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003483 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003484 // Create pipelineLayout with only one setLayout
3485 pipeline_layout_ci.setLayoutCount = 1;
3486 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003487 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3488 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003489 ASSERT_VK_SUCCESS(err);
3490 // Create pipelineLayout with 2 descriptor setLayout at index 0
3491 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
3492 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07003493 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3494 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003495 ASSERT_VK_SUCCESS(err);
3496 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
3497 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
3498 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07003499 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3500 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003501 ASSERT_VK_SUCCESS(err);
3502 // Create pipelineLayout with UB type, but stageFlags for FS only
3503 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
3504 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003505 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3506 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003507 ASSERT_VK_SUCCESS(err);
3508 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
3509 VkDescriptorSetLayout pl_bad_s0[2] = {};
3510 pl_bad_s0[0] = ds_layout_fs_only;
3511 pl_bad_s0[1] = ds_layout[1];
3512 pipeline_layout_ci.setLayoutCount = 2;
3513 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
3514 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07003515 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3516 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003517 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003518
3519 // Create a buffer to update the descriptor with
3520 uint32_t qfi = 0;
3521 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003522 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3523 buffCI.size = 1024;
3524 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3525 buffCI.queueFamilyIndexCount = 1;
3526 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003527
3528 VkBuffer dyub;
3529 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3530 ASSERT_VK_SUCCESS(err);
3531 // Correctly update descriptor to avoid "NOT_UPDATED" error
3532 static const uint32_t NUM_BUFFS = 5;
3533 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003534 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003535 buffInfo[i].buffer = dyub;
3536 buffInfo[i].offset = 0;
3537 buffInfo[i].range = 1024;
3538 }
Karl Schultz6addd812016-02-02 17:17:23 -07003539 VkImage image;
3540 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3541 const int32_t tex_width = 32;
3542 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003543 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003544 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3545 image_create_info.pNext = NULL;
3546 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3547 image_create_info.format = tex_format;
3548 image_create_info.extent.width = tex_width;
3549 image_create_info.extent.height = tex_height;
3550 image_create_info.extent.depth = 1;
3551 image_create_info.mipLevels = 1;
3552 image_create_info.arrayLayers = 1;
3553 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3554 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3555 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3556 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003557 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3558 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003559
Karl Schultz6addd812016-02-02 17:17:23 -07003560 VkMemoryRequirements memReqs;
3561 VkDeviceMemory imageMem;
3562 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003563 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003564 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3565 memAlloc.pNext = NULL;
3566 memAlloc.allocationSize = 0;
3567 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003568 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
3569 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003570 pass =
3571 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003572 ASSERT_TRUE(pass);
3573 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
3574 ASSERT_VK_SUCCESS(err);
3575 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
3576 ASSERT_VK_SUCCESS(err);
3577
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003578 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003579 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3580 image_view_create_info.image = image;
3581 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
3582 image_view_create_info.format = tex_format;
3583 image_view_create_info.subresourceRange.layerCount = 1;
3584 image_view_create_info.subresourceRange.baseMipLevel = 0;
3585 image_view_create_info.subresourceRange.levelCount = 1;
3586 image_view_create_info.subresourceRange.aspectMask =
3587 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003588
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003589 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07003590 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
3591 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003592 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003593 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003594 imageInfo[0].imageView = view;
3595 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3596 imageInfo[1].imageView = view;
3597 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003598 imageInfo[2].imageView = view;
3599 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3600 imageInfo[3].imageView = view;
3601 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003602
3603 static const uint32_t NUM_SET_UPDATES = 3;
3604 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
3605 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3606 descriptor_write[0].dstSet = descriptorSet[0];
3607 descriptor_write[0].dstBinding = 0;
3608 descriptor_write[0].descriptorCount = 5;
3609 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3610 descriptor_write[0].pBufferInfo = buffInfo;
3611 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3612 descriptor_write[1].dstSet = descriptorSet[1];
3613 descriptor_write[1].dstBinding = 0;
3614 descriptor_write[1].descriptorCount = 2;
3615 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3616 descriptor_write[1].pImageInfo = imageInfo;
3617 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3618 descriptor_write[2].dstSet = descriptorSet[1];
3619 descriptor_write[2].dstBinding = 1;
3620 descriptor_write[2].descriptorCount = 2;
3621 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003622 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003623
3624 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003625
Tobin Ehlis88452832015-12-03 09:40:56 -07003626 // Create PSO to be used for draw-time errors below
3627 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003628 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003629 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003630 "out gl_PerVertex {\n"
3631 " vec4 gl_Position;\n"
3632 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003633 "void main(){\n"
3634 " gl_Position = vec4(1);\n"
3635 "}\n";
3636 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003637 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003638 "\n"
3639 "layout(location=0) out vec4 x;\n"
3640 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3641 "void main(){\n"
3642 " x = vec4(bar.y);\n"
3643 "}\n";
3644 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3645 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003646 VkPipelineObj pipe(m_device);
3647 pipe.AddShader(&vs);
3648 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07003649 pipe.AddColorAttachment();
3650 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07003651
3652 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07003653
Karl Schultz6addd812016-02-02 17:17:23 -07003654 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3655 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3656 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
3657 // of PSO
3658 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
3659 // cmd_pipeline.c
3660 // due to the fact that cmd_alloc_dset_data() has not been called in
3661 // cmd_bind_graphics_pipeline()
3662 // TODO : Want to cause various binding incompatibility issues here to test
3663 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07003664 // First cause various verify_layout_compatibility() fails
3665 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003666 // verify_set_layout_compatibility fail cases:
3667 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07003668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3669 " due to: invalid VkPipelineLayout ");
3670 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3671 VK_PIPELINE_BIND_POINT_GRAPHICS,
3672 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
3673 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003674 m_errorMonitor->VerifyFound();
3675
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003676 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07003677 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3678 " attempting to bind set to index 1");
3679 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3680 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
3681 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003682 m_errorMonitor->VerifyFound();
3683
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003684 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003685 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
3686 // descriptors
3687 m_errorMonitor->SetDesiredFailureMsg(
3688 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003689 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003690 vkCmdBindDescriptorSets(
3691 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3692 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003693 m_errorMonitor->VerifyFound();
3694
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003695 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
3696 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07003697 m_errorMonitor->SetDesiredFailureMsg(
3698 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003699 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07003700 vkCmdBindDescriptorSets(
3701 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3702 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003703 m_errorMonitor->VerifyFound();
3704
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003705 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
3706 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07003707 m_errorMonitor->SetDesiredFailureMsg(
3708 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003709 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003710 vkCmdBindDescriptorSets(
3711 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3712 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003713 m_errorMonitor->VerifyFound();
3714
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003715 // Cause INFO messages due to disturbing previously bound Sets
3716 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07003717 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3718 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3719 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003720 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07003721 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003722 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003723 " previously bound as set #0 was disturbed ");
3724 vkCmdBindDescriptorSets(
3725 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3726 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003727 m_errorMonitor->VerifyFound();
3728
Karl Schultz6addd812016-02-02 17:17:23 -07003729 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3730 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3731 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003732 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003733 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003734 " newly bound as set #0 so set #1 and "
3735 "any subsequent sets were disturbed ");
3736 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3737 VK_PIPELINE_BIND_POINT_GRAPHICS,
3738 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003739 m_errorMonitor->VerifyFound();
3740
Tobin Ehlis88452832015-12-03 09:40:56 -07003741 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07003742 // 1. Error due to not binding required set (we actually use same code as
3743 // above to disturb set0)
3744 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3745 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3746 2, &descriptorSet[0], 0, NULL);
3747 vkCmdBindDescriptorSets(
3748 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3749 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
3750 m_errorMonitor->SetDesiredFailureMsg(
3751 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3752 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07003753 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003754 m_errorMonitor->VerifyFound();
3755
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003756 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003757 // 2. Error due to bound set not being compatible with PSO's
3758 // VkPipelineLayout (diff stageFlags in this case)
3759 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3760 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3761 2, &descriptorSet[0], 0, NULL);
3762 m_errorMonitor->SetDesiredFailureMsg(
3763 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3764 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07003765 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003766 m_errorMonitor->VerifyFound();
3767
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003768 // Remaining clean-up
3769 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003770 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003771 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
3772 }
3773 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06003774 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
3775 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003776 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003777 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3778 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3779}
Tobin Ehlis559c6382015-11-05 09:52:49 -07003780
Karl Schultz6addd812016-02-02 17:17:23 -07003781TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003782
Karl Schultz6addd812016-02-02 17:17:23 -07003783 m_errorMonitor->SetDesiredFailureMsg(
3784 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003785 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003786
3787 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003788 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003789 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003790 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003791
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003792 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003793}
3794
Karl Schultz6addd812016-02-02 17:17:23 -07003795TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
3796 VkResult err;
3797 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003798
Karl Schultz6addd812016-02-02 17:17:23 -07003799 m_errorMonitor->SetDesiredFailureMsg(
3800 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07003801 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003802
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003803 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003804
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003805 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003806 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003807 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003808 cmd.commandPool = m_commandPool;
3809 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003810 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06003811
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003812 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06003813 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003814
3815 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003816 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003817 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003818 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003819 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07003820 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
3821 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003822 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003823
3824 // The error should be caught by validation of the BeginCommandBuffer call
3825 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
3826
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003827 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003828 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003829}
3830
Karl Schultz6addd812016-02-02 17:17:23 -07003831TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003832 // Cause error due to Begin while recording CB
3833 // Then cause 2 errors for attempting to reset CB w/o having
3834 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
3835 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003837 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003838
3839 ASSERT_NO_FATAL_FAILURE(InitState());
3840
3841 // Calls AllocateCommandBuffers
3842 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
3843
Karl Schultz6addd812016-02-02 17:17:23 -07003844 // Force the failure by setting the Renderpass and Framebuffer fields with
3845 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003846 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003847 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003848 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3849 cmd_buf_info.pNext = NULL;
3850 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003851 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003852
3853 // Begin CB to transition to recording state
3854 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
3855 // Can't re-begin. This should trigger error
3856 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003857 m_errorMonitor->VerifyFound();
3858
Karl Schultz6addd812016-02-02 17:17:23 -07003859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3860 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003861 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
3862 // Reset attempt will trigger error due to incorrect CommandPool state
3863 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003864 m_errorMonitor->VerifyFound();
3865
Karl Schultz6addd812016-02-02 17:17:23 -07003866 m_errorMonitor->SetDesiredFailureMsg(
3867 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3868 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003869 // Transition CB to RECORDED state
3870 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
3871 // Now attempting to Begin will implicitly reset, which triggers error
3872 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003873 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003874}
3875
Karl Schultz6addd812016-02-02 17:17:23 -07003876TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003877 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003878 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003879
Karl Schultz6addd812016-02-02 17:17:23 -07003880 m_errorMonitor->SetDesiredFailureMsg(
3881 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003882 "Invalid Pipeline CreateInfo State: Vtx Shader required");
3883
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003884 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003885 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003886
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003887 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003888 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3889 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003890
3891 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003892 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3893 ds_pool_ci.pNext = NULL;
3894 ds_pool_ci.maxSets = 1;
3895 ds_pool_ci.poolSizeCount = 1;
3896 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003897
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003898 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003899 err =
3900 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003901 ASSERT_VK_SUCCESS(err);
3902
Tony Barboureb254902015-07-15 12:50:33 -06003903 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003904 dsl_binding.binding = 0;
3905 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3906 dsl_binding.descriptorCount = 1;
3907 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3908 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003909
Tony Barboureb254902015-07-15 12:50:33 -06003910 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003911 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3912 ds_layout_ci.pNext = NULL;
3913 ds_layout_ci.bindingCount = 1;
3914 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003915
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003916 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003917 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3918 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003919 ASSERT_VK_SUCCESS(err);
3920
3921 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003922 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003923 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003924 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003925 alloc_info.descriptorPool = ds_pool;
3926 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003927 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3928 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003929 ASSERT_VK_SUCCESS(err);
3930
Tony Barboureb254902015-07-15 12:50:33 -06003931 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003932 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3933 pipeline_layout_ci.setLayoutCount = 1;
3934 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003935
3936 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003937 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3938 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003939 ASSERT_VK_SUCCESS(err);
3940
Tobin Ehlise68360f2015-10-01 11:15:13 -06003941 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07003942 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06003943
3944 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003945 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3946 vp_state_ci.scissorCount = 1;
3947 vp_state_ci.pScissors = &sc;
3948 vp_state_ci.viewportCount = 1;
3949 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003950
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003951 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3952 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3953 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3954 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3955 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3956 rs_state_ci.depthClampEnable = VK_FALSE;
3957 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3958 rs_state_ci.depthBiasEnable = VK_FALSE;
3959
Tony Barboureb254902015-07-15 12:50:33 -06003960 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003961 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3962 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003963 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003964 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3965 gp_ci.layout = pipeline_layout;
3966 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06003967
3968 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003969 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3970 pc_ci.initialDataSize = 0;
3971 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003972
3973 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003974 VkPipelineCache pipelineCache;
3975
Karl Schultz6addd812016-02-02 17:17:23 -07003976 err =
3977 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06003978 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003979 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3980 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003981
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003982 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003983
Chia-I Wuf7458c52015-10-26 21:10:41 +08003984 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3985 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3986 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3987 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003988}
Tobin Ehlis912df022015-09-17 08:46:18 -06003989/*// TODO : This test should be good, but needs Tess support in compiler to run
3990TEST_F(VkLayerTest, InvalidPatchControlPoints)
3991{
3992 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06003993 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003994
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003995 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003996 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
3997primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003998
Tobin Ehlis912df022015-09-17 08:46:18 -06003999 ASSERT_NO_FATAL_FAILURE(InitState());
4000 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06004001
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004002 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06004003 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004004 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004005
4006 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4007 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4008 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004009 ds_pool_ci.poolSizeCount = 1;
4010 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06004011
4012 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004013 err = vkCreateDescriptorPool(m_device->device(),
4014VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06004015 ASSERT_VK_SUCCESS(err);
4016
4017 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08004018 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06004019 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08004020 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004021 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4022 dsl_binding.pImmutableSamplers = NULL;
4023
4024 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004025 ds_layout_ci.sType =
4026VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06004027 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004028 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004029 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06004030
4031 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004032 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4033&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06004034 ASSERT_VK_SUCCESS(err);
4035
4036 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004037 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
4038VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06004039 ASSERT_VK_SUCCESS(err);
4040
4041 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004042 pipeline_layout_ci.sType =
4043VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06004044 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004045 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004046 pipeline_layout_ci.pSetLayouts = &ds_layout;
4047
4048 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004049 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4050&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06004051 ASSERT_VK_SUCCESS(err);
4052
4053 VkPipelineShaderStageCreateInfo shaderStages[3];
4054 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
4055
Karl Schultz6addd812016-02-02 17:17:23 -07004056 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
4057this);
Tobin Ehlis912df022015-09-17 08:46:18 -06004058 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07004059 VkShaderObj
4060tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
4061this);
4062 VkShaderObj
4063te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
4064this);
Tobin Ehlis912df022015-09-17 08:46:18 -06004065
Karl Schultz6addd812016-02-02 17:17:23 -07004066 shaderStages[0].sType =
4067VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004068 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004069 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07004070 shaderStages[1].sType =
4071VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004072 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004073 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07004074 shaderStages[2].sType =
4075VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004076 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004077 shaderStages[2].shader = te.handle();
4078
4079 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004080 iaCI.sType =
4081VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08004082 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06004083
4084 VkPipelineTessellationStateCreateInfo tsCI = {};
4085 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
4086 tsCI.patchControlPoints = 0; // This will cause an error
4087
4088 VkGraphicsPipelineCreateInfo gp_ci = {};
4089 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4090 gp_ci.pNext = NULL;
4091 gp_ci.stageCount = 3;
4092 gp_ci.pStages = shaderStages;
4093 gp_ci.pVertexInputState = NULL;
4094 gp_ci.pInputAssemblyState = &iaCI;
4095 gp_ci.pTessellationState = &tsCI;
4096 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004097 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06004098 gp_ci.pMultisampleState = NULL;
4099 gp_ci.pDepthStencilState = NULL;
4100 gp_ci.pColorBlendState = NULL;
4101 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4102 gp_ci.layout = pipeline_layout;
4103 gp_ci.renderPass = renderPass();
4104
4105 VkPipelineCacheCreateInfo pc_ci = {};
4106 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4107 pc_ci.pNext = NULL;
4108 pc_ci.initialSize = 0;
4109 pc_ci.initialData = 0;
4110 pc_ci.maxSize = 0;
4111
4112 VkPipeline pipeline;
4113 VkPipelineCache pipelineCache;
4114
Karl Schultz6addd812016-02-02 17:17:23 -07004115 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
4116&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06004117 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004118 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4119&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06004120
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004121 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004122
Chia-I Wuf7458c52015-10-26 21:10:41 +08004123 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4124 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4125 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4126 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06004127}
4128*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06004129// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07004130TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07004131 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004132
Karl Schultz6addd812016-02-02 17:17:23 -07004133 m_errorMonitor->SetDesiredFailureMsg(
4134 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004135 "Gfx Pipeline viewport count (1) must match scissor count (0).");
4136
Tobin Ehlise68360f2015-10-01 11:15:13 -06004137 ASSERT_NO_FATAL_FAILURE(InitState());
4138 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004139
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004140 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004141 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4142 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004143
4144 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004145 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4146 ds_pool_ci.maxSets = 1;
4147 ds_pool_ci.poolSizeCount = 1;
4148 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004149
4150 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004151 err =
4152 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004153 ASSERT_VK_SUCCESS(err);
4154
4155 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004156 dsl_binding.binding = 0;
4157 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4158 dsl_binding.descriptorCount = 1;
4159 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004160
4161 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004162 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4163 ds_layout_ci.bindingCount = 1;
4164 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004165
4166 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004167 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4168 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004169 ASSERT_VK_SUCCESS(err);
4170
4171 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004172 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004173 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004174 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004175 alloc_info.descriptorPool = ds_pool;
4176 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004177 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4178 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004179 ASSERT_VK_SUCCESS(err);
4180
4181 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004182 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4183 pipeline_layout_ci.setLayoutCount = 1;
4184 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004185
4186 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004187 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4188 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004189 ASSERT_VK_SUCCESS(err);
4190
4191 VkViewport vp = {}; // Just need dummy vp to point to
4192
4193 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004194 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4195 vp_state_ci.scissorCount = 0;
4196 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
4197 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004198
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004199 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4200 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4201 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4202 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4203 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4204 rs_state_ci.depthClampEnable = VK_FALSE;
4205 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4206 rs_state_ci.depthBiasEnable = VK_FALSE;
4207
Cody Northropeb3a6c12015-10-05 14:44:45 -06004208 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004209 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004210
Karl Schultz6addd812016-02-02 17:17:23 -07004211 VkShaderObj vs(m_device, bindStateVertShaderText,
4212 VK_SHADER_STAGE_VERTEX_BIT, this);
4213 VkShaderObj fs(m_device, bindStateFragShaderText,
4214 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004215 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004216 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004217 shaderStages[0] = vs.GetStageCreateInfo();
4218 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004219
4220 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004221 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4222 gp_ci.stageCount = 2;
4223 gp_ci.pStages = shaderStages;
4224 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004225 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004226 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4227 gp_ci.layout = pipeline_layout;
4228 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004229
4230 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004231 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004232
4233 VkPipeline pipeline;
4234 VkPipelineCache pipelineCache;
4235
Karl Schultz6addd812016-02-02 17:17:23 -07004236 err =
4237 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004238 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004239 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4240 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004241
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004242 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004243
Chia-I Wuf7458c52015-10-26 21:10:41 +08004244 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4245 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4246 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4247 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004248}
Karl Schultz6addd812016-02-02 17:17:23 -07004249// Don't set viewport state in PSO. This is an error b/c we always need this
4250// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06004251// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07004252TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06004253 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07004254 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004255
Karl Schultz6addd812016-02-02 17:17:23 -07004256 m_errorMonitor->SetDesiredFailureMsg(
4257 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004258 "Gfx Pipeline pViewportState is null. Even if ");
4259
Tobin Ehlise68360f2015-10-01 11:15:13 -06004260 ASSERT_NO_FATAL_FAILURE(InitState());
4261 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004262
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004263 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004264 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4265 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004266
4267 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004268 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4269 ds_pool_ci.maxSets = 1;
4270 ds_pool_ci.poolSizeCount = 1;
4271 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004272
4273 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004274 err =
4275 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004276 ASSERT_VK_SUCCESS(err);
4277
4278 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004279 dsl_binding.binding = 0;
4280 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4281 dsl_binding.descriptorCount = 1;
4282 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004283
4284 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004285 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4286 ds_layout_ci.bindingCount = 1;
4287 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004288
4289 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004290 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4291 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004292 ASSERT_VK_SUCCESS(err);
4293
4294 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004295 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004296 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004297 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004298 alloc_info.descriptorPool = ds_pool;
4299 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004300 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4301 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004302 ASSERT_VK_SUCCESS(err);
4303
4304 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004305 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4306 pipeline_layout_ci.setLayoutCount = 1;
4307 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004308
4309 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004310 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4311 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004312 ASSERT_VK_SUCCESS(err);
4313
4314 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4315 // Set scissor as dynamic to avoid second error
4316 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004317 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4318 dyn_state_ci.dynamicStateCount = 1;
4319 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004320
Cody Northropeb3a6c12015-10-05 14:44:45 -06004321 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004322 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004323
Karl Schultz6addd812016-02-02 17:17:23 -07004324 VkShaderObj vs(m_device, bindStateVertShaderText,
4325 VK_SHADER_STAGE_VERTEX_BIT, this);
4326 VkShaderObj fs(m_device, bindStateFragShaderText,
4327 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004328 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004329 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004330 shaderStages[0] = vs.GetStageCreateInfo();
4331 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004332
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004333
4334 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4335 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4336 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4337 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4338 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4339 rs_state_ci.depthClampEnable = VK_FALSE;
4340 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4341 rs_state_ci.depthBiasEnable = VK_FALSE;
4342
Tobin Ehlise68360f2015-10-01 11:15:13 -06004343 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004344 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4345 gp_ci.stageCount = 2;
4346 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004347 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004348 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
4349 // should cause validation error
4350 gp_ci.pDynamicState = &dyn_state_ci;
4351 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4352 gp_ci.layout = pipeline_layout;
4353 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004354
4355 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004356 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004357
4358 VkPipeline pipeline;
4359 VkPipelineCache pipelineCache;
4360
Karl Schultz6addd812016-02-02 17:17:23 -07004361 err =
4362 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004363 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004364 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4365 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004366
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004367 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004368
Chia-I Wuf7458c52015-10-26 21:10:41 +08004369 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4370 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4371 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4372 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004373}
4374// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07004375// Then run second test where dynamic scissor count doesn't match PSO scissor
4376// count
4377TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
4378 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004379
Karl Schultz6addd812016-02-02 17:17:23 -07004380 m_errorMonitor->SetDesiredFailureMsg(
4381 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004382 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
4383
Tobin Ehlise68360f2015-10-01 11:15:13 -06004384 ASSERT_NO_FATAL_FAILURE(InitState());
4385 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004386
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004387 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004388 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4389 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004390
4391 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004392 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4393 ds_pool_ci.maxSets = 1;
4394 ds_pool_ci.poolSizeCount = 1;
4395 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004396
4397 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004398 err =
4399 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004400 ASSERT_VK_SUCCESS(err);
4401
4402 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004403 dsl_binding.binding = 0;
4404 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4405 dsl_binding.descriptorCount = 1;
4406 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004407
4408 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004409 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4410 ds_layout_ci.bindingCount = 1;
4411 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004412
4413 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004414 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4415 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004416 ASSERT_VK_SUCCESS(err);
4417
4418 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004419 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004420 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004421 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004422 alloc_info.descriptorPool = ds_pool;
4423 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004424 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4425 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004426 ASSERT_VK_SUCCESS(err);
4427
4428 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004429 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4430 pipeline_layout_ci.setLayoutCount = 1;
4431 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004432
4433 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004434 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4435 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004436 ASSERT_VK_SUCCESS(err);
4437
4438 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004439 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4440 vp_state_ci.viewportCount = 1;
4441 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
4442 vp_state_ci.scissorCount = 1;
4443 vp_state_ci.pScissors =
4444 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06004445
4446 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4447 // Set scissor as dynamic to avoid that error
4448 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004449 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4450 dyn_state_ci.dynamicStateCount = 1;
4451 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004452
Cody Northropeb3a6c12015-10-05 14:44:45 -06004453 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004454 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004455
Karl Schultz6addd812016-02-02 17:17:23 -07004456 VkShaderObj vs(m_device, bindStateVertShaderText,
4457 VK_SHADER_STAGE_VERTEX_BIT, this);
4458 VkShaderObj fs(m_device, bindStateFragShaderText,
4459 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004460 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004461 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004462 shaderStages[0] = vs.GetStageCreateInfo();
4463 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004464
Cody Northropf6622dc2015-10-06 10:33:21 -06004465 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4466 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4467 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004468 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004469 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004470 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004471 vi_ci.pVertexAttributeDescriptions = nullptr;
4472
4473 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4474 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4475 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4476
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004477 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004478 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06004479 rs_ci.pNext = nullptr;
4480
Mark Youngc89c6312016-03-31 16:03:20 -06004481 VkPipelineColorBlendAttachmentState att = {};
4482 att.blendEnable = VK_FALSE;
4483 att.colorWriteMask = 0xf;
4484
Cody Northropf6622dc2015-10-06 10:33:21 -06004485 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4486 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4487 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004488 cb_ci.attachmentCount = 1;
4489 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06004490
Tobin Ehlise68360f2015-10-01 11:15:13 -06004491 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004492 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4493 gp_ci.stageCount = 2;
4494 gp_ci.pStages = shaderStages;
4495 gp_ci.pVertexInputState = &vi_ci;
4496 gp_ci.pInputAssemblyState = &ia_ci;
4497 gp_ci.pViewportState = &vp_state_ci;
4498 gp_ci.pRasterizationState = &rs_ci;
4499 gp_ci.pColorBlendState = &cb_ci;
4500 gp_ci.pDynamicState = &dyn_state_ci;
4501 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4502 gp_ci.layout = pipeline_layout;
4503 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004504
4505 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004506 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004507
4508 VkPipeline pipeline;
4509 VkPipelineCache pipelineCache;
4510
Karl Schultz6addd812016-02-02 17:17:23 -07004511 err =
4512 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004513 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004514 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4515 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004516
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004517 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004518
Tobin Ehlisd332f282015-10-02 11:00:56 -06004519 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07004520 // First need to successfully create the PSO from above by setting
4521 // pViewports
4522 m_errorMonitor->SetDesiredFailureMsg(
4523 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4524 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
4525 "scissorCount is 1. These counts must match.");
4526
4527 VkViewport vp = {}; // Just need dummy vp to point to
4528 vp_state_ci.pViewports = &vp;
4529 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4530 &gp_ci, NULL, &pipeline);
4531 ASSERT_VK_SUCCESS(err);
4532 BeginCommandBuffer();
4533 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4534 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4535 VkRect2D scissors[2] = {}; // don't care about data
4536 // Count of 2 doesn't match PSO count of 1
4537 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
4538 Draw(1, 0, 0, 0);
4539
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004540 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004541
4542 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4543 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4544 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4545 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4546}
4547// Create PSO w/o non-zero scissorCount but no scissor data
4548// Then run second test where dynamic viewportCount doesn't match PSO
4549// viewportCount
4550TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
4551 VkResult err;
4552
4553 m_errorMonitor->SetDesiredFailureMsg(
4554 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4555 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
4556
4557 ASSERT_NO_FATAL_FAILURE(InitState());
4558 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4559
4560 VkDescriptorPoolSize ds_type_count = {};
4561 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4562 ds_type_count.descriptorCount = 1;
4563
4564 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4565 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4566 ds_pool_ci.maxSets = 1;
4567 ds_pool_ci.poolSizeCount = 1;
4568 ds_pool_ci.pPoolSizes = &ds_type_count;
4569
4570 VkDescriptorPool ds_pool;
4571 err =
4572 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4573 ASSERT_VK_SUCCESS(err);
4574
4575 VkDescriptorSetLayoutBinding dsl_binding = {};
4576 dsl_binding.binding = 0;
4577 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4578 dsl_binding.descriptorCount = 1;
4579 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4580
4581 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4582 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4583 ds_layout_ci.bindingCount = 1;
4584 ds_layout_ci.pBindings = &dsl_binding;
4585
4586 VkDescriptorSetLayout ds_layout;
4587 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4588 &ds_layout);
4589 ASSERT_VK_SUCCESS(err);
4590
4591 VkDescriptorSet descriptorSet;
4592 VkDescriptorSetAllocateInfo alloc_info = {};
4593 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4594 alloc_info.descriptorSetCount = 1;
4595 alloc_info.descriptorPool = ds_pool;
4596 alloc_info.pSetLayouts = &ds_layout;
4597 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4598 &descriptorSet);
4599 ASSERT_VK_SUCCESS(err);
4600
4601 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4602 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4603 pipeline_layout_ci.setLayoutCount = 1;
4604 pipeline_layout_ci.pSetLayouts = &ds_layout;
4605
4606 VkPipelineLayout pipeline_layout;
4607 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4608 &pipeline_layout);
4609 ASSERT_VK_SUCCESS(err);
4610
4611 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4612 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4613 vp_state_ci.scissorCount = 1;
4614 vp_state_ci.pScissors =
4615 NULL; // Null scissor w/ count of 1 should cause error
4616 vp_state_ci.viewportCount = 1;
4617 vp_state_ci.pViewports =
4618 NULL; // vp is dynamic (below) so this won't cause error
4619
4620 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
4621 // Set scissor as dynamic to avoid that error
4622 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4623 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4624 dyn_state_ci.dynamicStateCount = 1;
4625 dyn_state_ci.pDynamicStates = &vp_state;
4626
4627 VkPipelineShaderStageCreateInfo shaderStages[2];
4628 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4629
4630 VkShaderObj vs(m_device, bindStateVertShaderText,
4631 VK_SHADER_STAGE_VERTEX_BIT, this);
4632 VkShaderObj fs(m_device, bindStateFragShaderText,
4633 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004634 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004635 // but add it to be able to run on more devices
4636 shaderStages[0] = vs.GetStageCreateInfo();
4637 shaderStages[1] = fs.GetStageCreateInfo();
4638
4639 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4640 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4641 vi_ci.pNext = nullptr;
4642 vi_ci.vertexBindingDescriptionCount = 0;
4643 vi_ci.pVertexBindingDescriptions = nullptr;
4644 vi_ci.vertexAttributeDescriptionCount = 0;
4645 vi_ci.pVertexAttributeDescriptions = nullptr;
4646
4647 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4648 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4649 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4650
4651 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4652 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4653 rs_ci.pNext = nullptr;
4654
Mark Youngc89c6312016-03-31 16:03:20 -06004655 VkPipelineColorBlendAttachmentState att = {};
4656 att.blendEnable = VK_FALSE;
4657 att.colorWriteMask = 0xf;
4658
Karl Schultz6addd812016-02-02 17:17:23 -07004659 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4660 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4661 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004662 cb_ci.attachmentCount = 1;
4663 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07004664
4665 VkGraphicsPipelineCreateInfo gp_ci = {};
4666 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4667 gp_ci.stageCount = 2;
4668 gp_ci.pStages = shaderStages;
4669 gp_ci.pVertexInputState = &vi_ci;
4670 gp_ci.pInputAssemblyState = &ia_ci;
4671 gp_ci.pViewportState = &vp_state_ci;
4672 gp_ci.pRasterizationState = &rs_ci;
4673 gp_ci.pColorBlendState = &cb_ci;
4674 gp_ci.pDynamicState = &dyn_state_ci;
4675 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4676 gp_ci.layout = pipeline_layout;
4677 gp_ci.renderPass = renderPass();
4678
4679 VkPipelineCacheCreateInfo pc_ci = {};
4680 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4681
4682 VkPipeline pipeline;
4683 VkPipelineCache pipelineCache;
4684
4685 err =
4686 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4687 ASSERT_VK_SUCCESS(err);
4688 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4689 &gp_ci, NULL, &pipeline);
4690
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004691 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004692
4693 // Now hit second fail case where we set scissor w/ different count than PSO
4694 // First need to successfully create the PSO from above by setting
4695 // pViewports
4696 m_errorMonitor->SetDesiredFailureMsg(
4697 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4698 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
4699 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004700
Tobin Ehlisd332f282015-10-02 11:00:56 -06004701 VkRect2D sc = {}; // Just need dummy vp to point to
4702 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07004703 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4704 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004705 ASSERT_VK_SUCCESS(err);
4706 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004707 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4708 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004709 VkViewport viewports[2] = {}; // don't care about data
4710 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07004711 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004712 Draw(1, 0, 0, 0);
4713
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004714 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004715
Chia-I Wuf7458c52015-10-26 21:10:41 +08004716 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4717 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4718 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4719 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004720}
4721
Mark Young7394fdd2016-03-31 14:56:43 -06004722TEST_F(VkLayerTest, PSOLineWidthInvalid) {
4723 VkResult err;
4724
4725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004726 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004727
4728 ASSERT_NO_FATAL_FAILURE(InitState());
4729 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4730
4731 VkDescriptorPoolSize ds_type_count = {};
4732 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4733 ds_type_count.descriptorCount = 1;
4734
4735 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4736 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4737 ds_pool_ci.maxSets = 1;
4738 ds_pool_ci.poolSizeCount = 1;
4739 ds_pool_ci.pPoolSizes = &ds_type_count;
4740
4741 VkDescriptorPool ds_pool;
4742 err =
4743 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4744 ASSERT_VK_SUCCESS(err);
4745
4746 VkDescriptorSetLayoutBinding dsl_binding = {};
4747 dsl_binding.binding = 0;
4748 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4749 dsl_binding.descriptorCount = 1;
4750 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4751
4752 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4753 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4754 ds_layout_ci.bindingCount = 1;
4755 ds_layout_ci.pBindings = &dsl_binding;
4756
4757 VkDescriptorSetLayout ds_layout;
4758 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4759 &ds_layout);
4760 ASSERT_VK_SUCCESS(err);
4761
4762 VkDescriptorSet descriptorSet;
4763 VkDescriptorSetAllocateInfo alloc_info = {};
4764 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4765 alloc_info.descriptorSetCount = 1;
4766 alloc_info.descriptorPool = ds_pool;
4767 alloc_info.pSetLayouts = &ds_layout;
4768 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4769 &descriptorSet);
4770 ASSERT_VK_SUCCESS(err);
4771
4772 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4773 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4774 pipeline_layout_ci.setLayoutCount = 1;
4775 pipeline_layout_ci.pSetLayouts = &ds_layout;
4776
4777 VkPipelineLayout pipeline_layout;
4778 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4779 &pipeline_layout);
4780 ASSERT_VK_SUCCESS(err);
4781
4782 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4783 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4784 vp_state_ci.scissorCount = 1;
4785 vp_state_ci.pScissors = NULL;
4786 vp_state_ci.viewportCount = 1;
4787 vp_state_ci.pViewports = NULL;
4788
4789 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
4790 VK_DYNAMIC_STATE_SCISSOR,
4791 VK_DYNAMIC_STATE_LINE_WIDTH};
4792 // Set scissor as dynamic to avoid that error
4793 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4794 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4795 dyn_state_ci.dynamicStateCount = 2;
4796 dyn_state_ci.pDynamicStates = dynamic_states;
4797
4798 VkPipelineShaderStageCreateInfo shaderStages[2];
4799 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4800
4801 VkShaderObj vs(m_device, bindStateVertShaderText,
4802 VK_SHADER_STAGE_VERTEX_BIT, this);
4803 VkShaderObj fs(m_device, bindStateFragShaderText,
4804 VK_SHADER_STAGE_FRAGMENT_BIT,
4805 this); // TODO - We shouldn't need a fragment shader
4806 // but add it to be able to run on more devices
4807 shaderStages[0] = vs.GetStageCreateInfo();
4808 shaderStages[1] = fs.GetStageCreateInfo();
4809
4810 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4811 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4812 vi_ci.pNext = nullptr;
4813 vi_ci.vertexBindingDescriptionCount = 0;
4814 vi_ci.pVertexBindingDescriptions = nullptr;
4815 vi_ci.vertexAttributeDescriptionCount = 0;
4816 vi_ci.pVertexAttributeDescriptions = nullptr;
4817
4818 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4819 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4820 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4821
4822 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4823 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4824 rs_ci.pNext = nullptr;
4825
Mark Young47107952016-05-02 15:59:55 -06004826 // Check too low (line width of -1.0f).
4827 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06004828
4829 VkPipelineColorBlendAttachmentState att = {};
4830 att.blendEnable = VK_FALSE;
4831 att.colorWriteMask = 0xf;
4832
4833 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4834 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4835 cb_ci.pNext = nullptr;
4836 cb_ci.attachmentCount = 1;
4837 cb_ci.pAttachments = &att;
4838
4839 VkGraphicsPipelineCreateInfo gp_ci = {};
4840 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4841 gp_ci.stageCount = 2;
4842 gp_ci.pStages = shaderStages;
4843 gp_ci.pVertexInputState = &vi_ci;
4844 gp_ci.pInputAssemblyState = &ia_ci;
4845 gp_ci.pViewportState = &vp_state_ci;
4846 gp_ci.pRasterizationState = &rs_ci;
4847 gp_ci.pColorBlendState = &cb_ci;
4848 gp_ci.pDynamicState = &dyn_state_ci;
4849 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4850 gp_ci.layout = pipeline_layout;
4851 gp_ci.renderPass = renderPass();
4852
4853 VkPipelineCacheCreateInfo pc_ci = {};
4854 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4855
4856 VkPipeline pipeline;
4857 VkPipelineCache pipelineCache;
4858
4859 err =
4860 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4861 ASSERT_VK_SUCCESS(err);
4862 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4863 &gp_ci, NULL, &pipeline);
4864
4865 m_errorMonitor->VerifyFound();
4866
4867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4868 "Attempt to set lineWidth to 65536");
4869
4870 // Check too high (line width of 65536.0f).
4871 rs_ci.lineWidth = 65536.0f;
4872
4873 err =
4874 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4875 ASSERT_VK_SUCCESS(err);
4876 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4877 &gp_ci, NULL, &pipeline);
4878
4879 m_errorMonitor->VerifyFound();
4880
4881 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004882 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004883
4884 dyn_state_ci.dynamicStateCount = 3;
4885
4886 rs_ci.lineWidth = 1.0f;
4887
4888 err =
4889 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4890 ASSERT_VK_SUCCESS(err);
4891 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4892 &gp_ci, NULL, &pipeline);
4893 BeginCommandBuffer();
4894 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4895 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4896
4897 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06004898 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06004899 m_errorMonitor->VerifyFound();
4900
4901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4902 "Attempt to set lineWidth to 65536");
4903
4904 // Check too high with dynamic setting.
4905 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
4906 m_errorMonitor->VerifyFound();
4907 EndCommandBuffer();
4908
4909 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4910 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4911 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4912 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4913}
4914
Karl Schultz6addd812016-02-02 17:17:23 -07004915TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004916 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004917 m_errorMonitor->SetDesiredFailureMsg(
4918 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004919 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004920
4921 ASSERT_NO_FATAL_FAILURE(InitState());
4922 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004923
Tony Barbourfe3351b2015-07-28 10:17:20 -06004924 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004925 // Don't care about RenderPass handle b/c error should be flagged before
4926 // that
4927 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
4928 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004929
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004930 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004931}
4932
Karl Schultz6addd812016-02-02 17:17:23 -07004933TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004934 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004935 m_errorMonitor->SetDesiredFailureMsg(
4936 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004937 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004938
4939 ASSERT_NO_FATAL_FAILURE(InitState());
4940 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004941
Tony Barbourfe3351b2015-07-28 10:17:20 -06004942 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004943 // Just create a dummy Renderpass that's non-NULL so we can get to the
4944 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06004945 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004946 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4947 rp_begin.pNext = NULL;
4948 rp_begin.renderPass = renderPass();
4949 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004950
Karl Schultz6addd812016-02-02 17:17:23 -07004951 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
4952 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004953
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004954 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004955}
4956
Karl Schultz6addd812016-02-02 17:17:23 -07004957TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004958 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004959 m_errorMonitor->SetDesiredFailureMsg(
4960 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004961 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004962
4963 ASSERT_NO_FATAL_FAILURE(InitState());
4964 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004965
4966 // Renderpass is started here
4967 BeginCommandBuffer();
4968
4969 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004970 vk_testing::Buffer dstBuffer;
4971 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004972
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004973 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004974
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004975 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004976}
4977
Karl Schultz6addd812016-02-02 17:17:23 -07004978TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004979 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004980 m_errorMonitor->SetDesiredFailureMsg(
4981 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004982 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004983
4984 ASSERT_NO_FATAL_FAILURE(InitState());
4985 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004986
4987 // Renderpass is started here
4988 BeginCommandBuffer();
4989
4990 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004991 vk_testing::Buffer dstBuffer;
4992 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004993
Karl Schultz6addd812016-02-02 17:17:23 -07004994 VkDeviceSize dstOffset = 0;
4995 VkDeviceSize dataSize = 1024;
4996 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004997
Karl Schultz6addd812016-02-02 17:17:23 -07004998 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
4999 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005000
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005001 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005002}
5003
Karl Schultz6addd812016-02-02 17:17:23 -07005004TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005005 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005006 m_errorMonitor->SetDesiredFailureMsg(
5007 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005008 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005009
5010 ASSERT_NO_FATAL_FAILURE(InitState());
5011 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005012
5013 // Renderpass is started here
5014 BeginCommandBuffer();
5015
Michael Lentine0a369f62016-02-03 16:51:46 -06005016 VkClearColorValue clear_color;
5017 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07005018 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
5019 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5020 const int32_t tex_width = 32;
5021 const int32_t tex_height = 32;
5022 VkImageCreateInfo image_create_info = {};
5023 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5024 image_create_info.pNext = NULL;
5025 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5026 image_create_info.format = tex_format;
5027 image_create_info.extent.width = tex_width;
5028 image_create_info.extent.height = tex_height;
5029 image_create_info.extent.depth = 1;
5030 image_create_info.mipLevels = 1;
5031 image_create_info.arrayLayers = 1;
5032 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5033 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
5034 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005035
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005036 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07005037 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
5038 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005039
Karl Schultz6addd812016-02-02 17:17:23 -07005040 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
5041 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005042
Karl Schultz6addd812016-02-02 17:17:23 -07005043 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
5044 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005045
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005046 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005047}
5048
Karl Schultz6addd812016-02-02 17:17:23 -07005049TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005050 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005051 m_errorMonitor->SetDesiredFailureMsg(
5052 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005053 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005054
5055 ASSERT_NO_FATAL_FAILURE(InitState());
5056 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005057
5058 // Renderpass is started here
5059 BeginCommandBuffer();
5060
5061 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07005062 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005063 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
5064 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5065 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
5066 image_create_info.extent.width = 64;
5067 image_create_info.extent.height = 64;
5068 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5069 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005070
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005071 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07005072 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
5073 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005074
Karl Schultz6addd812016-02-02 17:17:23 -07005075 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
5076 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005077
Karl Schultz6addd812016-02-02 17:17:23 -07005078 vkCmdClearDepthStencilImage(
5079 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
5080 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
5081 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005082
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005083 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005084}
5085
Karl Schultz6addd812016-02-02 17:17:23 -07005086TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005087 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005088 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005089
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005091 "vkCmdClearAttachments: This call "
5092 "must be issued inside an active "
5093 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005094
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005095 ASSERT_NO_FATAL_FAILURE(InitState());
5096 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005097
5098 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005099 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005100 ASSERT_VK_SUCCESS(err);
5101
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005102 VkClearAttachment color_attachment;
5103 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5104 color_attachment.clearValue.color.float32[0] = 0;
5105 color_attachment.clearValue.color.float32[1] = 0;
5106 color_attachment.clearValue.color.float32[2] = 0;
5107 color_attachment.clearValue.color.float32[3] = 0;
5108 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005109 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
5110 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
5111 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005112
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005113 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005114}
5115
Karl Schultz9e66a292016-04-21 15:57:51 -06005116TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
5117 // Try to add a buffer memory barrier with no buffer.
5118 m_errorMonitor->SetDesiredFailureMsg(
5119 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5120 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
5121
5122 ASSERT_NO_FATAL_FAILURE(InitState());
5123 BeginCommandBuffer();
5124
5125 VkBufferMemoryBarrier buf_barrier = {};
5126 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5127 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5128 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5129 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5130 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5131 buf_barrier.buffer = VK_NULL_HANDLE;
5132 buf_barrier.offset = 0;
5133 buf_barrier.size = VK_WHOLE_SIZE;
5134 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5135 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
5136 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
5137
5138 m_errorMonitor->VerifyFound();
5139}
5140
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06005141TEST_F(VkLayerTest, InvalidBarriers) {
5142 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
5143
5144 m_errorMonitor->SetDesiredFailureMsg(
5145 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
5146
5147 ASSERT_NO_FATAL_FAILURE(InitState());
5148 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5149
5150 VkMemoryBarrier mem_barrier = {};
5151 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
5152 mem_barrier.pNext = NULL;
5153 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5154 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5155 BeginCommandBuffer();
5156 // BeginCommandBuffer() starts a render pass
5157 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5158 VK_PIPELINE_STAGE_HOST_BIT,
5159 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
5160 &mem_barrier, 0, nullptr, 0, nullptr);
5161 m_errorMonitor->VerifyFound();
5162
5163 m_errorMonitor->SetDesiredFailureMsg(
5164 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5165 "Image Layout cannot be transitioned to UNDEFINED");
5166 VkImageObj image(m_device);
5167 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
5168 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5169 ASSERT_TRUE(image.initialized());
5170 VkImageMemoryBarrier img_barrier = {};
5171 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
5172 img_barrier.pNext = NULL;
5173 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5174 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5175 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5176 // New layout can't be UNDEFINED
5177 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5178 img_barrier.image = image.handle();
5179 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5180 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5181 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5182 img_barrier.subresourceRange.baseArrayLayer = 0;
5183 img_barrier.subresourceRange.baseMipLevel = 0;
5184 img_barrier.subresourceRange.layerCount = 1;
5185 img_barrier.subresourceRange.levelCount = 1;
5186 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5187 VK_PIPELINE_STAGE_HOST_BIT,
5188 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5189 nullptr, 1, &img_barrier);
5190 m_errorMonitor->VerifyFound();
5191 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5192
5193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5194 "Subresource must have the sum of the "
5195 "baseArrayLayer");
5196 // baseArrayLayer + layerCount must be <= image's arrayLayers
5197 img_barrier.subresourceRange.baseArrayLayer = 1;
5198 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5199 VK_PIPELINE_STAGE_HOST_BIT,
5200 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5201 nullptr, 1, &img_barrier);
5202 m_errorMonitor->VerifyFound();
5203 img_barrier.subresourceRange.baseArrayLayer = 0;
5204
5205 m_errorMonitor->SetDesiredFailureMsg(
5206 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5207 "Subresource must have the sum of the baseMipLevel");
5208 // baseMipLevel + levelCount must be <= image's mipLevels
5209 img_barrier.subresourceRange.baseMipLevel = 1;
5210 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5211 VK_PIPELINE_STAGE_HOST_BIT,
5212 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5213 nullptr, 1, &img_barrier);
5214 m_errorMonitor->VerifyFound();
5215 img_barrier.subresourceRange.baseMipLevel = 0;
5216
5217 m_errorMonitor->SetDesiredFailureMsg(
5218 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5219 "Buffer Barriers cannot be used during a render pass");
5220 vk_testing::Buffer buffer;
5221 buffer.init(*m_device, 256);
5222 VkBufferMemoryBarrier buf_barrier = {};
5223 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5224 buf_barrier.pNext = NULL;
5225 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5226 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5227 buf_barrier.buffer = buffer.handle();
5228 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5229 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5230 buf_barrier.offset = 0;
5231 buf_barrier.size = VK_WHOLE_SIZE;
5232 // Can't send buffer barrier during a render pass
5233 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5234 VK_PIPELINE_STAGE_HOST_BIT,
5235 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5236 &buf_barrier, 0, nullptr);
5237 m_errorMonitor->VerifyFound();
5238 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
5239
5240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5241 "which is not less than total size");
5242 buf_barrier.offset = 257;
5243 // Offset greater than total size
5244 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5245 VK_PIPELINE_STAGE_HOST_BIT,
5246 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5247 &buf_barrier, 0, nullptr);
5248 m_errorMonitor->VerifyFound();
5249 buf_barrier.offset = 0;
5250
5251 m_errorMonitor->SetDesiredFailureMsg(
5252 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
5253 buf_barrier.size = 257;
5254 // Size greater than total size
5255 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5256 VK_PIPELINE_STAGE_HOST_BIT,
5257 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5258 &buf_barrier, 0, nullptr);
5259 m_errorMonitor->VerifyFound();
5260 buf_barrier.size = VK_WHOLE_SIZE;
5261
5262 m_errorMonitor->SetDesiredFailureMsg(
5263 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5264 "Image is a depth and stencil format and thus must "
5265 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
5266 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
5267 VkDepthStencilObj ds_image(m_device);
5268 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
5269 ASSERT_TRUE(ds_image.initialized());
5270 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5271 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
5272 img_barrier.image = ds_image.handle();
5273 // Leave aspectMask at COLOR on purpose
5274 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5275 VK_PIPELINE_STAGE_HOST_BIT,
5276 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5277 nullptr, 1, &img_barrier);
5278 m_errorMonitor->VerifyFound();
5279}
5280
Karl Schultz6addd812016-02-02 17:17:23 -07005281TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005282 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005283 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005284
Karl Schultz6addd812016-02-02 17:17:23 -07005285 m_errorMonitor->SetDesiredFailureMsg(
5286 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005287 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
5288
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005289 ASSERT_NO_FATAL_FAILURE(InitState());
5290 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005291 uint32_t qfi = 0;
5292 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005293 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5294 buffCI.size = 1024;
5295 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5296 buffCI.queueFamilyIndexCount = 1;
5297 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005298
5299 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005300 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005301 ASSERT_VK_SUCCESS(err);
5302
5303 BeginCommandBuffer();
5304 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005305 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5306 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005307 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07005308 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
5309 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005310
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005311 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005312
Chia-I Wuf7458c52015-10-26 21:10:41 +08005313 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005314}
5315
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005316TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
5317 // Create an out-of-range queueFamilyIndex
5318 m_errorMonitor->SetDesiredFailureMsg(
5319 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06005320 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005321
5322 ASSERT_NO_FATAL_FAILURE(InitState());
5323 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5324 VkBufferCreateInfo buffCI = {};
5325 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5326 buffCI.size = 1024;
5327 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5328 buffCI.queueFamilyIndexCount = 1;
5329 // Introduce failure by specifying invalid queue_family_index
5330 uint32_t qfi = 777;
5331 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06005332 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005333
5334 VkBuffer ib;
5335 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
5336
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005337 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005338}
5339
Karl Schultz6addd812016-02-02 17:17:23 -07005340TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
5341 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
5342 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005343
Karl Schultz6addd812016-02-02 17:17:23 -07005344 m_errorMonitor->SetDesiredFailureMsg(
5345 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005346 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005347
5348 ASSERT_NO_FATAL_FAILURE(InitState());
5349 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005350
5351 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005352 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005353 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
5354 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005355
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005356 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005357}
5358
Karl Schultz6addd812016-02-02 17:17:23 -07005359TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005360 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07005361 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005362
Karl Schultz6addd812016-02-02 17:17:23 -07005363 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005364 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5365 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
5366 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005367
Tobin Ehlis3b780662015-05-28 12:11:26 -06005368 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005369 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005370 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005371 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5372 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005373
5374 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005375 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5376 ds_pool_ci.pNext = NULL;
5377 ds_pool_ci.maxSets = 1;
5378 ds_pool_ci.poolSizeCount = 1;
5379 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005380
Tobin Ehlis3b780662015-05-28 12:11:26 -06005381 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005382 err =
5383 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005384 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005385 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005386 dsl_binding.binding = 0;
5387 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5388 dsl_binding.descriptorCount = 1;
5389 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5390 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005391
Tony Barboureb254902015-07-15 12:50:33 -06005392 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005393 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5394 ds_layout_ci.pNext = NULL;
5395 ds_layout_ci.bindingCount = 1;
5396 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005397
Tobin Ehlis3b780662015-05-28 12:11:26 -06005398 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005399 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5400 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005401 ASSERT_VK_SUCCESS(err);
5402
5403 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005404 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005405 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005406 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005407 alloc_info.descriptorPool = ds_pool;
5408 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005409 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5410 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005411 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005412
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005413 VkSamplerCreateInfo sampler_ci = {};
5414 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5415 sampler_ci.pNext = NULL;
5416 sampler_ci.magFilter = VK_FILTER_NEAREST;
5417 sampler_ci.minFilter = VK_FILTER_NEAREST;
5418 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5419 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5420 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5421 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5422 sampler_ci.mipLodBias = 1.0;
5423 sampler_ci.anisotropyEnable = VK_FALSE;
5424 sampler_ci.maxAnisotropy = 1;
5425 sampler_ci.compareEnable = VK_FALSE;
5426 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5427 sampler_ci.minLod = 1.0;
5428 sampler_ci.maxLod = 1.0;
5429 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5430 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5431 VkSampler sampler;
5432 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5433 ASSERT_VK_SUCCESS(err);
5434
5435 VkDescriptorImageInfo info = {};
5436 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005437
5438 VkWriteDescriptorSet descriptor_write;
5439 memset(&descriptor_write, 0, sizeof(descriptor_write));
5440 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005441 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005442 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005443 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005444 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005445 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005446
5447 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5448
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005449 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005450
Chia-I Wuf7458c52015-10-26 21:10:41 +08005451 vkDestroySampler(m_device->device(), sampler, NULL);
5452 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5453 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005454}
5455
Karl Schultz6addd812016-02-02 17:17:23 -07005456TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005457 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07005458 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005459
Karl Schultz6addd812016-02-02 17:17:23 -07005460 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005461 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5462 " binding #0 with 1 total descriptors but update of 1 descriptors "
5463 "starting at binding offset of 0 combined with update array element "
5464 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005465
Tobin Ehlis3b780662015-05-28 12:11:26 -06005466 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005467 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005468 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005469 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5470 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005471
5472 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005473 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5474 ds_pool_ci.pNext = NULL;
5475 ds_pool_ci.maxSets = 1;
5476 ds_pool_ci.poolSizeCount = 1;
5477 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005478
Tobin Ehlis3b780662015-05-28 12:11:26 -06005479 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005480 err =
5481 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005482 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005483
Tony Barboureb254902015-07-15 12:50:33 -06005484 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005485 dsl_binding.binding = 0;
5486 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5487 dsl_binding.descriptorCount = 1;
5488 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5489 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005490
5491 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005492 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5493 ds_layout_ci.pNext = NULL;
5494 ds_layout_ci.bindingCount = 1;
5495 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005496
Tobin Ehlis3b780662015-05-28 12:11:26 -06005497 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005498 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5499 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005500 ASSERT_VK_SUCCESS(err);
5501
5502 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005503 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005504 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005505 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005506 alloc_info.descriptorPool = ds_pool;
5507 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005508 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5509 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005510 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005511
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005512 // Correctly update descriptor to avoid "NOT_UPDATED" error
5513 VkDescriptorBufferInfo buff_info = {};
5514 buff_info.buffer =
5515 VkBuffer(0); // Don't care about buffer handle for this test
5516 buff_info.offset = 0;
5517 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005518
5519 VkWriteDescriptorSet descriptor_write;
5520 memset(&descriptor_write, 0, sizeof(descriptor_write));
5521 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005522 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005523 descriptor_write.dstArrayElement =
5524 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08005525 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005526 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5527 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005528
5529 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5530
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005531 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005532
Chia-I Wuf7458c52015-10-26 21:10:41 +08005533 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5534 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005535}
5536
Karl Schultz6addd812016-02-02 17:17:23 -07005537TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
5538 // Create layout w/ count of 1 and attempt update to that layout w/ binding
5539 // index 2
5540 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005541
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5543 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005544
Tobin Ehlis3b780662015-05-28 12:11:26 -06005545 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005546 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005547 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005548 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5549 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005550
5551 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005552 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5553 ds_pool_ci.pNext = NULL;
5554 ds_pool_ci.maxSets = 1;
5555 ds_pool_ci.poolSizeCount = 1;
5556 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005557
Tobin Ehlis3b780662015-05-28 12:11:26 -06005558 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005559 err =
5560 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005561 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005562
Tony Barboureb254902015-07-15 12:50:33 -06005563 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005564 dsl_binding.binding = 0;
5565 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5566 dsl_binding.descriptorCount = 1;
5567 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5568 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005569
5570 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005571 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5572 ds_layout_ci.pNext = NULL;
5573 ds_layout_ci.bindingCount = 1;
5574 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005575 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005576 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5577 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005578 ASSERT_VK_SUCCESS(err);
5579
5580 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005581 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005582 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005583 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005584 alloc_info.descriptorPool = ds_pool;
5585 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005586 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5587 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005588 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005589
Tony Barboureb254902015-07-15 12:50:33 -06005590 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005591 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5592 sampler_ci.pNext = NULL;
5593 sampler_ci.magFilter = VK_FILTER_NEAREST;
5594 sampler_ci.minFilter = VK_FILTER_NEAREST;
5595 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5596 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5597 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5598 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5599 sampler_ci.mipLodBias = 1.0;
5600 sampler_ci.anisotropyEnable = VK_FALSE;
5601 sampler_ci.maxAnisotropy = 1;
5602 sampler_ci.compareEnable = VK_FALSE;
5603 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5604 sampler_ci.minLod = 1.0;
5605 sampler_ci.maxLod = 1.0;
5606 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5607 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005608
Tobin Ehlis3b780662015-05-28 12:11:26 -06005609 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005610 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005611 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005612
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005613 VkDescriptorImageInfo info = {};
5614 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005615
5616 VkWriteDescriptorSet descriptor_write;
5617 memset(&descriptor_write, 0, sizeof(descriptor_write));
5618 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005619 descriptor_write.dstSet = descriptorSet;
5620 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005621 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005622 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005623 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005624 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005625
5626 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5627
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005628 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005629
Chia-I Wuf7458c52015-10-26 21:10:41 +08005630 vkDestroySampler(m_device->device(), sampler, NULL);
5631 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5632 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005633}
5634
Karl Schultz6addd812016-02-02 17:17:23 -07005635TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
5636 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
5637 // types
5638 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005639
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005640 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005641 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005642
Tobin Ehlis3b780662015-05-28 12:11:26 -06005643 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005644
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005645 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005646 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5647 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005648
5649 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005650 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5651 ds_pool_ci.pNext = NULL;
5652 ds_pool_ci.maxSets = 1;
5653 ds_pool_ci.poolSizeCount = 1;
5654 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005655
Tobin Ehlis3b780662015-05-28 12:11:26 -06005656 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005657 err =
5658 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005659 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005660 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005661 dsl_binding.binding = 0;
5662 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5663 dsl_binding.descriptorCount = 1;
5664 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5665 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005666
Tony Barboureb254902015-07-15 12:50:33 -06005667 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005668 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5669 ds_layout_ci.pNext = NULL;
5670 ds_layout_ci.bindingCount = 1;
5671 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005672
Tobin Ehlis3b780662015-05-28 12:11:26 -06005673 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005674 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5675 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005676 ASSERT_VK_SUCCESS(err);
5677
5678 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005679 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005680 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005681 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005682 alloc_info.descriptorPool = ds_pool;
5683 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005684 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5685 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005686 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005687
Tony Barboureb254902015-07-15 12:50:33 -06005688 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005689 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5690 sampler_ci.pNext = NULL;
5691 sampler_ci.magFilter = VK_FILTER_NEAREST;
5692 sampler_ci.minFilter = VK_FILTER_NEAREST;
5693 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5694 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5695 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5696 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5697 sampler_ci.mipLodBias = 1.0;
5698 sampler_ci.anisotropyEnable = VK_FALSE;
5699 sampler_ci.maxAnisotropy = 1;
5700 sampler_ci.compareEnable = VK_FALSE;
5701 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5702 sampler_ci.minLod = 1.0;
5703 sampler_ci.maxLod = 1.0;
5704 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5705 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005706 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005707 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005708 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005709
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005710 VkDescriptorImageInfo info = {};
5711 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005712
5713 VkWriteDescriptorSet descriptor_write;
5714 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07005715 descriptor_write.sType =
5716 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005717 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005718 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005719 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005720 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005721 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005722
5723 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5724
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005725 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005726
Chia-I Wuf7458c52015-10-26 21:10:41 +08005727 vkDestroySampler(m_device->device(), sampler, NULL);
5728 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5729 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005730}
5731
Karl Schultz6addd812016-02-02 17:17:23 -07005732TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005733 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07005734 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005735
Karl Schultz6addd812016-02-02 17:17:23 -07005736 m_errorMonitor->SetDesiredFailureMsg(
5737 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005738 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005739
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005740 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005741 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
5742 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005743 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005744 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
5745 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005746
5747 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005748 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5749 ds_pool_ci.pNext = NULL;
5750 ds_pool_ci.maxSets = 1;
5751 ds_pool_ci.poolSizeCount = 1;
5752 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005753
5754 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005755 err =
5756 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005757 ASSERT_VK_SUCCESS(err);
5758
5759 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005760 dsl_binding.binding = 0;
5761 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5762 dsl_binding.descriptorCount = 1;
5763 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5764 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005765
5766 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005767 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5768 ds_layout_ci.pNext = NULL;
5769 ds_layout_ci.bindingCount = 1;
5770 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005771 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005772 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5773 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005774 ASSERT_VK_SUCCESS(err);
5775
5776 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005777 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005778 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005779 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005780 alloc_info.descriptorPool = ds_pool;
5781 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005782 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5783 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005784 ASSERT_VK_SUCCESS(err);
5785
Karl Schultz6addd812016-02-02 17:17:23 -07005786 VkSampler sampler =
5787 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005788
5789 VkDescriptorImageInfo descriptor_info;
5790 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5791 descriptor_info.sampler = sampler;
5792
5793 VkWriteDescriptorSet descriptor_write;
5794 memset(&descriptor_write, 0, sizeof(descriptor_write));
5795 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005796 descriptor_write.dstSet = descriptorSet;
5797 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005798 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005799 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5800 descriptor_write.pImageInfo = &descriptor_info;
5801
5802 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5803
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005804 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005805
Chia-I Wuf7458c52015-10-26 21:10:41 +08005806 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5807 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005808}
5809
Karl Schultz6addd812016-02-02 17:17:23 -07005810TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
5811 // Create a single combined Image/Sampler descriptor and send it an invalid
5812 // imageView
5813 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005814
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005815 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5816 "Attempted write update to combined "
5817 "image sampler descriptor failed due "
5818 "to: Invalid VkImageView: 0xbaadbeef");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005819
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005820 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005821 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005822 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5823 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005824
5825 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005826 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5827 ds_pool_ci.pNext = NULL;
5828 ds_pool_ci.maxSets = 1;
5829 ds_pool_ci.poolSizeCount = 1;
5830 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005831
5832 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005833 err =
5834 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005835 ASSERT_VK_SUCCESS(err);
5836
5837 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005838 dsl_binding.binding = 0;
5839 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5840 dsl_binding.descriptorCount = 1;
5841 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5842 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005843
5844 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005845 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5846 ds_layout_ci.pNext = NULL;
5847 ds_layout_ci.bindingCount = 1;
5848 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005849 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005850 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5851 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005852 ASSERT_VK_SUCCESS(err);
5853
5854 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005855 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005856 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005857 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005858 alloc_info.descriptorPool = ds_pool;
5859 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005860 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5861 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005862 ASSERT_VK_SUCCESS(err);
5863
5864 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005865 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5866 sampler_ci.pNext = NULL;
5867 sampler_ci.magFilter = VK_FILTER_NEAREST;
5868 sampler_ci.minFilter = VK_FILTER_NEAREST;
5869 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5870 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5871 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5872 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5873 sampler_ci.mipLodBias = 1.0;
5874 sampler_ci.anisotropyEnable = VK_FALSE;
5875 sampler_ci.maxAnisotropy = 1;
5876 sampler_ci.compareEnable = VK_FALSE;
5877 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5878 sampler_ci.minLod = 1.0;
5879 sampler_ci.maxLod = 1.0;
5880 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5881 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005882
5883 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005884 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005885 ASSERT_VK_SUCCESS(err);
5886
Karl Schultz6addd812016-02-02 17:17:23 -07005887 VkImageView view =
5888 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005889
5890 VkDescriptorImageInfo descriptor_info;
5891 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5892 descriptor_info.sampler = sampler;
5893 descriptor_info.imageView = view;
5894
5895 VkWriteDescriptorSet descriptor_write;
5896 memset(&descriptor_write, 0, sizeof(descriptor_write));
5897 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005898 descriptor_write.dstSet = descriptorSet;
5899 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005900 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005901 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5902 descriptor_write.pImageInfo = &descriptor_info;
5903
5904 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5905
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005906 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005907
Chia-I Wuf7458c52015-10-26 21:10:41 +08005908 vkDestroySampler(m_device->device(), sampler, NULL);
5909 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5910 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005911}
5912
Karl Schultz6addd812016-02-02 17:17:23 -07005913TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
5914 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
5915 // into the other
5916 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005917
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5919 " binding #1 with type "
5920 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
5921 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005922
Tobin Ehlis04356f92015-10-27 16:35:27 -06005923 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005924 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005925 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005926 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5927 ds_type_count[0].descriptorCount = 1;
5928 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
5929 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005930
5931 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005932 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5933 ds_pool_ci.pNext = NULL;
5934 ds_pool_ci.maxSets = 1;
5935 ds_pool_ci.poolSizeCount = 2;
5936 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005937
5938 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005939 err =
5940 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005941 ASSERT_VK_SUCCESS(err);
5942 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005943 dsl_binding[0].binding = 0;
5944 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5945 dsl_binding[0].descriptorCount = 1;
5946 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
5947 dsl_binding[0].pImmutableSamplers = NULL;
5948 dsl_binding[1].binding = 1;
5949 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5950 dsl_binding[1].descriptorCount = 1;
5951 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
5952 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005953
5954 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005955 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5956 ds_layout_ci.pNext = NULL;
5957 ds_layout_ci.bindingCount = 2;
5958 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005959
5960 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005961 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5962 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005963 ASSERT_VK_SUCCESS(err);
5964
5965 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005966 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005967 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005968 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005969 alloc_info.descriptorPool = ds_pool;
5970 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005971 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5972 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005973 ASSERT_VK_SUCCESS(err);
5974
5975 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005976 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5977 sampler_ci.pNext = NULL;
5978 sampler_ci.magFilter = VK_FILTER_NEAREST;
5979 sampler_ci.minFilter = VK_FILTER_NEAREST;
5980 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5981 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5982 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5983 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5984 sampler_ci.mipLodBias = 1.0;
5985 sampler_ci.anisotropyEnable = VK_FALSE;
5986 sampler_ci.maxAnisotropy = 1;
5987 sampler_ci.compareEnable = VK_FALSE;
5988 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5989 sampler_ci.minLod = 1.0;
5990 sampler_ci.maxLod = 1.0;
5991 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5992 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005993
5994 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005995 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005996 ASSERT_VK_SUCCESS(err);
5997
5998 VkDescriptorImageInfo info = {};
5999 info.sampler = sampler;
6000
6001 VkWriteDescriptorSet descriptor_write;
6002 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
6003 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006004 descriptor_write.dstSet = descriptorSet;
6005 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08006006 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006007 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6008 descriptor_write.pImageInfo = &info;
6009 // This write update should succeed
6010 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6011 // Now perform a copy update that fails due to type mismatch
6012 VkCopyDescriptorSet copy_ds_update;
6013 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6014 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6015 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -06006016 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006017 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006018 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08006019 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06006020 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6021
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006022 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06006023 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006024 m_errorMonitor->SetDesiredFailureMsg(
6025 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006026 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -06006027 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6028 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6029 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006030 copy_ds_update.srcBinding =
6031 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006032 copy_ds_update.dstSet = descriptorSet;
6033 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -06006034 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06006035 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6036
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006037 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006038
Tobin Ehlis04356f92015-10-27 16:35:27 -06006039 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006040 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006041 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
6042 "update array offset of 0 and update of "
6043 "5 descriptors oversteps total number "
6044 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006045
Tobin Ehlis04356f92015-10-27 16:35:27 -06006046 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6047 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6048 copy_ds_update.srcSet = descriptorSet;
6049 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006050 copy_ds_update.dstSet = descriptorSet;
6051 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006052 copy_ds_update.descriptorCount =
6053 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06006054 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6055
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006056 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06006057
Chia-I Wuf7458c52015-10-26 21:10:41 +08006058 vkDestroySampler(m_device->device(), sampler, NULL);
6059 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6060 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006061}
6062
Karl Schultz6addd812016-02-02 17:17:23 -07006063TEST_F(VkLayerTest, NumSamplesMismatch) {
6064 // Create CommandBuffer where MSAA samples doesn't match RenderPass
6065 // sampleCount
6066 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006067
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006068 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006069 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006070
Tobin Ehlis3b780662015-05-28 12:11:26 -06006071 ASSERT_NO_FATAL_FAILURE(InitState());
6072 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006073 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06006074 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006075 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006076
6077 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006078 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6079 ds_pool_ci.pNext = NULL;
6080 ds_pool_ci.maxSets = 1;
6081 ds_pool_ci.poolSizeCount = 1;
6082 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006083
Tobin Ehlis3b780662015-05-28 12:11:26 -06006084 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006085 err =
6086 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006087 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006088
Tony Barboureb254902015-07-15 12:50:33 -06006089 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08006090 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06006091 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08006092 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006093 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6094 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006095
Tony Barboureb254902015-07-15 12:50:33 -06006096 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6097 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6098 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006099 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006100 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006101
Tobin Ehlis3b780662015-05-28 12:11:26 -06006102 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006103 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6104 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006105 ASSERT_VK_SUCCESS(err);
6106
6107 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006108 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006109 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006110 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006111 alloc_info.descriptorPool = ds_pool;
6112 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006113 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6114 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006115 ASSERT_VK_SUCCESS(err);
6116
Tony Barboureb254902015-07-15 12:50:33 -06006117 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006118 pipe_ms_state_ci.sType =
6119 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6120 pipe_ms_state_ci.pNext = NULL;
6121 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6122 pipe_ms_state_ci.sampleShadingEnable = 0;
6123 pipe_ms_state_ci.minSampleShading = 1.0;
6124 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006125
Tony Barboureb254902015-07-15 12:50:33 -06006126 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006127 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6128 pipeline_layout_ci.pNext = NULL;
6129 pipeline_layout_ci.setLayoutCount = 1;
6130 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006131
6132 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006133 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6134 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006135 ASSERT_VK_SUCCESS(err);
6136
Karl Schultz6addd812016-02-02 17:17:23 -07006137 VkShaderObj vs(m_device, bindStateVertShaderText,
6138 VK_SHADER_STAGE_VERTEX_BIT, this);
6139 VkShaderObj fs(m_device, bindStateFragShaderText,
6140 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006141 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006142 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006143 VkPipelineObj pipe(m_device);
6144 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006145 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006146 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006147 pipe.SetMSAA(&pipe_ms_state_ci);
6148 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06006149
Tony Barbourfe3351b2015-07-28 10:17:20 -06006150 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006151 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6152 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06006153
Mark Young29927482016-05-04 14:38:51 -06006154 // Render triangle (the error should trigger on the attempt to draw).
6155 Draw(3, 1, 0, 0);
6156
6157 // Finalize recording of the command buffer
6158 EndCommandBuffer();
6159
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006160 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006161
Chia-I Wuf7458c52015-10-26 21:10:41 +08006162 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6163 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6164 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006165}
Mark Young29927482016-05-04 14:38:51 -06006166
Mark Youngc89c6312016-03-31 16:03:20 -06006167TEST_F(VkLayerTest, NumBlendAttachMismatch) {
6168 // Create Pipeline where the number of blend attachments doesn't match the
6169 // number of color attachments. In this case, we don't add any color
6170 // blend attachments even though we have a color attachment.
6171 VkResult err;
6172
6173 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -06006174 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -06006175
6176 ASSERT_NO_FATAL_FAILURE(InitState());
6177 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6178 VkDescriptorPoolSize ds_type_count = {};
6179 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6180 ds_type_count.descriptorCount = 1;
6181
6182 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6183 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6184 ds_pool_ci.pNext = NULL;
6185 ds_pool_ci.maxSets = 1;
6186 ds_pool_ci.poolSizeCount = 1;
6187 ds_pool_ci.pPoolSizes = &ds_type_count;
6188
6189 VkDescriptorPool ds_pool;
6190 err =
6191 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6192 ASSERT_VK_SUCCESS(err);
6193
6194 VkDescriptorSetLayoutBinding dsl_binding = {};
6195 dsl_binding.binding = 0;
6196 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6197 dsl_binding.descriptorCount = 1;
6198 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6199 dsl_binding.pImmutableSamplers = NULL;
6200
6201 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6202 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6203 ds_layout_ci.pNext = NULL;
6204 ds_layout_ci.bindingCount = 1;
6205 ds_layout_ci.pBindings = &dsl_binding;
6206
6207 VkDescriptorSetLayout ds_layout;
6208 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6209 &ds_layout);
6210 ASSERT_VK_SUCCESS(err);
6211
6212 VkDescriptorSet descriptorSet;
6213 VkDescriptorSetAllocateInfo alloc_info = {};
6214 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6215 alloc_info.descriptorSetCount = 1;
6216 alloc_info.descriptorPool = ds_pool;
6217 alloc_info.pSetLayouts = &ds_layout;
6218 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6219 &descriptorSet);
6220 ASSERT_VK_SUCCESS(err);
6221
6222 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
6223 pipe_ms_state_ci.sType =
6224 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6225 pipe_ms_state_ci.pNext = NULL;
6226 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6227 pipe_ms_state_ci.sampleShadingEnable = 0;
6228 pipe_ms_state_ci.minSampleShading = 1.0;
6229 pipe_ms_state_ci.pSampleMask = NULL;
6230
6231 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6232 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6233 pipeline_layout_ci.pNext = NULL;
6234 pipeline_layout_ci.setLayoutCount = 1;
6235 pipeline_layout_ci.pSetLayouts = &ds_layout;
6236
6237 VkPipelineLayout pipeline_layout;
6238 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6239 &pipeline_layout);
6240 ASSERT_VK_SUCCESS(err);
6241
6242 VkShaderObj vs(m_device, bindStateVertShaderText,
6243 VK_SHADER_STAGE_VERTEX_BIT, this);
6244 VkShaderObj fs(m_device, bindStateFragShaderText,
6245 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006246 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06006247 // but add it to be able to run on more devices
6248 VkPipelineObj pipe(m_device);
6249 pipe.AddShader(&vs);
6250 pipe.AddShader(&fs);
6251 pipe.SetMSAA(&pipe_ms_state_ci);
6252 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6253
6254 BeginCommandBuffer();
6255 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6256 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6257
Mark Young29927482016-05-04 14:38:51 -06006258 // Render triangle (the error should trigger on the attempt to draw).
6259 Draw(3, 1, 0, 0);
6260
6261 // Finalize recording of the command buffer
6262 EndCommandBuffer();
6263
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006264 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06006265
6266 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6267 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6268 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6269}
Mark Young29927482016-05-04 14:38:51 -06006270
Karl Schultz6addd812016-02-02 17:17:23 -07006271TEST_F(VkLayerTest, ClearCmdNoDraw) {
6272 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
6273 // to issuing a Draw
6274 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006275
Karl Schultz6addd812016-02-02 17:17:23 -07006276 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07006277 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006278 "vkCmdClearAttachments() issued on CB object ");
6279
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006280 ASSERT_NO_FATAL_FAILURE(InitState());
6281 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006282
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006283 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006284 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6285 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006286
6287 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006288 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6289 ds_pool_ci.pNext = NULL;
6290 ds_pool_ci.maxSets = 1;
6291 ds_pool_ci.poolSizeCount = 1;
6292 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006293
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006294 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006295 err =
6296 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006297 ASSERT_VK_SUCCESS(err);
6298
Tony Barboureb254902015-07-15 12:50:33 -06006299 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006300 dsl_binding.binding = 0;
6301 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6302 dsl_binding.descriptorCount = 1;
6303 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6304 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006305
Tony Barboureb254902015-07-15 12:50:33 -06006306 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006307 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6308 ds_layout_ci.pNext = NULL;
6309 ds_layout_ci.bindingCount = 1;
6310 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006311
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006312 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006313 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6314 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006315 ASSERT_VK_SUCCESS(err);
6316
6317 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006318 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006319 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006320 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006321 alloc_info.descriptorPool = ds_pool;
6322 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006323 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6324 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006325 ASSERT_VK_SUCCESS(err);
6326
Tony Barboureb254902015-07-15 12:50:33 -06006327 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006328 pipe_ms_state_ci.sType =
6329 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6330 pipe_ms_state_ci.pNext = NULL;
6331 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6332 pipe_ms_state_ci.sampleShadingEnable = 0;
6333 pipe_ms_state_ci.minSampleShading = 1.0;
6334 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006335
Tony Barboureb254902015-07-15 12:50:33 -06006336 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006337 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6338 pipeline_layout_ci.pNext = NULL;
6339 pipeline_layout_ci.setLayoutCount = 1;
6340 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006341
6342 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006343 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6344 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006345 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006346
Karl Schultz6addd812016-02-02 17:17:23 -07006347 VkShaderObj vs(m_device, bindStateVertShaderText,
6348 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006349 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006350 // on more devices
6351 VkShaderObj fs(m_device, bindStateFragShaderText,
6352 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006353
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006354 VkPipelineObj pipe(m_device);
6355 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006356 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006357 pipe.SetMSAA(&pipe_ms_state_ci);
6358 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006359
6360 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006361
Karl Schultz6addd812016-02-02 17:17:23 -07006362 // Main thing we care about for this test is that the VkImage obj we're
6363 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006364 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06006365 VkClearAttachment color_attachment;
6366 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6367 color_attachment.clearValue.color.float32[0] = 1.0;
6368 color_attachment.clearValue.color.float32[1] = 1.0;
6369 color_attachment.clearValue.color.float32[2] = 1.0;
6370 color_attachment.clearValue.color.float32[3] = 1.0;
6371 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006372 VkClearRect clear_rect = {
6373 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006374
Karl Schultz6addd812016-02-02 17:17:23 -07006375 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
6376 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006377
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006378 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006379
Chia-I Wuf7458c52015-10-26 21:10:41 +08006380 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6381 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6382 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006383}
6384
Karl Schultz6addd812016-02-02 17:17:23 -07006385TEST_F(VkLayerTest, VtxBufferBadIndex) {
6386 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006387
Karl Schultz6addd812016-02-02 17:17:23 -07006388 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006389 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07006390 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006391
Tobin Ehlis502480b2015-06-24 15:53:07 -06006392 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06006393 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06006394 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006395
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006396 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006397 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6398 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006399
6400 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006401 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6402 ds_pool_ci.pNext = NULL;
6403 ds_pool_ci.maxSets = 1;
6404 ds_pool_ci.poolSizeCount = 1;
6405 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006406
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006407 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006408 err =
6409 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006410 ASSERT_VK_SUCCESS(err);
6411
Tony Barboureb254902015-07-15 12:50:33 -06006412 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006413 dsl_binding.binding = 0;
6414 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6415 dsl_binding.descriptorCount = 1;
6416 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6417 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006418
Tony Barboureb254902015-07-15 12:50:33 -06006419 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006420 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6421 ds_layout_ci.pNext = NULL;
6422 ds_layout_ci.bindingCount = 1;
6423 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006424
Tobin Ehlis502480b2015-06-24 15:53:07 -06006425 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006426 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6427 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006428 ASSERT_VK_SUCCESS(err);
6429
6430 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006431 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006432 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006433 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006434 alloc_info.descriptorPool = ds_pool;
6435 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006436 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6437 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006438 ASSERT_VK_SUCCESS(err);
6439
Tony Barboureb254902015-07-15 12:50:33 -06006440 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006441 pipe_ms_state_ci.sType =
6442 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6443 pipe_ms_state_ci.pNext = NULL;
6444 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6445 pipe_ms_state_ci.sampleShadingEnable = 0;
6446 pipe_ms_state_ci.minSampleShading = 1.0;
6447 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006448
Tony Barboureb254902015-07-15 12:50:33 -06006449 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006450 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6451 pipeline_layout_ci.pNext = NULL;
6452 pipeline_layout_ci.setLayoutCount = 1;
6453 pipeline_layout_ci.pSetLayouts = &ds_layout;
6454 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006455
Karl Schultz6addd812016-02-02 17:17:23 -07006456 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6457 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006458 ASSERT_VK_SUCCESS(err);
6459
Karl Schultz6addd812016-02-02 17:17:23 -07006460 VkShaderObj vs(m_device, bindStateVertShaderText,
6461 VK_SHADER_STAGE_VERTEX_BIT, this);
6462 VkShaderObj fs(m_device, bindStateFragShaderText,
6463 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006464 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006465 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006466 VkPipelineObj pipe(m_device);
6467 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006468 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006469 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006470 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006471 pipe.SetViewport(m_viewports);
6472 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006473 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006474
6475 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006476 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6477 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006478 // Don't care about actual data, just need to get to draw to flag error
6479 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07006480 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
6481 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006482 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06006483 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006484
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006485 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006486
Chia-I Wuf7458c52015-10-26 21:10:41 +08006487 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6488 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6489 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006490}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006491#endif // DRAW_STATE_TESTS
6492
Tobin Ehlis0788f522015-05-26 16:11:58 -06006493#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06006494#if GTEST_IS_THREADSAFE
6495struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006496 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006497 VkEvent event;
6498 bool bailout;
6499};
6500
Karl Schultz6addd812016-02-02 17:17:23 -07006501extern "C" void *AddToCommandBuffer(void *arg) {
6502 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006503
Karl Schultz6addd812016-02-02 17:17:23 -07006504 for (int i = 0; i < 10000; i++) {
6505 vkCmdSetEvent(data->commandBuffer, data->event,
6506 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006507 if (data->bailout) {
6508 break;
6509 }
6510 }
6511 return NULL;
6512}
6513
Karl Schultz6addd812016-02-02 17:17:23 -07006514TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006515 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006516
Karl Schultz6addd812016-02-02 17:17:23 -07006517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6518 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006519
Mike Stroyanaccf7692015-05-12 16:00:45 -06006520 ASSERT_NO_FATAL_FAILURE(InitState());
6521 ASSERT_NO_FATAL_FAILURE(InitViewport());
6522 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6523
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006524 // Calls AllocateCommandBuffers
6525 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006526
6527 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006528 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006529
6530 VkEventCreateInfo event_info;
6531 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006532 VkResult err;
6533
6534 memset(&event_info, 0, sizeof(event_info));
6535 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
6536
Chia-I Wuf7458c52015-10-26 21:10:41 +08006537 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006538 ASSERT_VK_SUCCESS(err);
6539
Mike Stroyanaccf7692015-05-12 16:00:45 -06006540 err = vkResetEvent(device(), event);
6541 ASSERT_VK_SUCCESS(err);
6542
6543 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006544 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006545 data.event = event;
6546 data.bailout = false;
6547 m_errorMonitor->SetBailout(&data.bailout);
6548 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006549 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006550 // Add many entries to command buffer from this thread at the same time.
6551 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006552
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006553 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006554 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006555
Mike Stroyan10b8cb72016-01-22 15:22:03 -07006556 m_errorMonitor->SetBailout(NULL);
6557
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006558 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006559
Chia-I Wuf7458c52015-10-26 21:10:41 +08006560 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006561}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006562#endif // GTEST_IS_THREADSAFE
6563#endif // THREADING_TESTS
6564
Chris Forbes9f7ff632015-05-25 11:13:08 +12006565#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006566TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006567 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006568 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006569
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006570 ASSERT_NO_FATAL_FAILURE(InitState());
6571 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6572
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006573 VkShaderModule module;
6574 VkShaderModuleCreateInfo moduleCreateInfo;
6575 struct icd_spv_header spv;
6576
6577 spv.magic = ICD_SPV_MAGIC;
6578 spv.version = ICD_SPV_VERSION;
6579 spv.gen_magic = 0;
6580
6581 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6582 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006583 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006584 moduleCreateInfo.codeSize = 4;
6585 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006586 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006587
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006588 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006589}
6590
Karl Schultz6addd812016-02-02 17:17:23 -07006591TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006592 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006593 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006594
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006595 ASSERT_NO_FATAL_FAILURE(InitState());
6596 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6597
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006598 VkShaderModule module;
6599 VkShaderModuleCreateInfo moduleCreateInfo;
6600 struct icd_spv_header spv;
6601
6602 spv.magic = ~ICD_SPV_MAGIC;
6603 spv.version = ICD_SPV_VERSION;
6604 spv.gen_magic = 0;
6605
6606 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6607 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006608 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006609 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6610 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006611 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006612
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006613 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006614}
6615
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006616#if 0
6617// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07006618TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006620 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006621
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006622 ASSERT_NO_FATAL_FAILURE(InitState());
6623 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6624
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006625 VkShaderModule module;
6626 VkShaderModuleCreateInfo moduleCreateInfo;
6627 struct icd_spv_header spv;
6628
6629 spv.magic = ICD_SPV_MAGIC;
6630 spv.version = ~ICD_SPV_VERSION;
6631 spv.gen_magic = 0;
6632
6633 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6634 moduleCreateInfo.pNext = NULL;
6635
Karl Schultz6addd812016-02-02 17:17:23 -07006636 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006637 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6638 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006639 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006640
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006641 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006642}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006643#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006644
Karl Schultz6addd812016-02-02 17:17:23 -07006645TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006647 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006648
Chris Forbes9f7ff632015-05-25 11:13:08 +12006649 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006650 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006651
6652 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006653 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006654 "\n"
6655 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006656 "out gl_PerVertex {\n"
6657 " vec4 gl_Position;\n"
6658 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006659 "void main(){\n"
6660 " gl_Position = vec4(1);\n"
6661 " x = 0;\n"
6662 "}\n";
6663 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006664 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006665 "\n"
6666 "layout(location=0) out vec4 color;\n"
6667 "void main(){\n"
6668 " color = vec4(1);\n"
6669 "}\n";
6670
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006671 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6672 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006673
6674 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006675 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006676 pipe.AddShader(&vs);
6677 pipe.AddShader(&fs);
6678
Chris Forbes9f7ff632015-05-25 11:13:08 +12006679 VkDescriptorSetObj descriptorSet(m_device);
6680 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006681 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006682
Tony Barbour5781e8f2015-08-04 16:23:11 -06006683 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006684
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006685 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006686}
Chris Forbes9f7ff632015-05-25 11:13:08 +12006687
Karl Schultz6addd812016-02-02 17:17:23 -07006688TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006690 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006691
Chris Forbes59cb88d2015-05-25 11:13:13 +12006692 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006693 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006694
6695 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006696 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006697 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006698 "out gl_PerVertex {\n"
6699 " vec4 gl_Position;\n"
6700 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006701 "void main(){\n"
6702 " gl_Position = vec4(1);\n"
6703 "}\n";
6704 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006705 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006706 "\n"
6707 "layout(location=0) in float x;\n"
6708 "layout(location=0) out vec4 color;\n"
6709 "void main(){\n"
6710 " color = vec4(x);\n"
6711 "}\n";
6712
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006713 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6714 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006715
6716 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006717 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006718 pipe.AddShader(&vs);
6719 pipe.AddShader(&fs);
6720
Chris Forbes59cb88d2015-05-25 11:13:13 +12006721 VkDescriptorSetObj descriptorSet(m_device);
6722 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006723 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006724
Tony Barbour5781e8f2015-08-04 16:23:11 -06006725 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006726
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006727 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006728}
6729
Karl Schultz6addd812016-02-02 17:17:23 -07006730TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006732 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006733
6734 ASSERT_NO_FATAL_FAILURE(InitState());
6735 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6736
6737 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006738 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006739 "\n"
6740 "out gl_PerVertex {\n"
6741 " vec4 gl_Position;\n"
6742 "};\n"
6743 "void main(){\n"
6744 " gl_Position = vec4(1);\n"
6745 "}\n";
6746 char const *fsSource =
6747 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006748 "\n"
6749 "in block { layout(location=0) float x; } ins;\n"
6750 "layout(location=0) out vec4 color;\n"
6751 "void main(){\n"
6752 " color = vec4(ins.x);\n"
6753 "}\n";
6754
6755 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6756 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6757
6758 VkPipelineObj pipe(m_device);
6759 pipe.AddColorAttachment();
6760 pipe.AddShader(&vs);
6761 pipe.AddShader(&fs);
6762
6763 VkDescriptorSetObj descriptorSet(m_device);
6764 descriptorSet.AppendDummy();
6765 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6766
6767 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6768
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006769 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006770}
6771
Karl Schultz6addd812016-02-02 17:17:23 -07006772TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13006773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13006774 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07006775 "output arr[2] of float32' vs 'ptr to "
6776 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13006777
6778 ASSERT_NO_FATAL_FAILURE(InitState());
6779 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6780
6781 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006782 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006783 "\n"
6784 "layout(location=0) out float x[2];\n"
6785 "out gl_PerVertex {\n"
6786 " vec4 gl_Position;\n"
6787 "};\n"
6788 "void main(){\n"
6789 " x[0] = 0; x[1] = 0;\n"
6790 " gl_Position = vec4(1);\n"
6791 "}\n";
6792 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006793 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006794 "\n"
6795 "layout(location=0) in float x[3];\n"
6796 "layout(location=0) out vec4 color;\n"
6797 "void main(){\n"
6798 " color = vec4(x[0] + x[1] + x[2]);\n"
6799 "}\n";
6800
6801 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6802 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6803
6804 VkPipelineObj pipe(m_device);
6805 pipe.AddColorAttachment();
6806 pipe.AddShader(&vs);
6807 pipe.AddShader(&fs);
6808
6809 VkDescriptorSetObj descriptorSet(m_device);
6810 descriptorSet.AppendDummy();
6811 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6812
6813 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6814
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006815 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13006816}
6817
Karl Schultz6addd812016-02-02 17:17:23 -07006818TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006820 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006821
Chris Forbesb56af562015-05-25 11:13:17 +12006822 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006823 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12006824
6825 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006826 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006827 "\n"
6828 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006829 "out gl_PerVertex {\n"
6830 " vec4 gl_Position;\n"
6831 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006832 "void main(){\n"
6833 " x = 0;\n"
6834 " gl_Position = vec4(1);\n"
6835 "}\n";
6836 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006837 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006838 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006839 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12006840 "layout(location=0) out vec4 color;\n"
6841 "void main(){\n"
6842 " color = vec4(x);\n"
6843 "}\n";
6844
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006845 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6846 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12006847
6848 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006849 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12006850 pipe.AddShader(&vs);
6851 pipe.AddShader(&fs);
6852
Chris Forbesb56af562015-05-25 11:13:17 +12006853 VkDescriptorSetObj descriptorSet(m_device);
6854 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006855 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12006856
Tony Barbour5781e8f2015-08-04 16:23:11 -06006857 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12006858
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006859 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12006860}
6861
Karl Schultz6addd812016-02-02 17:17:23 -07006862TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006864 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006865
6866 ASSERT_NO_FATAL_FAILURE(InitState());
6867 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6868
6869 char const *vsSource =
6870 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006871 "\n"
6872 "out block { layout(location=0) int x; } outs;\n"
6873 "out gl_PerVertex {\n"
6874 " vec4 gl_Position;\n"
6875 "};\n"
6876 "void main(){\n"
6877 " outs.x = 0;\n"
6878 " gl_Position = vec4(1);\n"
6879 "}\n";
6880 char const *fsSource =
6881 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006882 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006883 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13006884 "layout(location=0) out vec4 color;\n"
6885 "void main(){\n"
6886 " color = vec4(ins.x);\n"
6887 "}\n";
6888
6889 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6890 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6891
6892 VkPipelineObj pipe(m_device);
6893 pipe.AddColorAttachment();
6894 pipe.AddShader(&vs);
6895 pipe.AddShader(&fs);
6896
6897 VkDescriptorSetObj descriptorSet(m_device);
6898 descriptorSet.AppendDummy();
6899 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6900
6901 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6902
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006903 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006904}
6905
6906TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
6907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6908 "location 0.0 which is not written by vertex shader");
6909
6910 ASSERT_NO_FATAL_FAILURE(InitState());
6911 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6912
6913 char const *vsSource =
6914 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006915 "\n"
6916 "out block { layout(location=1) float x; } outs;\n"
6917 "out gl_PerVertex {\n"
6918 " vec4 gl_Position;\n"
6919 "};\n"
6920 "void main(){\n"
6921 " outs.x = 0;\n"
6922 " gl_Position = vec4(1);\n"
6923 "}\n";
6924 char const *fsSource =
6925 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006926 "\n"
6927 "in block { layout(location=0) float x; } ins;\n"
6928 "layout(location=0) out vec4 color;\n"
6929 "void main(){\n"
6930 " color = vec4(ins.x);\n"
6931 "}\n";
6932
6933 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6934 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6935
6936 VkPipelineObj pipe(m_device);
6937 pipe.AddColorAttachment();
6938 pipe.AddShader(&vs);
6939 pipe.AddShader(&fs);
6940
6941 VkDescriptorSetObj descriptorSet(m_device);
6942 descriptorSet.AppendDummy();
6943 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6944
6945 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6946
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006947 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006948}
6949
6950TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
6951 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6952 "location 0.1 which is not written by vertex shader");
6953
6954 ASSERT_NO_FATAL_FAILURE(InitState());
6955 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6956
6957 char const *vsSource =
6958 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006959 "\n"
6960 "out block { layout(location=0, component=0) float x; } outs;\n"
6961 "out gl_PerVertex {\n"
6962 " vec4 gl_Position;\n"
6963 "};\n"
6964 "void main(){\n"
6965 " outs.x = 0;\n"
6966 " gl_Position = vec4(1);\n"
6967 "}\n";
6968 char const *fsSource =
6969 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006970 "\n"
6971 "in block { layout(location=0, component=1) float x; } ins;\n"
6972 "layout(location=0) out vec4 color;\n"
6973 "void main(){\n"
6974 " color = vec4(ins.x);\n"
6975 "}\n";
6976
6977 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6978 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6979
6980 VkPipelineObj pipe(m_device);
6981 pipe.AddColorAttachment();
6982 pipe.AddShader(&vs);
6983 pipe.AddShader(&fs);
6984
6985 VkDescriptorSetObj descriptorSet(m_device);
6986 descriptorSet.AppendDummy();
6987 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6988
6989 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6990
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006991 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006992}
6993
Karl Schultz6addd812016-02-02 17:17:23 -07006994TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006995 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006996 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006997
Chris Forbesde136e02015-05-25 11:13:28 +12006998 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006999 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12007000
7001 VkVertexInputBindingDescription input_binding;
7002 memset(&input_binding, 0, sizeof(input_binding));
7003
7004 VkVertexInputAttributeDescription input_attrib;
7005 memset(&input_attrib, 0, sizeof(input_attrib));
7006 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7007
7008 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007009 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007010 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007011 "out gl_PerVertex {\n"
7012 " vec4 gl_Position;\n"
7013 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007014 "void main(){\n"
7015 " gl_Position = vec4(1);\n"
7016 "}\n";
7017 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007018 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007019 "\n"
7020 "layout(location=0) out vec4 color;\n"
7021 "void main(){\n"
7022 " color = vec4(1);\n"
7023 "}\n";
7024
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007025 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7026 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12007027
7028 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007029 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12007030 pipe.AddShader(&vs);
7031 pipe.AddShader(&fs);
7032
7033 pipe.AddVertexInputBindings(&input_binding, 1);
7034 pipe.AddVertexInputAttribs(&input_attrib, 1);
7035
Chris Forbesde136e02015-05-25 11:13:28 +12007036 VkDescriptorSetObj descriptorSet(m_device);
7037 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007038 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12007039
Tony Barbour5781e8f2015-08-04 16:23:11 -06007040 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12007041
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007042 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12007043}
7044
Karl Schultz6addd812016-02-02 17:17:23 -07007045TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007047 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13007048
7049 ASSERT_NO_FATAL_FAILURE(InitState());
7050 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7051
7052 VkVertexInputBindingDescription input_binding;
7053 memset(&input_binding, 0, sizeof(input_binding));
7054
7055 VkVertexInputAttributeDescription input_attrib;
7056 memset(&input_attrib, 0, sizeof(input_attrib));
7057 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7058
7059 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007060 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13007061 "\n"
7062 "layout(location=1) in float x;\n"
7063 "out gl_PerVertex {\n"
7064 " vec4 gl_Position;\n"
7065 "};\n"
7066 "void main(){\n"
7067 " gl_Position = vec4(x);\n"
7068 "}\n";
7069 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007070 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13007071 "\n"
7072 "layout(location=0) out vec4 color;\n"
7073 "void main(){\n"
7074 " color = vec4(1);\n"
7075 "}\n";
7076
7077 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7078 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7079
7080 VkPipelineObj pipe(m_device);
7081 pipe.AddColorAttachment();
7082 pipe.AddShader(&vs);
7083 pipe.AddShader(&fs);
7084
7085 pipe.AddVertexInputBindings(&input_binding, 1);
7086 pipe.AddVertexInputAttribs(&input_attrib, 1);
7087
7088 VkDescriptorSetObj descriptorSet(m_device);
7089 descriptorSet.AppendDummy();
7090 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7091
7092 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7093
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007094 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13007095}
7096
Karl Schultz6addd812016-02-02 17:17:23 -07007097TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
7098 m_errorMonitor->SetDesiredFailureMsg(
7099 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007100 "VS consumes input at location 0 but not provided");
7101
Chris Forbes62e8e502015-05-25 11:13:29 +12007102 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007103 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12007104
7105 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007106 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007107 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007108 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07007109 "out gl_PerVertex {\n"
7110 " vec4 gl_Position;\n"
7111 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007112 "void main(){\n"
7113 " gl_Position = x;\n"
7114 "}\n";
7115 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007116 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007117 "\n"
7118 "layout(location=0) out vec4 color;\n"
7119 "void main(){\n"
7120 " color = vec4(1);\n"
7121 "}\n";
7122
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007123 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7124 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12007125
7126 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007127 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12007128 pipe.AddShader(&vs);
7129 pipe.AddShader(&fs);
7130
Chris Forbes62e8e502015-05-25 11:13:29 +12007131 VkDescriptorSetObj descriptorSet(m_device);
7132 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007133 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12007134
Tony Barbour5781e8f2015-08-04 16:23:11 -06007135 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12007136
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007137 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12007138}
7139
Karl Schultz6addd812016-02-02 17:17:23 -07007140TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
7141 m_errorMonitor->SetDesiredFailureMsg(
7142 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007143 "location 0 does not match VS input type");
7144
Chris Forbesc97d98e2015-05-25 11:13:31 +12007145 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007146 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12007147
7148 VkVertexInputBindingDescription input_binding;
7149 memset(&input_binding, 0, sizeof(input_binding));
7150
7151 VkVertexInputAttributeDescription input_attrib;
7152 memset(&input_attrib, 0, sizeof(input_attrib));
7153 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7154
7155 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007156 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007157 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007158 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007159 "out gl_PerVertex {\n"
7160 " vec4 gl_Position;\n"
7161 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007162 "void main(){\n"
7163 " gl_Position = vec4(x);\n"
7164 "}\n";
7165 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007166 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007167 "\n"
7168 "layout(location=0) out vec4 color;\n"
7169 "void main(){\n"
7170 " color = vec4(1);\n"
7171 "}\n";
7172
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007173 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7174 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12007175
7176 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007177 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12007178 pipe.AddShader(&vs);
7179 pipe.AddShader(&fs);
7180
7181 pipe.AddVertexInputBindings(&input_binding, 1);
7182 pipe.AddVertexInputAttribs(&input_attrib, 1);
7183
Chris Forbesc97d98e2015-05-25 11:13:31 +12007184 VkDescriptorSetObj descriptorSet(m_device);
7185 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007186 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12007187
Tony Barbour5781e8f2015-08-04 16:23:11 -06007188 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12007189
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007190 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12007191}
7192
Chris Forbesc68b43c2016-04-06 11:18:47 +12007193TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
7194 m_errorMonitor->SetDesiredFailureMsg(
7195 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7196 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
7197
7198 ASSERT_NO_FATAL_FAILURE(InitState());
7199 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7200
7201 char const *vsSource =
7202 "#version 450\n"
7203 "\n"
7204 "out gl_PerVertex {\n"
7205 " vec4 gl_Position;\n"
7206 "};\n"
7207 "void main(){\n"
7208 " gl_Position = vec4(1);\n"
7209 "}\n";
7210 char const *fsSource =
7211 "#version 450\n"
7212 "\n"
7213 "layout(location=0) out vec4 color;\n"
7214 "void main(){\n"
7215 " color = vec4(1);\n"
7216 "}\n";
7217
7218 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7219 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7220
7221 VkPipelineObj pipe(m_device);
7222 pipe.AddColorAttachment();
7223 pipe.AddShader(&vs);
7224 pipe.AddShader(&vs);
7225 pipe.AddShader(&fs);
7226
7227 VkDescriptorSetObj descriptorSet(m_device);
7228 descriptorSet.AppendDummy();
7229 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7230
7231 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7232
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007233 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12007234}
7235
Karl Schultz6addd812016-02-02 17:17:23 -07007236TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007237 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007238
7239 ASSERT_NO_FATAL_FAILURE(InitState());
7240 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7241
7242 VkVertexInputBindingDescription input_binding;
7243 memset(&input_binding, 0, sizeof(input_binding));
7244
7245 VkVertexInputAttributeDescription input_attribs[2];
7246 memset(input_attribs, 0, sizeof(input_attribs));
7247
7248 for (int i = 0; i < 2; i++) {
7249 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7250 input_attribs[i].location = i;
7251 }
7252
7253 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007254 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007255 "\n"
7256 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007257 "out gl_PerVertex {\n"
7258 " vec4 gl_Position;\n"
7259 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007260 "void main(){\n"
7261 " gl_Position = x[0] + x[1];\n"
7262 "}\n";
7263 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007264 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007265 "\n"
7266 "layout(location=0) out vec4 color;\n"
7267 "void main(){\n"
7268 " color = vec4(1);\n"
7269 "}\n";
7270
7271 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7272 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7273
7274 VkPipelineObj pipe(m_device);
7275 pipe.AddColorAttachment();
7276 pipe.AddShader(&vs);
7277 pipe.AddShader(&fs);
7278
7279 pipe.AddVertexInputBindings(&input_binding, 1);
7280 pipe.AddVertexInputAttribs(input_attribs, 2);
7281
7282 VkDescriptorSetObj descriptorSet(m_device);
7283 descriptorSet.AppendDummy();
7284 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7285
7286 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7287
7288 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007289 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007290}
7291
Chris Forbes2682b242015-11-24 11:13:14 +13007292TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
7293{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007294 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007295
7296 ASSERT_NO_FATAL_FAILURE(InitState());
7297 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7298
7299 VkVertexInputBindingDescription input_binding;
7300 memset(&input_binding, 0, sizeof(input_binding));
7301
7302 VkVertexInputAttributeDescription input_attribs[2];
7303 memset(input_attribs, 0, sizeof(input_attribs));
7304
7305 for (int i = 0; i < 2; i++) {
7306 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7307 input_attribs[i].location = i;
7308 }
7309
7310 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007311 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007312 "\n"
7313 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07007314 "out gl_PerVertex {\n"
7315 " vec4 gl_Position;\n"
7316 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007317 "void main(){\n"
7318 " gl_Position = x[0] + x[1];\n"
7319 "}\n";
7320 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007321 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007322 "\n"
7323 "layout(location=0) out vec4 color;\n"
7324 "void main(){\n"
7325 " color = vec4(1);\n"
7326 "}\n";
7327
7328 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7329 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7330
7331 VkPipelineObj pipe(m_device);
7332 pipe.AddColorAttachment();
7333 pipe.AddShader(&vs);
7334 pipe.AddShader(&fs);
7335
7336 pipe.AddVertexInputBindings(&input_binding, 1);
7337 pipe.AddVertexInputAttribs(input_attribs, 2);
7338
7339 VkDescriptorSetObj descriptorSet(m_device);
7340 descriptorSet.AppendDummy();
7341 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7342
7343 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7344
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007345 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007346}
Chris Forbes2682b242015-11-24 11:13:14 +13007347
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007348TEST_F(VkLayerTest, CreatePipelineSimplePositive)
7349{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007350 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007351
7352 ASSERT_NO_FATAL_FAILURE(InitState());
7353 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7354
7355 char const *vsSource =
7356 "#version 450\n"
7357 "out gl_PerVertex {\n"
7358 " vec4 gl_Position;\n"
7359 "};\n"
7360 "void main(){\n"
7361 " gl_Position = vec4(0);\n"
7362 "}\n";
7363 char const *fsSource =
7364 "#version 450\n"
7365 "\n"
7366 "layout(location=0) out vec4 color;\n"
7367 "void main(){\n"
7368 " color = vec4(1);\n"
7369 "}\n";
7370
7371 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7372 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7373
7374 VkPipelineObj pipe(m_device);
7375 pipe.AddColorAttachment();
7376 pipe.AddShader(&vs);
7377 pipe.AddShader(&fs);
7378
7379 VkDescriptorSetObj descriptorSet(m_device);
7380 descriptorSet.AppendDummy();
7381 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7382
7383 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7384
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007385 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007386}
7387
Chris Forbes912c9192016-04-05 17:50:35 +12007388TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
7389{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007390 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12007391
7392 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
7393
7394 ASSERT_NO_FATAL_FAILURE(InitState());
7395 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7396
7397 char const *vsSource =
7398 "#version 450\n"
7399 "out gl_PerVertex {\n"
7400 " vec4 gl_Position;\n"
7401 "};\n"
7402 "layout(location=0) out vec3 x;\n"
7403 "layout(location=1) out ivec3 y;\n"
7404 "layout(location=2) out vec3 z;\n"
7405 "void main(){\n"
7406 " gl_Position = vec4(0);\n"
7407 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
7408 "}\n";
7409 char const *fsSource =
7410 "#version 450\n"
7411 "\n"
7412 "layout(location=0) out vec4 color;\n"
7413 "layout(location=0) in float x;\n"
7414 "layout(location=1) flat in int y;\n"
7415 "layout(location=2) in vec2 z;\n"
7416 "void main(){\n"
7417 " color = vec4(1 + x + y + z.x);\n"
7418 "}\n";
7419
7420 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7421 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7422
7423 VkPipelineObj pipe(m_device);
7424 pipe.AddColorAttachment();
7425 pipe.AddShader(&vs);
7426 pipe.AddShader(&fs);
7427
7428 VkDescriptorSetObj descriptorSet(m_device);
7429 descriptorSet.AppendDummy();
7430 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7431
7432 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7433
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007434 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12007435}
7436
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007437TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
7438{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007439 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007440
7441 ASSERT_NO_FATAL_FAILURE(InitState());
7442 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7443
Chris Forbesc1e852d2016-04-04 19:26:42 +12007444 if (!m_device->phy().features().tessellationShader) {
7445 printf("Device does not support tessellation shaders; skipped.\n");
7446 return;
7447 }
7448
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007449 char const *vsSource =
7450 "#version 450\n"
7451 "void main(){}\n";
7452 char const *tcsSource =
7453 "#version 450\n"
7454 "layout(location=0) out int x[];\n"
7455 "layout(vertices=3) out;\n"
7456 "void main(){\n"
7457 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7458 " gl_TessLevelInner[0] = 1;\n"
7459 " x[gl_InvocationID] = gl_InvocationID;\n"
7460 "}\n";
7461 char const *tesSource =
7462 "#version 450\n"
7463 "layout(triangles, equal_spacing, cw) in;\n"
7464 "layout(location=0) in int x[];\n"
7465 "out gl_PerVertex { vec4 gl_Position; };\n"
7466 "void main(){\n"
7467 " gl_Position.xyz = gl_TessCoord;\n"
7468 " gl_Position.w = x[0] + x[1] + x[2];\n"
7469 "}\n";
7470 char const *fsSource =
7471 "#version 450\n"
7472 "layout(location=0) out vec4 color;\n"
7473 "void main(){\n"
7474 " color = vec4(1);\n"
7475 "}\n";
7476
7477 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7478 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7479 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7480 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7481
7482 VkPipelineInputAssemblyStateCreateInfo iasci{
7483 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7484 nullptr,
7485 0,
7486 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7487 VK_FALSE};
7488
Chris Forbesb4cacb62016-04-04 19:15:00 +12007489 VkPipelineTessellationStateCreateInfo tsci{
7490 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7491 nullptr,
7492 0,
7493 3};
7494
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007495 VkPipelineObj pipe(m_device);
7496 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12007497 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007498 pipe.AddColorAttachment();
7499 pipe.AddShader(&vs);
7500 pipe.AddShader(&tcs);
7501 pipe.AddShader(&tes);
7502 pipe.AddShader(&fs);
7503
7504 VkDescriptorSetObj descriptorSet(m_device);
7505 descriptorSet.AppendDummy();
7506 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7507
7508 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7509
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007510 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007511}
7512
Chris Forbesa0ab8152016-04-20 13:34:27 +12007513TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
7514{
7515 m_errorMonitor->ExpectSuccess();
7516
7517 ASSERT_NO_FATAL_FAILURE(InitState());
7518 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7519
7520 if (!m_device->phy().features().geometryShader) {
7521 printf("Device does not support geometry shaders; skipped.\n");
7522 return;
7523 }
7524
7525 char const *vsSource =
7526 "#version 450\n"
7527 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
7528 "void main(){\n"
7529 " vs_out.x = vec4(1);\n"
7530 "}\n";
7531 char const *gsSource =
7532 "#version 450\n"
7533 "layout(triangles) in;\n"
7534 "layout(triangle_strip, max_vertices=3) out;\n"
7535 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
7536 "out gl_PerVertex { vec4 gl_Position; };\n"
7537 "void main() {\n"
7538 " gl_Position = gs_in[0].x;\n"
7539 " EmitVertex();\n"
7540 "}\n";
7541 char const *fsSource =
7542 "#version 450\n"
7543 "layout(location=0) out vec4 color;\n"
7544 "void main(){\n"
7545 " color = vec4(1);\n"
7546 "}\n";
7547
7548 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7549 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
7550 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7551
7552 VkPipelineObj pipe(m_device);
7553 pipe.AddColorAttachment();
7554 pipe.AddShader(&vs);
7555 pipe.AddShader(&gs);
7556 pipe.AddShader(&fs);
7557
7558 VkDescriptorSetObj descriptorSet(m_device);
7559 descriptorSet.AppendDummy();
7560 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7561
7562 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7563
7564 m_errorMonitor->VerifyNotFound();
7565}
7566
Chris Forbesa0193bc2016-04-04 19:19:47 +12007567TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
7568{
7569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7570 "is per-vertex in tessellation control shader stage "
7571 "but per-patch in tessellation evaluation shader stage");
7572
7573 ASSERT_NO_FATAL_FAILURE(InitState());
7574 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7575
Chris Forbesc1e852d2016-04-04 19:26:42 +12007576 if (!m_device->phy().features().tessellationShader) {
7577 printf("Device does not support tessellation shaders; skipped.\n");
7578 return;
7579 }
7580
Chris Forbesa0193bc2016-04-04 19:19:47 +12007581 char const *vsSource =
7582 "#version 450\n"
7583 "void main(){}\n";
7584 char const *tcsSource =
7585 "#version 450\n"
7586 "layout(location=0) out int x[];\n"
7587 "layout(vertices=3) out;\n"
7588 "void main(){\n"
7589 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7590 " gl_TessLevelInner[0] = 1;\n"
7591 " x[gl_InvocationID] = gl_InvocationID;\n"
7592 "}\n";
7593 char const *tesSource =
7594 "#version 450\n"
7595 "layout(triangles, equal_spacing, cw) in;\n"
7596 "layout(location=0) patch in int x;\n"
7597 "out gl_PerVertex { vec4 gl_Position; };\n"
7598 "void main(){\n"
7599 " gl_Position.xyz = gl_TessCoord;\n"
7600 " gl_Position.w = x;\n"
7601 "}\n";
7602 char const *fsSource =
7603 "#version 450\n"
7604 "layout(location=0) out vec4 color;\n"
7605 "void main(){\n"
7606 " color = vec4(1);\n"
7607 "}\n";
7608
7609 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7610 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7611 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7612 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7613
7614 VkPipelineInputAssemblyStateCreateInfo iasci{
7615 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7616 nullptr,
7617 0,
7618 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7619 VK_FALSE};
7620
7621 VkPipelineTessellationStateCreateInfo tsci{
7622 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7623 nullptr,
7624 0,
7625 3};
7626
7627 VkPipelineObj pipe(m_device);
7628 pipe.SetInputAssembly(&iasci);
7629 pipe.SetTessellation(&tsci);
7630 pipe.AddColorAttachment();
7631 pipe.AddShader(&vs);
7632 pipe.AddShader(&tcs);
7633 pipe.AddShader(&tes);
7634 pipe.AddShader(&fs);
7635
7636 VkDescriptorSetObj descriptorSet(m_device);
7637 descriptorSet.AppendDummy();
7638 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7639
7640 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7641
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007642 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12007643}
7644
Karl Schultz6addd812016-02-02 17:17:23 -07007645TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
7646 m_errorMonitor->SetDesiredFailureMsg(
7647 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007648 "Duplicate vertex input binding descriptions for binding 0");
7649
Chris Forbes280ba2c2015-06-12 11:16:41 +12007650 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007651 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007652
7653 /* Two binding descriptions for binding 0 */
7654 VkVertexInputBindingDescription input_bindings[2];
7655 memset(input_bindings, 0, sizeof(input_bindings));
7656
7657 VkVertexInputAttributeDescription input_attrib;
7658 memset(&input_attrib, 0, sizeof(input_attrib));
7659 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7660
7661 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007662 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007663 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007664 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007665 "out gl_PerVertex {\n"
7666 " vec4 gl_Position;\n"
7667 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007668 "void main(){\n"
7669 " gl_Position = vec4(x);\n"
7670 "}\n";
7671 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007672 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007673 "\n"
7674 "layout(location=0) out vec4 color;\n"
7675 "void main(){\n"
7676 " color = vec4(1);\n"
7677 "}\n";
7678
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007679 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7680 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007681
7682 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007683 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007684 pipe.AddShader(&vs);
7685 pipe.AddShader(&fs);
7686
7687 pipe.AddVertexInputBindings(input_bindings, 2);
7688 pipe.AddVertexInputAttribs(&input_attrib, 1);
7689
Chris Forbes280ba2c2015-06-12 11:16:41 +12007690 VkDescriptorSetObj descriptorSet(m_device);
7691 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007692 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007693
Tony Barbour5781e8f2015-08-04 16:23:11 -06007694 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007695
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007696 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007697}
Chris Forbes8f68b562015-05-25 11:13:32 +12007698
Chris Forbes35efec72016-04-21 14:32:08 +12007699TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
7700 m_errorMonitor->ExpectSuccess();
7701
7702 ASSERT_NO_FATAL_FAILURE(InitState());
7703 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7704
7705 if (!m_device->phy().features().tessellationShader) {
7706 printf("Device does not support 64bit vertex attributes; skipped.\n");
7707 return;
7708 }
7709
7710 VkVertexInputBindingDescription input_bindings[1];
7711 memset(input_bindings, 0, sizeof(input_bindings));
7712
7713 VkVertexInputAttributeDescription input_attribs[4];
7714 memset(input_attribs, 0, sizeof(input_attribs));
7715 input_attribs[0].location = 0;
7716 input_attribs[0].offset = 0;
7717 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7718 input_attribs[1].location = 2;
7719 input_attribs[1].offset = 32;
7720 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7721 input_attribs[2].location = 4;
7722 input_attribs[2].offset = 64;
7723 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7724 input_attribs[3].location = 6;
7725 input_attribs[3].offset = 96;
7726 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7727
7728 char const *vsSource =
7729 "#version 450\n"
7730 "\n"
7731 "layout(location=0) in dmat4 x;\n"
7732 "out gl_PerVertex {\n"
7733 " vec4 gl_Position;\n"
7734 "};\n"
7735 "void main(){\n"
7736 " gl_Position = vec4(x[0][0]);\n"
7737 "}\n";
7738 char const *fsSource =
7739 "#version 450\n"
7740 "\n"
7741 "layout(location=0) out vec4 color;\n"
7742 "void main(){\n"
7743 " color = vec4(1);\n"
7744 "}\n";
7745
7746 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7747 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7748
7749 VkPipelineObj pipe(m_device);
7750 pipe.AddColorAttachment();
7751 pipe.AddShader(&vs);
7752 pipe.AddShader(&fs);
7753
7754 pipe.AddVertexInputBindings(input_bindings, 1);
7755 pipe.AddVertexInputAttribs(input_attribs, 4);
7756
7757 VkDescriptorSetObj descriptorSet(m_device);
7758 descriptorSet.AppendDummy();
7759 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7760
7761 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7762
7763 m_errorMonitor->VerifyNotFound();
7764}
7765
Karl Schultz6addd812016-02-02 17:17:23 -07007766TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007768 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007769
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007770 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007771
7772 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007773 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007774 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007775 "out gl_PerVertex {\n"
7776 " vec4 gl_Position;\n"
7777 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007778 "void main(){\n"
7779 " gl_Position = vec4(1);\n"
7780 "}\n";
7781 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007782 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007783 "\n"
7784 "void main(){\n"
7785 "}\n";
7786
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007787 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7788 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007789
7790 VkPipelineObj pipe(m_device);
7791 pipe.AddShader(&vs);
7792 pipe.AddShader(&fs);
7793
Chia-I Wu08accc62015-07-07 11:50:03 +08007794 /* set up CB 0, not written */
7795 pipe.AddColorAttachment();
7796 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007797
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007798 VkDescriptorSetObj descriptorSet(m_device);
7799 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007800 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007801
Tony Barbour5781e8f2015-08-04 16:23:11 -06007802 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007803
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007804 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007805}
7806
Karl Schultz6addd812016-02-02 17:17:23 -07007807TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07007808 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007809 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007810 "FS writes to output location 1 with no matching attachment");
7811
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007812 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007813
7814 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007815 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007816 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007817 "out gl_PerVertex {\n"
7818 " vec4 gl_Position;\n"
7819 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007820 "void main(){\n"
7821 " gl_Position = vec4(1);\n"
7822 "}\n";
7823 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007824 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007825 "\n"
7826 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007827 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007828 "void main(){\n"
7829 " x = vec4(1);\n"
7830 " y = vec4(1);\n"
7831 "}\n";
7832
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007833 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7834 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007835
7836 VkPipelineObj pipe(m_device);
7837 pipe.AddShader(&vs);
7838 pipe.AddShader(&fs);
7839
Chia-I Wu08accc62015-07-07 11:50:03 +08007840 /* set up CB 0, not written */
7841 pipe.AddColorAttachment();
7842 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007843 /* FS writes CB 1, but we don't configure it */
7844
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007845 VkDescriptorSetObj descriptorSet(m_device);
7846 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007847 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007848
Tony Barbour5781e8f2015-08-04 16:23:11 -06007849 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007850
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007851 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007852}
7853
Karl Schultz6addd812016-02-02 17:17:23 -07007854TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007855 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007856 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007857
Chris Forbesa36d69e2015-05-25 11:13:44 +12007858 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007859
7860 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007861 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007862 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007863 "out gl_PerVertex {\n"
7864 " vec4 gl_Position;\n"
7865 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007866 "void main(){\n"
7867 " gl_Position = vec4(1);\n"
7868 "}\n";
7869 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007870 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007871 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007872 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12007873 "void main(){\n"
7874 " x = ivec4(1);\n"
7875 "}\n";
7876
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007877 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7878 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007879
7880 VkPipelineObj pipe(m_device);
7881 pipe.AddShader(&vs);
7882 pipe.AddShader(&fs);
7883
Chia-I Wu08accc62015-07-07 11:50:03 +08007884 /* set up CB 0; type is UNORM by default */
7885 pipe.AddColorAttachment();
7886 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007887
Chris Forbesa36d69e2015-05-25 11:13:44 +12007888 VkDescriptorSetObj descriptorSet(m_device);
7889 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007890 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007891
Tony Barbour5781e8f2015-08-04 16:23:11 -06007892 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007893
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007894 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12007895}
Chris Forbes7b1b8932015-06-05 14:43:36 +12007896
Karl Schultz6addd812016-02-02 17:17:23 -07007897TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007898 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007899 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007900
Chris Forbes556c76c2015-08-14 12:04:59 +12007901 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12007902
7903 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007904 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007905 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007906 "out gl_PerVertex {\n"
7907 " vec4 gl_Position;\n"
7908 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007909 "void main(){\n"
7910 " gl_Position = vec4(1);\n"
7911 "}\n";
7912 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007913 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007914 "\n"
7915 "layout(location=0) out vec4 x;\n"
7916 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7917 "void main(){\n"
7918 " x = vec4(bar.y);\n"
7919 "}\n";
7920
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007921 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7922 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12007923
Chris Forbes556c76c2015-08-14 12:04:59 +12007924 VkPipelineObj pipe(m_device);
7925 pipe.AddShader(&vs);
7926 pipe.AddShader(&fs);
7927
7928 /* set up CB 0; type is UNORM by default */
7929 pipe.AddColorAttachment();
7930 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7931
7932 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007933 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12007934
7935 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7936
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007937 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12007938}
7939
Chris Forbes5c59e902016-02-26 16:56:09 +13007940TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
7941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7942 "not declared in layout");
7943
7944 ASSERT_NO_FATAL_FAILURE(InitState());
7945
7946 char const *vsSource =
7947 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007948 "\n"
7949 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
7950 "out gl_PerVertex {\n"
7951 " vec4 gl_Position;\n"
7952 "};\n"
7953 "void main(){\n"
7954 " gl_Position = vec4(consts.x);\n"
7955 "}\n";
7956 char const *fsSource =
7957 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007958 "\n"
7959 "layout(location=0) out vec4 x;\n"
7960 "void main(){\n"
7961 " x = vec4(1);\n"
7962 "}\n";
7963
7964 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7965 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7966
7967 VkPipelineObj pipe(m_device);
7968 pipe.AddShader(&vs);
7969 pipe.AddShader(&fs);
7970
7971 /* set up CB 0; type is UNORM by default */
7972 pipe.AddColorAttachment();
7973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7974
7975 VkDescriptorSetObj descriptorSet(m_device);
7976 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7977
7978 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7979
7980 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007981 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13007982}
7983
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007984#endif // SHADER_CHECKER_TESTS
7985
7986#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06007987TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07007988 m_errorMonitor->SetDesiredFailureMsg(
7989 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007990 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007991
7992 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007993
7994 // Create an image
7995 VkImage image;
7996
Karl Schultz6addd812016-02-02 17:17:23 -07007997 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7998 const int32_t tex_width = 32;
7999 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008000
8001 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008002 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8003 image_create_info.pNext = NULL;
8004 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8005 image_create_info.format = tex_format;
8006 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008007 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07008008 image_create_info.extent.depth = 1;
8009 image_create_info.mipLevels = 1;
8010 image_create_info.arrayLayers = 1;
8011 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8012 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8013 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8014 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008015
8016 // Introduce error by sending down a bogus width extent
8017 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008018 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008019
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008020 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008021}
8022
Mark Youngc48c4c12016-04-11 14:26:49 -06008023TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
8024 m_errorMonitor->SetDesiredFailureMsg(
8025 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8026 "CreateImage extents is 0 for at least one required dimension");
8027
8028 ASSERT_NO_FATAL_FAILURE(InitState());
8029
8030 // Create an image
8031 VkImage image;
8032
8033 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8034 const int32_t tex_width = 32;
8035 const int32_t tex_height = 32;
8036
8037 VkImageCreateInfo image_create_info = {};
8038 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8039 image_create_info.pNext = NULL;
8040 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8041 image_create_info.format = tex_format;
8042 image_create_info.extent.width = tex_width;
8043 image_create_info.extent.height = tex_height;
8044 image_create_info.extent.depth = 1;
8045 image_create_info.mipLevels = 1;
8046 image_create_info.arrayLayers = 1;
8047 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8048 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8049 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8050 image_create_info.flags = 0;
8051
8052 // Introduce error by sending down a bogus width extent
8053 image_create_info.extent.width = 0;
8054 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
8055
8056 m_errorMonitor->VerifyFound();
8057}
8058
Karl Schultz6addd812016-02-02 17:17:23 -07008059TEST_F(VkLayerTest, UpdateBufferAlignment) {
8060 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06008061
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008062 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008063 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008064
Mike Stroyana3082432015-09-25 13:39:21 -06008065 ASSERT_NO_FATAL_FAILURE(InitState());
8066
8067 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8068 vk_testing::Buffer buffer;
8069 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
8070
8071 BeginCommandBuffer();
8072 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008073 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008074 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008075
Mike Stroyana3082432015-09-25 13:39:21 -06008076 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008078 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008079
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008080 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008081 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008082 EndCommandBuffer();
8083}
8084
Karl Schultz6addd812016-02-02 17:17:23 -07008085TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008086 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008087 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06008088
8089 ASSERT_NO_FATAL_FAILURE(InitState());
8090
8091 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8092 vk_testing::Buffer buffer;
8093 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
8094
8095 BeginCommandBuffer();
8096 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008097 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008098 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008099
Mike Stroyana3082432015-09-25 13:39:21 -06008100 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008102 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008103
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008104 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008105
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008106 m_errorMonitor->VerifyFound();
8107
Mike Stroyana3082432015-09-25 13:39:21 -06008108 EndCommandBuffer();
8109}
8110
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008111#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12008112
Tobin Ehliscde08892015-09-22 10:11:37 -06008113#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07008114TEST_F(VkLayerTest, InvalidImageView) {
8115 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06008116
Karl Schultz6addd812016-02-02 17:17:23 -07008117 m_errorMonitor->SetDesiredFailureMsg(
8118 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008119 "vkCreateImageView called with baseMipLevel 10 ");
8120
Tobin Ehliscde08892015-09-22 10:11:37 -06008121 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06008122
Mike Stroyana3082432015-09-25 13:39:21 -06008123 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07008124 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06008125
Karl Schultz6addd812016-02-02 17:17:23 -07008126 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8127 const int32_t tex_width = 32;
8128 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06008129
8130 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008131 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8132 image_create_info.pNext = NULL;
8133 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8134 image_create_info.format = tex_format;
8135 image_create_info.extent.width = tex_width;
8136 image_create_info.extent.height = tex_height;
8137 image_create_info.extent.depth = 1;
8138 image_create_info.mipLevels = 1;
8139 image_create_info.arrayLayers = 1;
8140 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8141 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8142 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8143 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06008144
Chia-I Wuf7458c52015-10-26 21:10:41 +08008145 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06008146 ASSERT_VK_SUCCESS(err);
8147
8148 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008149 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8150 image_view_create_info.image = image;
8151 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8152 image_view_create_info.format = tex_format;
8153 image_view_create_info.subresourceRange.layerCount = 1;
8154 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
8155 image_view_create_info.subresourceRange.levelCount = 1;
8156 image_view_create_info.subresourceRange.aspectMask =
8157 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06008158
8159 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008160 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8161 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06008162
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008163 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06008164}
Mike Stroyana3082432015-09-25 13:39:21 -06008165
Karl Schultz6addd812016-02-02 17:17:23 -07008166TEST_F(VkLayerTest, InvalidImageViewAspect) {
8167 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008168
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008169 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008170 "vkCreateImageView: Color image "
8171 "formats must have ONLY the "
8172 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008173
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008174 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008175
8176 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07008177 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008178
Karl Schultz6addd812016-02-02 17:17:23 -07008179 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8180 const int32_t tex_width = 32;
8181 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008182
8183 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008184 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8185 image_create_info.pNext = NULL;
8186 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8187 image_create_info.format = tex_format;
8188 image_create_info.extent.width = tex_width;
8189 image_create_info.extent.height = tex_height;
8190 image_create_info.extent.depth = 1;
8191 image_create_info.mipLevels = 1;
8192 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8193 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8194 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8195 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008196
Chia-I Wuf7458c52015-10-26 21:10:41 +08008197 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008198 ASSERT_VK_SUCCESS(err);
8199
8200 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008201 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8202 image_view_create_info.image = image;
8203 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8204 image_view_create_info.format = tex_format;
8205 image_view_create_info.subresourceRange.baseMipLevel = 0;
8206 image_view_create_info.subresourceRange.levelCount = 1;
8207 // Cause an error by setting an invalid image aspect
8208 image_view_create_info.subresourceRange.aspectMask =
8209 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008210
8211 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008212 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8213 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008214
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008215 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008216}
8217
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008218TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008219 VkResult err;
8220 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008221
Karl Schultz6addd812016-02-02 17:17:23 -07008222 m_errorMonitor->SetDesiredFailureMsg(
8223 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008224 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008225
Mike Stroyana3082432015-09-25 13:39:21 -06008226 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008227
8228 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008229 VkImage srcImage;
8230 VkImage dstImage;
8231 VkDeviceMemory srcMem;
8232 VkDeviceMemory destMem;
8233 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008234
8235 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008236 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8237 image_create_info.pNext = NULL;
8238 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8239 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8240 image_create_info.extent.width = 32;
8241 image_create_info.extent.height = 32;
8242 image_create_info.extent.depth = 1;
8243 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008244 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07008245 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8246 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8247 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8248 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008249
Karl Schultz6addd812016-02-02 17:17:23 -07008250 err =
8251 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008252 ASSERT_VK_SUCCESS(err);
8253
Karl Schultz6addd812016-02-02 17:17:23 -07008254 err =
8255 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008256 ASSERT_VK_SUCCESS(err);
8257
8258 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008259 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008260 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8261 memAlloc.pNext = NULL;
8262 memAlloc.allocationSize = 0;
8263 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008264
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008265 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008266 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008267 pass =
8268 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008269 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008270 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008271 ASSERT_VK_SUCCESS(err);
8272
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008273 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008274 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008275 pass =
8276 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008277 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008278 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008279 ASSERT_VK_SUCCESS(err);
8280
8281 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8282 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008283 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008284 ASSERT_VK_SUCCESS(err);
8285
8286 BeginCommandBuffer();
8287 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008288 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008289 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008290 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008291 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06008292 copyRegion.srcOffset.x = 0;
8293 copyRegion.srcOffset.y = 0;
8294 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008295 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008296 copyRegion.dstSubresource.mipLevel = 0;
8297 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008298 // Introduce failure by forcing the dst layerCount to differ from src
8299 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008300 copyRegion.dstOffset.x = 0;
8301 copyRegion.dstOffset.y = 0;
8302 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008303 copyRegion.extent.width = 1;
8304 copyRegion.extent.height = 1;
8305 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008306 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8307 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008308 EndCommandBuffer();
8309
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008310 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008311
Chia-I Wuf7458c52015-10-26 21:10:41 +08008312 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008313 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008314 vkFreeMemory(m_device->device(), srcMem, NULL);
8315 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008316}
8317
Karl Schultz6addd812016-02-02 17:17:23 -07008318TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06008319 VkResult err;
8320 bool pass;
8321
8322 // Create color images with different format sizes and try to copy between them
8323 m_errorMonitor->SetDesiredFailureMsg(
8324 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8325 "vkCmdCopyImage called with unmatched source and dest image format sizes");
8326
8327 ASSERT_NO_FATAL_FAILURE(InitState());
8328
8329 // Create two images of different types and try to copy between them
8330 VkImage srcImage;
8331 VkImage dstImage;
8332 VkDeviceMemory srcMem;
8333 VkDeviceMemory destMem;
8334 VkMemoryRequirements memReqs;
8335
8336 VkImageCreateInfo image_create_info = {};
8337 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8338 image_create_info.pNext = NULL;
8339 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8340 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8341 image_create_info.extent.width = 32;
8342 image_create_info.extent.height = 32;
8343 image_create_info.extent.depth = 1;
8344 image_create_info.mipLevels = 1;
8345 image_create_info.arrayLayers = 1;
8346 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8347 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8348 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8349 image_create_info.flags = 0;
8350
8351 err =
8352 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
8353 ASSERT_VK_SUCCESS(err);
8354
8355 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
8356 // Introduce failure by creating second image with a different-sized format.
8357 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
8358
8359 err =
8360 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
8361 ASSERT_VK_SUCCESS(err);
8362
8363 // Allocate memory
8364 VkMemoryAllocateInfo memAlloc = {};
8365 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8366 memAlloc.pNext = NULL;
8367 memAlloc.allocationSize = 0;
8368 memAlloc.memoryTypeIndex = 0;
8369
8370 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
8371 memAlloc.allocationSize = memReqs.size;
8372 pass =
8373 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
8374 ASSERT_TRUE(pass);
8375 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
8376 ASSERT_VK_SUCCESS(err);
8377
8378 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
8379 memAlloc.allocationSize = memReqs.size;
8380 pass =
8381 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
8382 ASSERT_TRUE(pass);
8383 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
8384 ASSERT_VK_SUCCESS(err);
8385
8386 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8387 ASSERT_VK_SUCCESS(err);
8388 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
8389 ASSERT_VK_SUCCESS(err);
8390
8391 BeginCommandBuffer();
8392 VkImageCopy copyRegion;
8393 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8394 copyRegion.srcSubresource.mipLevel = 0;
8395 copyRegion.srcSubresource.baseArrayLayer = 0;
8396 copyRegion.srcSubresource.layerCount = 0;
8397 copyRegion.srcOffset.x = 0;
8398 copyRegion.srcOffset.y = 0;
8399 copyRegion.srcOffset.z = 0;
8400 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8401 copyRegion.dstSubresource.mipLevel = 0;
8402 copyRegion.dstSubresource.baseArrayLayer = 0;
8403 copyRegion.dstSubresource.layerCount = 0;
8404 copyRegion.dstOffset.x = 0;
8405 copyRegion.dstOffset.y = 0;
8406 copyRegion.dstOffset.z = 0;
8407 copyRegion.extent.width = 1;
8408 copyRegion.extent.height = 1;
8409 copyRegion.extent.depth = 1;
8410 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8411 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
8412 EndCommandBuffer();
8413
8414 m_errorMonitor->VerifyFound();
8415
8416 vkDestroyImage(m_device->device(), srcImage, NULL);
8417 vkDestroyImage(m_device->device(), dstImage, NULL);
8418 vkFreeMemory(m_device->device(), srcMem, NULL);
8419 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008420}
8421
Karl Schultz6addd812016-02-02 17:17:23 -07008422TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
8423 VkResult err;
8424 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008425
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008426 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008427 m_errorMonitor->SetDesiredFailureMsg(
8428 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008429 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008430
Mike Stroyana3082432015-09-25 13:39:21 -06008431 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008432
8433 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008434 VkImage srcImage;
8435 VkImage dstImage;
8436 VkDeviceMemory srcMem;
8437 VkDeviceMemory destMem;
8438 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008439
8440 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008441 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8442 image_create_info.pNext = NULL;
8443 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8444 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8445 image_create_info.extent.width = 32;
8446 image_create_info.extent.height = 32;
8447 image_create_info.extent.depth = 1;
8448 image_create_info.mipLevels = 1;
8449 image_create_info.arrayLayers = 1;
8450 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8451 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8452 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8453 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008454
Karl Schultz6addd812016-02-02 17:17:23 -07008455 err =
8456 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008457 ASSERT_VK_SUCCESS(err);
8458
Karl Schultzbdb75952016-04-19 11:36:49 -06008459 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
8460
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008461 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07008462 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008463 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
8464 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008465
Karl Schultz6addd812016-02-02 17:17:23 -07008466 err =
8467 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008468 ASSERT_VK_SUCCESS(err);
8469
8470 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008471 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008472 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8473 memAlloc.pNext = NULL;
8474 memAlloc.allocationSize = 0;
8475 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008476
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008477 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008478 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008479 pass =
8480 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008481 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008482 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008483 ASSERT_VK_SUCCESS(err);
8484
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008485 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008486 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008487 pass =
8488 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008489 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008490 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008491 ASSERT_VK_SUCCESS(err);
8492
8493 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8494 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008495 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008496 ASSERT_VK_SUCCESS(err);
8497
8498 BeginCommandBuffer();
8499 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008500 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008501 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008502 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008503 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008504 copyRegion.srcOffset.x = 0;
8505 copyRegion.srcOffset.y = 0;
8506 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008507 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008508 copyRegion.dstSubresource.mipLevel = 0;
8509 copyRegion.dstSubresource.baseArrayLayer = 0;
8510 copyRegion.dstSubresource.layerCount = 0;
8511 copyRegion.dstOffset.x = 0;
8512 copyRegion.dstOffset.y = 0;
8513 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008514 copyRegion.extent.width = 1;
8515 copyRegion.extent.height = 1;
8516 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008517 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8518 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008519 EndCommandBuffer();
8520
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008521 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008522
Chia-I Wuf7458c52015-10-26 21:10:41 +08008523 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008524 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008525 vkFreeMemory(m_device->device(), srcMem, NULL);
8526 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008527}
8528
Karl Schultz6addd812016-02-02 17:17:23 -07008529TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
8530 VkResult err;
8531 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008532
Karl Schultz6addd812016-02-02 17:17:23 -07008533 m_errorMonitor->SetDesiredFailureMsg(
8534 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008535 "vkCmdResolveImage called with source sample count less than 2.");
8536
Mike Stroyana3082432015-09-25 13:39:21 -06008537 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008538
8539 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008540 VkImage srcImage;
8541 VkImage dstImage;
8542 VkDeviceMemory srcMem;
8543 VkDeviceMemory destMem;
8544 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008545
8546 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008547 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8548 image_create_info.pNext = NULL;
8549 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8550 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8551 image_create_info.extent.width = 32;
8552 image_create_info.extent.height = 1;
8553 image_create_info.extent.depth = 1;
8554 image_create_info.mipLevels = 1;
8555 image_create_info.arrayLayers = 1;
8556 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8557 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8558 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8559 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008560
Karl Schultz6addd812016-02-02 17:17:23 -07008561 err =
8562 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008563 ASSERT_VK_SUCCESS(err);
8564
Karl Schultz6addd812016-02-02 17:17:23 -07008565 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8566 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008567
Karl Schultz6addd812016-02-02 17:17:23 -07008568 err =
8569 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008570 ASSERT_VK_SUCCESS(err);
8571
8572 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008573 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008574 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8575 memAlloc.pNext = NULL;
8576 memAlloc.allocationSize = 0;
8577 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008578
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008579 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008580 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008581 pass =
8582 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008583 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008584 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008585 ASSERT_VK_SUCCESS(err);
8586
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008587 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008588 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008589 pass =
8590 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008591 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008592 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008593 ASSERT_VK_SUCCESS(err);
8594
8595 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8596 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008597 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008598 ASSERT_VK_SUCCESS(err);
8599
8600 BeginCommandBuffer();
8601 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008602 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8603 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008604 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008605 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008606 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008607 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008608 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008609 resolveRegion.srcOffset.x = 0;
8610 resolveRegion.srcOffset.y = 0;
8611 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008612 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008613 resolveRegion.dstSubresource.mipLevel = 0;
8614 resolveRegion.dstSubresource.baseArrayLayer = 0;
8615 resolveRegion.dstSubresource.layerCount = 0;
8616 resolveRegion.dstOffset.x = 0;
8617 resolveRegion.dstOffset.y = 0;
8618 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008619 resolveRegion.extent.width = 1;
8620 resolveRegion.extent.height = 1;
8621 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008622 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8623 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008624 EndCommandBuffer();
8625
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008626 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008627
Chia-I Wuf7458c52015-10-26 21:10:41 +08008628 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008629 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008630 vkFreeMemory(m_device->device(), srcMem, NULL);
8631 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008632}
8633
Karl Schultz6addd812016-02-02 17:17:23 -07008634TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
8635 VkResult err;
8636 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008637
Karl Schultz6addd812016-02-02 17:17:23 -07008638 m_errorMonitor->SetDesiredFailureMsg(
8639 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008640 "vkCmdResolveImage called with dest sample count greater than 1.");
8641
Mike Stroyana3082432015-09-25 13:39:21 -06008642 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008643
8644 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008645 VkImage srcImage;
8646 VkImage dstImage;
8647 VkDeviceMemory srcMem;
8648 VkDeviceMemory destMem;
8649 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008650
8651 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008652 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8653 image_create_info.pNext = NULL;
8654 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8655 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8656 image_create_info.extent.width = 32;
8657 image_create_info.extent.height = 1;
8658 image_create_info.extent.depth = 1;
8659 image_create_info.mipLevels = 1;
8660 image_create_info.arrayLayers = 1;
8661 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8662 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8663 // Note: Some implementations expect color attachment usage for any
8664 // multisample surface
8665 image_create_info.usage =
8666 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8667 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008668
Karl Schultz6addd812016-02-02 17:17:23 -07008669 err =
8670 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008671 ASSERT_VK_SUCCESS(err);
8672
Karl Schultz6addd812016-02-02 17:17:23 -07008673 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8674 // Note: Some implementations expect color attachment usage for any
8675 // multisample surface
8676 image_create_info.usage =
8677 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008678
Karl Schultz6addd812016-02-02 17:17:23 -07008679 err =
8680 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008681 ASSERT_VK_SUCCESS(err);
8682
8683 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008684 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008685 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8686 memAlloc.pNext = NULL;
8687 memAlloc.allocationSize = 0;
8688 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008689
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008690 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008691 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008692 pass =
8693 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008694 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008695 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008696 ASSERT_VK_SUCCESS(err);
8697
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008698 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008699 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008700 pass =
8701 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008702 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008703 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008704 ASSERT_VK_SUCCESS(err);
8705
8706 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8707 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008708 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008709 ASSERT_VK_SUCCESS(err);
8710
8711 BeginCommandBuffer();
8712 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008713 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8714 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008715 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008716 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008717 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008718 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008719 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008720 resolveRegion.srcOffset.x = 0;
8721 resolveRegion.srcOffset.y = 0;
8722 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008723 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008724 resolveRegion.dstSubresource.mipLevel = 0;
8725 resolveRegion.dstSubresource.baseArrayLayer = 0;
8726 resolveRegion.dstSubresource.layerCount = 0;
8727 resolveRegion.dstOffset.x = 0;
8728 resolveRegion.dstOffset.y = 0;
8729 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008730 resolveRegion.extent.width = 1;
8731 resolveRegion.extent.height = 1;
8732 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008733 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8734 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008735 EndCommandBuffer();
8736
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008737 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008738
Chia-I Wuf7458c52015-10-26 21:10:41 +08008739 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008740 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008741 vkFreeMemory(m_device->device(), srcMem, NULL);
8742 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008743}
8744
Karl Schultz6addd812016-02-02 17:17:23 -07008745TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
8746 VkResult err;
8747 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008748
Karl Schultz6addd812016-02-02 17:17:23 -07008749 m_errorMonitor->SetDesiredFailureMsg(
8750 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008751 "vkCmdResolveImage called with unmatched source and dest formats.");
8752
Mike Stroyana3082432015-09-25 13:39:21 -06008753 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008754
8755 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008756 VkImage srcImage;
8757 VkImage dstImage;
8758 VkDeviceMemory srcMem;
8759 VkDeviceMemory destMem;
8760 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008761
8762 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008763 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8764 image_create_info.pNext = NULL;
8765 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8766 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8767 image_create_info.extent.width = 32;
8768 image_create_info.extent.height = 1;
8769 image_create_info.extent.depth = 1;
8770 image_create_info.mipLevels = 1;
8771 image_create_info.arrayLayers = 1;
8772 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8773 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8774 // Note: Some implementations expect color attachment usage for any
8775 // multisample surface
8776 image_create_info.usage =
8777 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8778 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008779
Karl Schultz6addd812016-02-02 17:17:23 -07008780 err =
8781 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008782 ASSERT_VK_SUCCESS(err);
8783
Karl Schultz6addd812016-02-02 17:17:23 -07008784 // Set format to something other than source image
8785 image_create_info.format = VK_FORMAT_R32_SFLOAT;
8786 // Note: Some implementations expect color attachment usage for any
8787 // multisample surface
8788 image_create_info.usage =
8789 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8790 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008791
Karl Schultz6addd812016-02-02 17:17:23 -07008792 err =
8793 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008794 ASSERT_VK_SUCCESS(err);
8795
8796 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008797 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008798 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8799 memAlloc.pNext = NULL;
8800 memAlloc.allocationSize = 0;
8801 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008802
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008803 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008804 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008805 pass =
8806 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008807 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008808 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008809 ASSERT_VK_SUCCESS(err);
8810
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008811 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008812 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008813 pass =
8814 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008815 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008816 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008817 ASSERT_VK_SUCCESS(err);
8818
8819 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8820 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008821 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008822 ASSERT_VK_SUCCESS(err);
8823
8824 BeginCommandBuffer();
8825 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008826 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8827 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008828 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008829 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008830 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008831 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008832 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008833 resolveRegion.srcOffset.x = 0;
8834 resolveRegion.srcOffset.y = 0;
8835 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008836 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008837 resolveRegion.dstSubresource.mipLevel = 0;
8838 resolveRegion.dstSubresource.baseArrayLayer = 0;
8839 resolveRegion.dstSubresource.layerCount = 0;
8840 resolveRegion.dstOffset.x = 0;
8841 resolveRegion.dstOffset.y = 0;
8842 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008843 resolveRegion.extent.width = 1;
8844 resolveRegion.extent.height = 1;
8845 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008846 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8847 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008848 EndCommandBuffer();
8849
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008850 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008851
Chia-I Wuf7458c52015-10-26 21:10:41 +08008852 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008853 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008854 vkFreeMemory(m_device->device(), srcMem, NULL);
8855 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008856}
8857
Karl Schultz6addd812016-02-02 17:17:23 -07008858TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
8859 VkResult err;
8860 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008861
Karl Schultz6addd812016-02-02 17:17:23 -07008862 m_errorMonitor->SetDesiredFailureMsg(
8863 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008864 "vkCmdResolveImage called with unmatched source and dest image types.");
8865
Mike Stroyana3082432015-09-25 13:39:21 -06008866 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008867
8868 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008869 VkImage srcImage;
8870 VkImage dstImage;
8871 VkDeviceMemory srcMem;
8872 VkDeviceMemory destMem;
8873 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008874
8875 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008876 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8877 image_create_info.pNext = NULL;
8878 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8879 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8880 image_create_info.extent.width = 32;
8881 image_create_info.extent.height = 1;
8882 image_create_info.extent.depth = 1;
8883 image_create_info.mipLevels = 1;
8884 image_create_info.arrayLayers = 1;
8885 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8886 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8887 // Note: Some implementations expect color attachment usage for any
8888 // multisample surface
8889 image_create_info.usage =
8890 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8891 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008892
Karl Schultz6addd812016-02-02 17:17:23 -07008893 err =
8894 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008895 ASSERT_VK_SUCCESS(err);
8896
Karl Schultz6addd812016-02-02 17:17:23 -07008897 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8898 // Note: Some implementations expect color attachment usage for any
8899 // multisample surface
8900 image_create_info.usage =
8901 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8902 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008903
Karl Schultz6addd812016-02-02 17:17:23 -07008904 err =
8905 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008906 ASSERT_VK_SUCCESS(err);
8907
8908 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008909 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008910 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8911 memAlloc.pNext = NULL;
8912 memAlloc.allocationSize = 0;
8913 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008914
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008915 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008916 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008917 pass =
8918 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008919 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008920 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008921 ASSERT_VK_SUCCESS(err);
8922
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008923 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008924 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008925 pass =
8926 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008927 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008928 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008929 ASSERT_VK_SUCCESS(err);
8930
8931 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8932 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008933 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008934 ASSERT_VK_SUCCESS(err);
8935
8936 BeginCommandBuffer();
8937 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008938 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8939 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008940 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008941 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008942 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008943 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008944 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008945 resolveRegion.srcOffset.x = 0;
8946 resolveRegion.srcOffset.y = 0;
8947 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008948 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008949 resolveRegion.dstSubresource.mipLevel = 0;
8950 resolveRegion.dstSubresource.baseArrayLayer = 0;
8951 resolveRegion.dstSubresource.layerCount = 0;
8952 resolveRegion.dstOffset.x = 0;
8953 resolveRegion.dstOffset.y = 0;
8954 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008955 resolveRegion.extent.width = 1;
8956 resolveRegion.extent.height = 1;
8957 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008958 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8959 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008960 EndCommandBuffer();
8961
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008962 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008963
Chia-I Wuf7458c52015-10-26 21:10:41 +08008964 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008965 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008966 vkFreeMemory(m_device->device(), srcMem, NULL);
8967 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008968}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008969
Karl Schultz6addd812016-02-02 17:17:23 -07008970TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008971 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07008972 // to using a DS format, then cause it to hit error due to COLOR_BIT not
8973 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008974 // The image format check comes 2nd in validation so we trigger it first,
8975 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07008976 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008977
Karl Schultz6addd812016-02-02 17:17:23 -07008978 m_errorMonitor->SetDesiredFailureMsg(
8979 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008980 "Combination depth/stencil image formats can have only the ");
8981
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008982 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008983
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008984 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008985 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8986 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008987
8988 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008989 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8990 ds_pool_ci.pNext = NULL;
8991 ds_pool_ci.maxSets = 1;
8992 ds_pool_ci.poolSizeCount = 1;
8993 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008994
8995 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008996 err =
8997 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008998 ASSERT_VK_SUCCESS(err);
8999
9000 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009001 dsl_binding.binding = 0;
9002 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
9003 dsl_binding.descriptorCount = 1;
9004 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9005 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009006
9007 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009008 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9009 ds_layout_ci.pNext = NULL;
9010 ds_layout_ci.bindingCount = 1;
9011 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009012 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009013 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9014 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009015 ASSERT_VK_SUCCESS(err);
9016
9017 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009018 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009019 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009020 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009021 alloc_info.descriptorPool = ds_pool;
9022 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009023 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9024 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009025 ASSERT_VK_SUCCESS(err);
9026
Karl Schultz6addd812016-02-02 17:17:23 -07009027 VkImage image_bad;
9028 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009029 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07009030 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009031 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07009032 const int32_t tex_width = 32;
9033 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009034
9035 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009036 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9037 image_create_info.pNext = NULL;
9038 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9039 image_create_info.format = tex_format_bad;
9040 image_create_info.extent.width = tex_width;
9041 image_create_info.extent.height = tex_height;
9042 image_create_info.extent.depth = 1;
9043 image_create_info.mipLevels = 1;
9044 image_create_info.arrayLayers = 1;
9045 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9046 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9047 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
9048 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
9049 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009050
Karl Schultz6addd812016-02-02 17:17:23 -07009051 err =
9052 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009053 ASSERT_VK_SUCCESS(err);
9054 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07009055 image_create_info.usage =
9056 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9057 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
9058 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009059 ASSERT_VK_SUCCESS(err);
9060
9061 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009062 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9063 image_view_create_info.image = image_bad;
9064 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
9065 image_view_create_info.format = tex_format_bad;
9066 image_view_create_info.subresourceRange.baseArrayLayer = 0;
9067 image_view_create_info.subresourceRange.baseMipLevel = 0;
9068 image_view_create_info.subresourceRange.layerCount = 1;
9069 image_view_create_info.subresourceRange.levelCount = 1;
9070 image_view_create_info.subresourceRange.aspectMask =
9071 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009072
9073 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07009074 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
9075 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009076
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009077 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009078
Chia-I Wuf7458c52015-10-26 21:10:41 +08009079 vkDestroyImage(m_device->device(), image_bad, NULL);
9080 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009081 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9082 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009083}
Tobin Ehliscde08892015-09-22 10:11:37 -06009084#endif // IMAGE_TESTS
9085
Tony Barbour300a6082015-04-07 13:44:53 -06009086int main(int argc, char **argv) {
9087 int result;
9088
Cody Northrop8e54a402016-03-08 22:25:52 -07009089#ifdef ANDROID
9090 int vulkanSupport = InitVulkan();
9091 if (vulkanSupport == 0)
9092 return 1;
9093#endif
9094
Tony Barbour300a6082015-04-07 13:44:53 -06009095 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06009096 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06009097
9098 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
9099
9100 result = RUN_ALL_TESTS();
9101
Tony Barbour6918cd52015-04-09 12:58:51 -06009102 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06009103 return result;
9104}