blob: 769153cb88ef02fa53160156092dfbfe39ed2db3 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Michael Lentine0a369f62016-02-03 16:51:46 -06005 * Copyright (c) 2015-2016 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
20 */
Tony Barbour65c48b32015-11-17 10:02:56 -070021
Cody Northrop8e54a402016-03-08 22:25:52 -070022#ifdef ANDROID
23#include "vulkan_wrapper.h"
24#else
David Pinedo9316d3b2015-11-06 12:54:48 -070025#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070026#endif
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060027#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060028#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060029#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070030#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060031
Mark Lobodzinski3780e142015-05-14 15:08:13 -050032#define GLM_FORCE_RADIANS
33#include "glm/glm.hpp"
34#include <glm/gtc/matrix_transform.hpp>
35
Tobin Ehlis0788f522015-05-26 16:11:58 -060036#define MEM_TRACKER_TESTS 1
37#define OBJ_TRACKER_TESTS 1
38#define DRAW_STATE_TESTS 1
39#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120040#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060041#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060042#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060043
Mark Lobodzinski3780e142015-05-14 15:08:13 -050044//--------------------------------------------------------------------------------------
45// Mesh and VertexFormat Data
46//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070047struct Vertex {
48 float posX, posY, posZ, posW; // Position data
49 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050050};
51
Karl Schultz6addd812016-02-02 17:17:23 -070052#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050053
54typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070055 BsoFailNone = 0x00000000,
56 BsoFailLineWidth = 0x00000001,
57 BsoFailDepthBias = 0x00000002,
58 BsoFailViewport = 0x00000004,
59 BsoFailScissor = 0x00000008,
60 BsoFailBlend = 0x00000010,
61 BsoFailDepthBounds = 0x00000020,
62 BsoFailStencilReadMask = 0x00000040,
63 BsoFailStencilWriteMask = 0x00000080,
64 BsoFailStencilReference = 0x00000100,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050065} BsoFailSelect;
66
67struct vktriangle_vs_uniform {
68 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070069 float mvp[4][4];
70 float position[3][4];
71 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050072};
73
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050074static const char bindStateVertShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120075 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070076 "vec2 vertices[3];\n"
77 "out gl_PerVertex {\n"
78 " vec4 gl_Position;\n"
79 "};\n"
80 "void main() {\n"
81 " vertices[0] = vec2(-1.0, -1.0);\n"
82 " vertices[1] = vec2( 1.0, -1.0);\n"
83 " vertices[2] = vec2( 0.0, 1.0);\n"
84 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
85 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050086
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050087static const char bindStateFragShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120088 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070089 "\n"
90 "layout(location = 0) out vec4 uFragColor;\n"
91 "void main(){\n"
92 " uFragColor = vec4(0,1,0,1);\n"
93 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050094
Karl Schultz6addd812016-02-02 17:17:23 -070095static VKAPI_ATTR VkBool32 VKAPI_CALL
96myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
97 uint64_t srcObject, size_t location, int32_t msgCode,
98 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -060099
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600100// ********************************************************
101// ErrorMonitor Usage:
102//
103// Call SetDesiredFailureMsg with a string to be compared against all
104// encountered log messages. Passing NULL will match all log messages.
105// logMsg will return true for skipCall only if msg is matched or NULL.
106//
107// Call DesiredMsgFound to determine if the desired failure message
108// was encountered.
109
Tony Barbour300a6082015-04-07 13:44:53 -0600110class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700111 public:
112 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600113 test_platform_thread_create_mutex(&m_mutex);
114 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700115 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700116 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600117 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600118 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600119
Dustin Graves48458142016-04-29 16:11:55 -0600120 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
121
Karl Schultz6addd812016-02-02 17:17:23 -0700122 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200123 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600124 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600125 m_failureMsg.clear();
126 m_otherMsgs.clear();
127 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700128 m_msgFound = VK_FALSE;
129 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600130 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600131 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600132
Karl Schultz6addd812016-02-02 17:17:23 -0700133 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600134 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600135 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600136 if (m_bailout != NULL) {
137 *m_bailout = true;
138 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600139 string errorString(msgString);
140 if (msgFlags & m_msgFlags) {
141 if (errorString.find(m_desiredMsg) != string::npos) {
Chris Forbesc7b8ad72016-04-04 18:50:38 +1200142 if (m_msgFound) { /* if multiple matches, don't lose all but the last! */
143 m_otherMsgs.push_back(m_failureMsg);
144 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600145 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700146 m_msgFound = VK_TRUE;
147 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600148 } else {
149 m_otherMsgs.push_back(errorString);
150 }
151 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600152 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600153 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600154 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600155
Karl Schultz6addd812016-02-02 17:17:23 -0700156 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600157
Karl Schultz6addd812016-02-02 17:17:23 -0700158 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600159
Karl Schultz6addd812016-02-02 17:17:23 -0700160 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600161
Karl Schultz6addd812016-02-02 17:17:23 -0700162 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600163
Karl Schultz6addd812016-02-02 17:17:23 -0700164 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165 vector<string> otherMsgs = GetOtherFailureMsgs();
166 cout << "Other error messages logged for this test were:" << endl;
167 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
168 cout << " " << *iter << endl;
169 }
170 }
171
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200172 /* helpers */
173
174 void ExpectSuccess() {
175 // match anything
176 SetDesiredFailureMsg(~0u, "");
177 }
178
179 void VerifyFound() {
180 // Not seeing the desired message is a failure. /Before/ throwing, dump
181 // any other messages.
182 if (!DesiredMsgFound()) {
183 DumpFailureMsgs();
184 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
185 }
186 }
187
188 void VerifyNotFound() {
189 // ExpectSuccess() configured us to match anything. Any error is a
190 // failure.
191 if (DesiredMsgFound()) {
192 DumpFailureMsgs();
193 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
194 }
195 }
196
Karl Schultz6addd812016-02-02 17:17:23 -0700197 private:
198 VkFlags m_msgFlags;
199 string m_desiredMsg;
200 string m_failureMsg;
201 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600202 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700203 bool *m_bailout;
204 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600205};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500206
Karl Schultz6addd812016-02-02 17:17:23 -0700207static VKAPI_ATTR VkBool32 VKAPI_CALL
208myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
209 uint64_t srcObject, size_t location, int32_t msgCode,
210 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
211 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700212 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700213 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600214 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600215 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600216 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600217 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600218}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500219
Karl Schultz6addd812016-02-02 17:17:23 -0700220class VkLayerTest : public VkRenderFramework {
221 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800222 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
223 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700224 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
225 BsoFailSelect failMask);
226 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
227 VkPipelineObj &pipelineobj,
228 VkDescriptorSetObj &descriptorSet,
229 BsoFailSelect failMask);
230 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
231 VkDescriptorSetObj &descriptorSet,
232 BsoFailSelect failMask) {
233 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
234 failMask);
235 }
Tony Barbour300a6082015-04-07 13:44:53 -0600236
Tony Barbourfe3351b2015-07-28 10:17:20 -0600237 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700238 VkResult BeginCommandBuffer() {
239 return BeginCommandBuffer(*m_commandBuffer);
240 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800241 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700242 void Draw(uint32_t vertexCount, uint32_t instanceCount,
243 uint32_t firstVertex, uint32_t firstInstance) {
244 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
245 firstInstance);
246 }
247 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
248 uint32_t firstIndex, int32_t vertexOffset,
249 uint32_t firstInstance) {
250 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
251 vertexOffset, firstInstance);
252 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800253 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); }
Karl Schultz6addd812016-02-02 17:17:23 -0700254 void QueueCommandBuffer(const VkFence &fence) {
255 m_commandBuffer->QueueCommandBuffer(fence);
256 }
257 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
258 VkDeviceSize offset, uint32_t binding) {
259 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
260 }
261 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
262 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
263 }
264
265 protected:
266 ErrorMonitor *m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600267
268 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600269 std::vector<const char *> instance_layer_names;
270 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600271 std::vector<const char *> instance_extension_names;
272 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600273
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700274 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600275 /*
276 * Since CreateDbgMsgCallback is an instance level extension call
277 * any extension / layer that utilizes that feature also needs
278 * to be enabled at create instance time.
279 */
Karl Schultz6addd812016-02-02 17:17:23 -0700280 // Use Threading layer first to protect others from
281 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700282 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600283 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800284 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700285 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800286 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
287 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600288 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700289 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600290
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700291 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600292 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800293 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700294 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800295 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
296 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600297 device_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700298 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600299
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600300 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600301 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800302 this->app_info.pApplicationName = "layer_tests";
303 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600304 this->app_info.pEngineName = "unittest";
305 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600306 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600307
Tony Barbour15524c32015-04-29 17:34:29 -0600308 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600309 InitFramework(instance_layer_names, device_layer_names,
310 instance_extension_names, device_extension_names,
311 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600312 }
313
314 virtual void TearDown() {
315 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600316 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600317 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600318 }
319};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500320
Karl Schultz6addd812016-02-02 17:17:23 -0700321VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600322 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600323
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800324 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600325
326 /*
327 * For render test all drawing happens in a single render pass
328 * on a single command buffer.
329 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200330 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800331 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600332 }
333
334 return result;
335}
336
Karl Schultz6addd812016-02-02 17:17:23 -0700337VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600338 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600339
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200340 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800341 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200342 }
Tony Barbour300a6082015-04-07 13:44:53 -0600343
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800344 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600345
346 return result;
347}
348
Karl Schultz6addd812016-02-02 17:17:23 -0700349void VkLayerTest::VKTriangleTest(const char *vertShaderText,
350 const char *fragShaderText,
351 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500352 // Create identity matrix
353 int i;
354 struct vktriangle_vs_uniform data;
355
356 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700357 glm::mat4 View = glm::mat4(1.0f);
358 glm::mat4 Model = glm::mat4(1.0f);
359 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500360 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700361 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500362
363 memcpy(&data.mvp, &MVP[0][0], matrixSize);
364
Karl Schultz6addd812016-02-02 17:17:23 -0700365 static const Vertex tri_data[] = {
366 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
367 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
368 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500369 };
370
Karl Schultz6addd812016-02-02 17:17:23 -0700371 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500372 data.position[i][0] = tri_data[i].posX;
373 data.position[i][1] = tri_data[i].posY;
374 data.position[i][2] = tri_data[i].posZ;
375 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700376 data.color[i][0] = tri_data[i].r;
377 data.color[i][1] = tri_data[i].g;
378 data.color[i][2] = tri_data[i].b;
379 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500380 }
381
382 ASSERT_NO_FATAL_FAILURE(InitState());
383 ASSERT_NO_FATAL_FAILURE(InitViewport());
384
Karl Schultz6addd812016-02-02 17:17:23 -0700385 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
386 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500387
Karl Schultz6addd812016-02-02 17:17:23 -0700388 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
389 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
390 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500391
392 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800393 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500394 pipelineobj.AddShader(&vs);
395 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600396 if (failMask & BsoFailLineWidth) {
397 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600398 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
399 ia_state.sType =
400 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
401 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
402 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600403 }
404 if (failMask & BsoFailDepthBias) {
405 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600406 VkPipelineRasterizationStateCreateInfo rs_state = {};
407 rs_state.sType =
408 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
409 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600410 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600411 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600412 }
Karl Schultz6addd812016-02-02 17:17:23 -0700413 // Viewport and scissors must stay in synch or other errors will occur than
414 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600415 if (failMask & BsoFailViewport) {
416 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600417 m_viewports.clear();
418 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600419 }
420 if (failMask & BsoFailScissor) {
421 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600422 m_scissors.clear();
423 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600424 }
425 if (failMask & BsoFailBlend) {
426 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600427 VkPipelineColorBlendAttachmentState att_state = {};
428 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
429 att_state.blendEnable = VK_TRUE;
430 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600431 }
432 if (failMask & BsoFailDepthBounds) {
433 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
434 }
435 if (failMask & BsoFailStencilReadMask) {
436 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
437 }
438 if (failMask & BsoFailStencilWriteMask) {
439 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
440 }
441 if (failMask & BsoFailStencilReference) {
442 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
443 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500444
445 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700446 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
447 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500448
449 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600450 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500451
Tony Barbourfe3351b2015-07-28 10:17:20 -0600452 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500453
454 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600455 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500456
457 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600458 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500459
Tony Barbourfe3351b2015-07-28 10:17:20 -0600460 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500461}
462
Karl Schultz6addd812016-02-02 17:17:23 -0700463void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
464 VkPipelineObj &pipelineobj,
465 VkDescriptorSetObj &descriptorSet,
466 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500467 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700468 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
469 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500470 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700471 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
472 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500473 }
474
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800475 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700476 // Make sure depthWriteEnable is set so that Depth fail test will work
477 // correctly
478 // Make sure stencilTestEnable is set so that Stencil fail test will work
479 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600480 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800481 stencil.failOp = VK_STENCIL_OP_KEEP;
482 stencil.passOp = VK_STENCIL_OP_KEEP;
483 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
484 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600485
486 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
487 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600488 ds_ci.pNext = NULL;
489 ds_ci.depthTestEnable = VK_FALSE;
490 ds_ci.depthWriteEnable = VK_TRUE;
491 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
492 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600493 if (failMask & BsoFailDepthBounds) {
494 ds_ci.depthBoundsTestEnable = VK_TRUE;
495 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600496 ds_ci.stencilTestEnable = VK_TRUE;
497 ds_ci.front = stencil;
498 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600499
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600500 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600501 pipelineobj.SetViewport(m_viewports);
502 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800503 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700504 VkResult err = pipelineobj.CreateVKPipeline(
505 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600506 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800507 commandBuffer->BindPipeline(pipelineobj);
508 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500509}
510
511// ********************************************************************************************************************
512// ********************************************************************************************************************
513// ********************************************************************************************************************
514// ********************************************************************************************************************
Tobin Ehlis0788f522015-05-26 16:11:58 -0600515#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700516#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800517TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500518{
519 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500520 VkFenceCreateInfo fenceInfo = {};
521 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
522 fenceInfo.pNext = NULL;
523 fenceInfo.flags = 0;
524
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600526
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500527 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600528
529 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
530 vk_testing::Buffer buffer;
531 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500532
Tony Barbourfe3351b2015-07-28 10:17:20 -0600533 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800534 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600535 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500536
537 testFence.init(*m_device, fenceInfo);
538
539 // Bypass framework since it does the waits automatically
540 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600541 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800542 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
543 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800544 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600545 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700546 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800547 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800548 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800549 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600550 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600551
552 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500553 ASSERT_VK_SUCCESS( err );
554
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500555 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800556 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500557
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200558 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500559}
560
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800561TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500562{
563 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500564 VkFenceCreateInfo fenceInfo = {};
565 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
566 fenceInfo.pNext = NULL;
567 fenceInfo.flags = 0;
568
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600570
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500571 ASSERT_NO_FATAL_FAILURE(InitState());
572 ASSERT_NO_FATAL_FAILURE(InitViewport());
573 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
574
Tony Barbourfe3351b2015-07-28 10:17:20 -0600575 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800576 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600577 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500578
579 testFence.init(*m_device, fenceInfo);
580
581 // Bypass framework since it does the waits automatically
582 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600583 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800584 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
585 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800586 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600587 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700588 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800589 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800590 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800591 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600592 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600593
594 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500595 ASSERT_VK_SUCCESS( err );
596
Jon Ashburnf19916e2016-01-11 13:12:43 -0700597 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800598 VkCommandBufferBeginInfo info = {};
599 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
600 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600601 info.renderPass = VK_NULL_HANDLE;
602 info.subpass = 0;
603 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +0800604 info.occlusionQueryEnable = VK_FALSE;
605 info.queryFlags = 0;
606 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600607
608 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800609 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500610
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200611 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500612}
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700613#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200614
Ian Elliott1c32c772016-04-28 14:47:13 -0600615TEST_F(VkLayerTest, EnableWsiBeforeUse) {
616 VkResult err;
617 bool pass;
618
619 VkSurfaceKHR surface = VK_NULL_HANDLE;
620 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
621 VkSwapchainCreateInfoKHR swapchain_create_info = {};
622 uint32_t swapchain_image_count = 0;
623// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
624 uint32_t image_index = 0;
625// VkPresentInfoKHR present_info = {};
626
627 ASSERT_NO_FATAL_FAILURE(InitState());
628
Ian Elliott3f06ce52016-04-29 14:46:21 -0600629#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
630#if defined(VK_USE_PLATFORM_ANDROID_KHR)
631 // Use the functions from the VK_KHR_android_surface extension without
632 // enabling that extension:
633
634 // Create a surface:
635 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
636#if 0
637#endif
638 m_errorMonitor->SetDesiredFailureMsg(
639 VK_DEBUG_REPORT_ERROR_BIT_EXT,
640 "extension was not enabled for this");
641 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
642 &surface);
643 pass = (err != VK_SUCCESS);
644 ASSERT_TRUE(pass);
645 m_errorMonitor->VerifyFound();
646#endif // VK_USE_PLATFORM_ANDROID_KHR
647
648
649#if defined(VK_USE_PLATFORM_MIR_KHR)
650 // Use the functions from the VK_KHR_mir_surface extension without enabling
651 // that extension:
652
653 // Create a surface:
654 VkMirSurfaceCreateInfoKHR mir_create_info = {};
655#if 0
656#endif
657 m_errorMonitor->SetDesiredFailureMsg(
658 VK_DEBUG_REPORT_ERROR_BIT_EXT,
659 "extension was not enabled for this");
660 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
661 pass = (err != VK_SUCCESS);
662 ASSERT_TRUE(pass);
663 m_errorMonitor->VerifyFound();
664
665 // Tell whether an mir_connection supports presentation:
666 MirConnection *mir_connection = NULL;
667 m_errorMonitor->SetDesiredFailureMsg(
668 VK_DEBUG_REPORT_ERROR_BIT_EXT,
669 "extension was not enabled for this");
670 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
671 visual_id);
672 m_errorMonitor->VerifyFound();
673#endif // VK_USE_PLATFORM_MIR_KHR
674
675
676#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
677 // Use the functions from the VK_KHR_wayland_surface extension without
678 // enabling that extension:
679
680 // Create a surface:
681 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
682#if 0
683#endif
684 m_errorMonitor->SetDesiredFailureMsg(
685 VK_DEBUG_REPORT_ERROR_BIT_EXT,
686 "extension was not enabled for this");
687 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
688 &surface);
689 pass = (err != VK_SUCCESS);
690 ASSERT_TRUE(pass);
691 m_errorMonitor->VerifyFound();
692
693 // Tell whether an wayland_display supports presentation:
694 struct wl_display wayland_display = {};
695 m_errorMonitor->SetDesiredFailureMsg(
696 VK_DEBUG_REPORT_ERROR_BIT_EXT,
697 "extension was not enabled for this");
698 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
699 &wayland_display);
700 m_errorMonitor->VerifyFound();
701#endif // VK_USE_PLATFORM_WAYLAND_KHR
702
703
704#if defined(VK_USE_PLATFORM_WIN32_KHR)
705 // Use the functions from the VK_KHR_win32_surface extension without
706 // enabling that extension:
707
708 // Create a surface:
709 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
710#if 0
711#endif
712 m_errorMonitor->SetDesiredFailureMsg(
713 VK_DEBUG_REPORT_ERROR_BIT_EXT,
714 "extension was not enabled for this");
715 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
716 &surface);
717 pass = (err != VK_SUCCESS);
718 ASSERT_TRUE(pass);
719 m_errorMonitor->VerifyFound();
720
721 // Tell whether win32 supports presentation:
722 struct wl_display win32_display = {};
723 m_errorMonitor->SetDesiredFailureMsg(
724 VK_DEBUG_REPORT_ERROR_BIT_EXT,
725 "extension was not enabled for this");
726 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0,
727 &win32_display);
728 m_errorMonitor->VerifyFound();
729#endif // VK_USE_PLATFORM_WAYLAND_KHR
730#endif // NEED_TO_TEST_THIS_ON_PLATFORM
731
732
Ian Elliott1c32c772016-04-28 14:47:13 -0600733#if defined(VK_USE_PLATFORM_XCB_KHR)
734 // Use the functions from the VK_KHR_xcb_surface extension without enabling
735 // that extension:
736
737 // Create a surface:
738 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
739#if 0
740#endif
741 m_errorMonitor->SetDesiredFailureMsg(
742 VK_DEBUG_REPORT_ERROR_BIT_EXT,
743 "extension was not enabled for this");
744 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
745 pass = (err != VK_SUCCESS);
746 ASSERT_TRUE(pass);
747 m_errorMonitor->VerifyFound();
748
749 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -0600750 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -0600751 xcb_visualid_t visual_id = 0;
752 m_errorMonitor->SetDesiredFailureMsg(
753 VK_DEBUG_REPORT_ERROR_BIT_EXT,
754 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -0600755 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -0600756 visual_id);
757 m_errorMonitor->VerifyFound();
758#endif // VK_USE_PLATFORM_XCB_KHR
759
760
Ian Elliott12630812016-04-29 14:35:43 -0600761#if defined(VK_USE_PLATFORM_XLIB_KHR)
762 // Use the functions from the VK_KHR_xlib_surface extension without enabling
763 // that extension:
764
765 // Create a surface:
766 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
767#if 0
768#endif
769 m_errorMonitor->SetDesiredFailureMsg(
770 VK_DEBUG_REPORT_ERROR_BIT_EXT,
771 "extension was not enabled for this");
772 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
773 pass = (err != VK_SUCCESS);
774 ASSERT_TRUE(pass);
775 m_errorMonitor->VerifyFound();
776
777 // Tell whether an Xlib VisualID supports presentation:
778 Display *dpy = NULL;
779 VisualID visual = 0;
780 m_errorMonitor->SetDesiredFailureMsg(
781 VK_DEBUG_REPORT_ERROR_BIT_EXT,
782 "extension was not enabled for this");
783 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
784 m_errorMonitor->VerifyFound();
785#endif // VK_USE_PLATFORM_XLIB_KHR
786
787
Ian Elliott1c32c772016-04-28 14:47:13 -0600788 // Use the functions from the VK_KHR_surface extension without enabling
789 // that extension:
790
791 // Destroy a surface:
792 m_errorMonitor->SetDesiredFailureMsg(
793 VK_DEBUG_REPORT_ERROR_BIT_EXT,
794 "extension was not enabled for this");
795 vkDestroySurfaceKHR(instance(), surface, NULL);
796 m_errorMonitor->VerifyFound();
797
798 // Check if surface supports presentation:
799 VkBool32 supported = false;
800 m_errorMonitor->SetDesiredFailureMsg(
801 VK_DEBUG_REPORT_ERROR_BIT_EXT,
802 "extension was not enabled for this");
803 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
804 pass = (err != VK_SUCCESS);
805 ASSERT_TRUE(pass);
806 m_errorMonitor->VerifyFound();
807
808 // Check surface capabilities:
809 VkSurfaceCapabilitiesKHR capabilities = {};
810 m_errorMonitor->SetDesiredFailureMsg(
811 VK_DEBUG_REPORT_ERROR_BIT_EXT,
812 "extension was not enabled for this");
813 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
814 &capabilities);
815 pass = (err != VK_SUCCESS);
816 ASSERT_TRUE(pass);
817 m_errorMonitor->VerifyFound();
818
819 // Check surface formats:
820 uint32_t format_count = 0;
821 VkSurfaceFormatKHR *formats = NULL;
822 m_errorMonitor->SetDesiredFailureMsg(
823 VK_DEBUG_REPORT_ERROR_BIT_EXT,
824 "extension was not enabled for this");
825 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
826 &format_count, formats);
827 pass = (err != VK_SUCCESS);
828 ASSERT_TRUE(pass);
829 m_errorMonitor->VerifyFound();
830
831 // Check surface present modes:
832 uint32_t present_mode_count = 0;
833 VkSurfaceFormatKHR *present_modes = NULL;
834 m_errorMonitor->SetDesiredFailureMsg(
835 VK_DEBUG_REPORT_ERROR_BIT_EXT,
836 "extension was not enabled for this");
837 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
838 &present_mode_count, present_modes);
839 pass = (err != VK_SUCCESS);
840 ASSERT_TRUE(pass);
841 m_errorMonitor->VerifyFound();
842
843
844 // Use the functions from the VK_KHR_swapchain extension without enabling
845 // that extension:
846
847 // Create a swapchain:
848 m_errorMonitor->SetDesiredFailureMsg(
849 VK_DEBUG_REPORT_ERROR_BIT_EXT,
850 "extension was not enabled for this");
851 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
852 swapchain_create_info.pNext = NULL;
853#if 0
854 swapchain_create_info.flags = 0;
855 swapchain_create_info.surface = 0;
856 swapchain_create_info.minImageCount = 0;
857 swapchain_create_info.imageFormat = 0;
858 swapchain_create_info.imageColorSpace = 0;
859 swapchain_create_info.imageExtent.width = 0;
860 swapchain_create_info.imageExtent.height = 0;
861 swapchain_create_info.imageArrayLayers = 0;
862 swapchain_create_info.imageUsage = 0;
863 swapchain_create_info.imageSharingMode = 0;
864 swapchain_create_info.queueFamilyIndexCount = 0;
865 swapchain_create_info.preTransform = 0;
866 swapchain_create_info.compositeAlpha = 0;
867 swapchain_create_info.presentMode = 0;
868 swapchain_create_info.clipped = 0;
869 swapchain_create_info.oldSwapchain = NULL;
870#endif
871 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
872 NULL, &swapchain);
873 pass = (err != VK_SUCCESS);
874 ASSERT_TRUE(pass);
875 m_errorMonitor->VerifyFound();
876
877 // Get the images from the swapchain:
878 m_errorMonitor->SetDesiredFailureMsg(
879 VK_DEBUG_REPORT_ERROR_BIT_EXT,
880 "extension was not enabled for this");
881 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
882 &swapchain_image_count, NULL);
883 pass = (err != VK_SUCCESS);
884 ASSERT_TRUE(pass);
885 m_errorMonitor->VerifyFound();
886
887 // Try to acquire an image:
888 m_errorMonitor->SetDesiredFailureMsg(
889 VK_DEBUG_REPORT_ERROR_BIT_EXT,
890 "extension was not enabled for this");
891 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
892 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
893 pass = (err != VK_SUCCESS);
894 ASSERT_TRUE(pass);
895 m_errorMonitor->VerifyFound();
896
897 // Try to present an image:
898#if 0 // NOTE: Currently can't test this because a real swapchain is needed
899 // (as opposed to the fake one we created) in order for the layer to
900 // lookup the VkDevice used to enable the extension:
901 m_errorMonitor->SetDesiredFailureMsg(
902 VK_DEBUG_REPORT_ERROR_BIT_EXT,
903 "extension was not enabled for this");
904 present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
905 present_info.pNext = NULL;
906#if 0
907#endif
908 err = vkQueuePresentKHR(m_device->m_queue, &present_info);
909 pass = (err != VK_SUCCESS);
910 ASSERT_TRUE(pass);
911 m_errorMonitor->VerifyFound();
912#endif
913
914 // Destroy the swapchain:
915 m_errorMonitor->SetDesiredFailureMsg(
916 VK_DEBUG_REPORT_ERROR_BIT_EXT,
917 "extension was not enabled for this");
918 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
919 m_errorMonitor->VerifyFound();
920}
921
Karl Schultz6addd812016-02-02 17:17:23 -0700922TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
923 VkResult err;
924 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500925
Karl Schultz6addd812016-02-02 17:17:23 -0700926 m_errorMonitor->SetDesiredFailureMsg(
927 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600928 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
929
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500930 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500931
932 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700933 VkImage image;
934 VkDeviceMemory mem;
935 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500936
Karl Schultz6addd812016-02-02 17:17:23 -0700937 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
938 const int32_t tex_width = 32;
939 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500940
Tony Barboureb254902015-07-15 12:50:33 -0600941 VkImageCreateInfo image_create_info = {};
942 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700943 image_create_info.pNext = NULL;
944 image_create_info.imageType = VK_IMAGE_TYPE_2D;
945 image_create_info.format = tex_format;
946 image_create_info.extent.width = tex_width;
947 image_create_info.extent.height = tex_height;
948 image_create_info.extent.depth = 1;
949 image_create_info.mipLevels = 1;
950 image_create_info.arrayLayers = 1;
951 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
952 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
953 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
954 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600955
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800956 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800957 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700958 mem_alloc.pNext = NULL;
959 mem_alloc.allocationSize = 0;
960 // Introduce failure, do NOT set memProps to
961 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
962 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500963
Chia-I Wuf7458c52015-10-26 21:10:41 +0800964 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500965 ASSERT_VK_SUCCESS(err);
966
Karl Schultz6addd812016-02-02 17:17:23 -0700967 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500968
Mark Lobodzinski23065352015-05-29 09:32:35 -0500969 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500970
Karl Schultz6addd812016-02-02 17:17:23 -0700971 pass =
972 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
973 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
974 if (!pass) { // If we can't find any unmappable memory this test doesn't
975 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +0800976 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -0600977 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -0600978 }
Mike Stroyan713b2d72015-08-04 10:49:29 -0600979
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500980 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800981 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500982 ASSERT_VK_SUCCESS(err);
983
984 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -0600985 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500986 ASSERT_VK_SUCCESS(err);
987
988 // Map memory as if to initialize the image
989 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -0700990 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
991 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500992
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200993 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600994
Chia-I Wuf7458c52015-10-26 21:10:41 +0800995 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500996}
997
Karl Schultz6addd812016-02-02 17:17:23 -0700998TEST_F(VkLayerTest, RebindMemory) {
999 VkResult err;
1000 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001001
Karl Schultz6addd812016-02-02 17:17:23 -07001002 m_errorMonitor->SetDesiredFailureMsg(
1003 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001004 "which has already been bound to mem object");
1005
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001006 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001007
1008 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001009 VkImage image;
1010 VkDeviceMemory mem1;
1011 VkDeviceMemory mem2;
1012 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001013
Karl Schultz6addd812016-02-02 17:17:23 -07001014 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1015 const int32_t tex_width = 32;
1016 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001017
Tony Barboureb254902015-07-15 12:50:33 -06001018 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001019 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1020 image_create_info.pNext = NULL;
1021 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1022 image_create_info.format = tex_format;
1023 image_create_info.extent.width = tex_width;
1024 image_create_info.extent.height = tex_height;
1025 image_create_info.extent.depth = 1;
1026 image_create_info.mipLevels = 1;
1027 image_create_info.arrayLayers = 1;
1028 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1029 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1030 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1031 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001032
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001033 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001034 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1035 mem_alloc.pNext = NULL;
1036 mem_alloc.allocationSize = 0;
1037 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06001038
Karl Schultz6addd812016-02-02 17:17:23 -07001039 // Introduce failure, do NOT set memProps to
1040 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06001041 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08001042 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001043 ASSERT_VK_SUCCESS(err);
1044
Karl Schultz6addd812016-02-02 17:17:23 -07001045 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001046
1047 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001048 pass =
1049 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001050 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001051
1052 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001053 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001054 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001055 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001056 ASSERT_VK_SUCCESS(err);
1057
1058 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06001059 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001060 ASSERT_VK_SUCCESS(err);
1061
Karl Schultz6addd812016-02-02 17:17:23 -07001062 // Introduce validation failure, try to bind a different memory object to
1063 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06001064 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001065
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001066 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001067
Chia-I Wuf7458c52015-10-26 21:10:41 +08001068 vkDestroyImage(m_device->device(), image, NULL);
1069 vkFreeMemory(m_device->device(), mem1, NULL);
1070 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001071}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001072
Karl Schultz6addd812016-02-02 17:17:23 -07001073TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001074 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001075
Karl Schultz6addd812016-02-02 17:17:23 -07001076 m_errorMonitor->SetDesiredFailureMsg(
1077 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
1078 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001079
1080 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001081 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1082 fenceInfo.pNext = NULL;
1083 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06001084
Tony Barbour300a6082015-04-07 13:44:53 -06001085 ASSERT_NO_FATAL_FAILURE(InitState());
1086 ASSERT_NO_FATAL_FAILURE(InitViewport());
1087 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1088
Tony Barbourfe3351b2015-07-28 10:17:20 -06001089 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001090 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
1091 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001092 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06001093
1094 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001095
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001096 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001097 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1098 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001099 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001100 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001101 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001102 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001103 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001104 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001105 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001106
1107 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07001108 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001109
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001110 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001111}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001112// This is a positive test. We used to expect error in this case but spec now
1113// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07001114TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001115 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001116 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001117 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001118 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1119 fenceInfo.pNext = NULL;
1120
Tony Barbour0b4d9562015-04-09 10:48:04 -06001121 ASSERT_NO_FATAL_FAILURE(InitState());
1122 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08001123 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001124 VkResult result = vkResetFences(m_device->device(), 1, fences);
1125 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06001126
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001127 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06001128}
Tobin Ehlis41376e12015-07-03 08:45:14 -06001129
Chia-I Wu08accc62015-07-07 11:50:03 +08001130/* TODO: Update for changes due to bug-14075 tiling across render passes */
1131#if 0
Tobin Ehlis41376e12015-07-03 08:45:14 -06001132TEST_F(VkLayerTest, InvalidUsageBits)
1133{
1134 // Initiate Draw w/o a PSO bound
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001135
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001137 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06001138
1139 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001140 VkCommandBufferObj commandBuffer(m_device);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001141 BeginCommandBuffer();
Tobin Ehlis41376e12015-07-03 08:45:14 -06001142
1143 const VkExtent3D e3d = {
1144 .width = 128,
1145 .height = 128,
1146 .depth = 1,
1147 };
1148 const VkImageCreateInfo ici = {
1149 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
1150 .pNext = NULL,
1151 .imageType = VK_IMAGE_TYPE_2D,
1152 .format = VK_FORMAT_D32_SFLOAT_S8_UINT,
1153 .extent = e3d,
1154 .mipLevels = 1,
1155 .arraySize = 1,
Chia-I Wu5c17c962015-10-31 00:31:16 +08001156 .samples = VK_SAMPLE_COUNT_1_BIT,
Tobin Ehlis41376e12015-07-03 08:45:14 -06001157 .tiling = VK_IMAGE_TILING_LINEAR,
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -06001158 .usage = 0, // Not setting VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
Tobin Ehlis41376e12015-07-03 08:45:14 -06001159 .flags = 0,
1160 };
1161
1162 VkImage dsi;
Chia-I Wuf7458c52015-10-26 21:10:41 +08001163 vkCreateImage(m_device->device(), &ici, NULL, &dsi);
Tobin Ehlis41376e12015-07-03 08:45:14 -06001164 VkDepthStencilView dsv;
1165 const VkDepthStencilViewCreateInfo dsvci = {
1166 .sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO,
1167 .pNext = NULL,
1168 .image = dsi,
1169 .mipLevel = 0,
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -06001170 .baseArrayLayer = 0,
Tobin Ehlis41376e12015-07-03 08:45:14 -06001171 .arraySize = 1,
1172 .flags = 0,
1173 };
Chia-I Wuf7458c52015-10-26 21:10:41 +08001174 vkCreateDepthStencilView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001175
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001176 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06001177}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001178#endif // 0
1179#endif // MEM_TRACKER_TESTS
1180
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06001181#if OBJ_TRACKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07001182TEST_F(VkLayerTest, PipelineNotBound) {
1183 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001184
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001186 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001187
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001188 ASSERT_NO_FATAL_FAILURE(InitState());
1189 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001190
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001191 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001192 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1193 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001194
1195 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001196 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1197 ds_pool_ci.pNext = NULL;
1198 ds_pool_ci.maxSets = 1;
1199 ds_pool_ci.poolSizeCount = 1;
1200 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001201
1202 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001203 err =
1204 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001205 ASSERT_VK_SUCCESS(err);
1206
1207 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001208 dsl_binding.binding = 0;
1209 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1210 dsl_binding.descriptorCount = 1;
1211 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1212 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001213
1214 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001215 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1216 ds_layout_ci.pNext = NULL;
1217 ds_layout_ci.bindingCount = 1;
1218 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001219
1220 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001221 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1222 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001223 ASSERT_VK_SUCCESS(err);
1224
1225 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001226 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001227 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001228 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001229 alloc_info.descriptorPool = ds_pool;
1230 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001231 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1232 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001233 ASSERT_VK_SUCCESS(err);
1234
1235 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001236 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1237 pipeline_layout_ci.pNext = NULL;
1238 pipeline_layout_ci.setLayoutCount = 1;
1239 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001240
1241 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001242 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1243 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001244 ASSERT_VK_SUCCESS(err);
1245
Mark Youngad779052016-01-06 14:26:04 -07001246 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001247
1248 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001249 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1250 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001251
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001252 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001253
Chia-I Wuf7458c52015-10-26 21:10:41 +08001254 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1255 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1256 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001257}
1258
Karl Schultz6addd812016-02-02 17:17:23 -07001259TEST_F(VkLayerTest, BindInvalidMemory) {
1260 VkResult err;
1261 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001262
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001264 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001265
Tobin Ehlisec598302015-09-15 15:02:17 -06001266 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001267
1268 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001269 VkImage image;
1270 VkDeviceMemory mem;
1271 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001272
Karl Schultz6addd812016-02-02 17:17:23 -07001273 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1274 const int32_t tex_width = 32;
1275 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001276
1277 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001278 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1279 image_create_info.pNext = NULL;
1280 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1281 image_create_info.format = tex_format;
1282 image_create_info.extent.width = tex_width;
1283 image_create_info.extent.height = tex_height;
1284 image_create_info.extent.depth = 1;
1285 image_create_info.mipLevels = 1;
1286 image_create_info.arrayLayers = 1;
1287 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1288 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1289 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1290 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001291
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001292 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001293 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1294 mem_alloc.pNext = NULL;
1295 mem_alloc.allocationSize = 0;
1296 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001297
Chia-I Wuf7458c52015-10-26 21:10:41 +08001298 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001299 ASSERT_VK_SUCCESS(err);
1300
Karl Schultz6addd812016-02-02 17:17:23 -07001301 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001302
1303 mem_alloc.allocationSize = mem_reqs.size;
1304
Karl Schultz6addd812016-02-02 17:17:23 -07001305 pass =
1306 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001307 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001308
1309 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001310 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001311 ASSERT_VK_SUCCESS(err);
1312
1313 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001314 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001315
1316 // Try to bind free memory that has been freed
1317 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1318 // This may very well return an error.
1319 (void)err;
1320
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001321 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001322
Chia-I Wuf7458c52015-10-26 21:10:41 +08001323 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001324}
1325
Karl Schultz6addd812016-02-02 17:17:23 -07001326TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1327 VkResult err;
1328 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001329
Karl Schultz6addd812016-02-02 17:17:23 -07001330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1331 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001332
Tobin Ehlisec598302015-09-15 15:02:17 -06001333 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001334
Karl Schultz6addd812016-02-02 17:17:23 -07001335 // Create an image object, allocate memory, destroy the object and then try
1336 // to bind it
1337 VkImage image;
1338 VkDeviceMemory mem;
1339 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001340
Karl Schultz6addd812016-02-02 17:17:23 -07001341 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1342 const int32_t tex_width = 32;
1343 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001344
1345 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001346 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1347 image_create_info.pNext = NULL;
1348 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1349 image_create_info.format = tex_format;
1350 image_create_info.extent.width = tex_width;
1351 image_create_info.extent.height = tex_height;
1352 image_create_info.extent.depth = 1;
1353 image_create_info.mipLevels = 1;
1354 image_create_info.arrayLayers = 1;
1355 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1356 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1357 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1358 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001359
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001360 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001361 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1362 mem_alloc.pNext = NULL;
1363 mem_alloc.allocationSize = 0;
1364 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001365
Chia-I Wuf7458c52015-10-26 21:10:41 +08001366 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001367 ASSERT_VK_SUCCESS(err);
1368
Karl Schultz6addd812016-02-02 17:17:23 -07001369 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001370
1371 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001372 pass =
1373 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001374 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001375
1376 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001377 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001378 ASSERT_VK_SUCCESS(err);
1379
1380 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001381 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001382 ASSERT_VK_SUCCESS(err);
1383
1384 // Now Try to bind memory to this destroyed object
1385 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1386 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001387 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001388
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001389 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001390
Chia-I Wuf7458c52015-10-26 21:10:41 +08001391 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001392}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001393
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001394#endif // OBJ_TRACKER_TESTS
1395
Tobin Ehlis0788f522015-05-26 16:11:58 -06001396#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001397
1398// This is a positive test. No errors should be generated.
1399TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
1400
1401 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1402 "submitted on separate queues followed by a QueueWaitIdle.");
1403
Dustin Graves48458142016-04-29 16:11:55 -06001404 if ((m_device->queue_props.empty()) ||
1405 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001406 return;
1407
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001408 m_errorMonitor->ExpectSuccess();
1409
1410 VkSemaphore semaphore;
1411 VkSemaphoreCreateInfo semaphore_create_info{};
1412 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1413 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1414 &semaphore);
1415
1416 VkCommandPool command_pool;
1417 VkCommandPoolCreateInfo pool_create_info{};
1418 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1419 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1420 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1421 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1422 &command_pool);
1423
1424 VkCommandBuffer command_buffer[2];
1425 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1426 command_buffer_allocate_info.sType =
1427 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1428 command_buffer_allocate_info.commandPool = command_pool;
1429 command_buffer_allocate_info.commandBufferCount = 2;
1430 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1431 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1432 command_buffer);
1433
1434 VkQueue queue = VK_NULL_HANDLE;
1435 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1436 1, &queue);
1437
1438 {
1439 VkCommandBufferBeginInfo begin_info{};
1440 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1441 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1442
1443 vkCmdPipelineBarrier(command_buffer[0],
1444 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1445 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1446 0, nullptr, 0, nullptr);
1447
1448 VkViewport viewport{};
1449 viewport.maxDepth = 1.0f;
1450 viewport.minDepth = 0.0f;
1451 viewport.width = 512;
1452 viewport.height = 512;
1453 viewport.x = 0;
1454 viewport.y = 0;
1455 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1456 vkEndCommandBuffer(command_buffer[0]);
1457 }
1458 {
1459 VkCommandBufferBeginInfo begin_info{};
1460 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1461 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1462
1463 VkViewport viewport{};
1464 viewport.maxDepth = 1.0f;
1465 viewport.minDepth = 0.0f;
1466 viewport.width = 512;
1467 viewport.height = 512;
1468 viewport.x = 0;
1469 viewport.y = 0;
1470 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1471 vkEndCommandBuffer(command_buffer[1]);
1472 }
1473 {
1474 VkSubmitInfo submit_info{};
1475 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1476 submit_info.commandBufferCount = 1;
1477 submit_info.pCommandBuffers = &command_buffer[0];
1478 submit_info.signalSemaphoreCount = 1;
1479 submit_info.pSignalSemaphores = &semaphore;
1480 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1481 }
1482 {
1483 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1484 VkSubmitInfo submit_info{};
1485 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1486 submit_info.commandBufferCount = 1;
1487 submit_info.pCommandBuffers = &command_buffer[1];
1488 submit_info.waitSemaphoreCount = 1;
1489 submit_info.pWaitSemaphores = &semaphore;
1490 submit_info.pWaitDstStageMask = flags;
1491 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1492 }
1493
1494 vkQueueWaitIdle(m_device->m_queue);
1495
1496 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1497 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1498 &command_buffer[0]);
1499 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1500
1501 m_errorMonitor->VerifyNotFound();
1502}
1503
1504// This is a positive test. No errors should be generated.
1505TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
1506
1507 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1508 "submitted on separate queues, the second having a fence"
1509 "followed by a QueueWaitIdle.");
1510
Dustin Graves48458142016-04-29 16:11:55 -06001511 if ((m_device->queue_props.empty()) ||
1512 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001513 return;
1514
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001515 m_errorMonitor->ExpectSuccess();
1516
1517 VkFence fence;
1518 VkFenceCreateInfo fence_create_info{};
1519 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1520 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1521
1522 VkSemaphore semaphore;
1523 VkSemaphoreCreateInfo semaphore_create_info{};
1524 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1525 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1526 &semaphore);
1527
1528 VkCommandPool command_pool;
1529 VkCommandPoolCreateInfo pool_create_info{};
1530 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1531 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1532 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1533 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1534 &command_pool);
1535
1536 VkCommandBuffer command_buffer[2];
1537 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1538 command_buffer_allocate_info.sType =
1539 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1540 command_buffer_allocate_info.commandPool = command_pool;
1541 command_buffer_allocate_info.commandBufferCount = 2;
1542 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1543 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1544 command_buffer);
1545
1546 VkQueue queue = VK_NULL_HANDLE;
1547 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1548 1, &queue);
1549
1550 {
1551 VkCommandBufferBeginInfo begin_info{};
1552 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1553 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1554
1555 vkCmdPipelineBarrier(command_buffer[0],
1556 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1557 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1558 0, nullptr, 0, nullptr);
1559
1560 VkViewport viewport{};
1561 viewport.maxDepth = 1.0f;
1562 viewport.minDepth = 0.0f;
1563 viewport.width = 512;
1564 viewport.height = 512;
1565 viewport.x = 0;
1566 viewport.y = 0;
1567 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1568 vkEndCommandBuffer(command_buffer[0]);
1569 }
1570 {
1571 VkCommandBufferBeginInfo begin_info{};
1572 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1573 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1574
1575 VkViewport viewport{};
1576 viewport.maxDepth = 1.0f;
1577 viewport.minDepth = 0.0f;
1578 viewport.width = 512;
1579 viewport.height = 512;
1580 viewport.x = 0;
1581 viewport.y = 0;
1582 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1583 vkEndCommandBuffer(command_buffer[1]);
1584 }
1585 {
1586 VkSubmitInfo submit_info{};
1587 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1588 submit_info.commandBufferCount = 1;
1589 submit_info.pCommandBuffers = &command_buffer[0];
1590 submit_info.signalSemaphoreCount = 1;
1591 submit_info.pSignalSemaphores = &semaphore;
1592 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1593 }
1594 {
1595 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1596 VkSubmitInfo submit_info{};
1597 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1598 submit_info.commandBufferCount = 1;
1599 submit_info.pCommandBuffers = &command_buffer[1];
1600 submit_info.waitSemaphoreCount = 1;
1601 submit_info.pWaitSemaphores = &semaphore;
1602 submit_info.pWaitDstStageMask = flags;
1603 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1604 }
1605
1606 vkQueueWaitIdle(m_device->m_queue);
1607
1608 vkDestroyFence(m_device->device(), fence, nullptr);
1609 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1610 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1611 &command_buffer[0]);
1612 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1613
1614 m_errorMonitor->VerifyNotFound();
1615}
1616
1617// This is a positive test. No errors should be generated.
1618TEST_F(VkLayerTest,
1619 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
1620
1621 TEST_DESCRIPTION(
1622 "Two command buffers, each in a separate QueueSubmit call "
1623 "submitted on separate queues, the second having a fence"
1624 "followed by two consecutive WaitForFences calls on the same fence.");
1625
Dustin Graves48458142016-04-29 16:11:55 -06001626 if ((m_device->queue_props.empty()) ||
1627 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001628 return;
1629
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001630 m_errorMonitor->ExpectSuccess();
1631
1632 VkFence fence;
1633 VkFenceCreateInfo fence_create_info{};
1634 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1635 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1636
1637 VkSemaphore semaphore;
1638 VkSemaphoreCreateInfo semaphore_create_info{};
1639 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1640 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1641 &semaphore);
1642
1643 VkCommandPool command_pool;
1644 VkCommandPoolCreateInfo pool_create_info{};
1645 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1646 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1647 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1648 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1649 &command_pool);
1650
1651 VkCommandBuffer command_buffer[2];
1652 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1653 command_buffer_allocate_info.sType =
1654 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1655 command_buffer_allocate_info.commandPool = command_pool;
1656 command_buffer_allocate_info.commandBufferCount = 2;
1657 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1658 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1659 command_buffer);
1660
1661 VkQueue queue = VK_NULL_HANDLE;
1662 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1663 1, &queue);
1664
1665 {
1666 VkCommandBufferBeginInfo begin_info{};
1667 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1668 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1669
1670 vkCmdPipelineBarrier(command_buffer[0],
1671 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1672 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1673 0, nullptr, 0, nullptr);
1674
1675 VkViewport viewport{};
1676 viewport.maxDepth = 1.0f;
1677 viewport.minDepth = 0.0f;
1678 viewport.width = 512;
1679 viewport.height = 512;
1680 viewport.x = 0;
1681 viewport.y = 0;
1682 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1683 vkEndCommandBuffer(command_buffer[0]);
1684 }
1685 {
1686 VkCommandBufferBeginInfo begin_info{};
1687 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1688 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1689
1690 VkViewport viewport{};
1691 viewport.maxDepth = 1.0f;
1692 viewport.minDepth = 0.0f;
1693 viewport.width = 512;
1694 viewport.height = 512;
1695 viewport.x = 0;
1696 viewport.y = 0;
1697 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1698 vkEndCommandBuffer(command_buffer[1]);
1699 }
1700 {
1701 VkSubmitInfo submit_info{};
1702 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1703 submit_info.commandBufferCount = 1;
1704 submit_info.pCommandBuffers = &command_buffer[0];
1705 submit_info.signalSemaphoreCount = 1;
1706 submit_info.pSignalSemaphores = &semaphore;
1707 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1708 }
1709 {
1710 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1711 VkSubmitInfo submit_info{};
1712 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1713 submit_info.commandBufferCount = 1;
1714 submit_info.pCommandBuffers = &command_buffer[1];
1715 submit_info.waitSemaphoreCount = 1;
1716 submit_info.pWaitSemaphores = &semaphore;
1717 submit_info.pWaitDstStageMask = flags;
1718 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1719 }
1720
1721 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1722 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1723
1724 vkDestroyFence(m_device->device(), fence, nullptr);
1725 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1726 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1727 &command_buffer[0]);
1728 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1729
1730 m_errorMonitor->VerifyNotFound();
1731}
1732
1733// This is a positive test. No errors should be generated.
1734TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
1735
1736 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1737 "submitted on separate queues, the second having a fence, "
1738 "followed by a WaitForFences call.");
1739
Dustin Graves48458142016-04-29 16:11:55 -06001740 if ((m_device->queue_props.empty()) ||
1741 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001742 return;
1743
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001744 m_errorMonitor->ExpectSuccess();
1745
1746 VkFence fence;
1747 VkFenceCreateInfo fence_create_info{};
1748 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1749 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1750
1751 VkSemaphore semaphore;
1752 VkSemaphoreCreateInfo semaphore_create_info{};
1753 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1754 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1755 &semaphore);
1756
1757 VkCommandPool command_pool;
1758 VkCommandPoolCreateInfo pool_create_info{};
1759 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1760 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1761 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1762 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1763 &command_pool);
1764
1765 VkCommandBuffer command_buffer[2];
1766 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1767 command_buffer_allocate_info.sType =
1768 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1769 command_buffer_allocate_info.commandPool = command_pool;
1770 command_buffer_allocate_info.commandBufferCount = 2;
1771 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1772 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1773 command_buffer);
1774
1775 VkQueue queue = VK_NULL_HANDLE;
1776 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1777 1, &queue);
1778
1779
1780 {
1781 VkCommandBufferBeginInfo begin_info{};
1782 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1783 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1784
1785 vkCmdPipelineBarrier(command_buffer[0],
1786 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1787 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1788 0, nullptr, 0, nullptr);
1789
1790 VkViewport viewport{};
1791 viewport.maxDepth = 1.0f;
1792 viewport.minDepth = 0.0f;
1793 viewport.width = 512;
1794 viewport.height = 512;
1795 viewport.x = 0;
1796 viewport.y = 0;
1797 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1798 vkEndCommandBuffer(command_buffer[0]);
1799 }
1800 {
1801 VkCommandBufferBeginInfo begin_info{};
1802 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1803 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1804
1805 VkViewport viewport{};
1806 viewport.maxDepth = 1.0f;
1807 viewport.minDepth = 0.0f;
1808 viewport.width = 512;
1809 viewport.height = 512;
1810 viewport.x = 0;
1811 viewport.y = 0;
1812 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1813 vkEndCommandBuffer(command_buffer[1]);
1814 }
1815 {
1816 VkSubmitInfo submit_info{};
1817 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1818 submit_info.commandBufferCount = 1;
1819 submit_info.pCommandBuffers = &command_buffer[0];
1820 submit_info.signalSemaphoreCount = 1;
1821 submit_info.pSignalSemaphores = &semaphore;
1822 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1823 }
1824 {
1825 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1826 VkSubmitInfo submit_info{};
1827 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1828 submit_info.commandBufferCount = 1;
1829 submit_info.pCommandBuffers = &command_buffer[1];
1830 submit_info.waitSemaphoreCount = 1;
1831 submit_info.pWaitSemaphores = &semaphore;
1832 submit_info.pWaitDstStageMask = flags;
1833 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1834 }
1835
1836 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1837
1838 vkDestroyFence(m_device->device(), fence, nullptr);
1839 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1840 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1841 &command_buffer[0]);
1842 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1843
1844 m_errorMonitor->VerifyNotFound();
1845}
1846
1847// This is a positive test. No errors should be generated.
1848TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
1849
1850 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1851 "on the same queue, sharing a signal/wait semaphore, the "
1852 "second having a fence, "
1853 "followed by a WaitForFences call.");
1854
1855 m_errorMonitor->ExpectSuccess();
1856
1857 VkFence fence;
1858 VkFenceCreateInfo fence_create_info{};
1859 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1860 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1861
1862 VkSemaphore semaphore;
1863 VkSemaphoreCreateInfo semaphore_create_info{};
1864 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1865 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1866 &semaphore);
1867
1868 VkCommandPool command_pool;
1869 VkCommandPoolCreateInfo pool_create_info{};
1870 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1871 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1872 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1873 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1874 &command_pool);
1875
1876 VkCommandBuffer command_buffer[2];
1877 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1878 command_buffer_allocate_info.sType =
1879 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1880 command_buffer_allocate_info.commandPool = command_pool;
1881 command_buffer_allocate_info.commandBufferCount = 2;
1882 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1883 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1884 command_buffer);
1885
1886 {
1887 VkCommandBufferBeginInfo begin_info{};
1888 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1889 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1890
1891 vkCmdPipelineBarrier(command_buffer[0],
1892 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1893 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1894 0, nullptr, 0, nullptr);
1895
1896 VkViewport viewport{};
1897 viewport.maxDepth = 1.0f;
1898 viewport.minDepth = 0.0f;
1899 viewport.width = 512;
1900 viewport.height = 512;
1901 viewport.x = 0;
1902 viewport.y = 0;
1903 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1904 vkEndCommandBuffer(command_buffer[0]);
1905 }
1906 {
1907 VkCommandBufferBeginInfo begin_info{};
1908 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1909 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1910
1911 VkViewport viewport{};
1912 viewport.maxDepth = 1.0f;
1913 viewport.minDepth = 0.0f;
1914 viewport.width = 512;
1915 viewport.height = 512;
1916 viewport.x = 0;
1917 viewport.y = 0;
1918 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1919 vkEndCommandBuffer(command_buffer[1]);
1920 }
1921 {
1922 VkSubmitInfo submit_info{};
1923 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1924 submit_info.commandBufferCount = 1;
1925 submit_info.pCommandBuffers = &command_buffer[0];
1926 submit_info.signalSemaphoreCount = 1;
1927 submit_info.pSignalSemaphores = &semaphore;
1928 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1929 }
1930 {
1931 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1932 VkSubmitInfo submit_info{};
1933 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1934 submit_info.commandBufferCount = 1;
1935 submit_info.pCommandBuffers = &command_buffer[1];
1936 submit_info.waitSemaphoreCount = 1;
1937 submit_info.pWaitSemaphores = &semaphore;
1938 submit_info.pWaitDstStageMask = flags;
1939 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1940 }
1941
1942 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1943
1944 vkDestroyFence(m_device->device(), fence, nullptr);
1945 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1946 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1947 &command_buffer[0]);
1948 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1949
1950 m_errorMonitor->VerifyNotFound();
1951}
1952
1953// This is a positive test. No errors should be generated.
1954TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
1955
1956 TEST_DESCRIPTION(
1957 "Two command buffers, each in a separate QueueSubmit call "
1958 "on the same queue, no fences, followed by a third QueueSubmit with NO "
1959 "SubmitInfos but with a fence, followed by a WaitForFences call.");
1960
1961 m_errorMonitor->ExpectSuccess();
1962
1963 VkFence fence;
1964 VkFenceCreateInfo fence_create_info{};
1965 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1966 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1967
1968 VkCommandPool command_pool;
1969 VkCommandPoolCreateInfo pool_create_info{};
1970 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1971 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1972 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1973 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1974 &command_pool);
1975
1976 VkCommandBuffer command_buffer[2];
1977 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1978 command_buffer_allocate_info.sType =
1979 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1980 command_buffer_allocate_info.commandPool = command_pool;
1981 command_buffer_allocate_info.commandBufferCount = 2;
1982 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1983 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1984 command_buffer);
1985
1986 {
1987 VkCommandBufferBeginInfo begin_info{};
1988 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1989 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1990
1991 vkCmdPipelineBarrier(command_buffer[0],
1992 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1993 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1994 0, nullptr, 0, nullptr);
1995
1996 VkViewport viewport{};
1997 viewport.maxDepth = 1.0f;
1998 viewport.minDepth = 0.0f;
1999 viewport.width = 512;
2000 viewport.height = 512;
2001 viewport.x = 0;
2002 viewport.y = 0;
2003 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2004 vkEndCommandBuffer(command_buffer[0]);
2005 }
2006 {
2007 VkCommandBufferBeginInfo begin_info{};
2008 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2009 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2010
2011 VkViewport viewport{};
2012 viewport.maxDepth = 1.0f;
2013 viewport.minDepth = 0.0f;
2014 viewport.width = 512;
2015 viewport.height = 512;
2016 viewport.x = 0;
2017 viewport.y = 0;
2018 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2019 vkEndCommandBuffer(command_buffer[1]);
2020 }
2021 {
2022 VkSubmitInfo submit_info{};
2023 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2024 submit_info.commandBufferCount = 1;
2025 submit_info.pCommandBuffers = &command_buffer[0];
2026 submit_info.signalSemaphoreCount = 0;
2027 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2028 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2029 }
2030 {
2031 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2032 VkSubmitInfo submit_info{};
2033 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2034 submit_info.commandBufferCount = 1;
2035 submit_info.pCommandBuffers = &command_buffer[1];
2036 submit_info.waitSemaphoreCount = 0;
2037 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2038 submit_info.pWaitDstStageMask = flags;
2039 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2040 }
2041
2042 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
2043
2044 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2045
2046 vkDestroyFence(m_device->device(), fence, nullptr);
2047 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2048 &command_buffer[0]);
2049 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2050
2051 m_errorMonitor->VerifyNotFound();
2052}
2053
2054// This is a positive test. No errors should be generated.
2055TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
2056
2057 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2058 "on the same queue, the second having a fence, followed "
2059 "by a WaitForFences call.");
2060
2061 m_errorMonitor->ExpectSuccess();
2062
2063 VkFence fence;
2064 VkFenceCreateInfo fence_create_info{};
2065 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2066 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2067
2068 VkCommandPool command_pool;
2069 VkCommandPoolCreateInfo pool_create_info{};
2070 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2071 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2072 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2073 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2074 &command_pool);
2075
2076 VkCommandBuffer command_buffer[2];
2077 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2078 command_buffer_allocate_info.sType =
2079 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2080 command_buffer_allocate_info.commandPool = command_pool;
2081 command_buffer_allocate_info.commandBufferCount = 2;
2082 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2083 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2084 command_buffer);
2085
2086 {
2087 VkCommandBufferBeginInfo begin_info{};
2088 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2089 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2090
2091 vkCmdPipelineBarrier(command_buffer[0],
2092 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2093 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2094 0, nullptr, 0, nullptr);
2095
2096 VkViewport viewport{};
2097 viewport.maxDepth = 1.0f;
2098 viewport.minDepth = 0.0f;
2099 viewport.width = 512;
2100 viewport.height = 512;
2101 viewport.x = 0;
2102 viewport.y = 0;
2103 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2104 vkEndCommandBuffer(command_buffer[0]);
2105 }
2106 {
2107 VkCommandBufferBeginInfo begin_info{};
2108 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2109 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2110
2111 VkViewport viewport{};
2112 viewport.maxDepth = 1.0f;
2113 viewport.minDepth = 0.0f;
2114 viewport.width = 512;
2115 viewport.height = 512;
2116 viewport.x = 0;
2117 viewport.y = 0;
2118 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2119 vkEndCommandBuffer(command_buffer[1]);
2120 }
2121 {
2122 VkSubmitInfo submit_info{};
2123 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2124 submit_info.commandBufferCount = 1;
2125 submit_info.pCommandBuffers = &command_buffer[0];
2126 submit_info.signalSemaphoreCount = 0;
2127 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2128 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2129 }
2130 {
2131 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2132 VkSubmitInfo submit_info{};
2133 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2134 submit_info.commandBufferCount = 1;
2135 submit_info.pCommandBuffers = &command_buffer[1];
2136 submit_info.waitSemaphoreCount = 0;
2137 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2138 submit_info.pWaitDstStageMask = flags;
2139 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2140 }
2141
2142 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2143
2144 vkDestroyFence(m_device->device(), fence, nullptr);
2145 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2146 &command_buffer[0]);
2147 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2148
2149 m_errorMonitor->VerifyNotFound();
2150}
2151
2152// This is a positive test. No errors should be generated.
2153TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
2154
2155 TEST_DESCRIPTION(
2156 "Two command buffers each in a separate SubmitInfo sent in a single "
2157 "QueueSubmit call followed by a WaitForFences call.");
2158
2159 m_errorMonitor->ExpectSuccess();
2160
2161 VkFence fence;
2162 VkFenceCreateInfo fence_create_info{};
2163 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2164 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2165
2166 VkSemaphore semaphore;
2167 VkSemaphoreCreateInfo semaphore_create_info{};
2168 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2169 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2170 &semaphore);
2171
2172 VkCommandPool command_pool;
2173 VkCommandPoolCreateInfo pool_create_info{};
2174 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2175 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2176 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2177 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2178 &command_pool);
2179
2180 VkCommandBuffer command_buffer[2];
2181 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2182 command_buffer_allocate_info.sType =
2183 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2184 command_buffer_allocate_info.commandPool = command_pool;
2185 command_buffer_allocate_info.commandBufferCount = 2;
2186 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2187 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2188 command_buffer);
2189
2190 {
2191 VkCommandBufferBeginInfo begin_info{};
2192 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2193 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2194
2195 vkCmdPipelineBarrier(command_buffer[0],
2196 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2197 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2198 0, nullptr, 0, nullptr);
2199
2200 VkViewport viewport{};
2201 viewport.maxDepth = 1.0f;
2202 viewport.minDepth = 0.0f;
2203 viewport.width = 512;
2204 viewport.height = 512;
2205 viewport.x = 0;
2206 viewport.y = 0;
2207 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2208 vkEndCommandBuffer(command_buffer[0]);
2209 }
2210 {
2211 VkCommandBufferBeginInfo begin_info{};
2212 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2213 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2214
2215 VkViewport viewport{};
2216 viewport.maxDepth = 1.0f;
2217 viewport.minDepth = 0.0f;
2218 viewport.width = 512;
2219 viewport.height = 512;
2220 viewport.x = 0;
2221 viewport.y = 0;
2222 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2223 vkEndCommandBuffer(command_buffer[1]);
2224 }
2225 {
2226 VkSubmitInfo submit_info[2];
2227 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2228
2229 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2230 submit_info[0].pNext = NULL;
2231 submit_info[0].commandBufferCount = 1;
2232 submit_info[0].pCommandBuffers = &command_buffer[0];
2233 submit_info[0].signalSemaphoreCount = 1;
2234 submit_info[0].pSignalSemaphores = &semaphore;
2235 submit_info[0].waitSemaphoreCount = 0;
2236 submit_info[0].pWaitSemaphores = NULL;
2237 submit_info[0].pWaitDstStageMask = 0;
2238
2239 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2240 submit_info[1].pNext = NULL;
2241 submit_info[1].commandBufferCount = 1;
2242 submit_info[1].pCommandBuffers = &command_buffer[1];
2243 submit_info[1].waitSemaphoreCount = 1;
2244 submit_info[1].pWaitSemaphores = &semaphore;
2245 submit_info[1].pWaitDstStageMask = flags;
2246 submit_info[1].signalSemaphoreCount = 0;
2247 submit_info[1].pSignalSemaphores = NULL;
2248 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
2249 }
2250
2251 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2252
2253 vkDestroyFence(m_device->device(), fence, nullptr);
2254 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2255 &command_buffer[0]);
2256 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2257
2258 m_errorMonitor->VerifyNotFound();
2259}
2260
Karl Schultz6addd812016-02-02 17:17:23 -07002261TEST_F(VkLayerTest, LineWidthStateNotBound) {
2262 m_errorMonitor->SetDesiredFailureMsg(
2263 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002264 "Dynamic line width state not set for this command buffer");
2265
Karl Schultz6addd812016-02-02 17:17:23 -07002266 TEST_DESCRIPTION("Simple Draw Call that validates failure when a line "
2267 "width state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002268
Karl Schultz6addd812016-02-02 17:17:23 -07002269 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2270 BsoFailLineWidth);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002271
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002272 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002273}
2274
Karl Schultz6addd812016-02-02 17:17:23 -07002275TEST_F(VkLayerTest, DepthBiasStateNotBound) {
2276 m_errorMonitor->SetDesiredFailureMsg(
2277 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002278 "Dynamic depth bias state not set for this command buffer");
2279
Karl Schultz6addd812016-02-02 17:17:23 -07002280 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
2281 "bias state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002282
Karl Schultz6addd812016-02-02 17:17:23 -07002283 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2284 BsoFailDepthBias);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002285
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002286 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002287}
2288
Karl Schultz6addd812016-02-02 17:17:23 -07002289// Disable these two tests until we can sort out how to track multiple layer
2290// errors
2291TEST_F(VkLayerTest, ViewportStateNotBound) {
2292 m_errorMonitor->SetDesiredFailureMsg(
2293 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002294 "Dynamic viewport state not set for this command buffer");
2295
Karl Schultz6addd812016-02-02 17:17:23 -07002296 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
2297 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002298
Karl Schultz6addd812016-02-02 17:17:23 -07002299 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2300 BsoFailViewport);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002301
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002302 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002303}
2304
Karl Schultz6addd812016-02-02 17:17:23 -07002305TEST_F(VkLayerTest, ScissorStateNotBound) {
2306 m_errorMonitor->SetDesiredFailureMsg(
2307 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002308 "Dynamic scissor state not set for this command buffer");
2309
Karl Schultz6addd812016-02-02 17:17:23 -07002310 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
2311 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002312
Karl Schultz6addd812016-02-02 17:17:23 -07002313 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2314 BsoFailScissor);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002315
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002316 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002317}
2318
Karl Schultz6addd812016-02-02 17:17:23 -07002319TEST_F(VkLayerTest, BlendStateNotBound) {
2320 m_errorMonitor->SetDesiredFailureMsg(
2321 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7a1d2352016-03-28 11:18:19 -06002322 "Dynamic blend constants state not set for this command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002323
Karl Schultz6addd812016-02-02 17:17:23 -07002324 TEST_DESCRIPTION("Simple Draw Call that validates failure when a blend "
2325 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002326
Karl Schultz6addd812016-02-02 17:17:23 -07002327 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2328 BsoFailBlend);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002329
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002330 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002331}
2332
Karl Schultz6addd812016-02-02 17:17:23 -07002333TEST_F(VkLayerTest, DepthBoundsStateNotBound) {
2334 m_errorMonitor->SetDesiredFailureMsg(
2335 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002336 "Dynamic depth bounds state not set for this command buffer");
2337
Karl Schultz6addd812016-02-02 17:17:23 -07002338 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
2339 "bounds state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002340
Karl Schultz6addd812016-02-02 17:17:23 -07002341 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2342 BsoFailDepthBounds);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002343
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002344 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002345}
2346
Karl Schultz6addd812016-02-02 17:17:23 -07002347TEST_F(VkLayerTest, StencilReadMaskNotSet) {
2348 m_errorMonitor->SetDesiredFailureMsg(
2349 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002350 "Dynamic stencil read mask state not set for this command buffer");
2351
Tobin Ehlis963a4042015-09-29 08:18:34 -06002352 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002353
Karl Schultz6addd812016-02-02 17:17:23 -07002354 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2355 "read mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002356
Karl Schultz6addd812016-02-02 17:17:23 -07002357 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2358 BsoFailStencilReadMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002359
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002360 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002361}
2362
Karl Schultz6addd812016-02-02 17:17:23 -07002363TEST_F(VkLayerTest, StencilWriteMaskNotSet) {
2364 m_errorMonitor->SetDesiredFailureMsg(
2365 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002366 "Dynamic stencil write mask state not set for this command buffer");
2367
Tobin Ehlis963a4042015-09-29 08:18:34 -06002368 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002369
Karl Schultz6addd812016-02-02 17:17:23 -07002370 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2371 "write mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002372
Karl Schultz6addd812016-02-02 17:17:23 -07002373 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2374 BsoFailStencilWriteMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002375
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002376 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002377}
2378
Karl Schultz6addd812016-02-02 17:17:23 -07002379TEST_F(VkLayerTest, StencilReferenceNotSet) {
2380 m_errorMonitor->SetDesiredFailureMsg(
2381 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002382 "Dynamic stencil reference state not set for this command buffer");
2383
Karl Schultz6addd812016-02-02 17:17:23 -07002384 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2385 "reference is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002386
Karl Schultz6addd812016-02-02 17:17:23 -07002387 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2388 BsoFailStencilReference);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002389
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002390 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002391}
2392
Karl Schultz6addd812016-02-02 17:17:23 -07002393TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002394 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002395
Karl Schultz6addd812016-02-02 17:17:23 -07002396 m_errorMonitor->SetDesiredFailureMsg(
2397 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2398 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
2399 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002400
2401 VkFenceCreateInfo fenceInfo = {};
2402 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2403 fenceInfo.pNext = NULL;
2404 fenceInfo.flags = 0;
2405
2406 ASSERT_NO_FATAL_FAILURE(InitState());
2407 ASSERT_NO_FATAL_FAILURE(InitViewport());
2408 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2409
Karl Schultz6addd812016-02-02 17:17:23 -07002410 // We luck out b/c by default the framework creates CB w/ the
2411 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002412 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002413 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2414 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002415 EndCommandBuffer();
2416
2417 testFence.init(*m_device, fenceInfo);
2418
2419 // Bypass framework since it does the waits automatically
2420 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002421 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002422 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2423 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002424 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002425 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002426 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002427 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002428 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002429 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002430 submit_info.pSignalSemaphores = NULL;
2431
Karl Schultz6addd812016-02-02 17:17:23 -07002432 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
2433 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002434
Karl Schultz6addd812016-02-02 17:17:23 -07002435 // Cause validation error by re-submitting cmd buffer that should only be
2436 // submitted once
2437 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002438
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002439 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002440}
2441
Karl Schultz6addd812016-02-02 17:17:23 -07002442TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002443 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07002444 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002445
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002447 "Unable to allocate 1 descriptors of "
2448 "type "
2449 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002450
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002451 ASSERT_NO_FATAL_FAILURE(InitState());
2452 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002453
Karl Schultz6addd812016-02-02 17:17:23 -07002454 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
2455 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002456 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002457 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2458 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002459
2460 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002461 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2462 ds_pool_ci.pNext = NULL;
2463 ds_pool_ci.flags = 0;
2464 ds_pool_ci.maxSets = 1;
2465 ds_pool_ci.poolSizeCount = 1;
2466 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002467
2468 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002469 err =
2470 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002471 ASSERT_VK_SUCCESS(err);
2472
2473 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002474 dsl_binding.binding = 0;
2475 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2476 dsl_binding.descriptorCount = 1;
2477 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2478 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002479
2480 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002481 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2482 ds_layout_ci.pNext = NULL;
2483 ds_layout_ci.bindingCount = 1;
2484 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002485
2486 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002487 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2488 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002489 ASSERT_VK_SUCCESS(err);
2490
2491 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002492 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002493 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002494 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002495 alloc_info.descriptorPool = ds_pool;
2496 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002497 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2498 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002499
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002500 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002501
Chia-I Wuf7458c52015-10-26 21:10:41 +08002502 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2503 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002504}
2505
Karl Schultz6addd812016-02-02 17:17:23 -07002506TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
2507 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06002508
Karl Schultz6addd812016-02-02 17:17:23 -07002509 m_errorMonitor->SetDesiredFailureMsg(
2510 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2511 "It is invalid to call vkFreeDescriptorSets() with a pool created "
2512 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002513
Tobin Ehlise735c692015-10-08 13:13:50 -06002514 ASSERT_NO_FATAL_FAILURE(InitState());
2515 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06002516
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002517 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002518 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2519 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06002520
2521 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002522 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2523 ds_pool_ci.pNext = NULL;
2524 ds_pool_ci.maxSets = 1;
2525 ds_pool_ci.poolSizeCount = 1;
2526 ds_pool_ci.flags = 0;
2527 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
2528 // app can only call vkResetDescriptorPool on this pool.;
2529 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06002530
2531 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002532 err =
2533 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06002534 ASSERT_VK_SUCCESS(err);
2535
2536 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002537 dsl_binding.binding = 0;
2538 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2539 dsl_binding.descriptorCount = 1;
2540 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2541 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06002542
2543 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002544 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2545 ds_layout_ci.pNext = NULL;
2546 ds_layout_ci.bindingCount = 1;
2547 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06002548
2549 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002550 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2551 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06002552 ASSERT_VK_SUCCESS(err);
2553
2554 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002555 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002556 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002557 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002558 alloc_info.descriptorPool = ds_pool;
2559 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002560 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2561 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06002562 ASSERT_VK_SUCCESS(err);
2563
2564 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002565 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06002566
Chia-I Wuf7458c52015-10-26 21:10:41 +08002567 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2568 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06002569}
2570
Karl Schultz6addd812016-02-02 17:17:23 -07002571TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002572 // Attempt to clear Descriptor Pool with bad object.
2573 // ObjectTracker should catch this.
2574 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2575 "Invalid VkDescriptorPool Object 0xbaad6001");
2576 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
2577 vkResetDescriptorPool(device(), badPool, 0);
2578 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002579}
2580
Karl Schultz6addd812016-02-02 17:17:23 -07002581TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002582 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
2583 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002584 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06002585 // call vkCmdBindDescriptorSets w/ false Descriptor Set
2586 VkDescriptorSet badSet = (VkDescriptorSet)0xbaad6001;
2587 VkResult err;
2588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2589 "Invalid VkDescriptorSet Object 0xbaad6001");
2590
2591 ASSERT_NO_FATAL_FAILURE(InitState());
2592
2593 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
2594 layout_bindings[0].binding = 0;
2595 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2596 layout_bindings[0].descriptorCount = 1;
2597 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2598 layout_bindings[0].pImmutableSamplers = NULL;
2599
2600 VkDescriptorSetLayout descriptor_set_layout;
2601 VkDescriptorSetLayoutCreateInfo dslci = {};
2602 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2603 dslci.pNext = NULL;
2604 dslci.bindingCount = 1;
2605 dslci.pBindings = layout_bindings;
2606 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002607 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002608
2609 VkPipelineLayout pipeline_layout;
2610 VkPipelineLayoutCreateInfo plci = {};
2611 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2612 plci.pNext = NULL;
2613 plci.setLayoutCount = 1;
2614 plci.pSetLayouts = &descriptor_set_layout;
2615 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002616 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002617
2618 BeginCommandBuffer();
2619 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2620 pipeline_layout, 0, 1, &badSet, 0, NULL);
2621 m_errorMonitor->VerifyFound();
2622 EndCommandBuffer();
2623 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
2624 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002625}
2626
Karl Schultz6addd812016-02-02 17:17:23 -07002627TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002628 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
2629 // ObjectTracker should catch this.
2630 VkDescriptorSetLayout bad_layout = (VkDescriptorSetLayout)0xbaad6001;
2631 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2632 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
2633
2634 VkPipelineLayout pipeline_layout;
2635 VkPipelineLayoutCreateInfo plci = {};
2636 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2637 plci.pNext = NULL;
2638 plci.setLayoutCount = 1;
2639 plci.pSetLayouts = &bad_layout;
2640 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
2641
2642 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002643}
2644
Karl Schultz6addd812016-02-02 17:17:23 -07002645TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002646 // Attempt to bind an invalid Pipeline to a valid Command Buffer
2647 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002648 // Create a valid cmd buffer
2649 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultzbdb75952016-04-19 11:36:49 -06002650 VkPipeline bad_pipeline = (VkPipeline)0xbaad6001;
2651 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2652 "Invalid VkPipeline Object 0xbaad6001");
2653 ASSERT_NO_FATAL_FAILURE(InitState());
2654 BeginCommandBuffer();
2655 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2656 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
2657 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002658}
2659
Karl Schultz6addd812016-02-02 17:17:23 -07002660TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
2661 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
2662 // CommandBuffer
2663 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002664
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002666 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002667
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002668 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06002669 ASSERT_NO_FATAL_FAILURE(InitViewport());
2670 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002671 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002672 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2673 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06002674
2675 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002676 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2677 ds_pool_ci.pNext = NULL;
2678 ds_pool_ci.maxSets = 1;
2679 ds_pool_ci.poolSizeCount = 1;
2680 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06002681
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002682 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002683 err =
2684 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002685 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002686
Tony Barboureb254902015-07-15 12:50:33 -06002687 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002688 dsl_binding.binding = 0;
2689 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2690 dsl_binding.descriptorCount = 1;
2691 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2692 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002693
Tony Barboureb254902015-07-15 12:50:33 -06002694 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002695 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2696 ds_layout_ci.pNext = NULL;
2697 ds_layout_ci.bindingCount = 1;
2698 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002699 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002700 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2701 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002702 ASSERT_VK_SUCCESS(err);
2703
2704 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002705 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002706 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002707 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002708 alloc_info.descriptorPool = ds_pool;
2709 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002710 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2711 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002712 ASSERT_VK_SUCCESS(err);
2713
Tony Barboureb254902015-07-15 12:50:33 -06002714 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002715 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2716 pipeline_layout_ci.pNext = NULL;
2717 pipeline_layout_ci.setLayoutCount = 1;
2718 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002719
2720 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002721 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2722 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002723 ASSERT_VK_SUCCESS(err);
2724
Karl Schultz6addd812016-02-02 17:17:23 -07002725 VkShaderObj vs(m_device, bindStateVertShaderText,
2726 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06002727 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07002728 // on more devices
2729 VkShaderObj fs(m_device, bindStateFragShaderText,
2730 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002731
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002732 VkPipelineObj pipe(m_device);
2733 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06002734 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06002735 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002736 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06002737
2738 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002739 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2740 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2741 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2742 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2743 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002744
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002745 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002746
Chia-I Wuf7458c52015-10-26 21:10:41 +08002747 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2748 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2749 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002750}
2751
Karl Schultz6addd812016-02-02 17:17:23 -07002752TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002753 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07002754 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002755
Karl Schultz6addd812016-02-02 17:17:23 -07002756 m_errorMonitor->SetDesiredFailureMsg(
2757 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002758 "Attempt to update descriptor with invalid bufferView ");
2759
2760 ASSERT_NO_FATAL_FAILURE(InitState());
2761 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002762 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2763 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002764
2765 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002766 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2767 ds_pool_ci.pNext = NULL;
2768 ds_pool_ci.maxSets = 1;
2769 ds_pool_ci.poolSizeCount = 1;
2770 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002771
2772 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002773 err =
2774 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002775 ASSERT_VK_SUCCESS(err);
2776
2777 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002778 dsl_binding.binding = 0;
2779 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2780 dsl_binding.descriptorCount = 1;
2781 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2782 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002783
2784 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002785 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2786 ds_layout_ci.pNext = NULL;
2787 ds_layout_ci.bindingCount = 1;
2788 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002789 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002790 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2791 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002792 ASSERT_VK_SUCCESS(err);
2793
2794 VkDescriptorSet descriptorSet;
2795 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002796 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002797 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002798 alloc_info.descriptorPool = ds_pool;
2799 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002800 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2801 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002802 ASSERT_VK_SUCCESS(err);
2803
Karl Schultz6addd812016-02-02 17:17:23 -07002804 VkBufferView view =
2805 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002806 VkWriteDescriptorSet descriptor_write;
2807 memset(&descriptor_write, 0, sizeof(descriptor_write));
2808 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2809 descriptor_write.dstSet = descriptorSet;
2810 descriptor_write.dstBinding = 0;
2811 descriptor_write.descriptorCount = 1;
2812 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2813 descriptor_write.pTexelBufferView = &view;
2814
2815 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2816
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002817 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002818
2819 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2820 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2821}
2822
Karl Schultz6addd812016-02-02 17:17:23 -07002823TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
2824 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
2825 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07002826 // 1. No dynamicOffset supplied
2827 // 2. Too many dynamicOffsets supplied
2828 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07002829 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002831 " requires 1 dynamicOffsets, but only "
2832 "0 dynamicOffsets are left in "
2833 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002834
2835 ASSERT_NO_FATAL_FAILURE(InitState());
2836 ASSERT_NO_FATAL_FAILURE(InitViewport());
2837 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2838
2839 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002840 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2841 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002842
2843 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002844 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2845 ds_pool_ci.pNext = NULL;
2846 ds_pool_ci.maxSets = 1;
2847 ds_pool_ci.poolSizeCount = 1;
2848 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002849
2850 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002851 err =
2852 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002853 ASSERT_VK_SUCCESS(err);
2854
2855 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002856 dsl_binding.binding = 0;
2857 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2858 dsl_binding.descriptorCount = 1;
2859 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2860 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002861
2862 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002863 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2864 ds_layout_ci.pNext = NULL;
2865 ds_layout_ci.bindingCount = 1;
2866 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002867 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002868 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2869 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002870 ASSERT_VK_SUCCESS(err);
2871
2872 VkDescriptorSet descriptorSet;
2873 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002874 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002875 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002876 alloc_info.descriptorPool = ds_pool;
2877 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002878 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2879 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002880 ASSERT_VK_SUCCESS(err);
2881
2882 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002883 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2884 pipeline_layout_ci.pNext = NULL;
2885 pipeline_layout_ci.setLayoutCount = 1;
2886 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002887
2888 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002889 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2890 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002891 ASSERT_VK_SUCCESS(err);
2892
2893 // Create a buffer to update the descriptor with
2894 uint32_t qfi = 0;
2895 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002896 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2897 buffCI.size = 1024;
2898 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2899 buffCI.queueFamilyIndexCount = 1;
2900 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002901
2902 VkBuffer dyub;
2903 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2904 ASSERT_VK_SUCCESS(err);
2905 // Correctly update descriptor to avoid "NOT_UPDATED" error
2906 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002907 buffInfo.buffer = dyub;
2908 buffInfo.offset = 0;
2909 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002910
2911 VkWriteDescriptorSet descriptor_write;
2912 memset(&descriptor_write, 0, sizeof(descriptor_write));
2913 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2914 descriptor_write.dstSet = descriptorSet;
2915 descriptor_write.dstBinding = 0;
2916 descriptor_write.descriptorCount = 1;
2917 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2918 descriptor_write.pBufferInfo = &buffInfo;
2919
2920 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2921
2922 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002923 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2924 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2925 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002926 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07002927 uint32_t pDynOff[2] = {512, 756};
2928 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07002929 m_errorMonitor->SetDesiredFailureMsg(
2930 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07002931 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07002932 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2933 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2934 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12002935 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07002936 // Finally cause error due to dynamicOffset being too big
Karl Schultz6addd812016-02-02 17:17:23 -07002937 m_errorMonitor->SetDesiredFailureMsg(
2938 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07002939 " from its update, this oversteps its buffer (");
2940 // Create PSO to be used for draw-time errors below
2941 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002942 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002943 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07002944 "out gl_PerVertex { \n"
2945 " vec4 gl_Position;\n"
2946 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002947 "void main(){\n"
2948 " gl_Position = vec4(1);\n"
2949 "}\n";
2950 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002951 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002952 "\n"
2953 "layout(location=0) out vec4 x;\n"
2954 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2955 "void main(){\n"
2956 " x = vec4(bar.y);\n"
2957 "}\n";
2958 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2959 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2960 VkPipelineObj pipe(m_device);
2961 pipe.AddShader(&vs);
2962 pipe.AddShader(&fs);
2963 pipe.AddColorAttachment();
2964 pipe.CreateVKPipeline(pipeline_layout, renderPass());
2965
Karl Schultz6addd812016-02-02 17:17:23 -07002966 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2967 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2968 // This update should succeed, but offset size of 512 will overstep buffer
2969 // /w range 1024 & size 1024
2970 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2971 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2972 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07002973 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002974 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002975
2976 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2977 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2978}
2979
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002980TEST_F(VkLayerTest, InvalidPushConstants) {
2981 // Hit push constant error cases:
2982 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
2983 // 2. Incorrectly set push constant size to 0
2984 // 3. Incorrectly set push constant size to non-multiple of 4
2985 // 4. Attempt push constant update that exceeds maxPushConstantSize
2986 VkResult err;
2987 m_errorMonitor->SetDesiredFailureMsg(
2988 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2989 "vkCreatePipelineLayout() call has push constants with offset ");
2990
2991 ASSERT_NO_FATAL_FAILURE(InitState());
2992 ASSERT_NO_FATAL_FAILURE(InitViewport());
2993 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2994
2995 VkPushConstantRange pc_range = {};
2996 pc_range.size = 0xFFFFFFFFu;
2997 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2998 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
2999 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3000 pipeline_layout_ci.pushConstantRangeCount = 1;
3001 pipeline_layout_ci.pPushConstantRanges = &pc_range;
3002
3003 VkPipelineLayout pipeline_layout;
3004 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3005 &pipeline_layout);
3006
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003007 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003008 // Now cause errors due to size 0 and non-4 byte aligned size
3009 pc_range.size = 0;
3010 m_errorMonitor->SetDesiredFailureMsg(
3011 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3012 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
3013 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3014 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003015 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003016 pc_range.size = 1;
3017 m_errorMonitor->SetDesiredFailureMsg(
3018 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3019 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
3020 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3021 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003022 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003023 // Cause error due to bad size in vkCmdPushConstants() call
3024 m_errorMonitor->SetDesiredFailureMsg(
3025 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3026 "vkCmdPushConstants() call has push constants with offset ");
3027 pipeline_layout_ci.pushConstantRangeCount = 0;
3028 pipeline_layout_ci.pPushConstantRanges = NULL;
3029 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3030 &pipeline_layout);
3031 ASSERT_VK_SUCCESS(err);
3032 BeginCommandBuffer();
3033 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
3034 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003035 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003036 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3037}
3038
Karl Schultz6addd812016-02-02 17:17:23 -07003039TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003040 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07003041 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003042
3043 ASSERT_NO_FATAL_FAILURE(InitState());
3044 ASSERT_NO_FATAL_FAILURE(InitViewport());
3045 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3046
3047 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
3048 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003049 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3050 ds_type_count[0].descriptorCount = 10;
3051 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3052 ds_type_count[1].descriptorCount = 2;
3053 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3054 ds_type_count[2].descriptorCount = 2;
3055 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
3056 ds_type_count[3].descriptorCount = 5;
3057 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
3058 // type
3059 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
3060 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
3061 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003062
3063 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003064 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3065 ds_pool_ci.pNext = NULL;
3066 ds_pool_ci.maxSets = 5;
3067 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
3068 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003069
3070 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003071 err =
3072 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003073 ASSERT_VK_SUCCESS(err);
3074
3075 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
3076 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003077 dsl_binding[0].binding = 0;
3078 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3079 dsl_binding[0].descriptorCount = 5;
3080 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
3081 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003082
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003083 // Create layout identical to set0 layout but w/ different stageFlags
3084 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003085 dsl_fs_stage_only.binding = 0;
3086 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3087 dsl_fs_stage_only.descriptorCount = 5;
3088 dsl_fs_stage_only.stageFlags =
3089 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
3090 // bind time
3091 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003092 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003093 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3094 ds_layout_ci.pNext = NULL;
3095 ds_layout_ci.bindingCount = 1;
3096 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003097 static const uint32_t NUM_LAYOUTS = 4;
3098 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003099 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003100 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
3101 // layout for error case
3102 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3103 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003104 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003105 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003106 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3107 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003108 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003109 dsl_binding[0].binding = 0;
3110 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003111 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003112 dsl_binding[1].binding = 1;
3113 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3114 dsl_binding[1].descriptorCount = 2;
3115 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
3116 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003117 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003118 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003119 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3120 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003121 ASSERT_VK_SUCCESS(err);
3122 dsl_binding[0].binding = 0;
3123 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003124 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003125 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07003126 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3127 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003128 ASSERT_VK_SUCCESS(err);
3129 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003130 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003131 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3132 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003133 ASSERT_VK_SUCCESS(err);
3134
3135 static const uint32_t NUM_SETS = 4;
3136 VkDescriptorSet descriptorSet[NUM_SETS] = {};
3137 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003138 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003139 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003140 alloc_info.descriptorPool = ds_pool;
3141 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003142 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3143 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003144 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003145 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003146 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003147 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003148 err =
3149 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003150 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003151
3152 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003153 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3154 pipeline_layout_ci.pNext = NULL;
3155 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
3156 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003157
3158 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003159 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3160 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003161 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003162 // Create pipelineLayout with only one setLayout
3163 pipeline_layout_ci.setLayoutCount = 1;
3164 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003165 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3166 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003167 ASSERT_VK_SUCCESS(err);
3168 // Create pipelineLayout with 2 descriptor setLayout at index 0
3169 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
3170 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07003171 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3172 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003173 ASSERT_VK_SUCCESS(err);
3174 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
3175 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
3176 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07003177 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3178 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003179 ASSERT_VK_SUCCESS(err);
3180 // Create pipelineLayout with UB type, but stageFlags for FS only
3181 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
3182 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003183 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3184 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003185 ASSERT_VK_SUCCESS(err);
3186 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
3187 VkDescriptorSetLayout pl_bad_s0[2] = {};
3188 pl_bad_s0[0] = ds_layout_fs_only;
3189 pl_bad_s0[1] = ds_layout[1];
3190 pipeline_layout_ci.setLayoutCount = 2;
3191 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
3192 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07003193 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3194 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003195 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003196
3197 // Create a buffer to update the descriptor with
3198 uint32_t qfi = 0;
3199 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003200 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3201 buffCI.size = 1024;
3202 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3203 buffCI.queueFamilyIndexCount = 1;
3204 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003205
3206 VkBuffer dyub;
3207 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3208 ASSERT_VK_SUCCESS(err);
3209 // Correctly update descriptor to avoid "NOT_UPDATED" error
3210 static const uint32_t NUM_BUFFS = 5;
3211 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003212 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003213 buffInfo[i].buffer = dyub;
3214 buffInfo[i].offset = 0;
3215 buffInfo[i].range = 1024;
3216 }
Karl Schultz6addd812016-02-02 17:17:23 -07003217 VkImage image;
3218 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3219 const int32_t tex_width = 32;
3220 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003221 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003222 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3223 image_create_info.pNext = NULL;
3224 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3225 image_create_info.format = tex_format;
3226 image_create_info.extent.width = tex_width;
3227 image_create_info.extent.height = tex_height;
3228 image_create_info.extent.depth = 1;
3229 image_create_info.mipLevels = 1;
3230 image_create_info.arrayLayers = 1;
3231 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3232 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3233 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3234 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003235 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3236 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003237
Karl Schultz6addd812016-02-02 17:17:23 -07003238 VkMemoryRequirements memReqs;
3239 VkDeviceMemory imageMem;
3240 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003241 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003242 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3243 memAlloc.pNext = NULL;
3244 memAlloc.allocationSize = 0;
3245 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003246 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
3247 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003248 pass =
3249 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003250 ASSERT_TRUE(pass);
3251 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
3252 ASSERT_VK_SUCCESS(err);
3253 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
3254 ASSERT_VK_SUCCESS(err);
3255
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003256 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003257 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3258 image_view_create_info.image = image;
3259 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
3260 image_view_create_info.format = tex_format;
3261 image_view_create_info.subresourceRange.layerCount = 1;
3262 image_view_create_info.subresourceRange.baseMipLevel = 0;
3263 image_view_create_info.subresourceRange.levelCount = 1;
3264 image_view_create_info.subresourceRange.aspectMask =
3265 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003266
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003267 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07003268 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
3269 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003270 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003271 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003272 imageInfo[0].imageView = view;
3273 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3274 imageInfo[1].imageView = view;
3275 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003276 imageInfo[2].imageView = view;
3277 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3278 imageInfo[3].imageView = view;
3279 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003280
3281 static const uint32_t NUM_SET_UPDATES = 3;
3282 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
3283 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3284 descriptor_write[0].dstSet = descriptorSet[0];
3285 descriptor_write[0].dstBinding = 0;
3286 descriptor_write[0].descriptorCount = 5;
3287 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3288 descriptor_write[0].pBufferInfo = buffInfo;
3289 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3290 descriptor_write[1].dstSet = descriptorSet[1];
3291 descriptor_write[1].dstBinding = 0;
3292 descriptor_write[1].descriptorCount = 2;
3293 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3294 descriptor_write[1].pImageInfo = imageInfo;
3295 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3296 descriptor_write[2].dstSet = descriptorSet[1];
3297 descriptor_write[2].dstBinding = 1;
3298 descriptor_write[2].descriptorCount = 2;
3299 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003300 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003301
3302 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003303
Tobin Ehlis88452832015-12-03 09:40:56 -07003304 // Create PSO to be used for draw-time errors below
3305 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003306 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003307 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003308 "out gl_PerVertex {\n"
3309 " vec4 gl_Position;\n"
3310 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003311 "void main(){\n"
3312 " gl_Position = vec4(1);\n"
3313 "}\n";
3314 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003315 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003316 "\n"
3317 "layout(location=0) out vec4 x;\n"
3318 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3319 "void main(){\n"
3320 " x = vec4(bar.y);\n"
3321 "}\n";
3322 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3323 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003324 VkPipelineObj pipe(m_device);
3325 pipe.AddShader(&vs);
3326 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07003327 pipe.AddColorAttachment();
3328 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07003329
3330 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07003331
Karl Schultz6addd812016-02-02 17:17:23 -07003332 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3333 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3334 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
3335 // of PSO
3336 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
3337 // cmd_pipeline.c
3338 // due to the fact that cmd_alloc_dset_data() has not been called in
3339 // cmd_bind_graphics_pipeline()
3340 // TODO : Want to cause various binding incompatibility issues here to test
3341 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07003342 // First cause various verify_layout_compatibility() fails
3343 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003344 // verify_set_layout_compatibility fail cases:
3345 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07003346 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3347 " due to: invalid VkPipelineLayout ");
3348 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3349 VK_PIPELINE_BIND_POINT_GRAPHICS,
3350 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
3351 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003352 m_errorMonitor->VerifyFound();
3353
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003354 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07003355 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3356 " attempting to bind set to index 1");
3357 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3358 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
3359 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003360 m_errorMonitor->VerifyFound();
3361
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003362 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003363 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
3364 // descriptors
3365 m_errorMonitor->SetDesiredFailureMsg(
3366 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003367 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003368 vkCmdBindDescriptorSets(
3369 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3370 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003371 m_errorMonitor->VerifyFound();
3372
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003373 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
3374 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07003375 m_errorMonitor->SetDesiredFailureMsg(
3376 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003377 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07003378 vkCmdBindDescriptorSets(
3379 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3380 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003381 m_errorMonitor->VerifyFound();
3382
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003383 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
3384 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07003385 m_errorMonitor->SetDesiredFailureMsg(
3386 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003387 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003388 vkCmdBindDescriptorSets(
3389 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3390 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003391 m_errorMonitor->VerifyFound();
3392
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003393 // Cause INFO messages due to disturbing previously bound Sets
3394 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07003395 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3396 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3397 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003398 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07003399 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003400 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003401 " previously bound as set #0 was disturbed ");
3402 vkCmdBindDescriptorSets(
3403 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3404 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003405 m_errorMonitor->VerifyFound();
3406
Karl Schultz6addd812016-02-02 17:17:23 -07003407 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3408 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3409 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003410 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003411 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003412 " newly bound as set #0 so set #1 and "
3413 "any subsequent sets were disturbed ");
3414 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3415 VK_PIPELINE_BIND_POINT_GRAPHICS,
3416 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003417 m_errorMonitor->VerifyFound();
3418
Tobin Ehlis88452832015-12-03 09:40:56 -07003419 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07003420 // 1. Error due to not binding required set (we actually use same code as
3421 // above to disturb set0)
3422 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3423 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3424 2, &descriptorSet[0], 0, NULL);
3425 vkCmdBindDescriptorSets(
3426 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3427 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
3428 m_errorMonitor->SetDesiredFailureMsg(
3429 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3430 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07003431 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003432 m_errorMonitor->VerifyFound();
3433
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003434 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003435 // 2. Error due to bound set not being compatible with PSO's
3436 // VkPipelineLayout (diff stageFlags in this case)
3437 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3438 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3439 2, &descriptorSet[0], 0, NULL);
3440 m_errorMonitor->SetDesiredFailureMsg(
3441 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3442 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07003443 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003444 m_errorMonitor->VerifyFound();
3445
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003446 // Remaining clean-up
3447 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003448 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003449 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
3450 }
3451 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
3452 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, descriptorSet);
3453 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003454 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3455 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3456}
Tobin Ehlis559c6382015-11-05 09:52:49 -07003457
Karl Schultz6addd812016-02-02 17:17:23 -07003458TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003459
Karl Schultz6addd812016-02-02 17:17:23 -07003460 m_errorMonitor->SetDesiredFailureMsg(
3461 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003462 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003463
3464 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003465 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003466 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003467 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003468
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003469 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003470}
3471
Karl Schultz6addd812016-02-02 17:17:23 -07003472TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
3473 VkResult err;
3474 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003475
Karl Schultz6addd812016-02-02 17:17:23 -07003476 m_errorMonitor->SetDesiredFailureMsg(
3477 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07003478 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003479
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003480 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003481
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003482 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003483 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003484 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003485 cmd.commandPool = m_commandPool;
3486 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003487 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06003488
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003489 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06003490 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003491
3492 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003493 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003494 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003495 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003496 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07003497 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
3498 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003499 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003500
3501 // The error should be caught by validation of the BeginCommandBuffer call
3502 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
3503
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003504 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003505 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003506}
3507
Karl Schultz6addd812016-02-02 17:17:23 -07003508TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003509 // Cause error due to Begin while recording CB
3510 // Then cause 2 errors for attempting to reset CB w/o having
3511 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
3512 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003514 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003515
3516 ASSERT_NO_FATAL_FAILURE(InitState());
3517
3518 // Calls AllocateCommandBuffers
3519 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
3520
Karl Schultz6addd812016-02-02 17:17:23 -07003521 // Force the failure by setting the Renderpass and Framebuffer fields with
3522 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003523 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003524 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003525 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3526 cmd_buf_info.pNext = NULL;
3527 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003528 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003529
3530 // Begin CB to transition to recording state
3531 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
3532 // Can't re-begin. This should trigger error
3533 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003534 m_errorMonitor->VerifyFound();
3535
Karl Schultz6addd812016-02-02 17:17:23 -07003536 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3537 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003538 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
3539 // Reset attempt will trigger error due to incorrect CommandPool state
3540 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003541 m_errorMonitor->VerifyFound();
3542
Karl Schultz6addd812016-02-02 17:17:23 -07003543 m_errorMonitor->SetDesiredFailureMsg(
3544 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3545 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003546 // Transition CB to RECORDED state
3547 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
3548 // Now attempting to Begin will implicitly reset, which triggers error
3549 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003550 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003551}
3552
Karl Schultz6addd812016-02-02 17:17:23 -07003553TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003554 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003555 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003556
Karl Schultz6addd812016-02-02 17:17:23 -07003557 m_errorMonitor->SetDesiredFailureMsg(
3558 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003559 "Invalid Pipeline CreateInfo State: Vtx Shader required");
3560
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003561 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003562 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003563
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003564 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003565 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3566 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003567
3568 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003569 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3570 ds_pool_ci.pNext = NULL;
3571 ds_pool_ci.maxSets = 1;
3572 ds_pool_ci.poolSizeCount = 1;
3573 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003574
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003575 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003576 err =
3577 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003578 ASSERT_VK_SUCCESS(err);
3579
Tony Barboureb254902015-07-15 12:50:33 -06003580 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003581 dsl_binding.binding = 0;
3582 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3583 dsl_binding.descriptorCount = 1;
3584 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3585 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003586
Tony Barboureb254902015-07-15 12:50:33 -06003587 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003588 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3589 ds_layout_ci.pNext = NULL;
3590 ds_layout_ci.bindingCount = 1;
3591 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003592
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003593 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003594 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3595 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003596 ASSERT_VK_SUCCESS(err);
3597
3598 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003599 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003600 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003601 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003602 alloc_info.descriptorPool = ds_pool;
3603 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003604 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3605 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003606 ASSERT_VK_SUCCESS(err);
3607
Tony Barboureb254902015-07-15 12:50:33 -06003608 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003609 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3610 pipeline_layout_ci.setLayoutCount = 1;
3611 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003612
3613 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003614 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3615 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003616 ASSERT_VK_SUCCESS(err);
3617
Tobin Ehlise68360f2015-10-01 11:15:13 -06003618 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07003619 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06003620
3621 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003622 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3623 vp_state_ci.scissorCount = 1;
3624 vp_state_ci.pScissors = &sc;
3625 vp_state_ci.viewportCount = 1;
3626 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003627
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003628 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3629 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3630 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3631 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3632 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3633 rs_state_ci.depthClampEnable = VK_FALSE;
3634 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3635 rs_state_ci.depthBiasEnable = VK_FALSE;
3636
Tony Barboureb254902015-07-15 12:50:33 -06003637 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003638 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3639 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003640 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003641 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3642 gp_ci.layout = pipeline_layout;
3643 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06003644
3645 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003646 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3647 pc_ci.initialDataSize = 0;
3648 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003649
3650 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003651 VkPipelineCache pipelineCache;
3652
Karl Schultz6addd812016-02-02 17:17:23 -07003653 err =
3654 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06003655 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003656 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3657 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003658
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003659 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003660
Chia-I Wuf7458c52015-10-26 21:10:41 +08003661 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3662 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3663 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3664 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003665}
Tobin Ehlis912df022015-09-17 08:46:18 -06003666/*// TODO : This test should be good, but needs Tess support in compiler to run
3667TEST_F(VkLayerTest, InvalidPatchControlPoints)
3668{
3669 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06003670 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003671
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003673 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
3674primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003675
Tobin Ehlis912df022015-09-17 08:46:18 -06003676 ASSERT_NO_FATAL_FAILURE(InitState());
3677 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06003678
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003679 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06003680 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003681 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003682
3683 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3684 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3685 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003686 ds_pool_ci.poolSizeCount = 1;
3687 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06003688
3689 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003690 err = vkCreateDescriptorPool(m_device->device(),
3691VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06003692 ASSERT_VK_SUCCESS(err);
3693
3694 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08003695 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06003696 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08003697 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003698 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3699 dsl_binding.pImmutableSamplers = NULL;
3700
3701 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003702 ds_layout_ci.sType =
3703VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003704 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003705 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003706 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06003707
3708 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003709 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3710&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003711 ASSERT_VK_SUCCESS(err);
3712
3713 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07003714 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
3715VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06003716 ASSERT_VK_SUCCESS(err);
3717
3718 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003719 pipeline_layout_ci.sType =
3720VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003721 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003722 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003723 pipeline_layout_ci.pSetLayouts = &ds_layout;
3724
3725 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003726 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3727&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003728 ASSERT_VK_SUCCESS(err);
3729
3730 VkPipelineShaderStageCreateInfo shaderStages[3];
3731 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
3732
Karl Schultz6addd812016-02-02 17:17:23 -07003733 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
3734this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003735 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07003736 VkShaderObj
3737tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
3738this);
3739 VkShaderObj
3740te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
3741this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003742
Karl Schultz6addd812016-02-02 17:17:23 -07003743 shaderStages[0].sType =
3744VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003745 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003746 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003747 shaderStages[1].sType =
3748VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003749 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003750 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003751 shaderStages[2].sType =
3752VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003753 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003754 shaderStages[2].shader = te.handle();
3755
3756 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003757 iaCI.sType =
3758VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08003759 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06003760
3761 VkPipelineTessellationStateCreateInfo tsCI = {};
3762 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
3763 tsCI.patchControlPoints = 0; // This will cause an error
3764
3765 VkGraphicsPipelineCreateInfo gp_ci = {};
3766 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3767 gp_ci.pNext = NULL;
3768 gp_ci.stageCount = 3;
3769 gp_ci.pStages = shaderStages;
3770 gp_ci.pVertexInputState = NULL;
3771 gp_ci.pInputAssemblyState = &iaCI;
3772 gp_ci.pTessellationState = &tsCI;
3773 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003774 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06003775 gp_ci.pMultisampleState = NULL;
3776 gp_ci.pDepthStencilState = NULL;
3777 gp_ci.pColorBlendState = NULL;
3778 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3779 gp_ci.layout = pipeline_layout;
3780 gp_ci.renderPass = renderPass();
3781
3782 VkPipelineCacheCreateInfo pc_ci = {};
3783 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3784 pc_ci.pNext = NULL;
3785 pc_ci.initialSize = 0;
3786 pc_ci.initialData = 0;
3787 pc_ci.maxSize = 0;
3788
3789 VkPipeline pipeline;
3790 VkPipelineCache pipelineCache;
3791
Karl Schultz6addd812016-02-02 17:17:23 -07003792 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
3793&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06003794 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003795 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3796&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06003797
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003798 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003799
Chia-I Wuf7458c52015-10-26 21:10:41 +08003800 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3801 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3802 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3803 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06003804}
3805*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06003806// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07003807TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07003808 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003809
Karl Schultz6addd812016-02-02 17:17:23 -07003810 m_errorMonitor->SetDesiredFailureMsg(
3811 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003812 "Gfx Pipeline viewport count (1) must match scissor count (0).");
3813
Tobin Ehlise68360f2015-10-01 11:15:13 -06003814 ASSERT_NO_FATAL_FAILURE(InitState());
3815 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003816
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003817 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003818 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3819 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003820
3821 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003822 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3823 ds_pool_ci.maxSets = 1;
3824 ds_pool_ci.poolSizeCount = 1;
3825 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003826
3827 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003828 err =
3829 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003830 ASSERT_VK_SUCCESS(err);
3831
3832 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003833 dsl_binding.binding = 0;
3834 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3835 dsl_binding.descriptorCount = 1;
3836 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003837
3838 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003839 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3840 ds_layout_ci.bindingCount = 1;
3841 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003842
3843 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003844 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3845 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003846 ASSERT_VK_SUCCESS(err);
3847
3848 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003849 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003850 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003851 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003852 alloc_info.descriptorPool = ds_pool;
3853 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003854 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3855 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003856 ASSERT_VK_SUCCESS(err);
3857
3858 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003859 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3860 pipeline_layout_ci.setLayoutCount = 1;
3861 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003862
3863 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003864 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3865 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003866 ASSERT_VK_SUCCESS(err);
3867
3868 VkViewport vp = {}; // Just need dummy vp to point to
3869
3870 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003871 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3872 vp_state_ci.scissorCount = 0;
3873 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
3874 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003875
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003876 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3877 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3878 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3879 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3880 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3881 rs_state_ci.depthClampEnable = VK_FALSE;
3882 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3883 rs_state_ci.depthBiasEnable = VK_FALSE;
3884
Cody Northropeb3a6c12015-10-05 14:44:45 -06003885 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003886 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003887
Karl Schultz6addd812016-02-02 17:17:23 -07003888 VkShaderObj vs(m_device, bindStateVertShaderText,
3889 VK_SHADER_STAGE_VERTEX_BIT, this);
3890 VkShaderObj fs(m_device, bindStateFragShaderText,
3891 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003892 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003893 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003894 shaderStages[0] = vs.GetStageCreateInfo();
3895 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003896
3897 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003898 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3899 gp_ci.stageCount = 2;
3900 gp_ci.pStages = shaderStages;
3901 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003902 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003903 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3904 gp_ci.layout = pipeline_layout;
3905 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003906
3907 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003908 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003909
3910 VkPipeline pipeline;
3911 VkPipelineCache pipelineCache;
3912
Karl Schultz6addd812016-02-02 17:17:23 -07003913 err =
3914 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003915 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003916 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3917 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003918
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003919 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003920
Chia-I Wuf7458c52015-10-26 21:10:41 +08003921 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3922 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3923 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3924 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003925}
Karl Schultz6addd812016-02-02 17:17:23 -07003926// Don't set viewport state in PSO. This is an error b/c we always need this
3927// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06003928// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07003929TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06003930 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003931 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003932
Karl Schultz6addd812016-02-02 17:17:23 -07003933 m_errorMonitor->SetDesiredFailureMsg(
3934 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003935 "Gfx Pipeline pViewportState is null. Even if ");
3936
Tobin Ehlise68360f2015-10-01 11:15:13 -06003937 ASSERT_NO_FATAL_FAILURE(InitState());
3938 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003939
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003940 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003941 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3942 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003943
3944 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003945 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3946 ds_pool_ci.maxSets = 1;
3947 ds_pool_ci.poolSizeCount = 1;
3948 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003949
3950 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003951 err =
3952 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003953 ASSERT_VK_SUCCESS(err);
3954
3955 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003956 dsl_binding.binding = 0;
3957 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3958 dsl_binding.descriptorCount = 1;
3959 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003960
3961 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003962 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3963 ds_layout_ci.bindingCount = 1;
3964 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003965
3966 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003967 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3968 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003969 ASSERT_VK_SUCCESS(err);
3970
3971 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003972 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003973 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003974 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003975 alloc_info.descriptorPool = ds_pool;
3976 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003977 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3978 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003979 ASSERT_VK_SUCCESS(err);
3980
3981 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003982 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3983 pipeline_layout_ci.setLayoutCount = 1;
3984 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003985
3986 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003987 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3988 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003989 ASSERT_VK_SUCCESS(err);
3990
3991 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
3992 // Set scissor as dynamic to avoid second error
3993 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003994 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3995 dyn_state_ci.dynamicStateCount = 1;
3996 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003997
Cody Northropeb3a6c12015-10-05 14:44:45 -06003998 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003999 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004000
Karl Schultz6addd812016-02-02 17:17:23 -07004001 VkShaderObj vs(m_device, bindStateVertShaderText,
4002 VK_SHADER_STAGE_VERTEX_BIT, this);
4003 VkShaderObj fs(m_device, bindStateFragShaderText,
4004 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004005 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004006 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004007 shaderStages[0] = vs.GetStageCreateInfo();
4008 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004009
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004010
4011 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4012 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4013 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4014 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4015 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4016 rs_state_ci.depthClampEnable = VK_FALSE;
4017 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4018 rs_state_ci.depthBiasEnable = VK_FALSE;
4019
Tobin Ehlise68360f2015-10-01 11:15:13 -06004020 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004021 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4022 gp_ci.stageCount = 2;
4023 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004024 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004025 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
4026 // should cause validation error
4027 gp_ci.pDynamicState = &dyn_state_ci;
4028 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4029 gp_ci.layout = pipeline_layout;
4030 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004031
4032 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004033 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004034
4035 VkPipeline pipeline;
4036 VkPipelineCache pipelineCache;
4037
Karl Schultz6addd812016-02-02 17:17:23 -07004038 err =
4039 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004040 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004041 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4042 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004043
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004044 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004045
Chia-I Wuf7458c52015-10-26 21:10:41 +08004046 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4047 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4048 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4049 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004050}
4051// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07004052// Then run second test where dynamic scissor count doesn't match PSO scissor
4053// count
4054TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
4055 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004056
Karl Schultz6addd812016-02-02 17:17:23 -07004057 m_errorMonitor->SetDesiredFailureMsg(
4058 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004059 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
4060
Tobin Ehlise68360f2015-10-01 11:15:13 -06004061 ASSERT_NO_FATAL_FAILURE(InitState());
4062 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004063
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004064 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004065 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4066 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004067
4068 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004069 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4070 ds_pool_ci.maxSets = 1;
4071 ds_pool_ci.poolSizeCount = 1;
4072 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004073
4074 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004075 err =
4076 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004077 ASSERT_VK_SUCCESS(err);
4078
4079 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004080 dsl_binding.binding = 0;
4081 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4082 dsl_binding.descriptorCount = 1;
4083 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004084
4085 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004086 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4087 ds_layout_ci.bindingCount = 1;
4088 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004089
4090 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004091 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4092 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004093 ASSERT_VK_SUCCESS(err);
4094
4095 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004096 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004097 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004098 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004099 alloc_info.descriptorPool = ds_pool;
4100 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004101 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4102 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004103 ASSERT_VK_SUCCESS(err);
4104
4105 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004106 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4107 pipeline_layout_ci.setLayoutCount = 1;
4108 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004109
4110 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004111 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4112 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004113 ASSERT_VK_SUCCESS(err);
4114
4115 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004116 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4117 vp_state_ci.viewportCount = 1;
4118 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
4119 vp_state_ci.scissorCount = 1;
4120 vp_state_ci.pScissors =
4121 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06004122
4123 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4124 // Set scissor as dynamic to avoid that error
4125 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004126 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4127 dyn_state_ci.dynamicStateCount = 1;
4128 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004129
Cody Northropeb3a6c12015-10-05 14:44:45 -06004130 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004131 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004132
Karl Schultz6addd812016-02-02 17:17:23 -07004133 VkShaderObj vs(m_device, bindStateVertShaderText,
4134 VK_SHADER_STAGE_VERTEX_BIT, this);
4135 VkShaderObj fs(m_device, bindStateFragShaderText,
4136 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004137 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004138 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004139 shaderStages[0] = vs.GetStageCreateInfo();
4140 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004141
Cody Northropf6622dc2015-10-06 10:33:21 -06004142 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4143 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4144 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004145 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004146 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004147 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004148 vi_ci.pVertexAttributeDescriptions = nullptr;
4149
4150 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4151 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4152 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4153
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004154 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004155 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06004156 rs_ci.pNext = nullptr;
4157
Mark Youngc89c6312016-03-31 16:03:20 -06004158 VkPipelineColorBlendAttachmentState att = {};
4159 att.blendEnable = VK_FALSE;
4160 att.colorWriteMask = 0xf;
4161
Cody Northropf6622dc2015-10-06 10:33:21 -06004162 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4163 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4164 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004165 cb_ci.attachmentCount = 1;
4166 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06004167
Tobin Ehlise68360f2015-10-01 11:15:13 -06004168 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004169 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4170 gp_ci.stageCount = 2;
4171 gp_ci.pStages = shaderStages;
4172 gp_ci.pVertexInputState = &vi_ci;
4173 gp_ci.pInputAssemblyState = &ia_ci;
4174 gp_ci.pViewportState = &vp_state_ci;
4175 gp_ci.pRasterizationState = &rs_ci;
4176 gp_ci.pColorBlendState = &cb_ci;
4177 gp_ci.pDynamicState = &dyn_state_ci;
4178 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4179 gp_ci.layout = pipeline_layout;
4180 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004181
4182 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004183 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004184
4185 VkPipeline pipeline;
4186 VkPipelineCache pipelineCache;
4187
Karl Schultz6addd812016-02-02 17:17:23 -07004188 err =
4189 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004190 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004191 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4192 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004193
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004194 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004195
Tobin Ehlisd332f282015-10-02 11:00:56 -06004196 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07004197 // First need to successfully create the PSO from above by setting
4198 // pViewports
4199 m_errorMonitor->SetDesiredFailureMsg(
4200 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4201 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
4202 "scissorCount is 1. These counts must match.");
4203
4204 VkViewport vp = {}; // Just need dummy vp to point to
4205 vp_state_ci.pViewports = &vp;
4206 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4207 &gp_ci, NULL, &pipeline);
4208 ASSERT_VK_SUCCESS(err);
4209 BeginCommandBuffer();
4210 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4211 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4212 VkRect2D scissors[2] = {}; // don't care about data
4213 // Count of 2 doesn't match PSO count of 1
4214 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
4215 Draw(1, 0, 0, 0);
4216
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004217 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004218
4219 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4220 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4221 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4222 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4223}
4224// Create PSO w/o non-zero scissorCount but no scissor data
4225// Then run second test where dynamic viewportCount doesn't match PSO
4226// viewportCount
4227TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
4228 VkResult err;
4229
4230 m_errorMonitor->SetDesiredFailureMsg(
4231 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4232 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
4233
4234 ASSERT_NO_FATAL_FAILURE(InitState());
4235 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4236
4237 VkDescriptorPoolSize ds_type_count = {};
4238 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4239 ds_type_count.descriptorCount = 1;
4240
4241 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4242 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4243 ds_pool_ci.maxSets = 1;
4244 ds_pool_ci.poolSizeCount = 1;
4245 ds_pool_ci.pPoolSizes = &ds_type_count;
4246
4247 VkDescriptorPool ds_pool;
4248 err =
4249 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4250 ASSERT_VK_SUCCESS(err);
4251
4252 VkDescriptorSetLayoutBinding dsl_binding = {};
4253 dsl_binding.binding = 0;
4254 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4255 dsl_binding.descriptorCount = 1;
4256 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4257
4258 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4259 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4260 ds_layout_ci.bindingCount = 1;
4261 ds_layout_ci.pBindings = &dsl_binding;
4262
4263 VkDescriptorSetLayout ds_layout;
4264 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4265 &ds_layout);
4266 ASSERT_VK_SUCCESS(err);
4267
4268 VkDescriptorSet descriptorSet;
4269 VkDescriptorSetAllocateInfo alloc_info = {};
4270 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4271 alloc_info.descriptorSetCount = 1;
4272 alloc_info.descriptorPool = ds_pool;
4273 alloc_info.pSetLayouts = &ds_layout;
4274 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4275 &descriptorSet);
4276 ASSERT_VK_SUCCESS(err);
4277
4278 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4279 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4280 pipeline_layout_ci.setLayoutCount = 1;
4281 pipeline_layout_ci.pSetLayouts = &ds_layout;
4282
4283 VkPipelineLayout pipeline_layout;
4284 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4285 &pipeline_layout);
4286 ASSERT_VK_SUCCESS(err);
4287
4288 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4289 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4290 vp_state_ci.scissorCount = 1;
4291 vp_state_ci.pScissors =
4292 NULL; // Null scissor w/ count of 1 should cause error
4293 vp_state_ci.viewportCount = 1;
4294 vp_state_ci.pViewports =
4295 NULL; // vp is dynamic (below) so this won't cause error
4296
4297 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
4298 // Set scissor as dynamic to avoid that error
4299 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4300 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4301 dyn_state_ci.dynamicStateCount = 1;
4302 dyn_state_ci.pDynamicStates = &vp_state;
4303
4304 VkPipelineShaderStageCreateInfo shaderStages[2];
4305 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4306
4307 VkShaderObj vs(m_device, bindStateVertShaderText,
4308 VK_SHADER_STAGE_VERTEX_BIT, this);
4309 VkShaderObj fs(m_device, bindStateFragShaderText,
4310 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004311 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004312 // but add it to be able to run on more devices
4313 shaderStages[0] = vs.GetStageCreateInfo();
4314 shaderStages[1] = fs.GetStageCreateInfo();
4315
4316 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4317 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4318 vi_ci.pNext = nullptr;
4319 vi_ci.vertexBindingDescriptionCount = 0;
4320 vi_ci.pVertexBindingDescriptions = nullptr;
4321 vi_ci.vertexAttributeDescriptionCount = 0;
4322 vi_ci.pVertexAttributeDescriptions = nullptr;
4323
4324 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4325 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4326 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4327
4328 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4329 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4330 rs_ci.pNext = nullptr;
4331
Mark Youngc89c6312016-03-31 16:03:20 -06004332 VkPipelineColorBlendAttachmentState att = {};
4333 att.blendEnable = VK_FALSE;
4334 att.colorWriteMask = 0xf;
4335
Karl Schultz6addd812016-02-02 17:17:23 -07004336 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4337 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4338 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004339 cb_ci.attachmentCount = 1;
4340 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07004341
4342 VkGraphicsPipelineCreateInfo gp_ci = {};
4343 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4344 gp_ci.stageCount = 2;
4345 gp_ci.pStages = shaderStages;
4346 gp_ci.pVertexInputState = &vi_ci;
4347 gp_ci.pInputAssemblyState = &ia_ci;
4348 gp_ci.pViewportState = &vp_state_ci;
4349 gp_ci.pRasterizationState = &rs_ci;
4350 gp_ci.pColorBlendState = &cb_ci;
4351 gp_ci.pDynamicState = &dyn_state_ci;
4352 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4353 gp_ci.layout = pipeline_layout;
4354 gp_ci.renderPass = renderPass();
4355
4356 VkPipelineCacheCreateInfo pc_ci = {};
4357 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4358
4359 VkPipeline pipeline;
4360 VkPipelineCache pipelineCache;
4361
4362 err =
4363 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4364 ASSERT_VK_SUCCESS(err);
4365 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4366 &gp_ci, NULL, &pipeline);
4367
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004368 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004369
4370 // Now hit second fail case where we set scissor w/ different count than PSO
4371 // First need to successfully create the PSO from above by setting
4372 // pViewports
4373 m_errorMonitor->SetDesiredFailureMsg(
4374 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4375 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
4376 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004377
Tobin Ehlisd332f282015-10-02 11:00:56 -06004378 VkRect2D sc = {}; // Just need dummy vp to point to
4379 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07004380 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4381 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004382 ASSERT_VK_SUCCESS(err);
4383 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004384 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4385 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004386 VkViewport viewports[2] = {}; // don't care about data
4387 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07004388 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004389 Draw(1, 0, 0, 0);
4390
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004391 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004392
Chia-I Wuf7458c52015-10-26 21:10:41 +08004393 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4394 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4395 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4396 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004397}
4398
Mark Young7394fdd2016-03-31 14:56:43 -06004399TEST_F(VkLayerTest, PSOLineWidthInvalid) {
4400 VkResult err;
4401
4402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4403 "Attempt to set lineWidth to 0");
4404
4405 ASSERT_NO_FATAL_FAILURE(InitState());
4406 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4407
4408 VkDescriptorPoolSize ds_type_count = {};
4409 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4410 ds_type_count.descriptorCount = 1;
4411
4412 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4413 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4414 ds_pool_ci.maxSets = 1;
4415 ds_pool_ci.poolSizeCount = 1;
4416 ds_pool_ci.pPoolSizes = &ds_type_count;
4417
4418 VkDescriptorPool ds_pool;
4419 err =
4420 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4421 ASSERT_VK_SUCCESS(err);
4422
4423 VkDescriptorSetLayoutBinding dsl_binding = {};
4424 dsl_binding.binding = 0;
4425 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4426 dsl_binding.descriptorCount = 1;
4427 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4428
4429 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4430 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4431 ds_layout_ci.bindingCount = 1;
4432 ds_layout_ci.pBindings = &dsl_binding;
4433
4434 VkDescriptorSetLayout ds_layout;
4435 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4436 &ds_layout);
4437 ASSERT_VK_SUCCESS(err);
4438
4439 VkDescriptorSet descriptorSet;
4440 VkDescriptorSetAllocateInfo alloc_info = {};
4441 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4442 alloc_info.descriptorSetCount = 1;
4443 alloc_info.descriptorPool = ds_pool;
4444 alloc_info.pSetLayouts = &ds_layout;
4445 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4446 &descriptorSet);
4447 ASSERT_VK_SUCCESS(err);
4448
4449 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4450 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4451 pipeline_layout_ci.setLayoutCount = 1;
4452 pipeline_layout_ci.pSetLayouts = &ds_layout;
4453
4454 VkPipelineLayout pipeline_layout;
4455 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4456 &pipeline_layout);
4457 ASSERT_VK_SUCCESS(err);
4458
4459 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4460 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4461 vp_state_ci.scissorCount = 1;
4462 vp_state_ci.pScissors = NULL;
4463 vp_state_ci.viewportCount = 1;
4464 vp_state_ci.pViewports = NULL;
4465
4466 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
4467 VK_DYNAMIC_STATE_SCISSOR,
4468 VK_DYNAMIC_STATE_LINE_WIDTH};
4469 // Set scissor as dynamic to avoid that error
4470 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4471 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4472 dyn_state_ci.dynamicStateCount = 2;
4473 dyn_state_ci.pDynamicStates = dynamic_states;
4474
4475 VkPipelineShaderStageCreateInfo shaderStages[2];
4476 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4477
4478 VkShaderObj vs(m_device, bindStateVertShaderText,
4479 VK_SHADER_STAGE_VERTEX_BIT, this);
4480 VkShaderObj fs(m_device, bindStateFragShaderText,
4481 VK_SHADER_STAGE_FRAGMENT_BIT,
4482 this); // TODO - We shouldn't need a fragment shader
4483 // but add it to be able to run on more devices
4484 shaderStages[0] = vs.GetStageCreateInfo();
4485 shaderStages[1] = fs.GetStageCreateInfo();
4486
4487 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4488 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4489 vi_ci.pNext = nullptr;
4490 vi_ci.vertexBindingDescriptionCount = 0;
4491 vi_ci.pVertexBindingDescriptions = nullptr;
4492 vi_ci.vertexAttributeDescriptionCount = 0;
4493 vi_ci.pVertexAttributeDescriptions = nullptr;
4494
4495 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4496 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4497 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4498
4499 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4500 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4501 rs_ci.pNext = nullptr;
4502
4503 // Check too low (line width of 0.0f).
4504 rs_ci.lineWidth = 0.0f;
4505
4506 VkPipelineColorBlendAttachmentState att = {};
4507 att.blendEnable = VK_FALSE;
4508 att.colorWriteMask = 0xf;
4509
4510 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4511 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4512 cb_ci.pNext = nullptr;
4513 cb_ci.attachmentCount = 1;
4514 cb_ci.pAttachments = &att;
4515
4516 VkGraphicsPipelineCreateInfo gp_ci = {};
4517 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4518 gp_ci.stageCount = 2;
4519 gp_ci.pStages = shaderStages;
4520 gp_ci.pVertexInputState = &vi_ci;
4521 gp_ci.pInputAssemblyState = &ia_ci;
4522 gp_ci.pViewportState = &vp_state_ci;
4523 gp_ci.pRasterizationState = &rs_ci;
4524 gp_ci.pColorBlendState = &cb_ci;
4525 gp_ci.pDynamicState = &dyn_state_ci;
4526 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4527 gp_ci.layout = pipeline_layout;
4528 gp_ci.renderPass = renderPass();
4529
4530 VkPipelineCacheCreateInfo pc_ci = {};
4531 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4532
4533 VkPipeline pipeline;
4534 VkPipelineCache pipelineCache;
4535
4536 err =
4537 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4538 ASSERT_VK_SUCCESS(err);
4539 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4540 &gp_ci, NULL, &pipeline);
4541
4542 m_errorMonitor->VerifyFound();
4543
4544 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4545 "Attempt to set lineWidth to 65536");
4546
4547 // Check too high (line width of 65536.0f).
4548 rs_ci.lineWidth = 65536.0f;
4549
4550 err =
4551 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4552 ASSERT_VK_SUCCESS(err);
4553 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4554 &gp_ci, NULL, &pipeline);
4555
4556 m_errorMonitor->VerifyFound();
4557
4558 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4559 "Attempt to set lineWidth to 0");
4560
4561 dyn_state_ci.dynamicStateCount = 3;
4562
4563 rs_ci.lineWidth = 1.0f;
4564
4565 err =
4566 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4567 ASSERT_VK_SUCCESS(err);
4568 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4569 &gp_ci, NULL, &pipeline);
4570 BeginCommandBuffer();
4571 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4572 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4573
4574 // Check too low with dynamic setting.
4575 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 0.0f);
4576 m_errorMonitor->VerifyFound();
4577
4578 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4579 "Attempt to set lineWidth to 65536");
4580
4581 // Check too high with dynamic setting.
4582 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
4583 m_errorMonitor->VerifyFound();
4584 EndCommandBuffer();
4585
4586 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4587 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4588 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4589 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4590}
4591
Karl Schultz6addd812016-02-02 17:17:23 -07004592TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004593 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004594 m_errorMonitor->SetDesiredFailureMsg(
4595 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004596 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004597
4598 ASSERT_NO_FATAL_FAILURE(InitState());
4599 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004600
Tony Barbourfe3351b2015-07-28 10:17:20 -06004601 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004602 // Don't care about RenderPass handle b/c error should be flagged before
4603 // that
4604 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
4605 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004606
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004607 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004608}
4609
Karl Schultz6addd812016-02-02 17:17:23 -07004610TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004611 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004612 m_errorMonitor->SetDesiredFailureMsg(
4613 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004614 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004615
4616 ASSERT_NO_FATAL_FAILURE(InitState());
4617 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004618
Tony Barbourfe3351b2015-07-28 10:17:20 -06004619 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004620 // Just create a dummy Renderpass that's non-NULL so we can get to the
4621 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06004622 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004623 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4624 rp_begin.pNext = NULL;
4625 rp_begin.renderPass = renderPass();
4626 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004627
Karl Schultz6addd812016-02-02 17:17:23 -07004628 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
4629 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004630
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004631 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004632}
4633
Karl Schultz6addd812016-02-02 17:17:23 -07004634TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004635 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004636 m_errorMonitor->SetDesiredFailureMsg(
4637 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004638 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004639
4640 ASSERT_NO_FATAL_FAILURE(InitState());
4641 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004642
4643 // Renderpass is started here
4644 BeginCommandBuffer();
4645
4646 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004647 vk_testing::Buffer dstBuffer;
4648 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004649
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004650 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004651
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004652 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004653}
4654
Karl Schultz6addd812016-02-02 17:17:23 -07004655TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004656 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004657 m_errorMonitor->SetDesiredFailureMsg(
4658 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004659 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004660
4661 ASSERT_NO_FATAL_FAILURE(InitState());
4662 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004663
4664 // Renderpass is started here
4665 BeginCommandBuffer();
4666
4667 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004668 vk_testing::Buffer dstBuffer;
4669 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004670
Karl Schultz6addd812016-02-02 17:17:23 -07004671 VkDeviceSize dstOffset = 0;
4672 VkDeviceSize dataSize = 1024;
4673 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004674
Karl Schultz6addd812016-02-02 17:17:23 -07004675 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
4676 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004677
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004678 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004679}
4680
Karl Schultz6addd812016-02-02 17:17:23 -07004681TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004682 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004683 m_errorMonitor->SetDesiredFailureMsg(
4684 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004685 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004686
4687 ASSERT_NO_FATAL_FAILURE(InitState());
4688 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004689
4690 // Renderpass is started here
4691 BeginCommandBuffer();
4692
Michael Lentine0a369f62016-02-03 16:51:46 -06004693 VkClearColorValue clear_color;
4694 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07004695 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
4696 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4697 const int32_t tex_width = 32;
4698 const int32_t tex_height = 32;
4699 VkImageCreateInfo image_create_info = {};
4700 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4701 image_create_info.pNext = NULL;
4702 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4703 image_create_info.format = tex_format;
4704 image_create_info.extent.width = tex_width;
4705 image_create_info.extent.height = tex_height;
4706 image_create_info.extent.depth = 1;
4707 image_create_info.mipLevels = 1;
4708 image_create_info.arrayLayers = 1;
4709 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4710 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4711 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004712
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004713 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004714 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4715 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004716
Karl Schultz6addd812016-02-02 17:17:23 -07004717 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4718 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004719
Karl Schultz6addd812016-02-02 17:17:23 -07004720 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4721 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004722
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004723 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004724}
4725
Karl Schultz6addd812016-02-02 17:17:23 -07004726TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004727 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004728 m_errorMonitor->SetDesiredFailureMsg(
4729 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004730 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004731
4732 ASSERT_NO_FATAL_FAILURE(InitState());
4733 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004734
4735 // Renderpass is started here
4736 BeginCommandBuffer();
4737
4738 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07004739 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004740 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
4741 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4742 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
4743 image_create_info.extent.width = 64;
4744 image_create_info.extent.height = 64;
4745 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4746 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004747
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004748 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004749 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4750 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004751
Karl Schultz6addd812016-02-02 17:17:23 -07004752 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4753 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004754
Karl Schultz6addd812016-02-02 17:17:23 -07004755 vkCmdClearDepthStencilImage(
4756 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4757 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
4758 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004759
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004760 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004761}
4762
Karl Schultz6addd812016-02-02 17:17:23 -07004763TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004764 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004765 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004766
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004768 "vkCmdClearAttachments: This call "
4769 "must be issued inside an active "
4770 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004771
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004772 ASSERT_NO_FATAL_FAILURE(InitState());
4773 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004774
4775 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004776 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004777 ASSERT_VK_SUCCESS(err);
4778
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004779 VkClearAttachment color_attachment;
4780 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4781 color_attachment.clearValue.color.float32[0] = 0;
4782 color_attachment.clearValue.color.float32[1] = 0;
4783 color_attachment.clearValue.color.float32[2] = 0;
4784 color_attachment.clearValue.color.float32[3] = 0;
4785 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004786 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
4787 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
4788 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004789
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004790 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004791}
4792
Karl Schultz9e66a292016-04-21 15:57:51 -06004793TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
4794 // Try to add a buffer memory barrier with no buffer.
4795 m_errorMonitor->SetDesiredFailureMsg(
4796 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4797 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
4798
4799 ASSERT_NO_FATAL_FAILURE(InitState());
4800 BeginCommandBuffer();
4801
4802 VkBufferMemoryBarrier buf_barrier = {};
4803 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
4804 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4805 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4806 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4807 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4808 buf_barrier.buffer = VK_NULL_HANDLE;
4809 buf_barrier.offset = 0;
4810 buf_barrier.size = VK_WHOLE_SIZE;
4811 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4812 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
4813 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
4814
4815 m_errorMonitor->VerifyFound();
4816}
4817
Karl Schultz6addd812016-02-02 17:17:23 -07004818TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004819 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004820 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004821
Karl Schultz6addd812016-02-02 17:17:23 -07004822 m_errorMonitor->SetDesiredFailureMsg(
4823 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004824 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
4825
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004826 ASSERT_NO_FATAL_FAILURE(InitState());
4827 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004828 uint32_t qfi = 0;
4829 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004830 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4831 buffCI.size = 1024;
4832 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
4833 buffCI.queueFamilyIndexCount = 1;
4834 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004835
4836 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004837 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004838 ASSERT_VK_SUCCESS(err);
4839
4840 BeginCommandBuffer();
4841 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004842 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4843 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004844 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07004845 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
4846 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004847
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004848 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004849
Chia-I Wuf7458c52015-10-26 21:10:41 +08004850 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004851}
4852
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004853TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
4854 // Create an out-of-range queueFamilyIndex
4855 m_errorMonitor->SetDesiredFailureMsg(
4856 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06004857 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004858
4859 ASSERT_NO_FATAL_FAILURE(InitState());
4860 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4861 VkBufferCreateInfo buffCI = {};
4862 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4863 buffCI.size = 1024;
4864 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
4865 buffCI.queueFamilyIndexCount = 1;
4866 // Introduce failure by specifying invalid queue_family_index
4867 uint32_t qfi = 777;
4868 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06004869 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004870
4871 VkBuffer ib;
4872 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
4873
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004874 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004875}
4876
Karl Schultz6addd812016-02-02 17:17:23 -07004877TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
4878 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
4879 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004880
Karl Schultz6addd812016-02-02 17:17:23 -07004881 m_errorMonitor->SetDesiredFailureMsg(
4882 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004883 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004884
4885 ASSERT_NO_FATAL_FAILURE(InitState());
4886 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004887
4888 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004889 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004890 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
4891 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004892
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004893 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004894}
4895
Karl Schultz6addd812016-02-02 17:17:23 -07004896TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004897 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07004898 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004899
Karl Schultz6addd812016-02-02 17:17:23 -07004900 m_errorMonitor->SetDesiredFailureMsg(
4901 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Write descriptor update has descriptor "
4902 "type VK_DESCRIPTOR_TYPE_SAMPLER that "
4903 "does not match ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004904
Tobin Ehlis3b780662015-05-28 12:11:26 -06004905 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004906 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004907 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004908 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4909 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004910
4911 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004912 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4913 ds_pool_ci.pNext = NULL;
4914 ds_pool_ci.maxSets = 1;
4915 ds_pool_ci.poolSizeCount = 1;
4916 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004917
Tobin Ehlis3b780662015-05-28 12:11:26 -06004918 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004919 err =
4920 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004921 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06004922 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004923 dsl_binding.binding = 0;
4924 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4925 dsl_binding.descriptorCount = 1;
4926 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4927 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004928
Tony Barboureb254902015-07-15 12:50:33 -06004929 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004930 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4931 ds_layout_ci.pNext = NULL;
4932 ds_layout_ci.bindingCount = 1;
4933 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004934
Tobin Ehlis3b780662015-05-28 12:11:26 -06004935 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004936 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4937 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004938 ASSERT_VK_SUCCESS(err);
4939
4940 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004941 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004942 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004943 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004944 alloc_info.descriptorPool = ds_pool;
4945 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004946 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4947 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004948 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004949
Tony Barboureb254902015-07-15 12:50:33 -06004950 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004951 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4952 sampler_ci.pNext = NULL;
4953 sampler_ci.magFilter = VK_FILTER_NEAREST;
4954 sampler_ci.minFilter = VK_FILTER_NEAREST;
4955 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4956 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4957 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4958 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4959 sampler_ci.mipLodBias = 1.0;
4960 sampler_ci.anisotropyEnable = VK_FALSE;
4961 sampler_ci.maxAnisotropy = 1;
4962 sampler_ci.compareEnable = VK_FALSE;
4963 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4964 sampler_ci.minLod = 1.0;
4965 sampler_ci.maxLod = 1.0;
4966 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4967 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Mark Lobodzinski52ac6582015-09-01 15:42:56 -06004968
Tobin Ehlis3b780662015-05-28 12:11:26 -06004969 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004970 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004971 ASSERT_VK_SUCCESS(err);
4972
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004973 VkDescriptorImageInfo info = {};
4974 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004975
4976 VkWriteDescriptorSet descriptor_write;
4977 memset(&descriptor_write, 0, sizeof(descriptor_write));
4978 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004979 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004980 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004981 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004982 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004983 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004984
4985 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4986
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004987 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004988
Chia-I Wuf7458c52015-10-26 21:10:41 +08004989 vkDestroySampler(m_device->device(), sampler, NULL);
4990 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4991 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004992}
4993
Karl Schultz6addd812016-02-02 17:17:23 -07004994TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004995 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07004996 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004997
Karl Schultz6addd812016-02-02 17:17:23 -07004998 m_errorMonitor->SetDesiredFailureMsg(
4999 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Descriptor update type of "
5000 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET "
5001 "is out of bounds for matching binding");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005002
Tobin Ehlis3b780662015-05-28 12:11:26 -06005003 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005004 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005005 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005006 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5007 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005008
5009 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005010 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5011 ds_pool_ci.pNext = NULL;
5012 ds_pool_ci.maxSets = 1;
5013 ds_pool_ci.poolSizeCount = 1;
5014 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005015
Tobin Ehlis3b780662015-05-28 12:11:26 -06005016 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005017 err =
5018 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005019 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005020
Tony Barboureb254902015-07-15 12:50:33 -06005021 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005022 dsl_binding.binding = 0;
5023 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5024 dsl_binding.descriptorCount = 1;
5025 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5026 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005027
5028 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005029 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5030 ds_layout_ci.pNext = NULL;
5031 ds_layout_ci.bindingCount = 1;
5032 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005033
Tobin Ehlis3b780662015-05-28 12:11:26 -06005034 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005035 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5036 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005037 ASSERT_VK_SUCCESS(err);
5038
5039 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005040 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005041 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005042 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005043 alloc_info.descriptorPool = ds_pool;
5044 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005045 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5046 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005047 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005048
Tony Barboureb254902015-07-15 12:50:33 -06005049 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005050 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5051 sampler_ci.pNext = NULL;
5052 sampler_ci.magFilter = VK_FILTER_NEAREST;
5053 sampler_ci.minFilter = VK_FILTER_NEAREST;
5054 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5055 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5056 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5057 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5058 sampler_ci.mipLodBias = 1.0;
5059 sampler_ci.anisotropyEnable = VK_FALSE;
5060 sampler_ci.maxAnisotropy = 1;
5061 sampler_ci.compareEnable = VK_FALSE;
5062 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5063 sampler_ci.minLod = 1.0;
5064 sampler_ci.maxLod = 1.0;
5065 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5066 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005067
Tobin Ehlis3b780662015-05-28 12:11:26 -06005068 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005069 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005070 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005071
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005072 VkDescriptorImageInfo info = {};
5073 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005074
5075 VkWriteDescriptorSet descriptor_write;
5076 memset(&descriptor_write, 0, sizeof(descriptor_write));
5077 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005078 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005079 descriptor_write.dstArrayElement =
5080 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08005081 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005082 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005083 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005084 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005085
5086 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5087
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005088 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005089
Chia-I Wuf7458c52015-10-26 21:10:41 +08005090 vkDestroySampler(m_device->device(), sampler, NULL);
5091 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5092 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005093}
5094
Karl Schultz6addd812016-02-02 17:17:23 -07005095TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
5096 // Create layout w/ count of 1 and attempt update to that layout w/ binding
5097 // index 2
5098 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005099
Karl Schultz6addd812016-02-02 17:17:23 -07005100 m_errorMonitor->SetDesiredFailureMsg(
5101 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005102 " does not have binding to match update binding ");
5103
Tobin Ehlis3b780662015-05-28 12:11:26 -06005104 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005105 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005106 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005107 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5108 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005109
5110 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005111 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5112 ds_pool_ci.pNext = NULL;
5113 ds_pool_ci.maxSets = 1;
5114 ds_pool_ci.poolSizeCount = 1;
5115 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005116
Tobin Ehlis3b780662015-05-28 12:11:26 -06005117 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005118 err =
5119 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005120 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005121
Tony Barboureb254902015-07-15 12:50:33 -06005122 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005123 dsl_binding.binding = 0;
5124 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5125 dsl_binding.descriptorCount = 1;
5126 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5127 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005128
5129 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005130 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5131 ds_layout_ci.pNext = NULL;
5132 ds_layout_ci.bindingCount = 1;
5133 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005134 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005135 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5136 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005137 ASSERT_VK_SUCCESS(err);
5138
5139 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005140 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005141 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005142 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005143 alloc_info.descriptorPool = ds_pool;
5144 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005145 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5146 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005147 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005148
Tony Barboureb254902015-07-15 12:50:33 -06005149 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005150 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5151 sampler_ci.pNext = NULL;
5152 sampler_ci.magFilter = VK_FILTER_NEAREST;
5153 sampler_ci.minFilter = VK_FILTER_NEAREST;
5154 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5155 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5156 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5157 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5158 sampler_ci.mipLodBias = 1.0;
5159 sampler_ci.anisotropyEnable = VK_FALSE;
5160 sampler_ci.maxAnisotropy = 1;
5161 sampler_ci.compareEnable = VK_FALSE;
5162 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5163 sampler_ci.minLod = 1.0;
5164 sampler_ci.maxLod = 1.0;
5165 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5166 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005167
Tobin Ehlis3b780662015-05-28 12:11:26 -06005168 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005169 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005170 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005171
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005172 VkDescriptorImageInfo info = {};
5173 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005174
5175 VkWriteDescriptorSet descriptor_write;
5176 memset(&descriptor_write, 0, sizeof(descriptor_write));
5177 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005178 descriptor_write.dstSet = descriptorSet;
5179 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005180 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005181 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005182 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005183 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005184
5185 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5186
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005187 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005188
Chia-I Wuf7458c52015-10-26 21:10:41 +08005189 vkDestroySampler(m_device->device(), sampler, NULL);
5190 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5191 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005192}
5193
Karl Schultz6addd812016-02-02 17:17:23 -07005194TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
5195 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
5196 // types
5197 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005198
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005200 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005201
Tobin Ehlis3b780662015-05-28 12:11:26 -06005202 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005203
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005204 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005205 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5206 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005207
5208 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005209 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5210 ds_pool_ci.pNext = NULL;
5211 ds_pool_ci.maxSets = 1;
5212 ds_pool_ci.poolSizeCount = 1;
5213 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005214
Tobin Ehlis3b780662015-05-28 12:11:26 -06005215 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005216 err =
5217 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005218 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005219 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005220 dsl_binding.binding = 0;
5221 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5222 dsl_binding.descriptorCount = 1;
5223 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5224 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005225
Tony Barboureb254902015-07-15 12:50:33 -06005226 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005227 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5228 ds_layout_ci.pNext = NULL;
5229 ds_layout_ci.bindingCount = 1;
5230 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005231
Tobin Ehlis3b780662015-05-28 12:11:26 -06005232 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005233 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5234 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005235 ASSERT_VK_SUCCESS(err);
5236
5237 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005238 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005239 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005240 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005241 alloc_info.descriptorPool = ds_pool;
5242 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005243 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5244 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005245 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005246
Tony Barboureb254902015-07-15 12:50:33 -06005247 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005248 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5249 sampler_ci.pNext = NULL;
5250 sampler_ci.magFilter = VK_FILTER_NEAREST;
5251 sampler_ci.minFilter = VK_FILTER_NEAREST;
5252 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5253 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5254 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5255 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5256 sampler_ci.mipLodBias = 1.0;
5257 sampler_ci.anisotropyEnable = VK_FALSE;
5258 sampler_ci.maxAnisotropy = 1;
5259 sampler_ci.compareEnable = VK_FALSE;
5260 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5261 sampler_ci.minLod = 1.0;
5262 sampler_ci.maxLod = 1.0;
5263 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5264 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005265 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005266 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005267 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005268
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005269 VkDescriptorImageInfo info = {};
5270 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005271
5272 VkWriteDescriptorSet descriptor_write;
5273 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07005274 descriptor_write.sType =
5275 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005276 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005277 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005278 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005279 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005280 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005281
5282 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5283
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005284 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005285
Chia-I Wuf7458c52015-10-26 21:10:41 +08005286 vkDestroySampler(m_device->device(), sampler, NULL);
5287 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5288 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005289}
5290
Karl Schultz6addd812016-02-02 17:17:23 -07005291TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005292 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07005293 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005294
Karl Schultz6addd812016-02-02 17:17:23 -07005295 m_errorMonitor->SetDesiredFailureMsg(
5296 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005297 "Attempt to update descriptor with invalid sampler 0xbaadbeef");
5298
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005299 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005300 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
5301 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005302 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005303 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
5304 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005305
5306 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005307 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5308 ds_pool_ci.pNext = NULL;
5309 ds_pool_ci.maxSets = 1;
5310 ds_pool_ci.poolSizeCount = 1;
5311 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005312
5313 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005314 err =
5315 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005316 ASSERT_VK_SUCCESS(err);
5317
5318 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005319 dsl_binding.binding = 0;
5320 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5321 dsl_binding.descriptorCount = 1;
5322 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5323 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005324
5325 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005326 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5327 ds_layout_ci.pNext = NULL;
5328 ds_layout_ci.bindingCount = 1;
5329 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005330 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005331 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5332 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005333 ASSERT_VK_SUCCESS(err);
5334
5335 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005336 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005337 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005338 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005339 alloc_info.descriptorPool = ds_pool;
5340 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005341 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5342 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005343 ASSERT_VK_SUCCESS(err);
5344
Karl Schultz6addd812016-02-02 17:17:23 -07005345 VkSampler sampler =
5346 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005347
5348 VkDescriptorImageInfo descriptor_info;
5349 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5350 descriptor_info.sampler = sampler;
5351
5352 VkWriteDescriptorSet descriptor_write;
5353 memset(&descriptor_write, 0, sizeof(descriptor_write));
5354 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005355 descriptor_write.dstSet = descriptorSet;
5356 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005357 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005358 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5359 descriptor_write.pImageInfo = &descriptor_info;
5360
5361 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5362
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005363 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005364
Chia-I Wuf7458c52015-10-26 21:10:41 +08005365 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5366 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005367}
5368
Karl Schultz6addd812016-02-02 17:17:23 -07005369TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
5370 // Create a single combined Image/Sampler descriptor and send it an invalid
5371 // imageView
5372 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005373
Karl Schultz6addd812016-02-02 17:17:23 -07005374 m_errorMonitor->SetDesiredFailureMsg(
5375 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005376 "Attempt to update descriptor with invalid imageView 0xbaadbeef");
5377
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005378 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005379 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005380 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5381 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005382
5383 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005384 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5385 ds_pool_ci.pNext = NULL;
5386 ds_pool_ci.maxSets = 1;
5387 ds_pool_ci.poolSizeCount = 1;
5388 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005389
5390 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005391 err =
5392 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005393 ASSERT_VK_SUCCESS(err);
5394
5395 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005396 dsl_binding.binding = 0;
5397 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5398 dsl_binding.descriptorCount = 1;
5399 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5400 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005401
5402 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005403 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5404 ds_layout_ci.pNext = NULL;
5405 ds_layout_ci.bindingCount = 1;
5406 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005407 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005408 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5409 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005410 ASSERT_VK_SUCCESS(err);
5411
5412 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005413 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005414 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005415 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005416 alloc_info.descriptorPool = ds_pool;
5417 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005418 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5419 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005420 ASSERT_VK_SUCCESS(err);
5421
5422 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005423 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5424 sampler_ci.pNext = NULL;
5425 sampler_ci.magFilter = VK_FILTER_NEAREST;
5426 sampler_ci.minFilter = VK_FILTER_NEAREST;
5427 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5428 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5429 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5430 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5431 sampler_ci.mipLodBias = 1.0;
5432 sampler_ci.anisotropyEnable = VK_FALSE;
5433 sampler_ci.maxAnisotropy = 1;
5434 sampler_ci.compareEnable = VK_FALSE;
5435 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5436 sampler_ci.minLod = 1.0;
5437 sampler_ci.maxLod = 1.0;
5438 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5439 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005440
5441 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005442 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005443 ASSERT_VK_SUCCESS(err);
5444
Karl Schultz6addd812016-02-02 17:17:23 -07005445 VkImageView view =
5446 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005447
5448 VkDescriptorImageInfo descriptor_info;
5449 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5450 descriptor_info.sampler = sampler;
5451 descriptor_info.imageView = view;
5452
5453 VkWriteDescriptorSet descriptor_write;
5454 memset(&descriptor_write, 0, sizeof(descriptor_write));
5455 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005456 descriptor_write.dstSet = descriptorSet;
5457 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005458 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005459 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5460 descriptor_write.pImageInfo = &descriptor_info;
5461
5462 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5463
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005464 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005465
Chia-I Wuf7458c52015-10-26 21:10:41 +08005466 vkDestroySampler(m_device->device(), sampler, NULL);
5467 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5468 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005469}
5470
Karl Schultz6addd812016-02-02 17:17:23 -07005471TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
5472 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
5473 // into the other
5474 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005475
Karl Schultz6addd812016-02-02 17:17:23 -07005476 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06005477 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5478 "Copy descriptor update index 0, has src update descriptor "
5479 "type VK_DESCRIPTOR_TYPE_SAMPLER that does not match overlapping "
5480 "dest ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005481
Tobin Ehlis04356f92015-10-27 16:35:27 -06005482 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005483 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005484 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005485 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5486 ds_type_count[0].descriptorCount = 1;
5487 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
5488 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005489
5490 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005491 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5492 ds_pool_ci.pNext = NULL;
5493 ds_pool_ci.maxSets = 1;
5494 ds_pool_ci.poolSizeCount = 2;
5495 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005496
5497 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005498 err =
5499 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005500 ASSERT_VK_SUCCESS(err);
5501 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005502 dsl_binding[0].binding = 0;
5503 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5504 dsl_binding[0].descriptorCount = 1;
5505 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
5506 dsl_binding[0].pImmutableSamplers = NULL;
5507 dsl_binding[1].binding = 1;
5508 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5509 dsl_binding[1].descriptorCount = 1;
5510 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
5511 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005512
5513 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005514 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5515 ds_layout_ci.pNext = NULL;
5516 ds_layout_ci.bindingCount = 2;
5517 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005518
5519 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005520 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5521 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005522 ASSERT_VK_SUCCESS(err);
5523
5524 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005525 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005526 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005527 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005528 alloc_info.descriptorPool = ds_pool;
5529 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005530 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5531 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005532 ASSERT_VK_SUCCESS(err);
5533
5534 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005535 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5536 sampler_ci.pNext = NULL;
5537 sampler_ci.magFilter = VK_FILTER_NEAREST;
5538 sampler_ci.minFilter = VK_FILTER_NEAREST;
5539 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5540 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5541 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5542 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5543 sampler_ci.mipLodBias = 1.0;
5544 sampler_ci.anisotropyEnable = VK_FALSE;
5545 sampler_ci.maxAnisotropy = 1;
5546 sampler_ci.compareEnable = VK_FALSE;
5547 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5548 sampler_ci.minLod = 1.0;
5549 sampler_ci.maxLod = 1.0;
5550 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5551 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005552
5553 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005554 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005555 ASSERT_VK_SUCCESS(err);
5556
5557 VkDescriptorImageInfo info = {};
5558 info.sampler = sampler;
5559
5560 VkWriteDescriptorSet descriptor_write;
5561 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
5562 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005563 descriptor_write.dstSet = descriptorSet;
5564 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08005565 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005566 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5567 descriptor_write.pImageInfo = &info;
5568 // This write update should succeed
5569 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5570 // Now perform a copy update that fails due to type mismatch
5571 VkCopyDescriptorSet copy_ds_update;
5572 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5573 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5574 copy_ds_update.srcSet = descriptorSet;
5575 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005576 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005577 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08005578 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005579 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5580
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005581 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005582 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005583 m_errorMonitor->SetDesiredFailureMsg(
5584 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005585 "Copy descriptor update 0 has srcBinding 3 which is out of bounds ");
Tobin Ehlis04356f92015-10-27 16:35:27 -06005586 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5587 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5588 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005589 copy_ds_update.srcBinding =
5590 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005591 copy_ds_update.dstSet = descriptorSet;
5592 copy_ds_update.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005593 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005594 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5595
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005596 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005597
Tobin Ehlis04356f92015-10-27 16:35:27 -06005598 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005599 m_errorMonitor->SetDesiredFailureMsg(
5600 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005601 "Copy descriptor src update is out of bounds for matching binding 1 ");
5602
Tobin Ehlis04356f92015-10-27 16:35:27 -06005603 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5604 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5605 copy_ds_update.srcSet = descriptorSet;
5606 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005607 copy_ds_update.dstSet = descriptorSet;
5608 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005609 copy_ds_update.descriptorCount =
5610 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06005611 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5612
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005613 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005614
Chia-I Wuf7458c52015-10-26 21:10:41 +08005615 vkDestroySampler(m_device->device(), sampler, NULL);
5616 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5617 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005618}
5619
Karl Schultz6addd812016-02-02 17:17:23 -07005620TEST_F(VkLayerTest, NumSamplesMismatch) {
5621 // Create CommandBuffer where MSAA samples doesn't match RenderPass
5622 // sampleCount
5623 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005624
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005625 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005626 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005627
Tobin Ehlis3b780662015-05-28 12:11:26 -06005628 ASSERT_NO_FATAL_FAILURE(InitState());
5629 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005630 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06005631 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005632 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005633
5634 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005635 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5636 ds_pool_ci.pNext = NULL;
5637 ds_pool_ci.maxSets = 1;
5638 ds_pool_ci.poolSizeCount = 1;
5639 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005640
Tobin Ehlis3b780662015-05-28 12:11:26 -06005641 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005642 err =
5643 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005644 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005645
Tony Barboureb254902015-07-15 12:50:33 -06005646 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08005647 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06005648 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08005649 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005650 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5651 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005652
Tony Barboureb254902015-07-15 12:50:33 -06005653 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5654 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5655 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005656 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07005657 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005658
Tobin Ehlis3b780662015-05-28 12:11:26 -06005659 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005660 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5661 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005662 ASSERT_VK_SUCCESS(err);
5663
5664 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005665 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005666 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005667 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005668 alloc_info.descriptorPool = ds_pool;
5669 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005670 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5671 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005672 ASSERT_VK_SUCCESS(err);
5673
Tony Barboureb254902015-07-15 12:50:33 -06005674 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005675 pipe_ms_state_ci.sType =
5676 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5677 pipe_ms_state_ci.pNext = NULL;
5678 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5679 pipe_ms_state_ci.sampleShadingEnable = 0;
5680 pipe_ms_state_ci.minSampleShading = 1.0;
5681 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005682
Tony Barboureb254902015-07-15 12:50:33 -06005683 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005684 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5685 pipeline_layout_ci.pNext = NULL;
5686 pipeline_layout_ci.setLayoutCount = 1;
5687 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005688
5689 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005690 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5691 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005692 ASSERT_VK_SUCCESS(err);
5693
Karl Schultz6addd812016-02-02 17:17:23 -07005694 VkShaderObj vs(m_device, bindStateVertShaderText,
5695 VK_SHADER_STAGE_VERTEX_BIT, this);
5696 VkShaderObj fs(m_device, bindStateFragShaderText,
5697 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005698 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005699 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005700 VkPipelineObj pipe(m_device);
5701 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005702 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005703 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005704 pipe.SetMSAA(&pipe_ms_state_ci);
5705 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005706
Tony Barbourfe3351b2015-07-28 10:17:20 -06005707 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005708 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5709 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005710
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005711 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005712
Chia-I Wuf7458c52015-10-26 21:10:41 +08005713 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5714 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5715 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005716}
Tobin Ehlis0f10db52016-04-04 10:00:21 -06005717#ifdef ADD_BACK_IN_WHEN_CHECK_IS_BACK // TODO : Re-enable when GH256 fixed
Mark Youngc89c6312016-03-31 16:03:20 -06005718TEST_F(VkLayerTest, NumBlendAttachMismatch) {
5719 // Create Pipeline where the number of blend attachments doesn't match the
5720 // number of color attachments. In this case, we don't add any color
5721 // blend attachments even though we have a color attachment.
5722 VkResult err;
5723
5724 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5725 "Mismatch between blend state attachment");
5726
5727 ASSERT_NO_FATAL_FAILURE(InitState());
5728 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5729 VkDescriptorPoolSize ds_type_count = {};
5730 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5731 ds_type_count.descriptorCount = 1;
5732
5733 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5734 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5735 ds_pool_ci.pNext = NULL;
5736 ds_pool_ci.maxSets = 1;
5737 ds_pool_ci.poolSizeCount = 1;
5738 ds_pool_ci.pPoolSizes = &ds_type_count;
5739
5740 VkDescriptorPool ds_pool;
5741 err =
5742 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5743 ASSERT_VK_SUCCESS(err);
5744
5745 VkDescriptorSetLayoutBinding dsl_binding = {};
5746 dsl_binding.binding = 0;
5747 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5748 dsl_binding.descriptorCount = 1;
5749 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5750 dsl_binding.pImmutableSamplers = NULL;
5751
5752 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5753 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5754 ds_layout_ci.pNext = NULL;
5755 ds_layout_ci.bindingCount = 1;
5756 ds_layout_ci.pBindings = &dsl_binding;
5757
5758 VkDescriptorSetLayout ds_layout;
5759 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5760 &ds_layout);
5761 ASSERT_VK_SUCCESS(err);
5762
5763 VkDescriptorSet descriptorSet;
5764 VkDescriptorSetAllocateInfo alloc_info = {};
5765 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5766 alloc_info.descriptorSetCount = 1;
5767 alloc_info.descriptorPool = ds_pool;
5768 alloc_info.pSetLayouts = &ds_layout;
5769 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5770 &descriptorSet);
5771 ASSERT_VK_SUCCESS(err);
5772
5773 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
5774 pipe_ms_state_ci.sType =
5775 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5776 pipe_ms_state_ci.pNext = NULL;
5777 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
5778 pipe_ms_state_ci.sampleShadingEnable = 0;
5779 pipe_ms_state_ci.minSampleShading = 1.0;
5780 pipe_ms_state_ci.pSampleMask = NULL;
5781
5782 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5783 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5784 pipeline_layout_ci.pNext = NULL;
5785 pipeline_layout_ci.setLayoutCount = 1;
5786 pipeline_layout_ci.pSetLayouts = &ds_layout;
5787
5788 VkPipelineLayout pipeline_layout;
5789 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5790 &pipeline_layout);
5791 ASSERT_VK_SUCCESS(err);
5792
5793 VkShaderObj vs(m_device, bindStateVertShaderText,
5794 VK_SHADER_STAGE_VERTEX_BIT, this);
5795 VkShaderObj fs(m_device, bindStateFragShaderText,
5796 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005797 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06005798 // but add it to be able to run on more devices
5799 VkPipelineObj pipe(m_device);
5800 pipe.AddShader(&vs);
5801 pipe.AddShader(&fs);
5802 pipe.SetMSAA(&pipe_ms_state_ci);
5803 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5804
5805 BeginCommandBuffer();
5806 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5807 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5808
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005809 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06005810
5811 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5812 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5813 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5814}
Tony Barbour4e81a202016-04-04 11:09:40 -06005815#endif //ADD_BACK_IN_WHEN_CHECK_IS_BACK
Karl Schultz6addd812016-02-02 17:17:23 -07005816TEST_F(VkLayerTest, ClearCmdNoDraw) {
5817 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
5818 // to issuing a Draw
5819 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005820
Karl Schultz6addd812016-02-02 17:17:23 -07005821 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07005822 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005823 "vkCmdClearAttachments() issued on CB object ");
5824
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005825 ASSERT_NO_FATAL_FAILURE(InitState());
5826 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06005827
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005828 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005829 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5830 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005831
5832 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005833 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5834 ds_pool_ci.pNext = NULL;
5835 ds_pool_ci.maxSets = 1;
5836 ds_pool_ci.poolSizeCount = 1;
5837 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005838
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005839 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005840 err =
5841 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005842 ASSERT_VK_SUCCESS(err);
5843
Tony Barboureb254902015-07-15 12:50:33 -06005844 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005845 dsl_binding.binding = 0;
5846 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5847 dsl_binding.descriptorCount = 1;
5848 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5849 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005850
Tony Barboureb254902015-07-15 12:50:33 -06005851 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005852 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5853 ds_layout_ci.pNext = NULL;
5854 ds_layout_ci.bindingCount = 1;
5855 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005856
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005857 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005858 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5859 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005860 ASSERT_VK_SUCCESS(err);
5861
5862 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005863 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005864 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005865 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005866 alloc_info.descriptorPool = ds_pool;
5867 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005868 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5869 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005870 ASSERT_VK_SUCCESS(err);
5871
Tony Barboureb254902015-07-15 12:50:33 -06005872 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005873 pipe_ms_state_ci.sType =
5874 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5875 pipe_ms_state_ci.pNext = NULL;
5876 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5877 pipe_ms_state_ci.sampleShadingEnable = 0;
5878 pipe_ms_state_ci.minSampleShading = 1.0;
5879 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005880
Tony Barboureb254902015-07-15 12:50:33 -06005881 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005882 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5883 pipeline_layout_ci.pNext = NULL;
5884 pipeline_layout_ci.setLayoutCount = 1;
5885 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005886
5887 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005888 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5889 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005890 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005891
Karl Schultz6addd812016-02-02 17:17:23 -07005892 VkShaderObj vs(m_device, bindStateVertShaderText,
5893 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06005894 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07005895 // on more devices
5896 VkShaderObj fs(m_device, bindStateFragShaderText,
5897 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005898
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005899 VkPipelineObj pipe(m_device);
5900 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005901 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005902 pipe.SetMSAA(&pipe_ms_state_ci);
5903 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06005904
5905 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005906
Karl Schultz6addd812016-02-02 17:17:23 -07005907 // Main thing we care about for this test is that the VkImage obj we're
5908 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005909 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005910 VkClearAttachment color_attachment;
5911 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5912 color_attachment.clearValue.color.float32[0] = 1.0;
5913 color_attachment.clearValue.color.float32[1] = 1.0;
5914 color_attachment.clearValue.color.float32[2] = 1.0;
5915 color_attachment.clearValue.color.float32[3] = 1.0;
5916 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005917 VkClearRect clear_rect = {
5918 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005919
Karl Schultz6addd812016-02-02 17:17:23 -07005920 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
5921 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005922
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005923 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005924
Chia-I Wuf7458c52015-10-26 21:10:41 +08005925 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5926 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5927 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005928}
5929
Karl Schultz6addd812016-02-02 17:17:23 -07005930TEST_F(VkLayerTest, VtxBufferBadIndex) {
5931 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005932
Karl Schultz6addd812016-02-02 17:17:23 -07005933 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005934 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07005935 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005936
Tobin Ehlis502480b2015-06-24 15:53:07 -06005937 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06005938 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06005939 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06005940
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005941 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005942 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5943 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005944
5945 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005946 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5947 ds_pool_ci.pNext = NULL;
5948 ds_pool_ci.maxSets = 1;
5949 ds_pool_ci.poolSizeCount = 1;
5950 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005951
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005952 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005953 err =
5954 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005955 ASSERT_VK_SUCCESS(err);
5956
Tony Barboureb254902015-07-15 12:50:33 -06005957 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005958 dsl_binding.binding = 0;
5959 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5960 dsl_binding.descriptorCount = 1;
5961 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5962 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005963
Tony Barboureb254902015-07-15 12:50:33 -06005964 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005965 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5966 ds_layout_ci.pNext = NULL;
5967 ds_layout_ci.bindingCount = 1;
5968 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005969
Tobin Ehlis502480b2015-06-24 15:53:07 -06005970 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005971 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5972 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005973 ASSERT_VK_SUCCESS(err);
5974
5975 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005976 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005977 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005978 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005979 alloc_info.descriptorPool = ds_pool;
5980 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005981 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5982 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005983 ASSERT_VK_SUCCESS(err);
5984
Tony Barboureb254902015-07-15 12:50:33 -06005985 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005986 pipe_ms_state_ci.sType =
5987 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5988 pipe_ms_state_ci.pNext = NULL;
5989 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
5990 pipe_ms_state_ci.sampleShadingEnable = 0;
5991 pipe_ms_state_ci.minSampleShading = 1.0;
5992 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005993
Tony Barboureb254902015-07-15 12:50:33 -06005994 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005995 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5996 pipeline_layout_ci.pNext = NULL;
5997 pipeline_layout_ci.setLayoutCount = 1;
5998 pipeline_layout_ci.pSetLayouts = &ds_layout;
5999 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006000
Karl Schultz6addd812016-02-02 17:17:23 -07006001 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6002 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006003 ASSERT_VK_SUCCESS(err);
6004
Karl Schultz6addd812016-02-02 17:17:23 -07006005 VkShaderObj vs(m_device, bindStateVertShaderText,
6006 VK_SHADER_STAGE_VERTEX_BIT, this);
6007 VkShaderObj fs(m_device, bindStateFragShaderText,
6008 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006009 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006010 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006011 VkPipelineObj pipe(m_device);
6012 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006013 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006014 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006015 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006016 pipe.SetViewport(m_viewports);
6017 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006018 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006019
6020 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006021 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6022 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006023 // Don't care about actual data, just need to get to draw to flag error
6024 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07006025 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
6026 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006027 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06006028 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006029
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006030 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006031
Chia-I Wuf7458c52015-10-26 21:10:41 +08006032 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6033 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6034 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006035}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006036#endif // DRAW_STATE_TESTS
6037
Tobin Ehlis0788f522015-05-26 16:11:58 -06006038#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06006039#if GTEST_IS_THREADSAFE
6040struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006041 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006042 VkEvent event;
6043 bool bailout;
6044};
6045
Karl Schultz6addd812016-02-02 17:17:23 -07006046extern "C" void *AddToCommandBuffer(void *arg) {
6047 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006048
Karl Schultz6addd812016-02-02 17:17:23 -07006049 for (int i = 0; i < 10000; i++) {
6050 vkCmdSetEvent(data->commandBuffer, data->event,
6051 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006052 if (data->bailout) {
6053 break;
6054 }
6055 }
6056 return NULL;
6057}
6058
Karl Schultz6addd812016-02-02 17:17:23 -07006059TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006060 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006061
Karl Schultz6addd812016-02-02 17:17:23 -07006062 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6063 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006064
Mike Stroyanaccf7692015-05-12 16:00:45 -06006065 ASSERT_NO_FATAL_FAILURE(InitState());
6066 ASSERT_NO_FATAL_FAILURE(InitViewport());
6067 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6068
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006069 // Calls AllocateCommandBuffers
6070 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006071
6072 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006073 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006074
6075 VkEventCreateInfo event_info;
6076 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006077 VkResult err;
6078
6079 memset(&event_info, 0, sizeof(event_info));
6080 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
6081
Chia-I Wuf7458c52015-10-26 21:10:41 +08006082 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006083 ASSERT_VK_SUCCESS(err);
6084
Mike Stroyanaccf7692015-05-12 16:00:45 -06006085 err = vkResetEvent(device(), event);
6086 ASSERT_VK_SUCCESS(err);
6087
6088 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006089 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006090 data.event = event;
6091 data.bailout = false;
6092 m_errorMonitor->SetBailout(&data.bailout);
6093 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006094 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006095 // Add many entries to command buffer from this thread at the same time.
6096 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006097
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006098 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006099 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006100
Mike Stroyan10b8cb72016-01-22 15:22:03 -07006101 m_errorMonitor->SetBailout(NULL);
6102
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006103 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006104
Chia-I Wuf7458c52015-10-26 21:10:41 +08006105 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006106}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006107#endif // GTEST_IS_THREADSAFE
6108#endif // THREADING_TESTS
6109
Chris Forbes9f7ff632015-05-25 11:13:08 +12006110#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006111TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006113 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006114
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006115 ASSERT_NO_FATAL_FAILURE(InitState());
6116 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6117
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006118 VkShaderModule module;
6119 VkShaderModuleCreateInfo moduleCreateInfo;
6120 struct icd_spv_header spv;
6121
6122 spv.magic = ICD_SPV_MAGIC;
6123 spv.version = ICD_SPV_VERSION;
6124 spv.gen_magic = 0;
6125
6126 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6127 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006128 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006129 moduleCreateInfo.codeSize = 4;
6130 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006131 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006132
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006133 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006134}
6135
Karl Schultz6addd812016-02-02 17:17:23 -07006136TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006137 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006138 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006139
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006140 ASSERT_NO_FATAL_FAILURE(InitState());
6141 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6142
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006143 VkShaderModule module;
6144 VkShaderModuleCreateInfo moduleCreateInfo;
6145 struct icd_spv_header spv;
6146
6147 spv.magic = ~ICD_SPV_MAGIC;
6148 spv.version = ICD_SPV_VERSION;
6149 spv.gen_magic = 0;
6150
6151 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6152 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006153 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006154 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6155 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006156 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006157
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006158 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006159}
6160
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006161#if 0
6162// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07006163TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006164 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006165 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006166
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006167 ASSERT_NO_FATAL_FAILURE(InitState());
6168 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6169
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006170 VkShaderModule module;
6171 VkShaderModuleCreateInfo moduleCreateInfo;
6172 struct icd_spv_header spv;
6173
6174 spv.magic = ICD_SPV_MAGIC;
6175 spv.version = ~ICD_SPV_VERSION;
6176 spv.gen_magic = 0;
6177
6178 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6179 moduleCreateInfo.pNext = NULL;
6180
Karl Schultz6addd812016-02-02 17:17:23 -07006181 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006182 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6183 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006184 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006185
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006186 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006187}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006188#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006189
Karl Schultz6addd812016-02-02 17:17:23 -07006190TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006191 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006192 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006193
Chris Forbes9f7ff632015-05-25 11:13:08 +12006194 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006195 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006196
6197 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006198 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006199 "\n"
6200 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006201 "out gl_PerVertex {\n"
6202 " vec4 gl_Position;\n"
6203 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006204 "void main(){\n"
6205 " gl_Position = vec4(1);\n"
6206 " x = 0;\n"
6207 "}\n";
6208 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006209 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006210 "\n"
6211 "layout(location=0) out vec4 color;\n"
6212 "void main(){\n"
6213 " color = vec4(1);\n"
6214 "}\n";
6215
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006216 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6217 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006218
6219 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006220 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006221 pipe.AddShader(&vs);
6222 pipe.AddShader(&fs);
6223
Chris Forbes9f7ff632015-05-25 11:13:08 +12006224 VkDescriptorSetObj descriptorSet(m_device);
6225 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006226 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006227
Tony Barbour5781e8f2015-08-04 16:23:11 -06006228 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006229
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006230 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006231}
Chris Forbes9f7ff632015-05-25 11:13:08 +12006232
Karl Schultz6addd812016-02-02 17:17:23 -07006233TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006235 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006236
Chris Forbes59cb88d2015-05-25 11:13:13 +12006237 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006238 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006239
6240 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006241 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006242 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006243 "out gl_PerVertex {\n"
6244 " vec4 gl_Position;\n"
6245 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006246 "void main(){\n"
6247 " gl_Position = vec4(1);\n"
6248 "}\n";
6249 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006250 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006251 "\n"
6252 "layout(location=0) in float x;\n"
6253 "layout(location=0) out vec4 color;\n"
6254 "void main(){\n"
6255 " color = vec4(x);\n"
6256 "}\n";
6257
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006258 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6259 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006260
6261 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006262 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006263 pipe.AddShader(&vs);
6264 pipe.AddShader(&fs);
6265
Chris Forbes59cb88d2015-05-25 11:13:13 +12006266 VkDescriptorSetObj descriptorSet(m_device);
6267 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006268 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006269
Tony Barbour5781e8f2015-08-04 16:23:11 -06006270 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006271
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006272 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006273}
6274
Karl Schultz6addd812016-02-02 17:17:23 -07006275TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006276 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006277 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006278
6279 ASSERT_NO_FATAL_FAILURE(InitState());
6280 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6281
6282 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006283 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006284 "\n"
6285 "out gl_PerVertex {\n"
6286 " vec4 gl_Position;\n"
6287 "};\n"
6288 "void main(){\n"
6289 " gl_Position = vec4(1);\n"
6290 "}\n";
6291 char const *fsSource =
6292 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006293 "\n"
6294 "in block { layout(location=0) float x; } ins;\n"
6295 "layout(location=0) out vec4 color;\n"
6296 "void main(){\n"
6297 " color = vec4(ins.x);\n"
6298 "}\n";
6299
6300 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6301 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6302
6303 VkPipelineObj pipe(m_device);
6304 pipe.AddColorAttachment();
6305 pipe.AddShader(&vs);
6306 pipe.AddShader(&fs);
6307
6308 VkDescriptorSetObj descriptorSet(m_device);
6309 descriptorSet.AppendDummy();
6310 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6311
6312 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6313
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006314 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006315}
6316
Karl Schultz6addd812016-02-02 17:17:23 -07006317TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13006318 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13006319 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07006320 "output arr[2] of float32' vs 'ptr to "
6321 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13006322
6323 ASSERT_NO_FATAL_FAILURE(InitState());
6324 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6325
6326 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006327 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006328 "\n"
6329 "layout(location=0) out float x[2];\n"
6330 "out gl_PerVertex {\n"
6331 " vec4 gl_Position;\n"
6332 "};\n"
6333 "void main(){\n"
6334 " x[0] = 0; x[1] = 0;\n"
6335 " gl_Position = vec4(1);\n"
6336 "}\n";
6337 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006338 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006339 "\n"
6340 "layout(location=0) in float x[3];\n"
6341 "layout(location=0) out vec4 color;\n"
6342 "void main(){\n"
6343 " color = vec4(x[0] + x[1] + x[2]);\n"
6344 "}\n";
6345
6346 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6347 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6348
6349 VkPipelineObj pipe(m_device);
6350 pipe.AddColorAttachment();
6351 pipe.AddShader(&vs);
6352 pipe.AddShader(&fs);
6353
6354 VkDescriptorSetObj descriptorSet(m_device);
6355 descriptorSet.AppendDummy();
6356 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6357
6358 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6359
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006360 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13006361}
6362
Karl Schultz6addd812016-02-02 17:17:23 -07006363TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006364 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006365 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006366
Chris Forbesb56af562015-05-25 11:13:17 +12006367 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006368 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12006369
6370 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006371 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006372 "\n"
6373 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006374 "out gl_PerVertex {\n"
6375 " vec4 gl_Position;\n"
6376 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006377 "void main(){\n"
6378 " x = 0;\n"
6379 " gl_Position = vec4(1);\n"
6380 "}\n";
6381 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006382 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006383 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006384 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12006385 "layout(location=0) out vec4 color;\n"
6386 "void main(){\n"
6387 " color = vec4(x);\n"
6388 "}\n";
6389
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006390 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6391 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12006392
6393 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006394 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12006395 pipe.AddShader(&vs);
6396 pipe.AddShader(&fs);
6397
Chris Forbesb56af562015-05-25 11:13:17 +12006398 VkDescriptorSetObj descriptorSet(m_device);
6399 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006400 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12006401
Tony Barbour5781e8f2015-08-04 16:23:11 -06006402 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12006403
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006404 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12006405}
6406
Karl Schultz6addd812016-02-02 17:17:23 -07006407TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006409 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006410
6411 ASSERT_NO_FATAL_FAILURE(InitState());
6412 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6413
6414 char const *vsSource =
6415 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006416 "\n"
6417 "out block { layout(location=0) int x; } outs;\n"
6418 "out gl_PerVertex {\n"
6419 " vec4 gl_Position;\n"
6420 "};\n"
6421 "void main(){\n"
6422 " outs.x = 0;\n"
6423 " gl_Position = vec4(1);\n"
6424 "}\n";
6425 char const *fsSource =
6426 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006427 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006428 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13006429 "layout(location=0) out vec4 color;\n"
6430 "void main(){\n"
6431 " color = vec4(ins.x);\n"
6432 "}\n";
6433
6434 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6435 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6436
6437 VkPipelineObj pipe(m_device);
6438 pipe.AddColorAttachment();
6439 pipe.AddShader(&vs);
6440 pipe.AddShader(&fs);
6441
6442 VkDescriptorSetObj descriptorSet(m_device);
6443 descriptorSet.AppendDummy();
6444 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6445
6446 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6447
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006448 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006449}
6450
6451TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
6452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6453 "location 0.0 which is not written by vertex shader");
6454
6455 ASSERT_NO_FATAL_FAILURE(InitState());
6456 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6457
6458 char const *vsSource =
6459 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006460 "\n"
6461 "out block { layout(location=1) float x; } outs;\n"
6462 "out gl_PerVertex {\n"
6463 " vec4 gl_Position;\n"
6464 "};\n"
6465 "void main(){\n"
6466 " outs.x = 0;\n"
6467 " gl_Position = vec4(1);\n"
6468 "}\n";
6469 char const *fsSource =
6470 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006471 "\n"
6472 "in block { layout(location=0) float x; } ins;\n"
6473 "layout(location=0) out vec4 color;\n"
6474 "void main(){\n"
6475 " color = vec4(ins.x);\n"
6476 "}\n";
6477
6478 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6479 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6480
6481 VkPipelineObj pipe(m_device);
6482 pipe.AddColorAttachment();
6483 pipe.AddShader(&vs);
6484 pipe.AddShader(&fs);
6485
6486 VkDescriptorSetObj descriptorSet(m_device);
6487 descriptorSet.AppendDummy();
6488 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6489
6490 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6491
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006492 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006493}
6494
6495TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
6496 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6497 "location 0.1 which is not written by vertex shader");
6498
6499 ASSERT_NO_FATAL_FAILURE(InitState());
6500 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6501
6502 char const *vsSource =
6503 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006504 "\n"
6505 "out block { layout(location=0, component=0) float x; } outs;\n"
6506 "out gl_PerVertex {\n"
6507 " vec4 gl_Position;\n"
6508 "};\n"
6509 "void main(){\n"
6510 " outs.x = 0;\n"
6511 " gl_Position = vec4(1);\n"
6512 "}\n";
6513 char const *fsSource =
6514 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006515 "\n"
6516 "in block { layout(location=0, component=1) float x; } ins;\n"
6517 "layout(location=0) out vec4 color;\n"
6518 "void main(){\n"
6519 " color = vec4(ins.x);\n"
6520 "}\n";
6521
6522 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6523 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6524
6525 VkPipelineObj pipe(m_device);
6526 pipe.AddColorAttachment();
6527 pipe.AddShader(&vs);
6528 pipe.AddShader(&fs);
6529
6530 VkDescriptorSetObj descriptorSet(m_device);
6531 descriptorSet.AppendDummy();
6532 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6533
6534 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6535
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006536 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006537}
6538
Karl Schultz6addd812016-02-02 17:17:23 -07006539TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006540 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006541 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006542
Chris Forbesde136e02015-05-25 11:13:28 +12006543 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006544 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12006545
6546 VkVertexInputBindingDescription input_binding;
6547 memset(&input_binding, 0, sizeof(input_binding));
6548
6549 VkVertexInputAttributeDescription input_attrib;
6550 memset(&input_attrib, 0, sizeof(input_attrib));
6551 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6552
6553 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006554 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006555 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006556 "out gl_PerVertex {\n"
6557 " vec4 gl_Position;\n"
6558 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006559 "void main(){\n"
6560 " gl_Position = vec4(1);\n"
6561 "}\n";
6562 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006563 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006564 "\n"
6565 "layout(location=0) out vec4 color;\n"
6566 "void main(){\n"
6567 " color = vec4(1);\n"
6568 "}\n";
6569
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006570 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6571 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12006572
6573 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006574 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12006575 pipe.AddShader(&vs);
6576 pipe.AddShader(&fs);
6577
6578 pipe.AddVertexInputBindings(&input_binding, 1);
6579 pipe.AddVertexInputAttribs(&input_attrib, 1);
6580
Chris Forbesde136e02015-05-25 11:13:28 +12006581 VkDescriptorSetObj descriptorSet(m_device);
6582 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006583 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12006584
Tony Barbour5781e8f2015-08-04 16:23:11 -06006585 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12006586
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006587 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12006588}
6589
Karl Schultz6addd812016-02-02 17:17:23 -07006590TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006591 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006592 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13006593
6594 ASSERT_NO_FATAL_FAILURE(InitState());
6595 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6596
6597 VkVertexInputBindingDescription input_binding;
6598 memset(&input_binding, 0, sizeof(input_binding));
6599
6600 VkVertexInputAttributeDescription input_attrib;
6601 memset(&input_attrib, 0, sizeof(input_attrib));
6602 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6603
6604 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006605 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006606 "\n"
6607 "layout(location=1) in float x;\n"
6608 "out gl_PerVertex {\n"
6609 " vec4 gl_Position;\n"
6610 "};\n"
6611 "void main(){\n"
6612 " gl_Position = vec4(x);\n"
6613 "}\n";
6614 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006615 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006616 "\n"
6617 "layout(location=0) out vec4 color;\n"
6618 "void main(){\n"
6619 " color = vec4(1);\n"
6620 "}\n";
6621
6622 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6623 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6624
6625 VkPipelineObj pipe(m_device);
6626 pipe.AddColorAttachment();
6627 pipe.AddShader(&vs);
6628 pipe.AddShader(&fs);
6629
6630 pipe.AddVertexInputBindings(&input_binding, 1);
6631 pipe.AddVertexInputAttribs(&input_attrib, 1);
6632
6633 VkDescriptorSetObj descriptorSet(m_device);
6634 descriptorSet.AppendDummy();
6635 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6636
6637 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6638
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006639 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13006640}
6641
Karl Schultz6addd812016-02-02 17:17:23 -07006642TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
6643 m_errorMonitor->SetDesiredFailureMsg(
6644 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006645 "VS consumes input at location 0 but not provided");
6646
Chris Forbes62e8e502015-05-25 11:13:29 +12006647 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006648 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12006649
6650 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006651 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006652 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006653 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07006654 "out gl_PerVertex {\n"
6655 " vec4 gl_Position;\n"
6656 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006657 "void main(){\n"
6658 " gl_Position = x;\n"
6659 "}\n";
6660 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006661 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006662 "\n"
6663 "layout(location=0) out vec4 color;\n"
6664 "void main(){\n"
6665 " color = vec4(1);\n"
6666 "}\n";
6667
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006668 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6669 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12006670
6671 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006672 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12006673 pipe.AddShader(&vs);
6674 pipe.AddShader(&fs);
6675
Chris Forbes62e8e502015-05-25 11:13:29 +12006676 VkDescriptorSetObj descriptorSet(m_device);
6677 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006678 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12006679
Tony Barbour5781e8f2015-08-04 16:23:11 -06006680 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12006681
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006682 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12006683}
6684
Karl Schultz6addd812016-02-02 17:17:23 -07006685TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
6686 m_errorMonitor->SetDesiredFailureMsg(
6687 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006688 "location 0 does not match VS input type");
6689
Chris Forbesc97d98e2015-05-25 11:13:31 +12006690 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006691 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006692
6693 VkVertexInputBindingDescription input_binding;
6694 memset(&input_binding, 0, sizeof(input_binding));
6695
6696 VkVertexInputAttributeDescription input_attrib;
6697 memset(&input_attrib, 0, sizeof(input_attrib));
6698 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6699
6700 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006701 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006702 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006703 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07006704 "out gl_PerVertex {\n"
6705 " vec4 gl_Position;\n"
6706 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006707 "void main(){\n"
6708 " gl_Position = vec4(x);\n"
6709 "}\n";
6710 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006711 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006712 "\n"
6713 "layout(location=0) out vec4 color;\n"
6714 "void main(){\n"
6715 " color = vec4(1);\n"
6716 "}\n";
6717
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006718 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6719 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006720
6721 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006722 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006723 pipe.AddShader(&vs);
6724 pipe.AddShader(&fs);
6725
6726 pipe.AddVertexInputBindings(&input_binding, 1);
6727 pipe.AddVertexInputAttribs(&input_attrib, 1);
6728
Chris Forbesc97d98e2015-05-25 11:13:31 +12006729 VkDescriptorSetObj descriptorSet(m_device);
6730 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006731 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006732
Tony Barbour5781e8f2015-08-04 16:23:11 -06006733 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006734
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006735 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006736}
6737
Chris Forbesc68b43c2016-04-06 11:18:47 +12006738TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
6739 m_errorMonitor->SetDesiredFailureMsg(
6740 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6741 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
6742
6743 ASSERT_NO_FATAL_FAILURE(InitState());
6744 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6745
6746 char const *vsSource =
6747 "#version 450\n"
6748 "\n"
6749 "out gl_PerVertex {\n"
6750 " vec4 gl_Position;\n"
6751 "};\n"
6752 "void main(){\n"
6753 " gl_Position = vec4(1);\n"
6754 "}\n";
6755 char const *fsSource =
6756 "#version 450\n"
6757 "\n"
6758 "layout(location=0) out vec4 color;\n"
6759 "void main(){\n"
6760 " color = vec4(1);\n"
6761 "}\n";
6762
6763 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6764 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6765
6766 VkPipelineObj pipe(m_device);
6767 pipe.AddColorAttachment();
6768 pipe.AddShader(&vs);
6769 pipe.AddShader(&vs);
6770 pipe.AddShader(&fs);
6771
6772 VkDescriptorSetObj descriptorSet(m_device);
6773 descriptorSet.AppendDummy();
6774 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6775
6776 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6777
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006778 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12006779}
6780
Karl Schultz6addd812016-02-02 17:17:23 -07006781TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006782 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13006783
6784 ASSERT_NO_FATAL_FAILURE(InitState());
6785 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6786
6787 VkVertexInputBindingDescription input_binding;
6788 memset(&input_binding, 0, sizeof(input_binding));
6789
6790 VkVertexInputAttributeDescription input_attribs[2];
6791 memset(input_attribs, 0, sizeof(input_attribs));
6792
6793 for (int i = 0; i < 2; i++) {
6794 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
6795 input_attribs[i].location = i;
6796 }
6797
6798 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006799 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006800 "\n"
6801 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006802 "out gl_PerVertex {\n"
6803 " vec4 gl_Position;\n"
6804 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006805 "void main(){\n"
6806 " gl_Position = x[0] + x[1];\n"
6807 "}\n";
6808 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006809 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006810 "\n"
6811 "layout(location=0) out vec4 color;\n"
6812 "void main(){\n"
6813 " color = vec4(1);\n"
6814 "}\n";
6815
6816 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6817 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6818
6819 VkPipelineObj pipe(m_device);
6820 pipe.AddColorAttachment();
6821 pipe.AddShader(&vs);
6822 pipe.AddShader(&fs);
6823
6824 pipe.AddVertexInputBindings(&input_binding, 1);
6825 pipe.AddVertexInputAttribs(input_attribs, 2);
6826
6827 VkDescriptorSetObj descriptorSet(m_device);
6828 descriptorSet.AppendDummy();
6829 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6830
6831 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6832
6833 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006834 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13006835}
6836
Chris Forbes2682b242015-11-24 11:13:14 +13006837TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
6838{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006839 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13006840
6841 ASSERT_NO_FATAL_FAILURE(InitState());
6842 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6843
6844 VkVertexInputBindingDescription input_binding;
6845 memset(&input_binding, 0, sizeof(input_binding));
6846
6847 VkVertexInputAttributeDescription input_attribs[2];
6848 memset(input_attribs, 0, sizeof(input_attribs));
6849
6850 for (int i = 0; i < 2; i++) {
6851 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
6852 input_attribs[i].location = i;
6853 }
6854
6855 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006856 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006857 "\n"
6858 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07006859 "out gl_PerVertex {\n"
6860 " vec4 gl_Position;\n"
6861 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006862 "void main(){\n"
6863 " gl_Position = x[0] + x[1];\n"
6864 "}\n";
6865 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006866 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006867 "\n"
6868 "layout(location=0) out vec4 color;\n"
6869 "void main(){\n"
6870 " color = vec4(1);\n"
6871 "}\n";
6872
6873 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6874 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6875
6876 VkPipelineObj pipe(m_device);
6877 pipe.AddColorAttachment();
6878 pipe.AddShader(&vs);
6879 pipe.AddShader(&fs);
6880
6881 pipe.AddVertexInputBindings(&input_binding, 1);
6882 pipe.AddVertexInputAttribs(input_attribs, 2);
6883
6884 VkDescriptorSetObj descriptorSet(m_device);
6885 descriptorSet.AppendDummy();
6886 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6887
6888 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6889
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006890 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13006891}
Chris Forbes2682b242015-11-24 11:13:14 +13006892
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006893TEST_F(VkLayerTest, CreatePipelineSimplePositive)
6894{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006895 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006896
6897 ASSERT_NO_FATAL_FAILURE(InitState());
6898 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6899
6900 char const *vsSource =
6901 "#version 450\n"
6902 "out gl_PerVertex {\n"
6903 " vec4 gl_Position;\n"
6904 "};\n"
6905 "void main(){\n"
6906 " gl_Position = vec4(0);\n"
6907 "}\n";
6908 char const *fsSource =
6909 "#version 450\n"
6910 "\n"
6911 "layout(location=0) out vec4 color;\n"
6912 "void main(){\n"
6913 " color = vec4(1);\n"
6914 "}\n";
6915
6916 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6917 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6918
6919 VkPipelineObj pipe(m_device);
6920 pipe.AddColorAttachment();
6921 pipe.AddShader(&vs);
6922 pipe.AddShader(&fs);
6923
6924 VkDescriptorSetObj descriptorSet(m_device);
6925 descriptorSet.AppendDummy();
6926 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6927
6928 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6929
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006930 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006931}
6932
Chris Forbes912c9192016-04-05 17:50:35 +12006933TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
6934{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006935 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12006936
6937 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
6938
6939 ASSERT_NO_FATAL_FAILURE(InitState());
6940 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6941
6942 char const *vsSource =
6943 "#version 450\n"
6944 "out gl_PerVertex {\n"
6945 " vec4 gl_Position;\n"
6946 "};\n"
6947 "layout(location=0) out vec3 x;\n"
6948 "layout(location=1) out ivec3 y;\n"
6949 "layout(location=2) out vec3 z;\n"
6950 "void main(){\n"
6951 " gl_Position = vec4(0);\n"
6952 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
6953 "}\n";
6954 char const *fsSource =
6955 "#version 450\n"
6956 "\n"
6957 "layout(location=0) out vec4 color;\n"
6958 "layout(location=0) in float x;\n"
6959 "layout(location=1) flat in int y;\n"
6960 "layout(location=2) in vec2 z;\n"
6961 "void main(){\n"
6962 " color = vec4(1 + x + y + z.x);\n"
6963 "}\n";
6964
6965 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6966 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6967
6968 VkPipelineObj pipe(m_device);
6969 pipe.AddColorAttachment();
6970 pipe.AddShader(&vs);
6971 pipe.AddShader(&fs);
6972
6973 VkDescriptorSetObj descriptorSet(m_device);
6974 descriptorSet.AppendDummy();
6975 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6976
6977 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6978
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006979 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12006980}
6981
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006982TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
6983{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006984 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006985
6986 ASSERT_NO_FATAL_FAILURE(InitState());
6987 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6988
Chris Forbesc1e852d2016-04-04 19:26:42 +12006989 if (!m_device->phy().features().tessellationShader) {
6990 printf("Device does not support tessellation shaders; skipped.\n");
6991 return;
6992 }
6993
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006994 char const *vsSource =
6995 "#version 450\n"
6996 "void main(){}\n";
6997 char const *tcsSource =
6998 "#version 450\n"
6999 "layout(location=0) out int x[];\n"
7000 "layout(vertices=3) out;\n"
7001 "void main(){\n"
7002 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7003 " gl_TessLevelInner[0] = 1;\n"
7004 " x[gl_InvocationID] = gl_InvocationID;\n"
7005 "}\n";
7006 char const *tesSource =
7007 "#version 450\n"
7008 "layout(triangles, equal_spacing, cw) in;\n"
7009 "layout(location=0) in int x[];\n"
7010 "out gl_PerVertex { vec4 gl_Position; };\n"
7011 "void main(){\n"
7012 " gl_Position.xyz = gl_TessCoord;\n"
7013 " gl_Position.w = x[0] + x[1] + x[2];\n"
7014 "}\n";
7015 char const *fsSource =
7016 "#version 450\n"
7017 "layout(location=0) out vec4 color;\n"
7018 "void main(){\n"
7019 " color = vec4(1);\n"
7020 "}\n";
7021
7022 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7023 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7024 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7025 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7026
7027 VkPipelineInputAssemblyStateCreateInfo iasci{
7028 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7029 nullptr,
7030 0,
7031 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7032 VK_FALSE};
7033
Chris Forbesb4cacb62016-04-04 19:15:00 +12007034 VkPipelineTessellationStateCreateInfo tsci{
7035 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7036 nullptr,
7037 0,
7038 3};
7039
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007040 VkPipelineObj pipe(m_device);
7041 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12007042 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007043 pipe.AddColorAttachment();
7044 pipe.AddShader(&vs);
7045 pipe.AddShader(&tcs);
7046 pipe.AddShader(&tes);
7047 pipe.AddShader(&fs);
7048
7049 VkDescriptorSetObj descriptorSet(m_device);
7050 descriptorSet.AppendDummy();
7051 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7052
7053 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7054
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007055 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007056}
7057
Chris Forbesa0ab8152016-04-20 13:34:27 +12007058TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
7059{
7060 m_errorMonitor->ExpectSuccess();
7061
7062 ASSERT_NO_FATAL_FAILURE(InitState());
7063 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7064
7065 if (!m_device->phy().features().geometryShader) {
7066 printf("Device does not support geometry shaders; skipped.\n");
7067 return;
7068 }
7069
7070 char const *vsSource =
7071 "#version 450\n"
7072 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
7073 "void main(){\n"
7074 " vs_out.x = vec4(1);\n"
7075 "}\n";
7076 char const *gsSource =
7077 "#version 450\n"
7078 "layout(triangles) in;\n"
7079 "layout(triangle_strip, max_vertices=3) out;\n"
7080 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
7081 "out gl_PerVertex { vec4 gl_Position; };\n"
7082 "void main() {\n"
7083 " gl_Position = gs_in[0].x;\n"
7084 " EmitVertex();\n"
7085 "}\n";
7086 char const *fsSource =
7087 "#version 450\n"
7088 "layout(location=0) out vec4 color;\n"
7089 "void main(){\n"
7090 " color = vec4(1);\n"
7091 "}\n";
7092
7093 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7094 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
7095 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7096
7097 VkPipelineObj pipe(m_device);
7098 pipe.AddColorAttachment();
7099 pipe.AddShader(&vs);
7100 pipe.AddShader(&gs);
7101 pipe.AddShader(&fs);
7102
7103 VkDescriptorSetObj descriptorSet(m_device);
7104 descriptorSet.AppendDummy();
7105 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7106
7107 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7108
7109 m_errorMonitor->VerifyNotFound();
7110}
7111
Chris Forbesa0193bc2016-04-04 19:19:47 +12007112TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
7113{
7114 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7115 "is per-vertex in tessellation control shader stage "
7116 "but per-patch in tessellation evaluation shader stage");
7117
7118 ASSERT_NO_FATAL_FAILURE(InitState());
7119 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7120
Chris Forbesc1e852d2016-04-04 19:26:42 +12007121 if (!m_device->phy().features().tessellationShader) {
7122 printf("Device does not support tessellation shaders; skipped.\n");
7123 return;
7124 }
7125
Chris Forbesa0193bc2016-04-04 19:19:47 +12007126 char const *vsSource =
7127 "#version 450\n"
7128 "void main(){}\n";
7129 char const *tcsSource =
7130 "#version 450\n"
7131 "layout(location=0) out int x[];\n"
7132 "layout(vertices=3) out;\n"
7133 "void main(){\n"
7134 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7135 " gl_TessLevelInner[0] = 1;\n"
7136 " x[gl_InvocationID] = gl_InvocationID;\n"
7137 "}\n";
7138 char const *tesSource =
7139 "#version 450\n"
7140 "layout(triangles, equal_spacing, cw) in;\n"
7141 "layout(location=0) patch in int x;\n"
7142 "out gl_PerVertex { vec4 gl_Position; };\n"
7143 "void main(){\n"
7144 " gl_Position.xyz = gl_TessCoord;\n"
7145 " gl_Position.w = x;\n"
7146 "}\n";
7147 char const *fsSource =
7148 "#version 450\n"
7149 "layout(location=0) out vec4 color;\n"
7150 "void main(){\n"
7151 " color = vec4(1);\n"
7152 "}\n";
7153
7154 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7155 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7156 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7157 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7158
7159 VkPipelineInputAssemblyStateCreateInfo iasci{
7160 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7161 nullptr,
7162 0,
7163 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7164 VK_FALSE};
7165
7166 VkPipelineTessellationStateCreateInfo tsci{
7167 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7168 nullptr,
7169 0,
7170 3};
7171
7172 VkPipelineObj pipe(m_device);
7173 pipe.SetInputAssembly(&iasci);
7174 pipe.SetTessellation(&tsci);
7175 pipe.AddColorAttachment();
7176 pipe.AddShader(&vs);
7177 pipe.AddShader(&tcs);
7178 pipe.AddShader(&tes);
7179 pipe.AddShader(&fs);
7180
7181 VkDescriptorSetObj descriptorSet(m_device);
7182 descriptorSet.AppendDummy();
7183 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7184
7185 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7186
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007187 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12007188}
7189
Karl Schultz6addd812016-02-02 17:17:23 -07007190TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
7191 m_errorMonitor->SetDesiredFailureMsg(
7192 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007193 "Duplicate vertex input binding descriptions for binding 0");
7194
Chris Forbes280ba2c2015-06-12 11:16:41 +12007195 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007196 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007197
7198 /* Two binding descriptions for binding 0 */
7199 VkVertexInputBindingDescription input_bindings[2];
7200 memset(input_bindings, 0, sizeof(input_bindings));
7201
7202 VkVertexInputAttributeDescription input_attrib;
7203 memset(&input_attrib, 0, sizeof(input_attrib));
7204 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7205
7206 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007207 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007208 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007209 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007210 "out gl_PerVertex {\n"
7211 " vec4 gl_Position;\n"
7212 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007213 "void main(){\n"
7214 " gl_Position = vec4(x);\n"
7215 "}\n";
7216 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007217 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007218 "\n"
7219 "layout(location=0) out vec4 color;\n"
7220 "void main(){\n"
7221 " color = vec4(1);\n"
7222 "}\n";
7223
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007224 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7225 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007226
7227 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007228 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007229 pipe.AddShader(&vs);
7230 pipe.AddShader(&fs);
7231
7232 pipe.AddVertexInputBindings(input_bindings, 2);
7233 pipe.AddVertexInputAttribs(&input_attrib, 1);
7234
Chris Forbes280ba2c2015-06-12 11:16:41 +12007235 VkDescriptorSetObj descriptorSet(m_device);
7236 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007237 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007238
Tony Barbour5781e8f2015-08-04 16:23:11 -06007239 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007240
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007241 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007242}
Chris Forbes8f68b562015-05-25 11:13:32 +12007243
Chris Forbes35efec72016-04-21 14:32:08 +12007244TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
7245 m_errorMonitor->ExpectSuccess();
7246
7247 ASSERT_NO_FATAL_FAILURE(InitState());
7248 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7249
7250 if (!m_device->phy().features().tessellationShader) {
7251 printf("Device does not support 64bit vertex attributes; skipped.\n");
7252 return;
7253 }
7254
7255 VkVertexInputBindingDescription input_bindings[1];
7256 memset(input_bindings, 0, sizeof(input_bindings));
7257
7258 VkVertexInputAttributeDescription input_attribs[4];
7259 memset(input_attribs, 0, sizeof(input_attribs));
7260 input_attribs[0].location = 0;
7261 input_attribs[0].offset = 0;
7262 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7263 input_attribs[1].location = 2;
7264 input_attribs[1].offset = 32;
7265 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7266 input_attribs[2].location = 4;
7267 input_attribs[2].offset = 64;
7268 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7269 input_attribs[3].location = 6;
7270 input_attribs[3].offset = 96;
7271 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7272
7273 char const *vsSource =
7274 "#version 450\n"
7275 "\n"
7276 "layout(location=0) in dmat4 x;\n"
7277 "out gl_PerVertex {\n"
7278 " vec4 gl_Position;\n"
7279 "};\n"
7280 "void main(){\n"
7281 " gl_Position = vec4(x[0][0]);\n"
7282 "}\n";
7283 char const *fsSource =
7284 "#version 450\n"
7285 "\n"
7286 "layout(location=0) out vec4 color;\n"
7287 "void main(){\n"
7288 " color = vec4(1);\n"
7289 "}\n";
7290
7291 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7292 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7293
7294 VkPipelineObj pipe(m_device);
7295 pipe.AddColorAttachment();
7296 pipe.AddShader(&vs);
7297 pipe.AddShader(&fs);
7298
7299 pipe.AddVertexInputBindings(input_bindings, 1);
7300 pipe.AddVertexInputAttribs(input_attribs, 4);
7301
7302 VkDescriptorSetObj descriptorSet(m_device);
7303 descriptorSet.AppendDummy();
7304 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7305
7306 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7307
7308 m_errorMonitor->VerifyNotFound();
7309}
7310
Karl Schultz6addd812016-02-02 17:17:23 -07007311TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007312 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007313 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007314
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007315 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007316
7317 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007318 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007319 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007320 "out gl_PerVertex {\n"
7321 " vec4 gl_Position;\n"
7322 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007323 "void main(){\n"
7324 " gl_Position = vec4(1);\n"
7325 "}\n";
7326 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007327 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007328 "\n"
7329 "void main(){\n"
7330 "}\n";
7331
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007332 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7333 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007334
7335 VkPipelineObj pipe(m_device);
7336 pipe.AddShader(&vs);
7337 pipe.AddShader(&fs);
7338
Chia-I Wu08accc62015-07-07 11:50:03 +08007339 /* set up CB 0, not written */
7340 pipe.AddColorAttachment();
7341 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007342
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007343 VkDescriptorSetObj descriptorSet(m_device);
7344 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007345 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007346
Tony Barbour5781e8f2015-08-04 16:23:11 -06007347 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007348
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007349 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007350}
7351
Karl Schultz6addd812016-02-02 17:17:23 -07007352TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07007353 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007354 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007355 "FS writes to output location 1 with no matching attachment");
7356
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007357 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007358
7359 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007360 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007361 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007362 "out gl_PerVertex {\n"
7363 " vec4 gl_Position;\n"
7364 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007365 "void main(){\n"
7366 " gl_Position = vec4(1);\n"
7367 "}\n";
7368 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007369 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007370 "\n"
7371 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007372 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007373 "void main(){\n"
7374 " x = vec4(1);\n"
7375 " y = vec4(1);\n"
7376 "}\n";
7377
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007378 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7379 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007380
7381 VkPipelineObj pipe(m_device);
7382 pipe.AddShader(&vs);
7383 pipe.AddShader(&fs);
7384
Chia-I Wu08accc62015-07-07 11:50:03 +08007385 /* set up CB 0, not written */
7386 pipe.AddColorAttachment();
7387 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007388 /* FS writes CB 1, but we don't configure it */
7389
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007390 VkDescriptorSetObj descriptorSet(m_device);
7391 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007392 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007393
Tony Barbour5781e8f2015-08-04 16:23:11 -06007394 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007395
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007396 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007397}
7398
Karl Schultz6addd812016-02-02 17:17:23 -07007399TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007400 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007401 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007402
Chris Forbesa36d69e2015-05-25 11:13:44 +12007403 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007404
7405 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007406 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007407 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007408 "out gl_PerVertex {\n"
7409 " vec4 gl_Position;\n"
7410 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007411 "void main(){\n"
7412 " gl_Position = vec4(1);\n"
7413 "}\n";
7414 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007415 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007416 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007417 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12007418 "void main(){\n"
7419 " x = ivec4(1);\n"
7420 "}\n";
7421
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007422 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7423 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007424
7425 VkPipelineObj pipe(m_device);
7426 pipe.AddShader(&vs);
7427 pipe.AddShader(&fs);
7428
Chia-I Wu08accc62015-07-07 11:50:03 +08007429 /* set up CB 0; type is UNORM by default */
7430 pipe.AddColorAttachment();
7431 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007432
Chris Forbesa36d69e2015-05-25 11:13:44 +12007433 VkDescriptorSetObj descriptorSet(m_device);
7434 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007435 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007436
Tony Barbour5781e8f2015-08-04 16:23:11 -06007437 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007438
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007439 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12007440}
Chris Forbes7b1b8932015-06-05 14:43:36 +12007441
Karl Schultz6addd812016-02-02 17:17:23 -07007442TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007444 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007445
Chris Forbes556c76c2015-08-14 12:04:59 +12007446 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12007447
7448 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007449 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007450 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007451 "out gl_PerVertex {\n"
7452 " vec4 gl_Position;\n"
7453 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007454 "void main(){\n"
7455 " gl_Position = vec4(1);\n"
7456 "}\n";
7457 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007458 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007459 "\n"
7460 "layout(location=0) out vec4 x;\n"
7461 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7462 "void main(){\n"
7463 " x = vec4(bar.y);\n"
7464 "}\n";
7465
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007466 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7467 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12007468
Chris Forbes556c76c2015-08-14 12:04:59 +12007469 VkPipelineObj pipe(m_device);
7470 pipe.AddShader(&vs);
7471 pipe.AddShader(&fs);
7472
7473 /* set up CB 0; type is UNORM by default */
7474 pipe.AddColorAttachment();
7475 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7476
7477 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007478 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12007479
7480 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7481
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007482 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12007483}
7484
Chris Forbes5c59e902016-02-26 16:56:09 +13007485TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
7486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7487 "not declared in layout");
7488
7489 ASSERT_NO_FATAL_FAILURE(InitState());
7490
7491 char const *vsSource =
7492 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007493 "\n"
7494 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
7495 "out gl_PerVertex {\n"
7496 " vec4 gl_Position;\n"
7497 "};\n"
7498 "void main(){\n"
7499 " gl_Position = vec4(consts.x);\n"
7500 "}\n";
7501 char const *fsSource =
7502 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007503 "\n"
7504 "layout(location=0) out vec4 x;\n"
7505 "void main(){\n"
7506 " x = vec4(1);\n"
7507 "}\n";
7508
7509 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7510 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7511
7512 VkPipelineObj pipe(m_device);
7513 pipe.AddShader(&vs);
7514 pipe.AddShader(&fs);
7515
7516 /* set up CB 0; type is UNORM by default */
7517 pipe.AddColorAttachment();
7518 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7519
7520 VkDescriptorSetObj descriptorSet(m_device);
7521 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7522
7523 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7524
7525 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007526 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13007527}
7528
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007529#endif // SHADER_CHECKER_TESTS
7530
7531#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06007532TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07007533 m_errorMonitor->SetDesiredFailureMsg(
7534 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007535 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007536
7537 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007538
7539 // Create an image
7540 VkImage image;
7541
Karl Schultz6addd812016-02-02 17:17:23 -07007542 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7543 const int32_t tex_width = 32;
7544 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007545
7546 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007547 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7548 image_create_info.pNext = NULL;
7549 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7550 image_create_info.format = tex_format;
7551 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007552 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07007553 image_create_info.extent.depth = 1;
7554 image_create_info.mipLevels = 1;
7555 image_create_info.arrayLayers = 1;
7556 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7557 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7558 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7559 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007560
7561 // Introduce error by sending down a bogus width extent
7562 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007563 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007564
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007565 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007566}
7567
Mark Youngc48c4c12016-04-11 14:26:49 -06007568TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
7569 m_errorMonitor->SetDesiredFailureMsg(
7570 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7571 "CreateImage extents is 0 for at least one required dimension");
7572
7573 ASSERT_NO_FATAL_FAILURE(InitState());
7574
7575 // Create an image
7576 VkImage image;
7577
7578 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7579 const int32_t tex_width = 32;
7580 const int32_t tex_height = 32;
7581
7582 VkImageCreateInfo image_create_info = {};
7583 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7584 image_create_info.pNext = NULL;
7585 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7586 image_create_info.format = tex_format;
7587 image_create_info.extent.width = tex_width;
7588 image_create_info.extent.height = tex_height;
7589 image_create_info.extent.depth = 1;
7590 image_create_info.mipLevels = 1;
7591 image_create_info.arrayLayers = 1;
7592 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7593 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7594 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7595 image_create_info.flags = 0;
7596
7597 // Introduce error by sending down a bogus width extent
7598 image_create_info.extent.width = 0;
7599 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7600
7601 m_errorMonitor->VerifyFound();
7602}
7603
Karl Schultz6addd812016-02-02 17:17:23 -07007604TEST_F(VkLayerTest, UpdateBufferAlignment) {
7605 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06007606
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007608 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007609
Mike Stroyana3082432015-09-25 13:39:21 -06007610 ASSERT_NO_FATAL_FAILURE(InitState());
7611
7612 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7613 vk_testing::Buffer buffer;
7614 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7615
7616 BeginCommandBuffer();
7617 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007618 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007619 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007620
Mike Stroyana3082432015-09-25 13:39:21 -06007621 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007622 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007623 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007624
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007625 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007626 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007627 EndCommandBuffer();
7628}
7629
Karl Schultz6addd812016-02-02 17:17:23 -07007630TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007631 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007632 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06007633
7634 ASSERT_NO_FATAL_FAILURE(InitState());
7635
7636 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7637 vk_testing::Buffer buffer;
7638 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7639
7640 BeginCommandBuffer();
7641 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007642 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007643 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007644
Mike Stroyana3082432015-09-25 13:39:21 -06007645 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007647 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007648
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007649 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007650
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007651 m_errorMonitor->VerifyFound();
7652
Mike Stroyana3082432015-09-25 13:39:21 -06007653 EndCommandBuffer();
7654}
7655
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007656#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12007657
Tobin Ehliscde08892015-09-22 10:11:37 -06007658#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07007659TEST_F(VkLayerTest, InvalidImageView) {
7660 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06007661
Karl Schultz6addd812016-02-02 17:17:23 -07007662 m_errorMonitor->SetDesiredFailureMsg(
7663 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007664 "vkCreateImageView called with baseMipLevel 10 ");
7665
Tobin Ehliscde08892015-09-22 10:11:37 -06007666 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06007667
Mike Stroyana3082432015-09-25 13:39:21 -06007668 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07007669 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06007670
Karl Schultz6addd812016-02-02 17:17:23 -07007671 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7672 const int32_t tex_width = 32;
7673 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06007674
7675 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007676 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7677 image_create_info.pNext = NULL;
7678 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7679 image_create_info.format = tex_format;
7680 image_create_info.extent.width = tex_width;
7681 image_create_info.extent.height = tex_height;
7682 image_create_info.extent.depth = 1;
7683 image_create_info.mipLevels = 1;
7684 image_create_info.arrayLayers = 1;
7685 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7686 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7687 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7688 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06007689
Chia-I Wuf7458c52015-10-26 21:10:41 +08007690 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06007691 ASSERT_VK_SUCCESS(err);
7692
7693 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007694 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7695 image_view_create_info.image = image;
7696 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7697 image_view_create_info.format = tex_format;
7698 image_view_create_info.subresourceRange.layerCount = 1;
7699 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
7700 image_view_create_info.subresourceRange.levelCount = 1;
7701 image_view_create_info.subresourceRange.aspectMask =
7702 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06007703
7704 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007705 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7706 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06007707
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007708 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06007709}
Mike Stroyana3082432015-09-25 13:39:21 -06007710
Karl Schultz6addd812016-02-02 17:17:23 -07007711TEST_F(VkLayerTest, InvalidImageViewAspect) {
7712 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007713
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007714 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007715 "vkCreateImageView: Color image "
7716 "formats must have ONLY the "
7717 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007718
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007719 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007720
7721 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07007722 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007723
Karl Schultz6addd812016-02-02 17:17:23 -07007724 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7725 const int32_t tex_width = 32;
7726 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007727
7728 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007729 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7730 image_create_info.pNext = NULL;
7731 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7732 image_create_info.format = tex_format;
7733 image_create_info.extent.width = tex_width;
7734 image_create_info.extent.height = tex_height;
7735 image_create_info.extent.depth = 1;
7736 image_create_info.mipLevels = 1;
7737 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7738 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7739 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7740 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007741
Chia-I Wuf7458c52015-10-26 21:10:41 +08007742 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007743 ASSERT_VK_SUCCESS(err);
7744
7745 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007746 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7747 image_view_create_info.image = image;
7748 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7749 image_view_create_info.format = tex_format;
7750 image_view_create_info.subresourceRange.baseMipLevel = 0;
7751 image_view_create_info.subresourceRange.levelCount = 1;
7752 // Cause an error by setting an invalid image aspect
7753 image_view_create_info.subresourceRange.aspectMask =
7754 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007755
7756 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007757 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7758 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007759
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007760 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007761}
7762
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007763TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07007764 VkResult err;
7765 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007766
Karl Schultz6addd812016-02-02 17:17:23 -07007767 m_errorMonitor->SetDesiredFailureMsg(
7768 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007769 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007770
Mike Stroyana3082432015-09-25 13:39:21 -06007771 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007772
7773 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007774 VkImage srcImage;
7775 VkImage dstImage;
7776 VkDeviceMemory srcMem;
7777 VkDeviceMemory destMem;
7778 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007779
7780 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007781 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7782 image_create_info.pNext = NULL;
7783 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7784 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7785 image_create_info.extent.width = 32;
7786 image_create_info.extent.height = 32;
7787 image_create_info.extent.depth = 1;
7788 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007789 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07007790 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7791 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7792 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7793 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007794
Karl Schultz6addd812016-02-02 17:17:23 -07007795 err =
7796 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007797 ASSERT_VK_SUCCESS(err);
7798
Karl Schultz6addd812016-02-02 17:17:23 -07007799 err =
7800 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007801 ASSERT_VK_SUCCESS(err);
7802
7803 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007804 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007805 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7806 memAlloc.pNext = NULL;
7807 memAlloc.allocationSize = 0;
7808 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007809
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007810 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007811 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007812 pass =
7813 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007814 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007815 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007816 ASSERT_VK_SUCCESS(err);
7817
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007818 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007819 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007820 pass =
7821 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007822 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007823 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007824 ASSERT_VK_SUCCESS(err);
7825
7826 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7827 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007828 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007829 ASSERT_VK_SUCCESS(err);
7830
7831 BeginCommandBuffer();
7832 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007833 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007834 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007835 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007836 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06007837 copyRegion.srcOffset.x = 0;
7838 copyRegion.srcOffset.y = 0;
7839 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007840 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007841 copyRegion.dstSubresource.mipLevel = 0;
7842 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007843 // Introduce failure by forcing the dst layerCount to differ from src
7844 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007845 copyRegion.dstOffset.x = 0;
7846 copyRegion.dstOffset.y = 0;
7847 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007848 copyRegion.extent.width = 1;
7849 copyRegion.extent.height = 1;
7850 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007851 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7852 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007853 EndCommandBuffer();
7854
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007855 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007856
Chia-I Wuf7458c52015-10-26 21:10:41 +08007857 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007858 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007859 vkFreeMemory(m_device->device(), srcMem, NULL);
7860 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007861}
7862
Karl Schultz6addd812016-02-02 17:17:23 -07007863TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06007864 VkResult err;
7865 bool pass;
7866
7867 // Create color images with different format sizes and try to copy between them
7868 m_errorMonitor->SetDesiredFailureMsg(
7869 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7870 "vkCmdCopyImage called with unmatched source and dest image format sizes");
7871
7872 ASSERT_NO_FATAL_FAILURE(InitState());
7873
7874 // Create two images of different types and try to copy between them
7875 VkImage srcImage;
7876 VkImage dstImage;
7877 VkDeviceMemory srcMem;
7878 VkDeviceMemory destMem;
7879 VkMemoryRequirements memReqs;
7880
7881 VkImageCreateInfo image_create_info = {};
7882 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7883 image_create_info.pNext = NULL;
7884 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7885 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7886 image_create_info.extent.width = 32;
7887 image_create_info.extent.height = 32;
7888 image_create_info.extent.depth = 1;
7889 image_create_info.mipLevels = 1;
7890 image_create_info.arrayLayers = 1;
7891 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7892 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7893 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7894 image_create_info.flags = 0;
7895
7896 err =
7897 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
7898 ASSERT_VK_SUCCESS(err);
7899
7900 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7901 // Introduce failure by creating second image with a different-sized format.
7902 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
7903
7904 err =
7905 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
7906 ASSERT_VK_SUCCESS(err);
7907
7908 // Allocate memory
7909 VkMemoryAllocateInfo memAlloc = {};
7910 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7911 memAlloc.pNext = NULL;
7912 memAlloc.allocationSize = 0;
7913 memAlloc.memoryTypeIndex = 0;
7914
7915 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
7916 memAlloc.allocationSize = memReqs.size;
7917 pass =
7918 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
7919 ASSERT_TRUE(pass);
7920 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
7921 ASSERT_VK_SUCCESS(err);
7922
7923 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
7924 memAlloc.allocationSize = memReqs.size;
7925 pass =
7926 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
7927 ASSERT_TRUE(pass);
7928 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
7929 ASSERT_VK_SUCCESS(err);
7930
7931 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7932 ASSERT_VK_SUCCESS(err);
7933 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
7934 ASSERT_VK_SUCCESS(err);
7935
7936 BeginCommandBuffer();
7937 VkImageCopy copyRegion;
7938 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7939 copyRegion.srcSubresource.mipLevel = 0;
7940 copyRegion.srcSubresource.baseArrayLayer = 0;
7941 copyRegion.srcSubresource.layerCount = 0;
7942 copyRegion.srcOffset.x = 0;
7943 copyRegion.srcOffset.y = 0;
7944 copyRegion.srcOffset.z = 0;
7945 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7946 copyRegion.dstSubresource.mipLevel = 0;
7947 copyRegion.dstSubresource.baseArrayLayer = 0;
7948 copyRegion.dstSubresource.layerCount = 0;
7949 copyRegion.dstOffset.x = 0;
7950 copyRegion.dstOffset.y = 0;
7951 copyRegion.dstOffset.z = 0;
7952 copyRegion.extent.width = 1;
7953 copyRegion.extent.height = 1;
7954 copyRegion.extent.depth = 1;
7955 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7956 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7957 EndCommandBuffer();
7958
7959 m_errorMonitor->VerifyFound();
7960
7961 vkDestroyImage(m_device->device(), srcImage, NULL);
7962 vkDestroyImage(m_device->device(), dstImage, NULL);
7963 vkFreeMemory(m_device->device(), srcMem, NULL);
7964 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007965}
7966
Karl Schultz6addd812016-02-02 17:17:23 -07007967TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
7968 VkResult err;
7969 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007970
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007971 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007972 m_errorMonitor->SetDesiredFailureMsg(
7973 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007974 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007975
Mike Stroyana3082432015-09-25 13:39:21 -06007976 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007977
7978 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007979 VkImage srcImage;
7980 VkImage dstImage;
7981 VkDeviceMemory srcMem;
7982 VkDeviceMemory destMem;
7983 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007984
7985 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007986 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7987 image_create_info.pNext = NULL;
7988 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7989 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7990 image_create_info.extent.width = 32;
7991 image_create_info.extent.height = 32;
7992 image_create_info.extent.depth = 1;
7993 image_create_info.mipLevels = 1;
7994 image_create_info.arrayLayers = 1;
7995 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7996 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7997 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7998 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007999
Karl Schultz6addd812016-02-02 17:17:23 -07008000 err =
8001 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008002 ASSERT_VK_SUCCESS(err);
8003
Karl Schultzbdb75952016-04-19 11:36:49 -06008004 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
8005
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008006 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07008007 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008008 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
8009 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008010
Karl Schultz6addd812016-02-02 17:17:23 -07008011 err =
8012 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008013 ASSERT_VK_SUCCESS(err);
8014
8015 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008016 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008017 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8018 memAlloc.pNext = NULL;
8019 memAlloc.allocationSize = 0;
8020 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008021
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008022 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008023 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008024 pass =
8025 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008026 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008027 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008028 ASSERT_VK_SUCCESS(err);
8029
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008030 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008031 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008032 pass =
8033 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008034 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008035 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008036 ASSERT_VK_SUCCESS(err);
8037
8038 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8039 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008040 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008041 ASSERT_VK_SUCCESS(err);
8042
8043 BeginCommandBuffer();
8044 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008045 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008046 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008047 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008048 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008049 copyRegion.srcOffset.x = 0;
8050 copyRegion.srcOffset.y = 0;
8051 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008052 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008053 copyRegion.dstSubresource.mipLevel = 0;
8054 copyRegion.dstSubresource.baseArrayLayer = 0;
8055 copyRegion.dstSubresource.layerCount = 0;
8056 copyRegion.dstOffset.x = 0;
8057 copyRegion.dstOffset.y = 0;
8058 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008059 copyRegion.extent.width = 1;
8060 copyRegion.extent.height = 1;
8061 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008062 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8063 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008064 EndCommandBuffer();
8065
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008066 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008067
Chia-I Wuf7458c52015-10-26 21:10:41 +08008068 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008069 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008070 vkFreeMemory(m_device->device(), srcMem, NULL);
8071 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008072}
8073
Karl Schultz6addd812016-02-02 17:17:23 -07008074TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
8075 VkResult err;
8076 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008077
Karl Schultz6addd812016-02-02 17:17:23 -07008078 m_errorMonitor->SetDesiredFailureMsg(
8079 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008080 "vkCmdResolveImage called with source sample count less than 2.");
8081
Mike Stroyana3082432015-09-25 13:39:21 -06008082 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008083
8084 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008085 VkImage srcImage;
8086 VkImage dstImage;
8087 VkDeviceMemory srcMem;
8088 VkDeviceMemory destMem;
8089 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008090
8091 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008092 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8093 image_create_info.pNext = NULL;
8094 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8095 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8096 image_create_info.extent.width = 32;
8097 image_create_info.extent.height = 1;
8098 image_create_info.extent.depth = 1;
8099 image_create_info.mipLevels = 1;
8100 image_create_info.arrayLayers = 1;
8101 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8102 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8103 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8104 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008105
Karl Schultz6addd812016-02-02 17:17:23 -07008106 err =
8107 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008108 ASSERT_VK_SUCCESS(err);
8109
Karl Schultz6addd812016-02-02 17:17:23 -07008110 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8111 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008112
Karl Schultz6addd812016-02-02 17:17:23 -07008113 err =
8114 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008115 ASSERT_VK_SUCCESS(err);
8116
8117 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008118 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008119 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8120 memAlloc.pNext = NULL;
8121 memAlloc.allocationSize = 0;
8122 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008123
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008124 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008125 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008126 pass =
8127 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008128 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008129 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008130 ASSERT_VK_SUCCESS(err);
8131
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008132 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008133 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008134 pass =
8135 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008136 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008137 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008138 ASSERT_VK_SUCCESS(err);
8139
8140 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8141 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008142 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008143 ASSERT_VK_SUCCESS(err);
8144
8145 BeginCommandBuffer();
8146 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008147 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8148 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008149 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008150 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008151 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008152 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008153 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008154 resolveRegion.srcOffset.x = 0;
8155 resolveRegion.srcOffset.y = 0;
8156 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008157 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008158 resolveRegion.dstSubresource.mipLevel = 0;
8159 resolveRegion.dstSubresource.baseArrayLayer = 0;
8160 resolveRegion.dstSubresource.layerCount = 0;
8161 resolveRegion.dstOffset.x = 0;
8162 resolveRegion.dstOffset.y = 0;
8163 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008164 resolveRegion.extent.width = 1;
8165 resolveRegion.extent.height = 1;
8166 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008167 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8168 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008169 EndCommandBuffer();
8170
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008171 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008172
Chia-I Wuf7458c52015-10-26 21:10:41 +08008173 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008174 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008175 vkFreeMemory(m_device->device(), srcMem, NULL);
8176 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008177}
8178
Karl Schultz6addd812016-02-02 17:17:23 -07008179TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
8180 VkResult err;
8181 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008182
Karl Schultz6addd812016-02-02 17:17:23 -07008183 m_errorMonitor->SetDesiredFailureMsg(
8184 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008185 "vkCmdResolveImage called with dest sample count greater than 1.");
8186
Mike Stroyana3082432015-09-25 13:39:21 -06008187 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008188
8189 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008190 VkImage srcImage;
8191 VkImage dstImage;
8192 VkDeviceMemory srcMem;
8193 VkDeviceMemory destMem;
8194 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008195
8196 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008197 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8198 image_create_info.pNext = NULL;
8199 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8200 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8201 image_create_info.extent.width = 32;
8202 image_create_info.extent.height = 1;
8203 image_create_info.extent.depth = 1;
8204 image_create_info.mipLevels = 1;
8205 image_create_info.arrayLayers = 1;
8206 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8207 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8208 // Note: Some implementations expect color attachment usage for any
8209 // multisample surface
8210 image_create_info.usage =
8211 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8212 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008213
Karl Schultz6addd812016-02-02 17:17:23 -07008214 err =
8215 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008216 ASSERT_VK_SUCCESS(err);
8217
Karl Schultz6addd812016-02-02 17:17:23 -07008218 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8219 // Note: Some implementations expect color attachment usage for any
8220 // multisample surface
8221 image_create_info.usage =
8222 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008223
Karl Schultz6addd812016-02-02 17:17:23 -07008224 err =
8225 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008226 ASSERT_VK_SUCCESS(err);
8227
8228 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008229 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008230 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8231 memAlloc.pNext = NULL;
8232 memAlloc.allocationSize = 0;
8233 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008234
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008235 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008236 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008237 pass =
8238 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008239 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008240 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008241 ASSERT_VK_SUCCESS(err);
8242
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008243 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008244 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008245 pass =
8246 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008247 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008248 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008249 ASSERT_VK_SUCCESS(err);
8250
8251 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8252 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008253 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008254 ASSERT_VK_SUCCESS(err);
8255
8256 BeginCommandBuffer();
8257 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008258 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8259 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008260 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008261 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008262 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008263 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008264 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008265 resolveRegion.srcOffset.x = 0;
8266 resolveRegion.srcOffset.y = 0;
8267 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008268 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008269 resolveRegion.dstSubresource.mipLevel = 0;
8270 resolveRegion.dstSubresource.baseArrayLayer = 0;
8271 resolveRegion.dstSubresource.layerCount = 0;
8272 resolveRegion.dstOffset.x = 0;
8273 resolveRegion.dstOffset.y = 0;
8274 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008275 resolveRegion.extent.width = 1;
8276 resolveRegion.extent.height = 1;
8277 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008278 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8279 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008280 EndCommandBuffer();
8281
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008282 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008283
Chia-I Wuf7458c52015-10-26 21:10:41 +08008284 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008285 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008286 vkFreeMemory(m_device->device(), srcMem, NULL);
8287 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008288}
8289
Karl Schultz6addd812016-02-02 17:17:23 -07008290TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
8291 VkResult err;
8292 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008293
Karl Schultz6addd812016-02-02 17:17:23 -07008294 m_errorMonitor->SetDesiredFailureMsg(
8295 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008296 "vkCmdResolveImage called with unmatched source and dest formats.");
8297
Mike Stroyana3082432015-09-25 13:39:21 -06008298 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008299
8300 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008301 VkImage srcImage;
8302 VkImage dstImage;
8303 VkDeviceMemory srcMem;
8304 VkDeviceMemory destMem;
8305 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008306
8307 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008308 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8309 image_create_info.pNext = NULL;
8310 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8311 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8312 image_create_info.extent.width = 32;
8313 image_create_info.extent.height = 1;
8314 image_create_info.extent.depth = 1;
8315 image_create_info.mipLevels = 1;
8316 image_create_info.arrayLayers = 1;
8317 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8318 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8319 // Note: Some implementations expect color attachment usage for any
8320 // multisample surface
8321 image_create_info.usage =
8322 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8323 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008324
Karl Schultz6addd812016-02-02 17:17:23 -07008325 err =
8326 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008327 ASSERT_VK_SUCCESS(err);
8328
Karl Schultz6addd812016-02-02 17:17:23 -07008329 // Set format to something other than source image
8330 image_create_info.format = VK_FORMAT_R32_SFLOAT;
8331 // Note: Some implementations expect color attachment usage for any
8332 // multisample surface
8333 image_create_info.usage =
8334 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8335 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008336
Karl Schultz6addd812016-02-02 17:17:23 -07008337 err =
8338 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008339 ASSERT_VK_SUCCESS(err);
8340
8341 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008342 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008343 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8344 memAlloc.pNext = NULL;
8345 memAlloc.allocationSize = 0;
8346 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008347
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008348 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008349 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008350 pass =
8351 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008352 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008353 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008354 ASSERT_VK_SUCCESS(err);
8355
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008356 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008357 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008358 pass =
8359 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008360 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008361 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008362 ASSERT_VK_SUCCESS(err);
8363
8364 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8365 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008366 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008367 ASSERT_VK_SUCCESS(err);
8368
8369 BeginCommandBuffer();
8370 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008371 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8372 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008373 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008374 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008375 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008376 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008377 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008378 resolveRegion.srcOffset.x = 0;
8379 resolveRegion.srcOffset.y = 0;
8380 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008381 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008382 resolveRegion.dstSubresource.mipLevel = 0;
8383 resolveRegion.dstSubresource.baseArrayLayer = 0;
8384 resolveRegion.dstSubresource.layerCount = 0;
8385 resolveRegion.dstOffset.x = 0;
8386 resolveRegion.dstOffset.y = 0;
8387 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008388 resolveRegion.extent.width = 1;
8389 resolveRegion.extent.height = 1;
8390 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008391 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8392 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008393 EndCommandBuffer();
8394
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008395 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008396
Chia-I Wuf7458c52015-10-26 21:10:41 +08008397 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008398 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008399 vkFreeMemory(m_device->device(), srcMem, NULL);
8400 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008401}
8402
Karl Schultz6addd812016-02-02 17:17:23 -07008403TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
8404 VkResult err;
8405 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008406
Karl Schultz6addd812016-02-02 17:17:23 -07008407 m_errorMonitor->SetDesiredFailureMsg(
8408 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008409 "vkCmdResolveImage called with unmatched source and dest image types.");
8410
Mike Stroyana3082432015-09-25 13:39:21 -06008411 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008412
8413 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008414 VkImage srcImage;
8415 VkImage dstImage;
8416 VkDeviceMemory srcMem;
8417 VkDeviceMemory destMem;
8418 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008419
8420 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008421 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8422 image_create_info.pNext = NULL;
8423 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8424 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8425 image_create_info.extent.width = 32;
8426 image_create_info.extent.height = 1;
8427 image_create_info.extent.depth = 1;
8428 image_create_info.mipLevels = 1;
8429 image_create_info.arrayLayers = 1;
8430 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8431 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8432 // Note: Some implementations expect color attachment usage for any
8433 // multisample surface
8434 image_create_info.usage =
8435 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8436 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008437
Karl Schultz6addd812016-02-02 17:17:23 -07008438 err =
8439 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008440 ASSERT_VK_SUCCESS(err);
8441
Karl Schultz6addd812016-02-02 17:17:23 -07008442 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8443 // Note: Some implementations expect color attachment usage for any
8444 // multisample surface
8445 image_create_info.usage =
8446 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8447 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008448
Karl Schultz6addd812016-02-02 17:17:23 -07008449 err =
8450 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008451 ASSERT_VK_SUCCESS(err);
8452
8453 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008454 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008455 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8456 memAlloc.pNext = NULL;
8457 memAlloc.allocationSize = 0;
8458 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008459
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008460 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008461 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008462 pass =
8463 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008464 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008465 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008466 ASSERT_VK_SUCCESS(err);
8467
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008468 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008469 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008470 pass =
8471 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008472 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008473 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008474 ASSERT_VK_SUCCESS(err);
8475
8476 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8477 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008478 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008479 ASSERT_VK_SUCCESS(err);
8480
8481 BeginCommandBuffer();
8482 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008483 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8484 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008485 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008486 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008487 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008488 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008489 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008490 resolveRegion.srcOffset.x = 0;
8491 resolveRegion.srcOffset.y = 0;
8492 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008493 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008494 resolveRegion.dstSubresource.mipLevel = 0;
8495 resolveRegion.dstSubresource.baseArrayLayer = 0;
8496 resolveRegion.dstSubresource.layerCount = 0;
8497 resolveRegion.dstOffset.x = 0;
8498 resolveRegion.dstOffset.y = 0;
8499 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008500 resolveRegion.extent.width = 1;
8501 resolveRegion.extent.height = 1;
8502 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008503 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8504 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008505 EndCommandBuffer();
8506
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008507 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008508
Chia-I Wuf7458c52015-10-26 21:10:41 +08008509 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008510 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008511 vkFreeMemory(m_device->device(), srcMem, NULL);
8512 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008513}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008514
Karl Schultz6addd812016-02-02 17:17:23 -07008515TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008516 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07008517 // to using a DS format, then cause it to hit error due to COLOR_BIT not
8518 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008519 // The image format check comes 2nd in validation so we trigger it first,
8520 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07008521 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008522
Karl Schultz6addd812016-02-02 17:17:23 -07008523 m_errorMonitor->SetDesiredFailureMsg(
8524 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008525 "Combination depth/stencil image formats can have only the ");
8526
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008527 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008528
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008529 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008530 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8531 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008532
8533 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008534 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8535 ds_pool_ci.pNext = NULL;
8536 ds_pool_ci.maxSets = 1;
8537 ds_pool_ci.poolSizeCount = 1;
8538 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008539
8540 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008541 err =
8542 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008543 ASSERT_VK_SUCCESS(err);
8544
8545 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008546 dsl_binding.binding = 0;
8547 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8548 dsl_binding.descriptorCount = 1;
8549 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8550 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008551
8552 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008553 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8554 ds_layout_ci.pNext = NULL;
8555 ds_layout_ci.bindingCount = 1;
8556 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008557 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008558 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8559 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008560 ASSERT_VK_SUCCESS(err);
8561
8562 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008563 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008564 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008565 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008566 alloc_info.descriptorPool = ds_pool;
8567 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008568 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8569 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008570 ASSERT_VK_SUCCESS(err);
8571
Karl Schultz6addd812016-02-02 17:17:23 -07008572 VkImage image_bad;
8573 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008574 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07008575 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008576 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07008577 const int32_t tex_width = 32;
8578 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008579
8580 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008581 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8582 image_create_info.pNext = NULL;
8583 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8584 image_create_info.format = tex_format_bad;
8585 image_create_info.extent.width = tex_width;
8586 image_create_info.extent.height = tex_height;
8587 image_create_info.extent.depth = 1;
8588 image_create_info.mipLevels = 1;
8589 image_create_info.arrayLayers = 1;
8590 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8591 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8592 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
8593 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
8594 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008595
Karl Schultz6addd812016-02-02 17:17:23 -07008596 err =
8597 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008598 ASSERT_VK_SUCCESS(err);
8599 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07008600 image_create_info.usage =
8601 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8602 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
8603 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008604 ASSERT_VK_SUCCESS(err);
8605
8606 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008607 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8608 image_view_create_info.image = image_bad;
8609 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8610 image_view_create_info.format = tex_format_bad;
8611 image_view_create_info.subresourceRange.baseArrayLayer = 0;
8612 image_view_create_info.subresourceRange.baseMipLevel = 0;
8613 image_view_create_info.subresourceRange.layerCount = 1;
8614 image_view_create_info.subresourceRange.levelCount = 1;
8615 image_view_create_info.subresourceRange.aspectMask =
8616 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008617
8618 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008619 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8620 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008621
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008622 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008623
Chia-I Wuf7458c52015-10-26 21:10:41 +08008624 vkDestroyImage(m_device->device(), image_bad, NULL);
8625 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008626 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8627 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008628}
Tobin Ehliscde08892015-09-22 10:11:37 -06008629#endif // IMAGE_TESTS
8630
Tony Barbour300a6082015-04-07 13:44:53 -06008631int main(int argc, char **argv) {
8632 int result;
8633
Cody Northrop8e54a402016-03-08 22:25:52 -07008634#ifdef ANDROID
8635 int vulkanSupport = InitVulkan();
8636 if (vulkanSupport == 0)
8637 return 1;
8638#endif
8639
Tony Barbour300a6082015-04-07 13:44:53 -06008640 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06008641 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06008642
8643 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
8644
8645 result = RUN_ALL_TESTS();
8646
Tony Barbour6918cd52015-04-09 12:58:51 -06008647 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06008648 return result;
8649}