blob: b2ebab4d9515cd9ecc9a0884f07612fd1f45d84c [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Michael Lentine0a369f62016-02-03 16:51:46 -06005 * Copyright (c) 2015-2016 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
20 */
Tony Barbour65c48b32015-11-17 10:02:56 -070021
Cody Northrop8e54a402016-03-08 22:25:52 -070022#ifdef ANDROID
23#include "vulkan_wrapper.h"
24#else
David Pinedo9316d3b2015-11-06 12:54:48 -070025#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070026#endif
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060027#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060028#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060029#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070030#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060031
Mark Lobodzinski3780e142015-05-14 15:08:13 -050032#define GLM_FORCE_RADIANS
33#include "glm/glm.hpp"
34#include <glm/gtc/matrix_transform.hpp>
35
Tobin Ehlis0788f522015-05-26 16:11:58 -060036#define MEM_TRACKER_TESTS 1
37#define OBJ_TRACKER_TESTS 1
38#define DRAW_STATE_TESTS 1
39#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120040#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060041#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060042#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060043
Mark Lobodzinski3780e142015-05-14 15:08:13 -050044//--------------------------------------------------------------------------------------
45// Mesh and VertexFormat Data
46//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070047struct Vertex {
48 float posX, posY, posZ, posW; // Position data
49 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050050};
51
Karl Schultz6addd812016-02-02 17:17:23 -070052#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050053
54typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070055 BsoFailNone = 0x00000000,
56 BsoFailLineWidth = 0x00000001,
57 BsoFailDepthBias = 0x00000002,
58 BsoFailViewport = 0x00000004,
59 BsoFailScissor = 0x00000008,
60 BsoFailBlend = 0x00000010,
61 BsoFailDepthBounds = 0x00000020,
62 BsoFailStencilReadMask = 0x00000040,
63 BsoFailStencilWriteMask = 0x00000080,
64 BsoFailStencilReference = 0x00000100,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050065} BsoFailSelect;
66
67struct vktriangle_vs_uniform {
68 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070069 float mvp[4][4];
70 float position[3][4];
71 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050072};
73
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050074static const char bindStateVertShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120075 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070076 "vec2 vertices[3];\n"
77 "out gl_PerVertex {\n"
78 " vec4 gl_Position;\n"
79 "};\n"
80 "void main() {\n"
81 " vertices[0] = vec2(-1.0, -1.0);\n"
82 " vertices[1] = vec2( 1.0, -1.0);\n"
83 " vertices[2] = vec2( 0.0, 1.0);\n"
84 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
85 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050086
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050087static const char bindStateFragShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120088 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070089 "\n"
90 "layout(location = 0) out vec4 uFragColor;\n"
91 "void main(){\n"
92 " uFragColor = vec4(0,1,0,1);\n"
93 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050094
Karl Schultz6addd812016-02-02 17:17:23 -070095static VKAPI_ATTR VkBool32 VKAPI_CALL
96myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
97 uint64_t srcObject, size_t location, int32_t msgCode,
98 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -060099
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600100// ********************************************************
101// ErrorMonitor Usage:
102//
103// Call SetDesiredFailureMsg with a string to be compared against all
104// encountered log messages. Passing NULL will match all log messages.
105// logMsg will return true for skipCall only if msg is matched or NULL.
106//
107// Call DesiredMsgFound to determine if the desired failure message
108// was encountered.
109
Tony Barbour300a6082015-04-07 13:44:53 -0600110class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700111 public:
112 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600113 test_platform_thread_create_mutex(&m_mutex);
114 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700115 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700116 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600117 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600118 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600119
Dustin Graves48458142016-04-29 16:11:55 -0600120 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
121
Karl Schultz6addd812016-02-02 17:17:23 -0700122 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200123 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600124 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600125 m_failureMsg.clear();
126 m_otherMsgs.clear();
127 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700128 m_msgFound = VK_FALSE;
129 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600130 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600131 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600132
Karl Schultz6addd812016-02-02 17:17:23 -0700133 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600134 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600135 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600136 if (m_bailout != NULL) {
137 *m_bailout = true;
138 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600139 string errorString(msgString);
140 if (msgFlags & m_msgFlags) {
141 if (errorString.find(m_desiredMsg) != string::npos) {
Chris Forbesc7b8ad72016-04-04 18:50:38 +1200142 if (m_msgFound) { /* if multiple matches, don't lose all but the last! */
143 m_otherMsgs.push_back(m_failureMsg);
144 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600145 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700146 m_msgFound = VK_TRUE;
147 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600148 } else {
149 m_otherMsgs.push_back(errorString);
150 }
151 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600152 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600153 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600154 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600155
Karl Schultz6addd812016-02-02 17:17:23 -0700156 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600157
Karl Schultz6addd812016-02-02 17:17:23 -0700158 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600159
Karl Schultz6addd812016-02-02 17:17:23 -0700160 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600161
Karl Schultz6addd812016-02-02 17:17:23 -0700162 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600163
Karl Schultz6addd812016-02-02 17:17:23 -0700164 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165 vector<string> otherMsgs = GetOtherFailureMsgs();
166 cout << "Other error messages logged for this test were:" << endl;
167 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
168 cout << " " << *iter << endl;
169 }
170 }
171
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200172 /* helpers */
173
174 void ExpectSuccess() {
175 // match anything
176 SetDesiredFailureMsg(~0u, "");
177 }
178
179 void VerifyFound() {
180 // Not seeing the desired message is a failure. /Before/ throwing, dump
181 // any other messages.
182 if (!DesiredMsgFound()) {
183 DumpFailureMsgs();
184 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
185 }
186 }
187
188 void VerifyNotFound() {
189 // ExpectSuccess() configured us to match anything. Any error is a
190 // failure.
191 if (DesiredMsgFound()) {
192 DumpFailureMsgs();
193 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
194 }
195 }
196
Karl Schultz6addd812016-02-02 17:17:23 -0700197 private:
198 VkFlags m_msgFlags;
199 string m_desiredMsg;
200 string m_failureMsg;
201 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600202 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700203 bool *m_bailout;
204 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600205};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500206
Karl Schultz6addd812016-02-02 17:17:23 -0700207static VKAPI_ATTR VkBool32 VKAPI_CALL
208myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
209 uint64_t srcObject, size_t location, int32_t msgCode,
210 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
211 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700212 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700213 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600214 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600215 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600216 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600217 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600218}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500219
Karl Schultz6addd812016-02-02 17:17:23 -0700220class VkLayerTest : public VkRenderFramework {
221 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800222 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
223 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700224 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
225 BsoFailSelect failMask);
226 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
227 VkPipelineObj &pipelineobj,
228 VkDescriptorSetObj &descriptorSet,
229 BsoFailSelect failMask);
230 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
231 VkDescriptorSetObj &descriptorSet,
232 BsoFailSelect failMask) {
233 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
234 failMask);
235 }
Tony Barbour300a6082015-04-07 13:44:53 -0600236
Tony Barbourfe3351b2015-07-28 10:17:20 -0600237 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700238 VkResult BeginCommandBuffer() {
239 return BeginCommandBuffer(*m_commandBuffer);
240 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800241 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700242 void Draw(uint32_t vertexCount, uint32_t instanceCount,
243 uint32_t firstVertex, uint32_t firstInstance) {
244 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
245 firstInstance);
246 }
247 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
248 uint32_t firstIndex, int32_t vertexOffset,
249 uint32_t firstInstance) {
250 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
251 vertexOffset, firstInstance);
252 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800253 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); }
Karl Schultz6addd812016-02-02 17:17:23 -0700254 void QueueCommandBuffer(const VkFence &fence) {
255 m_commandBuffer->QueueCommandBuffer(fence);
256 }
257 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
258 VkDeviceSize offset, uint32_t binding) {
259 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
260 }
261 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
262 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
263 }
264
265 protected:
266 ErrorMonitor *m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600267
268 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600269 std::vector<const char *> instance_layer_names;
270 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600271 std::vector<const char *> instance_extension_names;
272 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600273
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700274 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600275 /*
276 * Since CreateDbgMsgCallback is an instance level extension call
277 * any extension / layer that utilizes that feature also needs
278 * to be enabled at create instance time.
279 */
Karl Schultz6addd812016-02-02 17:17:23 -0700280 // Use Threading layer first to protect others from
281 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700282 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600283 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800284 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700285 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800286 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
287 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600288 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700289 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600290
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700291 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600292 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800293 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700294 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800295 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
296 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600297 device_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700298 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600299
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600300 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600301 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800302 this->app_info.pApplicationName = "layer_tests";
303 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600304 this->app_info.pEngineName = "unittest";
305 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600306 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600307
Tony Barbour15524c32015-04-29 17:34:29 -0600308 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600309 InitFramework(instance_layer_names, device_layer_names,
310 instance_extension_names, device_extension_names,
311 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600312 }
313
314 virtual void TearDown() {
315 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600316 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600317 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600318 }
319};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500320
Karl Schultz6addd812016-02-02 17:17:23 -0700321VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600322 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600323
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800324 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600325
326 /*
327 * For render test all drawing happens in a single render pass
328 * on a single command buffer.
329 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200330 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800331 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600332 }
333
334 return result;
335}
336
Karl Schultz6addd812016-02-02 17:17:23 -0700337VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600338 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600339
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200340 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800341 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200342 }
Tony Barbour300a6082015-04-07 13:44:53 -0600343
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800344 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600345
346 return result;
347}
348
Karl Schultz6addd812016-02-02 17:17:23 -0700349void VkLayerTest::VKTriangleTest(const char *vertShaderText,
350 const char *fragShaderText,
351 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500352 // Create identity matrix
353 int i;
354 struct vktriangle_vs_uniform data;
355
356 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700357 glm::mat4 View = glm::mat4(1.0f);
358 glm::mat4 Model = glm::mat4(1.0f);
359 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500360 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700361 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500362
363 memcpy(&data.mvp, &MVP[0][0], matrixSize);
364
Karl Schultz6addd812016-02-02 17:17:23 -0700365 static const Vertex tri_data[] = {
366 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
367 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
368 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500369 };
370
Karl Schultz6addd812016-02-02 17:17:23 -0700371 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500372 data.position[i][0] = tri_data[i].posX;
373 data.position[i][1] = tri_data[i].posY;
374 data.position[i][2] = tri_data[i].posZ;
375 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700376 data.color[i][0] = tri_data[i].r;
377 data.color[i][1] = tri_data[i].g;
378 data.color[i][2] = tri_data[i].b;
379 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500380 }
381
382 ASSERT_NO_FATAL_FAILURE(InitState());
383 ASSERT_NO_FATAL_FAILURE(InitViewport());
384
Karl Schultz6addd812016-02-02 17:17:23 -0700385 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
386 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500387
Karl Schultz6addd812016-02-02 17:17:23 -0700388 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
389 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
390 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500391
392 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800393 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500394 pipelineobj.AddShader(&vs);
395 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600396 if (failMask & BsoFailLineWidth) {
397 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600398 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
399 ia_state.sType =
400 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
401 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
402 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600403 }
404 if (failMask & BsoFailDepthBias) {
405 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600406 VkPipelineRasterizationStateCreateInfo rs_state = {};
407 rs_state.sType =
408 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
409 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600410 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600411 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600412 }
Karl Schultz6addd812016-02-02 17:17:23 -0700413 // Viewport and scissors must stay in synch or other errors will occur than
414 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600415 if (failMask & BsoFailViewport) {
416 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600417 m_viewports.clear();
418 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600419 }
420 if (failMask & BsoFailScissor) {
421 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600422 m_scissors.clear();
423 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600424 }
425 if (failMask & BsoFailBlend) {
426 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600427 VkPipelineColorBlendAttachmentState att_state = {};
428 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
429 att_state.blendEnable = VK_TRUE;
430 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600431 }
432 if (failMask & BsoFailDepthBounds) {
433 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
434 }
435 if (failMask & BsoFailStencilReadMask) {
436 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
437 }
438 if (failMask & BsoFailStencilWriteMask) {
439 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
440 }
441 if (failMask & BsoFailStencilReference) {
442 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
443 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500444
445 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700446 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
447 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500448
449 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600450 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500451
Tony Barbourfe3351b2015-07-28 10:17:20 -0600452 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500453
454 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600455 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500456
457 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600458 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500459
Tony Barbourfe3351b2015-07-28 10:17:20 -0600460 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500461}
462
Karl Schultz6addd812016-02-02 17:17:23 -0700463void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
464 VkPipelineObj &pipelineobj,
465 VkDescriptorSetObj &descriptorSet,
466 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500467 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700468 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
469 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500470 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700471 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
472 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500473 }
474
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800475 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700476 // Make sure depthWriteEnable is set so that Depth fail test will work
477 // correctly
478 // Make sure stencilTestEnable is set so that Stencil fail test will work
479 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600480 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800481 stencil.failOp = VK_STENCIL_OP_KEEP;
482 stencil.passOp = VK_STENCIL_OP_KEEP;
483 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
484 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600485
486 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
487 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600488 ds_ci.pNext = NULL;
489 ds_ci.depthTestEnable = VK_FALSE;
490 ds_ci.depthWriteEnable = VK_TRUE;
491 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
492 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600493 if (failMask & BsoFailDepthBounds) {
494 ds_ci.depthBoundsTestEnable = VK_TRUE;
495 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600496 ds_ci.stencilTestEnable = VK_TRUE;
497 ds_ci.front = stencil;
498 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600499
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600500 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600501 pipelineobj.SetViewport(m_viewports);
502 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800503 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700504 VkResult err = pipelineobj.CreateVKPipeline(
505 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600506 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800507 commandBuffer->BindPipeline(pipelineobj);
508 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500509}
510
511// ********************************************************************************************************************
512// ********************************************************************************************************************
513// ********************************************************************************************************************
514// ********************************************************************************************************************
Tobin Ehlis0788f522015-05-26 16:11:58 -0600515#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700516#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800517TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500518{
519 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500520 VkFenceCreateInfo fenceInfo = {};
521 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
522 fenceInfo.pNext = NULL;
523 fenceInfo.flags = 0;
524
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600526
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500527 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600528
529 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
530 vk_testing::Buffer buffer;
531 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500532
Tony Barbourfe3351b2015-07-28 10:17:20 -0600533 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800534 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600535 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500536
537 testFence.init(*m_device, fenceInfo);
538
539 // Bypass framework since it does the waits automatically
540 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600541 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800542 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
543 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800544 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600545 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700546 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800547 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800548 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800549 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600550 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600551
552 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500553 ASSERT_VK_SUCCESS( err );
554
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500555 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800556 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500557
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200558 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500559}
560
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800561TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500562{
563 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500564 VkFenceCreateInfo fenceInfo = {};
565 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
566 fenceInfo.pNext = NULL;
567 fenceInfo.flags = 0;
568
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600570
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500571 ASSERT_NO_FATAL_FAILURE(InitState());
572 ASSERT_NO_FATAL_FAILURE(InitViewport());
573 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
574
Tony Barbourfe3351b2015-07-28 10:17:20 -0600575 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800576 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600577 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500578
579 testFence.init(*m_device, fenceInfo);
580
581 // Bypass framework since it does the waits automatically
582 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600583 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800584 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
585 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800586 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600587 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700588 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800589 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800590 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800591 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600592 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600593
594 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500595 ASSERT_VK_SUCCESS( err );
596
Jon Ashburnf19916e2016-01-11 13:12:43 -0700597 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800598 VkCommandBufferBeginInfo info = {};
599 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
600 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600601 info.renderPass = VK_NULL_HANDLE;
602 info.subpass = 0;
603 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +0800604 info.occlusionQueryEnable = VK_FALSE;
605 info.queryFlags = 0;
606 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600607
608 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800609 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500610
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200611 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500612}
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700613#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200614
Ian Elliott1c32c772016-04-28 14:47:13 -0600615TEST_F(VkLayerTest, EnableWsiBeforeUse) {
616 VkResult err;
617 bool pass;
618
619 VkSurfaceKHR surface = VK_NULL_HANDLE;
620 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
621 VkSwapchainCreateInfoKHR swapchain_create_info = {};
622 uint32_t swapchain_image_count = 0;
623// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
624 uint32_t image_index = 0;
625// VkPresentInfoKHR present_info = {};
626
627 ASSERT_NO_FATAL_FAILURE(InitState());
628
Ian Elliott3f06ce52016-04-29 14:46:21 -0600629#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
630#if defined(VK_USE_PLATFORM_ANDROID_KHR)
631 // Use the functions from the VK_KHR_android_surface extension without
632 // enabling that extension:
633
634 // Create a surface:
635 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
636#if 0
637#endif
638 m_errorMonitor->SetDesiredFailureMsg(
639 VK_DEBUG_REPORT_ERROR_BIT_EXT,
640 "extension was not enabled for this");
641 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
642 &surface);
643 pass = (err != VK_SUCCESS);
644 ASSERT_TRUE(pass);
645 m_errorMonitor->VerifyFound();
646#endif // VK_USE_PLATFORM_ANDROID_KHR
647
648
649#if defined(VK_USE_PLATFORM_MIR_KHR)
650 // Use the functions from the VK_KHR_mir_surface extension without enabling
651 // that extension:
652
653 // Create a surface:
654 VkMirSurfaceCreateInfoKHR mir_create_info = {};
655#if 0
656#endif
657 m_errorMonitor->SetDesiredFailureMsg(
658 VK_DEBUG_REPORT_ERROR_BIT_EXT,
659 "extension was not enabled for this");
660 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
661 pass = (err != VK_SUCCESS);
662 ASSERT_TRUE(pass);
663 m_errorMonitor->VerifyFound();
664
665 // Tell whether an mir_connection supports presentation:
666 MirConnection *mir_connection = NULL;
667 m_errorMonitor->SetDesiredFailureMsg(
668 VK_DEBUG_REPORT_ERROR_BIT_EXT,
669 "extension was not enabled for this");
670 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
671 visual_id);
672 m_errorMonitor->VerifyFound();
673#endif // VK_USE_PLATFORM_MIR_KHR
674
675
676#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
677 // Use the functions from the VK_KHR_wayland_surface extension without
678 // enabling that extension:
679
680 // Create a surface:
681 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
682#if 0
683#endif
684 m_errorMonitor->SetDesiredFailureMsg(
685 VK_DEBUG_REPORT_ERROR_BIT_EXT,
686 "extension was not enabled for this");
687 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
688 &surface);
689 pass = (err != VK_SUCCESS);
690 ASSERT_TRUE(pass);
691 m_errorMonitor->VerifyFound();
692
693 // Tell whether an wayland_display supports presentation:
694 struct wl_display wayland_display = {};
695 m_errorMonitor->SetDesiredFailureMsg(
696 VK_DEBUG_REPORT_ERROR_BIT_EXT,
697 "extension was not enabled for this");
698 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
699 &wayland_display);
700 m_errorMonitor->VerifyFound();
701#endif // VK_USE_PLATFORM_WAYLAND_KHR
702
703
704#if defined(VK_USE_PLATFORM_WIN32_KHR)
705 // Use the functions from the VK_KHR_win32_surface extension without
706 // enabling that extension:
707
708 // Create a surface:
709 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
710#if 0
711#endif
712 m_errorMonitor->SetDesiredFailureMsg(
713 VK_DEBUG_REPORT_ERROR_BIT_EXT,
714 "extension was not enabled for this");
715 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
716 &surface);
717 pass = (err != VK_SUCCESS);
718 ASSERT_TRUE(pass);
719 m_errorMonitor->VerifyFound();
720
721 // Tell whether win32 supports presentation:
722 struct wl_display win32_display = {};
723 m_errorMonitor->SetDesiredFailureMsg(
724 VK_DEBUG_REPORT_ERROR_BIT_EXT,
725 "extension was not enabled for this");
726 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0,
727 &win32_display);
728 m_errorMonitor->VerifyFound();
729#endif // VK_USE_PLATFORM_WAYLAND_KHR
730#endif // NEED_TO_TEST_THIS_ON_PLATFORM
731
732
Ian Elliott1c32c772016-04-28 14:47:13 -0600733#if defined(VK_USE_PLATFORM_XCB_KHR)
734 // Use the functions from the VK_KHR_xcb_surface extension without enabling
735 // that extension:
736
737 // Create a surface:
738 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
739#if 0
740#endif
741 m_errorMonitor->SetDesiredFailureMsg(
742 VK_DEBUG_REPORT_ERROR_BIT_EXT,
743 "extension was not enabled for this");
744 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
745 pass = (err != VK_SUCCESS);
746 ASSERT_TRUE(pass);
747 m_errorMonitor->VerifyFound();
748
749 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -0600750 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -0600751 xcb_visualid_t visual_id = 0;
752 m_errorMonitor->SetDesiredFailureMsg(
753 VK_DEBUG_REPORT_ERROR_BIT_EXT,
754 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -0600755 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -0600756 visual_id);
757 m_errorMonitor->VerifyFound();
758#endif // VK_USE_PLATFORM_XCB_KHR
759
760
Ian Elliott12630812016-04-29 14:35:43 -0600761#if defined(VK_USE_PLATFORM_XLIB_KHR)
762 // Use the functions from the VK_KHR_xlib_surface extension without enabling
763 // that extension:
764
765 // Create a surface:
766 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
767#if 0
768#endif
769 m_errorMonitor->SetDesiredFailureMsg(
770 VK_DEBUG_REPORT_ERROR_BIT_EXT,
771 "extension was not enabled for this");
772 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
773 pass = (err != VK_SUCCESS);
774 ASSERT_TRUE(pass);
775 m_errorMonitor->VerifyFound();
776
777 // Tell whether an Xlib VisualID supports presentation:
778 Display *dpy = NULL;
779 VisualID visual = 0;
780 m_errorMonitor->SetDesiredFailureMsg(
781 VK_DEBUG_REPORT_ERROR_BIT_EXT,
782 "extension was not enabled for this");
783 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
784 m_errorMonitor->VerifyFound();
785#endif // VK_USE_PLATFORM_XLIB_KHR
786
787
Ian Elliott1c32c772016-04-28 14:47:13 -0600788 // Use the functions from the VK_KHR_surface extension without enabling
789 // that extension:
790
791 // Destroy a surface:
792 m_errorMonitor->SetDesiredFailureMsg(
793 VK_DEBUG_REPORT_ERROR_BIT_EXT,
794 "extension was not enabled for this");
795 vkDestroySurfaceKHR(instance(), surface, NULL);
796 m_errorMonitor->VerifyFound();
797
798 // Check if surface supports presentation:
799 VkBool32 supported = false;
800 m_errorMonitor->SetDesiredFailureMsg(
801 VK_DEBUG_REPORT_ERROR_BIT_EXT,
802 "extension was not enabled for this");
803 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
804 pass = (err != VK_SUCCESS);
805 ASSERT_TRUE(pass);
806 m_errorMonitor->VerifyFound();
807
808 // Check surface capabilities:
809 VkSurfaceCapabilitiesKHR capabilities = {};
810 m_errorMonitor->SetDesiredFailureMsg(
811 VK_DEBUG_REPORT_ERROR_BIT_EXT,
812 "extension was not enabled for this");
813 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
814 &capabilities);
815 pass = (err != VK_SUCCESS);
816 ASSERT_TRUE(pass);
817 m_errorMonitor->VerifyFound();
818
819 // Check surface formats:
820 uint32_t format_count = 0;
821 VkSurfaceFormatKHR *formats = NULL;
822 m_errorMonitor->SetDesiredFailureMsg(
823 VK_DEBUG_REPORT_ERROR_BIT_EXT,
824 "extension was not enabled for this");
825 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
826 &format_count, formats);
827 pass = (err != VK_SUCCESS);
828 ASSERT_TRUE(pass);
829 m_errorMonitor->VerifyFound();
830
831 // Check surface present modes:
832 uint32_t present_mode_count = 0;
833 VkSurfaceFormatKHR *present_modes = NULL;
834 m_errorMonitor->SetDesiredFailureMsg(
835 VK_DEBUG_REPORT_ERROR_BIT_EXT,
836 "extension was not enabled for this");
837 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
838 &present_mode_count, present_modes);
839 pass = (err != VK_SUCCESS);
840 ASSERT_TRUE(pass);
841 m_errorMonitor->VerifyFound();
842
843
844 // Use the functions from the VK_KHR_swapchain extension without enabling
845 // that extension:
846
847 // Create a swapchain:
848 m_errorMonitor->SetDesiredFailureMsg(
849 VK_DEBUG_REPORT_ERROR_BIT_EXT,
850 "extension was not enabled for this");
851 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
852 swapchain_create_info.pNext = NULL;
853#if 0
854 swapchain_create_info.flags = 0;
855 swapchain_create_info.surface = 0;
856 swapchain_create_info.minImageCount = 0;
857 swapchain_create_info.imageFormat = 0;
858 swapchain_create_info.imageColorSpace = 0;
859 swapchain_create_info.imageExtent.width = 0;
860 swapchain_create_info.imageExtent.height = 0;
861 swapchain_create_info.imageArrayLayers = 0;
862 swapchain_create_info.imageUsage = 0;
863 swapchain_create_info.imageSharingMode = 0;
864 swapchain_create_info.queueFamilyIndexCount = 0;
865 swapchain_create_info.preTransform = 0;
866 swapchain_create_info.compositeAlpha = 0;
867 swapchain_create_info.presentMode = 0;
868 swapchain_create_info.clipped = 0;
869 swapchain_create_info.oldSwapchain = NULL;
870#endif
871 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
872 NULL, &swapchain);
873 pass = (err != VK_SUCCESS);
874 ASSERT_TRUE(pass);
875 m_errorMonitor->VerifyFound();
876
877 // Get the images from the swapchain:
878 m_errorMonitor->SetDesiredFailureMsg(
879 VK_DEBUG_REPORT_ERROR_BIT_EXT,
880 "extension was not enabled for this");
881 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
882 &swapchain_image_count, NULL);
883 pass = (err != VK_SUCCESS);
884 ASSERT_TRUE(pass);
885 m_errorMonitor->VerifyFound();
886
887 // Try to acquire an image:
888 m_errorMonitor->SetDesiredFailureMsg(
889 VK_DEBUG_REPORT_ERROR_BIT_EXT,
890 "extension was not enabled for this");
891 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
892 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
893 pass = (err != VK_SUCCESS);
894 ASSERT_TRUE(pass);
895 m_errorMonitor->VerifyFound();
896
897 // Try to present an image:
898#if 0 // NOTE: Currently can't test this because a real swapchain is needed
899 // (as opposed to the fake one we created) in order for the layer to
900 // lookup the VkDevice used to enable the extension:
901 m_errorMonitor->SetDesiredFailureMsg(
902 VK_DEBUG_REPORT_ERROR_BIT_EXT,
903 "extension was not enabled for this");
904 present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
905 present_info.pNext = NULL;
906#if 0
907#endif
908 err = vkQueuePresentKHR(m_device->m_queue, &present_info);
909 pass = (err != VK_SUCCESS);
910 ASSERT_TRUE(pass);
911 m_errorMonitor->VerifyFound();
912#endif
913
914 // Destroy the swapchain:
915 m_errorMonitor->SetDesiredFailureMsg(
916 VK_DEBUG_REPORT_ERROR_BIT_EXT,
917 "extension was not enabled for this");
918 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
919 m_errorMonitor->VerifyFound();
920}
921
Karl Schultz6addd812016-02-02 17:17:23 -0700922TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
923 VkResult err;
924 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500925
Karl Schultz6addd812016-02-02 17:17:23 -0700926 m_errorMonitor->SetDesiredFailureMsg(
927 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600928 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
929
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500930 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500931
932 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700933 VkImage image;
934 VkDeviceMemory mem;
935 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500936
Karl Schultz6addd812016-02-02 17:17:23 -0700937 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
938 const int32_t tex_width = 32;
939 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500940
Tony Barboureb254902015-07-15 12:50:33 -0600941 VkImageCreateInfo image_create_info = {};
942 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700943 image_create_info.pNext = NULL;
944 image_create_info.imageType = VK_IMAGE_TYPE_2D;
945 image_create_info.format = tex_format;
946 image_create_info.extent.width = tex_width;
947 image_create_info.extent.height = tex_height;
948 image_create_info.extent.depth = 1;
949 image_create_info.mipLevels = 1;
950 image_create_info.arrayLayers = 1;
951 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
952 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
953 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
954 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600955
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800956 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800957 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700958 mem_alloc.pNext = NULL;
959 mem_alloc.allocationSize = 0;
960 // Introduce failure, do NOT set memProps to
961 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
962 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500963
Chia-I Wuf7458c52015-10-26 21:10:41 +0800964 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500965 ASSERT_VK_SUCCESS(err);
966
Karl Schultz6addd812016-02-02 17:17:23 -0700967 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500968
Mark Lobodzinski23065352015-05-29 09:32:35 -0500969 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500970
Karl Schultz6addd812016-02-02 17:17:23 -0700971 pass =
972 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
973 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
974 if (!pass) { // If we can't find any unmappable memory this test doesn't
975 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +0800976 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -0600977 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -0600978 }
Mike Stroyan713b2d72015-08-04 10:49:29 -0600979
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500980 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800981 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500982 ASSERT_VK_SUCCESS(err);
983
984 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -0600985 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500986 ASSERT_VK_SUCCESS(err);
987
988 // Map memory as if to initialize the image
989 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -0700990 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
991 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500992
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200993 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600994
Chia-I Wuf7458c52015-10-26 21:10:41 +0800995 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500996}
997
Karl Schultz6addd812016-02-02 17:17:23 -0700998TEST_F(VkLayerTest, RebindMemory) {
999 VkResult err;
1000 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001001
Karl Schultz6addd812016-02-02 17:17:23 -07001002 m_errorMonitor->SetDesiredFailureMsg(
1003 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001004 "which has already been bound to mem object");
1005
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001006 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001007
1008 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001009 VkImage image;
1010 VkDeviceMemory mem1;
1011 VkDeviceMemory mem2;
1012 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001013
Karl Schultz6addd812016-02-02 17:17:23 -07001014 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1015 const int32_t tex_width = 32;
1016 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001017
Tony Barboureb254902015-07-15 12:50:33 -06001018 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001019 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1020 image_create_info.pNext = NULL;
1021 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1022 image_create_info.format = tex_format;
1023 image_create_info.extent.width = tex_width;
1024 image_create_info.extent.height = tex_height;
1025 image_create_info.extent.depth = 1;
1026 image_create_info.mipLevels = 1;
1027 image_create_info.arrayLayers = 1;
1028 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1029 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1030 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1031 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001032
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001033 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001034 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1035 mem_alloc.pNext = NULL;
1036 mem_alloc.allocationSize = 0;
1037 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06001038
Karl Schultz6addd812016-02-02 17:17:23 -07001039 // Introduce failure, do NOT set memProps to
1040 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06001041 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08001042 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001043 ASSERT_VK_SUCCESS(err);
1044
Karl Schultz6addd812016-02-02 17:17:23 -07001045 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001046
1047 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001048 pass =
1049 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001050 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001051
1052 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001053 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001054 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001055 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001056 ASSERT_VK_SUCCESS(err);
1057
1058 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06001059 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001060 ASSERT_VK_SUCCESS(err);
1061
Karl Schultz6addd812016-02-02 17:17:23 -07001062 // Introduce validation failure, try to bind a different memory object to
1063 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06001064 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001065
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001066 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001067
Chia-I Wuf7458c52015-10-26 21:10:41 +08001068 vkDestroyImage(m_device->device(), image, NULL);
1069 vkFreeMemory(m_device->device(), mem1, NULL);
1070 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001071}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001072
Karl Schultz6addd812016-02-02 17:17:23 -07001073TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001074 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001075
Karl Schultz6addd812016-02-02 17:17:23 -07001076 m_errorMonitor->SetDesiredFailureMsg(
1077 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
1078 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001079
1080 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001081 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1082 fenceInfo.pNext = NULL;
1083 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06001084
Tony Barbour300a6082015-04-07 13:44:53 -06001085 ASSERT_NO_FATAL_FAILURE(InitState());
1086 ASSERT_NO_FATAL_FAILURE(InitViewport());
1087 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1088
Tony Barbourfe3351b2015-07-28 10:17:20 -06001089 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001090 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
1091 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001092 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06001093
1094 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001095
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001096 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001097 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1098 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001099 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001100 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001101 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001102 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001103 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001104 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001105 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001106
1107 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07001108 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001109
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001110 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001111}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001112// This is a positive test. We used to expect error in this case but spec now
1113// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07001114TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001115 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001116 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001117 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001118 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1119 fenceInfo.pNext = NULL;
1120
Tony Barbour0b4d9562015-04-09 10:48:04 -06001121 ASSERT_NO_FATAL_FAILURE(InitState());
1122 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08001123 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001124 VkResult result = vkResetFences(m_device->device(), 1, fences);
1125 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06001126
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001127 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06001128}
Tobin Ehlis41376e12015-07-03 08:45:14 -06001129
1130TEST_F(VkLayerTest, InvalidUsageBits)
1131{
Tony Barbourf92621a2016-05-02 14:28:12 -06001132 TEST_DESCRIPTION(
1133 "Specify wrong usage for image then create conflictiong view of image "
1134 "Initialize buffer with wrong usage then perform copy expecting errors "
1135 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001137 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06001138
1139 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06001140 VkImageObj image(m_device);
1141 // Initialize image with USAGE_INPUT_ATTACHMENT
1142 image.init(128, 128, VK_FORMAT_D32_SFLOAT_S8_UINT,
1143 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis41376e12015-07-03 08:45:14 -06001144
Tony Barbourf92621a2016-05-02 14:28:12 -06001145 VkImageView dsv;
1146 VkImageViewCreateInfo dsvci = {};
1147 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1148 dsvci.image = image.handle();
1149 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
1150 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
1151 dsvci.subresourceRange.layerCount = 1;
1152 dsvci.subresourceRange.baseMipLevel = 0;
1153 dsvci.subresourceRange.levelCount = 1;
1154 dsvci.subresourceRange.aspectMask =
1155 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06001156
Tony Barbourf92621a2016-05-02 14:28:12 -06001157 // Create a view with depth / stencil aspect for image with different usage
1158 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001159
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001160 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06001161
1162 // Initialize buffer with TRANSFER_DST usage
1163 vk_testing::Buffer buffer;
1164 VkMemoryPropertyFlags reqs = 0;
1165 buffer.init_as_dst(*m_device, 128 * 128, reqs);
1166 VkBufferImageCopy region = {};
1167 region.bufferRowLength = 128;
1168 region.bufferImageHeight = 128;
1169 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1170 region.imageSubresource.layerCount = 1;
1171 region.imageExtent.height = 16;
1172 region.imageExtent.width = 16;
1173 region.imageExtent.depth = 1;
1174
1175 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1176 "Invalid usage flag for buffer ");
1177 // Buffer usage not set to TRANSFER_SRC and image usage not set to
1178 // TRANSFER_DST
1179 BeginCommandBuffer();
1180 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1181 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1182 1, &region);
1183 m_errorMonitor->VerifyFound();
1184
1185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1186 "Invalid usage flag for image ");
1187 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1188 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1189 1, &region);
1190 m_errorMonitor->VerifyFound();
1191
1192 vkDestroyImageView(m_device->device(), dsv, NULL);
Tobin Ehlis41376e12015-07-03 08:45:14 -06001193}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001194#endif // MEM_TRACKER_TESTS
1195
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06001196#if OBJ_TRACKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07001197TEST_F(VkLayerTest, PipelineNotBound) {
1198 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001199
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001200 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001201 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001202
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001203 ASSERT_NO_FATAL_FAILURE(InitState());
1204 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001205
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001206 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001207 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1208 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001209
1210 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001211 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1212 ds_pool_ci.pNext = NULL;
1213 ds_pool_ci.maxSets = 1;
1214 ds_pool_ci.poolSizeCount = 1;
1215 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001216
1217 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001218 err =
1219 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001220 ASSERT_VK_SUCCESS(err);
1221
1222 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001223 dsl_binding.binding = 0;
1224 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1225 dsl_binding.descriptorCount = 1;
1226 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1227 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001228
1229 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001230 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1231 ds_layout_ci.pNext = NULL;
1232 ds_layout_ci.bindingCount = 1;
1233 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001234
1235 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001236 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1237 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001238 ASSERT_VK_SUCCESS(err);
1239
1240 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001241 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001242 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001243 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001244 alloc_info.descriptorPool = ds_pool;
1245 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001246 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1247 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001248 ASSERT_VK_SUCCESS(err);
1249
1250 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001251 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1252 pipeline_layout_ci.pNext = NULL;
1253 pipeline_layout_ci.setLayoutCount = 1;
1254 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001255
1256 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001257 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1258 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001259 ASSERT_VK_SUCCESS(err);
1260
Mark Youngad779052016-01-06 14:26:04 -07001261 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001262
1263 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001264 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1265 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001266
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001267 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001268
Chia-I Wuf7458c52015-10-26 21:10:41 +08001269 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1270 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1271 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001272}
1273
Karl Schultz6addd812016-02-02 17:17:23 -07001274TEST_F(VkLayerTest, BindInvalidMemory) {
1275 VkResult err;
1276 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001277
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001278 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001279 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001280
Tobin Ehlisec598302015-09-15 15:02:17 -06001281 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001282
1283 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001284 VkImage image;
1285 VkDeviceMemory mem;
1286 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001287
Karl Schultz6addd812016-02-02 17:17:23 -07001288 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1289 const int32_t tex_width = 32;
1290 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001291
1292 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001293 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1294 image_create_info.pNext = NULL;
1295 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1296 image_create_info.format = tex_format;
1297 image_create_info.extent.width = tex_width;
1298 image_create_info.extent.height = tex_height;
1299 image_create_info.extent.depth = 1;
1300 image_create_info.mipLevels = 1;
1301 image_create_info.arrayLayers = 1;
1302 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1303 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1304 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1305 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001306
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001307 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001308 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1309 mem_alloc.pNext = NULL;
1310 mem_alloc.allocationSize = 0;
1311 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001312
Chia-I Wuf7458c52015-10-26 21:10:41 +08001313 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001314 ASSERT_VK_SUCCESS(err);
1315
Karl Schultz6addd812016-02-02 17:17:23 -07001316 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001317
1318 mem_alloc.allocationSize = mem_reqs.size;
1319
Karl Schultz6addd812016-02-02 17:17:23 -07001320 pass =
1321 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001322 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001323
1324 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001325 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001326 ASSERT_VK_SUCCESS(err);
1327
1328 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001329 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001330
1331 // Try to bind free memory that has been freed
1332 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1333 // This may very well return an error.
1334 (void)err;
1335
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001336 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001337
Chia-I Wuf7458c52015-10-26 21:10:41 +08001338 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001339}
1340
Karl Schultz6addd812016-02-02 17:17:23 -07001341TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1342 VkResult err;
1343 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001344
Karl Schultz6addd812016-02-02 17:17:23 -07001345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1346 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001347
Tobin Ehlisec598302015-09-15 15:02:17 -06001348 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001349
Karl Schultz6addd812016-02-02 17:17:23 -07001350 // Create an image object, allocate memory, destroy the object and then try
1351 // to bind it
1352 VkImage image;
1353 VkDeviceMemory mem;
1354 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001355
Karl Schultz6addd812016-02-02 17:17:23 -07001356 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1357 const int32_t tex_width = 32;
1358 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001359
1360 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001361 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1362 image_create_info.pNext = NULL;
1363 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1364 image_create_info.format = tex_format;
1365 image_create_info.extent.width = tex_width;
1366 image_create_info.extent.height = tex_height;
1367 image_create_info.extent.depth = 1;
1368 image_create_info.mipLevels = 1;
1369 image_create_info.arrayLayers = 1;
1370 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1371 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1372 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1373 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001374
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001375 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001376 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1377 mem_alloc.pNext = NULL;
1378 mem_alloc.allocationSize = 0;
1379 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001380
Chia-I Wuf7458c52015-10-26 21:10:41 +08001381 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001382 ASSERT_VK_SUCCESS(err);
1383
Karl Schultz6addd812016-02-02 17:17:23 -07001384 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001385
1386 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001387 pass =
1388 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001389 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001390
1391 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001392 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001393 ASSERT_VK_SUCCESS(err);
1394
1395 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001396 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001397 ASSERT_VK_SUCCESS(err);
1398
1399 // Now Try to bind memory to this destroyed object
1400 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1401 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001402 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001403
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001404 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001405
Chia-I Wuf7458c52015-10-26 21:10:41 +08001406 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001407}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001408
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001409#endif // OBJ_TRACKER_TESTS
1410
Tobin Ehlis0788f522015-05-26 16:11:58 -06001411#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001412
1413// This is a positive test. No errors should be generated.
1414TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
1415
1416 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1417 "submitted on separate queues followed by a QueueWaitIdle.");
1418
Dustin Graves48458142016-04-29 16:11:55 -06001419 if ((m_device->queue_props.empty()) ||
1420 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001421 return;
1422
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001423 m_errorMonitor->ExpectSuccess();
1424
1425 VkSemaphore semaphore;
1426 VkSemaphoreCreateInfo semaphore_create_info{};
1427 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1428 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1429 &semaphore);
1430
1431 VkCommandPool command_pool;
1432 VkCommandPoolCreateInfo pool_create_info{};
1433 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1434 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1435 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1436 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1437 &command_pool);
1438
1439 VkCommandBuffer command_buffer[2];
1440 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1441 command_buffer_allocate_info.sType =
1442 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1443 command_buffer_allocate_info.commandPool = command_pool;
1444 command_buffer_allocate_info.commandBufferCount = 2;
1445 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1446 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1447 command_buffer);
1448
1449 VkQueue queue = VK_NULL_HANDLE;
1450 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1451 1, &queue);
1452
1453 {
1454 VkCommandBufferBeginInfo begin_info{};
1455 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1456 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1457
1458 vkCmdPipelineBarrier(command_buffer[0],
1459 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1460 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1461 0, nullptr, 0, nullptr);
1462
1463 VkViewport viewport{};
1464 viewport.maxDepth = 1.0f;
1465 viewport.minDepth = 0.0f;
1466 viewport.width = 512;
1467 viewport.height = 512;
1468 viewport.x = 0;
1469 viewport.y = 0;
1470 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1471 vkEndCommandBuffer(command_buffer[0]);
1472 }
1473 {
1474 VkCommandBufferBeginInfo begin_info{};
1475 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1476 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1477
1478 VkViewport viewport{};
1479 viewport.maxDepth = 1.0f;
1480 viewport.minDepth = 0.0f;
1481 viewport.width = 512;
1482 viewport.height = 512;
1483 viewport.x = 0;
1484 viewport.y = 0;
1485 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1486 vkEndCommandBuffer(command_buffer[1]);
1487 }
1488 {
1489 VkSubmitInfo submit_info{};
1490 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1491 submit_info.commandBufferCount = 1;
1492 submit_info.pCommandBuffers = &command_buffer[0];
1493 submit_info.signalSemaphoreCount = 1;
1494 submit_info.pSignalSemaphores = &semaphore;
1495 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1496 }
1497 {
1498 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1499 VkSubmitInfo submit_info{};
1500 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1501 submit_info.commandBufferCount = 1;
1502 submit_info.pCommandBuffers = &command_buffer[1];
1503 submit_info.waitSemaphoreCount = 1;
1504 submit_info.pWaitSemaphores = &semaphore;
1505 submit_info.pWaitDstStageMask = flags;
1506 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1507 }
1508
1509 vkQueueWaitIdle(m_device->m_queue);
1510
1511 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1512 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1513 &command_buffer[0]);
1514 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1515
1516 m_errorMonitor->VerifyNotFound();
1517}
1518
1519// This is a positive test. No errors should be generated.
1520TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
1521
1522 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1523 "submitted on separate queues, the second having a fence"
1524 "followed by a QueueWaitIdle.");
1525
Dustin Graves48458142016-04-29 16:11:55 -06001526 if ((m_device->queue_props.empty()) ||
1527 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001528 return;
1529
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001530 m_errorMonitor->ExpectSuccess();
1531
1532 VkFence fence;
1533 VkFenceCreateInfo fence_create_info{};
1534 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1535 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1536
1537 VkSemaphore semaphore;
1538 VkSemaphoreCreateInfo semaphore_create_info{};
1539 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1540 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1541 &semaphore);
1542
1543 VkCommandPool command_pool;
1544 VkCommandPoolCreateInfo pool_create_info{};
1545 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1546 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1547 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1548 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1549 &command_pool);
1550
1551 VkCommandBuffer command_buffer[2];
1552 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1553 command_buffer_allocate_info.sType =
1554 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1555 command_buffer_allocate_info.commandPool = command_pool;
1556 command_buffer_allocate_info.commandBufferCount = 2;
1557 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1558 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1559 command_buffer);
1560
1561 VkQueue queue = VK_NULL_HANDLE;
1562 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1563 1, &queue);
1564
1565 {
1566 VkCommandBufferBeginInfo begin_info{};
1567 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1568 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1569
1570 vkCmdPipelineBarrier(command_buffer[0],
1571 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1572 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1573 0, nullptr, 0, nullptr);
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[0], 0, 1, &viewport);
1583 vkEndCommandBuffer(command_buffer[0]);
1584 }
1585 {
1586 VkCommandBufferBeginInfo begin_info{};
1587 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1588 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1589
1590 VkViewport viewport{};
1591 viewport.maxDepth = 1.0f;
1592 viewport.minDepth = 0.0f;
1593 viewport.width = 512;
1594 viewport.height = 512;
1595 viewport.x = 0;
1596 viewport.y = 0;
1597 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1598 vkEndCommandBuffer(command_buffer[1]);
1599 }
1600 {
1601 VkSubmitInfo submit_info{};
1602 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1603 submit_info.commandBufferCount = 1;
1604 submit_info.pCommandBuffers = &command_buffer[0];
1605 submit_info.signalSemaphoreCount = 1;
1606 submit_info.pSignalSemaphores = &semaphore;
1607 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1608 }
1609 {
1610 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1611 VkSubmitInfo submit_info{};
1612 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1613 submit_info.commandBufferCount = 1;
1614 submit_info.pCommandBuffers = &command_buffer[1];
1615 submit_info.waitSemaphoreCount = 1;
1616 submit_info.pWaitSemaphores = &semaphore;
1617 submit_info.pWaitDstStageMask = flags;
1618 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1619 }
1620
1621 vkQueueWaitIdle(m_device->m_queue);
1622
1623 vkDestroyFence(m_device->device(), fence, nullptr);
1624 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1625 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1626 &command_buffer[0]);
1627 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1628
1629 m_errorMonitor->VerifyNotFound();
1630}
1631
1632// This is a positive test. No errors should be generated.
1633TEST_F(VkLayerTest,
1634 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
1635
1636 TEST_DESCRIPTION(
1637 "Two command buffers, each in a separate QueueSubmit call "
1638 "submitted on separate queues, the second having a fence"
1639 "followed by two consecutive WaitForFences calls on the same fence.");
1640
Dustin Graves48458142016-04-29 16:11:55 -06001641 if ((m_device->queue_props.empty()) ||
1642 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001643 return;
1644
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001645 m_errorMonitor->ExpectSuccess();
1646
1647 VkFence fence;
1648 VkFenceCreateInfo fence_create_info{};
1649 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1650 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1651
1652 VkSemaphore semaphore;
1653 VkSemaphoreCreateInfo semaphore_create_info{};
1654 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1655 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1656 &semaphore);
1657
1658 VkCommandPool command_pool;
1659 VkCommandPoolCreateInfo pool_create_info{};
1660 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1661 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1662 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1663 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1664 &command_pool);
1665
1666 VkCommandBuffer command_buffer[2];
1667 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1668 command_buffer_allocate_info.sType =
1669 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1670 command_buffer_allocate_info.commandPool = command_pool;
1671 command_buffer_allocate_info.commandBufferCount = 2;
1672 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1673 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1674 command_buffer);
1675
1676 VkQueue queue = VK_NULL_HANDLE;
1677 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1678 1, &queue);
1679
1680 {
1681 VkCommandBufferBeginInfo begin_info{};
1682 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1683 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1684
1685 vkCmdPipelineBarrier(command_buffer[0],
1686 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1687 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1688 0, nullptr, 0, nullptr);
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[0], 0, 1, &viewport);
1698 vkEndCommandBuffer(command_buffer[0]);
1699 }
1700 {
1701 VkCommandBufferBeginInfo begin_info{};
1702 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1703 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1704
1705 VkViewport viewport{};
1706 viewport.maxDepth = 1.0f;
1707 viewport.minDepth = 0.0f;
1708 viewport.width = 512;
1709 viewport.height = 512;
1710 viewport.x = 0;
1711 viewport.y = 0;
1712 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1713 vkEndCommandBuffer(command_buffer[1]);
1714 }
1715 {
1716 VkSubmitInfo submit_info{};
1717 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1718 submit_info.commandBufferCount = 1;
1719 submit_info.pCommandBuffers = &command_buffer[0];
1720 submit_info.signalSemaphoreCount = 1;
1721 submit_info.pSignalSemaphores = &semaphore;
1722 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1723 }
1724 {
1725 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1726 VkSubmitInfo submit_info{};
1727 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1728 submit_info.commandBufferCount = 1;
1729 submit_info.pCommandBuffers = &command_buffer[1];
1730 submit_info.waitSemaphoreCount = 1;
1731 submit_info.pWaitSemaphores = &semaphore;
1732 submit_info.pWaitDstStageMask = flags;
1733 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1734 }
1735
1736 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1737 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1738
1739 vkDestroyFence(m_device->device(), fence, nullptr);
1740 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1741 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1742 &command_buffer[0]);
1743 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1744
1745 m_errorMonitor->VerifyNotFound();
1746}
1747
1748// This is a positive test. No errors should be generated.
1749TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
1750
1751 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1752 "submitted on separate queues, the second having a fence, "
1753 "followed by a WaitForFences call.");
1754
Dustin Graves48458142016-04-29 16:11:55 -06001755 if ((m_device->queue_props.empty()) ||
1756 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001757 return;
1758
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001759 m_errorMonitor->ExpectSuccess();
1760
1761 VkFence fence;
1762 VkFenceCreateInfo fence_create_info{};
1763 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1764 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1765
1766 VkSemaphore semaphore;
1767 VkSemaphoreCreateInfo semaphore_create_info{};
1768 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1769 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1770 &semaphore);
1771
1772 VkCommandPool command_pool;
1773 VkCommandPoolCreateInfo pool_create_info{};
1774 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1775 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1776 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1777 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1778 &command_pool);
1779
1780 VkCommandBuffer command_buffer[2];
1781 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1782 command_buffer_allocate_info.sType =
1783 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1784 command_buffer_allocate_info.commandPool = command_pool;
1785 command_buffer_allocate_info.commandBufferCount = 2;
1786 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1787 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1788 command_buffer);
1789
1790 VkQueue queue = VK_NULL_HANDLE;
1791 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1792 1, &queue);
1793
1794
1795 {
1796 VkCommandBufferBeginInfo begin_info{};
1797 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1798 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1799
1800 vkCmdPipelineBarrier(command_buffer[0],
1801 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1802 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1803 0, nullptr, 0, nullptr);
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[0], 0, 1, &viewport);
1813 vkEndCommandBuffer(command_buffer[0]);
1814 }
1815 {
1816 VkCommandBufferBeginInfo begin_info{};
1817 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1818 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1819
1820 VkViewport viewport{};
1821 viewport.maxDepth = 1.0f;
1822 viewport.minDepth = 0.0f;
1823 viewport.width = 512;
1824 viewport.height = 512;
1825 viewport.x = 0;
1826 viewport.y = 0;
1827 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1828 vkEndCommandBuffer(command_buffer[1]);
1829 }
1830 {
1831 VkSubmitInfo submit_info{};
1832 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1833 submit_info.commandBufferCount = 1;
1834 submit_info.pCommandBuffers = &command_buffer[0];
1835 submit_info.signalSemaphoreCount = 1;
1836 submit_info.pSignalSemaphores = &semaphore;
1837 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1838 }
1839 {
1840 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1841 VkSubmitInfo submit_info{};
1842 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1843 submit_info.commandBufferCount = 1;
1844 submit_info.pCommandBuffers = &command_buffer[1];
1845 submit_info.waitSemaphoreCount = 1;
1846 submit_info.pWaitSemaphores = &semaphore;
1847 submit_info.pWaitDstStageMask = flags;
1848 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1849 }
1850
1851 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1852
1853 vkDestroyFence(m_device->device(), fence, nullptr);
1854 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1855 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1856 &command_buffer[0]);
1857 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1858
1859 m_errorMonitor->VerifyNotFound();
1860}
1861
1862// This is a positive test. No errors should be generated.
1863TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
1864
1865 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1866 "on the same queue, sharing a signal/wait semaphore, the "
1867 "second having a fence, "
1868 "followed by a WaitForFences call.");
1869
1870 m_errorMonitor->ExpectSuccess();
1871
1872 VkFence fence;
1873 VkFenceCreateInfo fence_create_info{};
1874 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1875 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1876
1877 VkSemaphore semaphore;
1878 VkSemaphoreCreateInfo semaphore_create_info{};
1879 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1880 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1881 &semaphore);
1882
1883 VkCommandPool command_pool;
1884 VkCommandPoolCreateInfo pool_create_info{};
1885 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1886 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1887 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1888 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1889 &command_pool);
1890
1891 VkCommandBuffer command_buffer[2];
1892 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1893 command_buffer_allocate_info.sType =
1894 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1895 command_buffer_allocate_info.commandPool = command_pool;
1896 command_buffer_allocate_info.commandBufferCount = 2;
1897 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1898 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1899 command_buffer);
1900
1901 {
1902 VkCommandBufferBeginInfo begin_info{};
1903 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1904 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1905
1906 vkCmdPipelineBarrier(command_buffer[0],
1907 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1908 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1909 0, nullptr, 0, nullptr);
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[0], 0, 1, &viewport);
1919 vkEndCommandBuffer(command_buffer[0]);
1920 }
1921 {
1922 VkCommandBufferBeginInfo begin_info{};
1923 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1924 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1925
1926 VkViewport viewport{};
1927 viewport.maxDepth = 1.0f;
1928 viewport.minDepth = 0.0f;
1929 viewport.width = 512;
1930 viewport.height = 512;
1931 viewport.x = 0;
1932 viewport.y = 0;
1933 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1934 vkEndCommandBuffer(command_buffer[1]);
1935 }
1936 {
1937 VkSubmitInfo submit_info{};
1938 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1939 submit_info.commandBufferCount = 1;
1940 submit_info.pCommandBuffers = &command_buffer[0];
1941 submit_info.signalSemaphoreCount = 1;
1942 submit_info.pSignalSemaphores = &semaphore;
1943 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1944 }
1945 {
1946 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1947 VkSubmitInfo submit_info{};
1948 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1949 submit_info.commandBufferCount = 1;
1950 submit_info.pCommandBuffers = &command_buffer[1];
1951 submit_info.waitSemaphoreCount = 1;
1952 submit_info.pWaitSemaphores = &semaphore;
1953 submit_info.pWaitDstStageMask = flags;
1954 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1955 }
1956
1957 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1958
1959 vkDestroyFence(m_device->device(), fence, nullptr);
1960 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1961 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1962 &command_buffer[0]);
1963 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1964
1965 m_errorMonitor->VerifyNotFound();
1966}
1967
1968// This is a positive test. No errors should be generated.
1969TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
1970
1971 TEST_DESCRIPTION(
1972 "Two command buffers, each in a separate QueueSubmit call "
1973 "on the same queue, no fences, followed by a third QueueSubmit with NO "
1974 "SubmitInfos but with a fence, followed by a WaitForFences call.");
1975
1976 m_errorMonitor->ExpectSuccess();
1977
1978 VkFence fence;
1979 VkFenceCreateInfo fence_create_info{};
1980 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1981 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1982
1983 VkCommandPool command_pool;
1984 VkCommandPoolCreateInfo pool_create_info{};
1985 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1986 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1987 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1988 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1989 &command_pool);
1990
1991 VkCommandBuffer command_buffer[2];
1992 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1993 command_buffer_allocate_info.sType =
1994 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1995 command_buffer_allocate_info.commandPool = command_pool;
1996 command_buffer_allocate_info.commandBufferCount = 2;
1997 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1998 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1999 command_buffer);
2000
2001 {
2002 VkCommandBufferBeginInfo begin_info{};
2003 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2004 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2005
2006 vkCmdPipelineBarrier(command_buffer[0],
2007 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2008 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2009 0, nullptr, 0, nullptr);
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[0], 0, 1, &viewport);
2019 vkEndCommandBuffer(command_buffer[0]);
2020 }
2021 {
2022 VkCommandBufferBeginInfo begin_info{};
2023 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2024 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2025
2026 VkViewport viewport{};
2027 viewport.maxDepth = 1.0f;
2028 viewport.minDepth = 0.0f;
2029 viewport.width = 512;
2030 viewport.height = 512;
2031 viewport.x = 0;
2032 viewport.y = 0;
2033 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2034 vkEndCommandBuffer(command_buffer[1]);
2035 }
2036 {
2037 VkSubmitInfo submit_info{};
2038 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2039 submit_info.commandBufferCount = 1;
2040 submit_info.pCommandBuffers = &command_buffer[0];
2041 submit_info.signalSemaphoreCount = 0;
2042 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2043 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2044 }
2045 {
2046 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2047 VkSubmitInfo submit_info{};
2048 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2049 submit_info.commandBufferCount = 1;
2050 submit_info.pCommandBuffers = &command_buffer[1];
2051 submit_info.waitSemaphoreCount = 0;
2052 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2053 submit_info.pWaitDstStageMask = flags;
2054 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2055 }
2056
2057 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
2058
2059 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2060
2061 vkDestroyFence(m_device->device(), fence, nullptr);
2062 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2063 &command_buffer[0]);
2064 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2065
2066 m_errorMonitor->VerifyNotFound();
2067}
2068
2069// This is a positive test. No errors should be generated.
2070TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
2071
2072 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2073 "on the same queue, the second having a fence, followed "
2074 "by a WaitForFences call.");
2075
2076 m_errorMonitor->ExpectSuccess();
2077
2078 VkFence fence;
2079 VkFenceCreateInfo fence_create_info{};
2080 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2081 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2082
2083 VkCommandPool command_pool;
2084 VkCommandPoolCreateInfo pool_create_info{};
2085 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2086 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2087 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2088 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2089 &command_pool);
2090
2091 VkCommandBuffer command_buffer[2];
2092 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2093 command_buffer_allocate_info.sType =
2094 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2095 command_buffer_allocate_info.commandPool = command_pool;
2096 command_buffer_allocate_info.commandBufferCount = 2;
2097 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2098 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2099 command_buffer);
2100
2101 {
2102 VkCommandBufferBeginInfo begin_info{};
2103 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2104 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2105
2106 vkCmdPipelineBarrier(command_buffer[0],
2107 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2108 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2109 0, nullptr, 0, nullptr);
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[0], 0, 1, &viewport);
2119 vkEndCommandBuffer(command_buffer[0]);
2120 }
2121 {
2122 VkCommandBufferBeginInfo begin_info{};
2123 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2124 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2125
2126 VkViewport viewport{};
2127 viewport.maxDepth = 1.0f;
2128 viewport.minDepth = 0.0f;
2129 viewport.width = 512;
2130 viewport.height = 512;
2131 viewport.x = 0;
2132 viewport.y = 0;
2133 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2134 vkEndCommandBuffer(command_buffer[1]);
2135 }
2136 {
2137 VkSubmitInfo submit_info{};
2138 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2139 submit_info.commandBufferCount = 1;
2140 submit_info.pCommandBuffers = &command_buffer[0];
2141 submit_info.signalSemaphoreCount = 0;
2142 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2143 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2144 }
2145 {
2146 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2147 VkSubmitInfo submit_info{};
2148 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2149 submit_info.commandBufferCount = 1;
2150 submit_info.pCommandBuffers = &command_buffer[1];
2151 submit_info.waitSemaphoreCount = 0;
2152 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2153 submit_info.pWaitDstStageMask = flags;
2154 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2155 }
2156
2157 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2158
2159 vkDestroyFence(m_device->device(), fence, nullptr);
2160 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2161 &command_buffer[0]);
2162 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2163
2164 m_errorMonitor->VerifyNotFound();
2165}
2166
2167// This is a positive test. No errors should be generated.
2168TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
2169
2170 TEST_DESCRIPTION(
2171 "Two command buffers each in a separate SubmitInfo sent in a single "
2172 "QueueSubmit call followed by a WaitForFences call.");
2173
2174 m_errorMonitor->ExpectSuccess();
2175
2176 VkFence fence;
2177 VkFenceCreateInfo fence_create_info{};
2178 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2179 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2180
2181 VkSemaphore semaphore;
2182 VkSemaphoreCreateInfo semaphore_create_info{};
2183 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2184 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2185 &semaphore);
2186
2187 VkCommandPool command_pool;
2188 VkCommandPoolCreateInfo pool_create_info{};
2189 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2190 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2191 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2192 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2193 &command_pool);
2194
2195 VkCommandBuffer command_buffer[2];
2196 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2197 command_buffer_allocate_info.sType =
2198 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2199 command_buffer_allocate_info.commandPool = command_pool;
2200 command_buffer_allocate_info.commandBufferCount = 2;
2201 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2202 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2203 command_buffer);
2204
2205 {
2206 VkCommandBufferBeginInfo begin_info{};
2207 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2208 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2209
2210 vkCmdPipelineBarrier(command_buffer[0],
2211 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2212 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2213 0, nullptr, 0, nullptr);
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[0], 0, 1, &viewport);
2223 vkEndCommandBuffer(command_buffer[0]);
2224 }
2225 {
2226 VkCommandBufferBeginInfo begin_info{};
2227 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2228 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2229
2230 VkViewport viewport{};
2231 viewport.maxDepth = 1.0f;
2232 viewport.minDepth = 0.0f;
2233 viewport.width = 512;
2234 viewport.height = 512;
2235 viewport.x = 0;
2236 viewport.y = 0;
2237 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2238 vkEndCommandBuffer(command_buffer[1]);
2239 }
2240 {
2241 VkSubmitInfo submit_info[2];
2242 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2243
2244 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2245 submit_info[0].pNext = NULL;
2246 submit_info[0].commandBufferCount = 1;
2247 submit_info[0].pCommandBuffers = &command_buffer[0];
2248 submit_info[0].signalSemaphoreCount = 1;
2249 submit_info[0].pSignalSemaphores = &semaphore;
2250 submit_info[0].waitSemaphoreCount = 0;
2251 submit_info[0].pWaitSemaphores = NULL;
2252 submit_info[0].pWaitDstStageMask = 0;
2253
2254 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2255 submit_info[1].pNext = NULL;
2256 submit_info[1].commandBufferCount = 1;
2257 submit_info[1].pCommandBuffers = &command_buffer[1];
2258 submit_info[1].waitSemaphoreCount = 1;
2259 submit_info[1].pWaitSemaphores = &semaphore;
2260 submit_info[1].pWaitDstStageMask = flags;
2261 submit_info[1].signalSemaphoreCount = 0;
2262 submit_info[1].pSignalSemaphores = NULL;
2263 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
2264 }
2265
2266 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2267
2268 vkDestroyFence(m_device->device(), fence, nullptr);
2269 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2270 &command_buffer[0]);
2271 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2272
2273 m_errorMonitor->VerifyNotFound();
2274}
2275
Karl Schultz6addd812016-02-02 17:17:23 -07002276TEST_F(VkLayerTest, LineWidthStateNotBound) {
2277 m_errorMonitor->SetDesiredFailureMsg(
2278 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002279 "Dynamic line width state not set for this command buffer");
2280
Karl Schultz6addd812016-02-02 17:17:23 -07002281 TEST_DESCRIPTION("Simple Draw Call that validates failure when a line "
2282 "width state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002283
Karl Schultz6addd812016-02-02 17:17:23 -07002284 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2285 BsoFailLineWidth);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002286
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002287 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002288}
2289
Karl Schultz6addd812016-02-02 17:17:23 -07002290TEST_F(VkLayerTest, DepthBiasStateNotBound) {
2291 m_errorMonitor->SetDesiredFailureMsg(
2292 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002293 "Dynamic depth bias state not set for this command buffer");
2294
Karl Schultz6addd812016-02-02 17:17:23 -07002295 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
2296 "bias state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002297
Karl Schultz6addd812016-02-02 17:17:23 -07002298 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2299 BsoFailDepthBias);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002300
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002301 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002302}
2303
Karl Schultz6addd812016-02-02 17:17:23 -07002304// Disable these two tests until we can sort out how to track multiple layer
2305// errors
2306TEST_F(VkLayerTest, ViewportStateNotBound) {
2307 m_errorMonitor->SetDesiredFailureMsg(
2308 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002309 "Dynamic viewport state not set for this command buffer");
2310
Karl Schultz6addd812016-02-02 17:17:23 -07002311 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
2312 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002313
Karl Schultz6addd812016-02-02 17:17:23 -07002314 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2315 BsoFailViewport);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002316
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002317 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002318}
2319
Karl Schultz6addd812016-02-02 17:17:23 -07002320TEST_F(VkLayerTest, ScissorStateNotBound) {
2321 m_errorMonitor->SetDesiredFailureMsg(
2322 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002323 "Dynamic scissor state not set for this command buffer");
2324
Karl Schultz6addd812016-02-02 17:17:23 -07002325 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
2326 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002327
Karl Schultz6addd812016-02-02 17:17:23 -07002328 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2329 BsoFailScissor);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002330
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002331 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002332}
2333
Karl Schultz6addd812016-02-02 17:17:23 -07002334TEST_F(VkLayerTest, BlendStateNotBound) {
2335 m_errorMonitor->SetDesiredFailureMsg(
2336 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7a1d2352016-03-28 11:18:19 -06002337 "Dynamic blend constants state not set for this command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002338
Karl Schultz6addd812016-02-02 17:17:23 -07002339 TEST_DESCRIPTION("Simple Draw Call that validates failure when a blend "
2340 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002341
Karl Schultz6addd812016-02-02 17:17:23 -07002342 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2343 BsoFailBlend);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002344
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002345 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002346}
2347
Karl Schultz6addd812016-02-02 17:17:23 -07002348TEST_F(VkLayerTest, DepthBoundsStateNotBound) {
2349 m_errorMonitor->SetDesiredFailureMsg(
2350 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002351 "Dynamic depth bounds state not set for this command buffer");
2352
Karl Schultz6addd812016-02-02 17:17:23 -07002353 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
2354 "bounds state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002355
Karl Schultz6addd812016-02-02 17:17:23 -07002356 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2357 BsoFailDepthBounds);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002358
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002359 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002360}
2361
Karl Schultz6addd812016-02-02 17:17:23 -07002362TEST_F(VkLayerTest, StencilReadMaskNotSet) {
2363 m_errorMonitor->SetDesiredFailureMsg(
2364 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002365 "Dynamic stencil read mask state not set for this command buffer");
2366
Tobin Ehlis963a4042015-09-29 08:18:34 -06002367 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002368
Karl Schultz6addd812016-02-02 17:17:23 -07002369 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2370 "read mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002371
Karl Schultz6addd812016-02-02 17:17:23 -07002372 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2373 BsoFailStencilReadMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002374
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002375 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002376}
2377
Karl Schultz6addd812016-02-02 17:17:23 -07002378TEST_F(VkLayerTest, StencilWriteMaskNotSet) {
2379 m_errorMonitor->SetDesiredFailureMsg(
2380 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002381 "Dynamic stencil write mask state not set for this command buffer");
2382
Tobin Ehlis963a4042015-09-29 08:18:34 -06002383 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002384
Karl Schultz6addd812016-02-02 17:17:23 -07002385 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2386 "write mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002387
Karl Schultz6addd812016-02-02 17:17:23 -07002388 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2389 BsoFailStencilWriteMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002390
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002391 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002392}
2393
Karl Schultz6addd812016-02-02 17:17:23 -07002394TEST_F(VkLayerTest, StencilReferenceNotSet) {
2395 m_errorMonitor->SetDesiredFailureMsg(
2396 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002397 "Dynamic stencil reference state not set for this command buffer");
2398
Karl Schultz6addd812016-02-02 17:17:23 -07002399 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2400 "reference is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002401
Karl Schultz6addd812016-02-02 17:17:23 -07002402 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2403 BsoFailStencilReference);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002404
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002405 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002406}
2407
Karl Schultz6addd812016-02-02 17:17:23 -07002408TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002409 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002410
Karl Schultz6addd812016-02-02 17:17:23 -07002411 m_errorMonitor->SetDesiredFailureMsg(
2412 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2413 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
2414 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002415
2416 VkFenceCreateInfo fenceInfo = {};
2417 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2418 fenceInfo.pNext = NULL;
2419 fenceInfo.flags = 0;
2420
2421 ASSERT_NO_FATAL_FAILURE(InitState());
2422 ASSERT_NO_FATAL_FAILURE(InitViewport());
2423 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2424
Karl Schultz6addd812016-02-02 17:17:23 -07002425 // We luck out b/c by default the framework creates CB w/ the
2426 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002427 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002428 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2429 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002430 EndCommandBuffer();
2431
2432 testFence.init(*m_device, fenceInfo);
2433
2434 // Bypass framework since it does the waits automatically
2435 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002436 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002437 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2438 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002439 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002440 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002441 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002442 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002443 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002444 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002445 submit_info.pSignalSemaphores = NULL;
2446
Karl Schultz6addd812016-02-02 17:17:23 -07002447 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
2448 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002449
Karl Schultz6addd812016-02-02 17:17:23 -07002450 // Cause validation error by re-submitting cmd buffer that should only be
2451 // submitted once
2452 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002453
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002454 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002455}
2456
Karl Schultz6addd812016-02-02 17:17:23 -07002457TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002458 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07002459 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002460
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002462 "Unable to allocate 1 descriptors of "
2463 "type "
2464 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002465
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002466 ASSERT_NO_FATAL_FAILURE(InitState());
2467 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002468
Karl Schultz6addd812016-02-02 17:17:23 -07002469 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
2470 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002471 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002472 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2473 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002474
2475 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002476 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2477 ds_pool_ci.pNext = NULL;
2478 ds_pool_ci.flags = 0;
2479 ds_pool_ci.maxSets = 1;
2480 ds_pool_ci.poolSizeCount = 1;
2481 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002482
2483 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002484 err =
2485 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002486 ASSERT_VK_SUCCESS(err);
2487
2488 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002489 dsl_binding.binding = 0;
2490 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2491 dsl_binding.descriptorCount = 1;
2492 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2493 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002494
2495 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002496 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2497 ds_layout_ci.pNext = NULL;
2498 ds_layout_ci.bindingCount = 1;
2499 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002500
2501 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002502 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2503 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002504 ASSERT_VK_SUCCESS(err);
2505
2506 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002507 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002508 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002509 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002510 alloc_info.descriptorPool = ds_pool;
2511 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002512 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2513 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002514
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002515 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002516
Chia-I Wuf7458c52015-10-26 21:10:41 +08002517 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2518 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002519}
2520
Karl Schultz6addd812016-02-02 17:17:23 -07002521TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
2522 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06002523
Karl Schultz6addd812016-02-02 17:17:23 -07002524 m_errorMonitor->SetDesiredFailureMsg(
2525 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2526 "It is invalid to call vkFreeDescriptorSets() with a pool created "
2527 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002528
Tobin Ehlise735c692015-10-08 13:13:50 -06002529 ASSERT_NO_FATAL_FAILURE(InitState());
2530 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06002531
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002532 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002533 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2534 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06002535
2536 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002537 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2538 ds_pool_ci.pNext = NULL;
2539 ds_pool_ci.maxSets = 1;
2540 ds_pool_ci.poolSizeCount = 1;
2541 ds_pool_ci.flags = 0;
2542 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
2543 // app can only call vkResetDescriptorPool on this pool.;
2544 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06002545
2546 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002547 err =
2548 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06002549 ASSERT_VK_SUCCESS(err);
2550
2551 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002552 dsl_binding.binding = 0;
2553 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2554 dsl_binding.descriptorCount = 1;
2555 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2556 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06002557
2558 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002559 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2560 ds_layout_ci.pNext = NULL;
2561 ds_layout_ci.bindingCount = 1;
2562 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06002563
2564 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002565 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2566 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06002567 ASSERT_VK_SUCCESS(err);
2568
2569 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002570 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002571 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002572 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002573 alloc_info.descriptorPool = ds_pool;
2574 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002575 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2576 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06002577 ASSERT_VK_SUCCESS(err);
2578
2579 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002580 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06002581
Chia-I Wuf7458c52015-10-26 21:10:41 +08002582 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2583 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06002584}
2585
Karl Schultz6addd812016-02-02 17:17:23 -07002586TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002587 // Attempt to clear Descriptor Pool with bad object.
2588 // ObjectTracker should catch this.
2589 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2590 "Invalid VkDescriptorPool Object 0xbaad6001");
2591 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
2592 vkResetDescriptorPool(device(), badPool, 0);
2593 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002594}
2595
Karl Schultz6addd812016-02-02 17:17:23 -07002596TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002597 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
2598 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002599 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06002600 // call vkCmdBindDescriptorSets w/ false Descriptor Set
2601 VkDescriptorSet badSet = (VkDescriptorSet)0xbaad6001;
2602 VkResult err;
2603 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2604 "Invalid VkDescriptorSet Object 0xbaad6001");
2605
2606 ASSERT_NO_FATAL_FAILURE(InitState());
2607
2608 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
2609 layout_bindings[0].binding = 0;
2610 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2611 layout_bindings[0].descriptorCount = 1;
2612 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2613 layout_bindings[0].pImmutableSamplers = NULL;
2614
2615 VkDescriptorSetLayout descriptor_set_layout;
2616 VkDescriptorSetLayoutCreateInfo dslci = {};
2617 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2618 dslci.pNext = NULL;
2619 dslci.bindingCount = 1;
2620 dslci.pBindings = layout_bindings;
2621 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002622 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002623
2624 VkPipelineLayout pipeline_layout;
2625 VkPipelineLayoutCreateInfo plci = {};
2626 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2627 plci.pNext = NULL;
2628 plci.setLayoutCount = 1;
2629 plci.pSetLayouts = &descriptor_set_layout;
2630 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002631 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002632
2633 BeginCommandBuffer();
2634 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2635 pipeline_layout, 0, 1, &badSet, 0, NULL);
2636 m_errorMonitor->VerifyFound();
2637 EndCommandBuffer();
2638 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
2639 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002640}
2641
Karl Schultz6addd812016-02-02 17:17:23 -07002642TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002643 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
2644 // ObjectTracker should catch this.
2645 VkDescriptorSetLayout bad_layout = (VkDescriptorSetLayout)0xbaad6001;
2646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2647 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
2648
2649 VkPipelineLayout pipeline_layout;
2650 VkPipelineLayoutCreateInfo plci = {};
2651 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2652 plci.pNext = NULL;
2653 plci.setLayoutCount = 1;
2654 plci.pSetLayouts = &bad_layout;
2655 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
2656
2657 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002658}
2659
Karl Schultz6addd812016-02-02 17:17:23 -07002660TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002661 // Attempt to bind an invalid Pipeline to a valid Command Buffer
2662 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002663 // Create a valid cmd buffer
2664 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultzbdb75952016-04-19 11:36:49 -06002665 VkPipeline bad_pipeline = (VkPipeline)0xbaad6001;
2666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2667 "Invalid VkPipeline Object 0xbaad6001");
2668 ASSERT_NO_FATAL_FAILURE(InitState());
2669 BeginCommandBuffer();
2670 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2671 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
2672 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002673}
2674
Karl Schultz6addd812016-02-02 17:17:23 -07002675TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
2676 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
2677 // CommandBuffer
2678 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002679
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002680 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002681 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002682
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002683 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06002684 ASSERT_NO_FATAL_FAILURE(InitViewport());
2685 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002686 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002687 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2688 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06002689
2690 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002691 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2692 ds_pool_ci.pNext = NULL;
2693 ds_pool_ci.maxSets = 1;
2694 ds_pool_ci.poolSizeCount = 1;
2695 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06002696
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002697 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002698 err =
2699 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002700 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002701
Tony Barboureb254902015-07-15 12:50:33 -06002702 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002703 dsl_binding.binding = 0;
2704 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2705 dsl_binding.descriptorCount = 1;
2706 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2707 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002708
Tony Barboureb254902015-07-15 12:50:33 -06002709 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002710 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2711 ds_layout_ci.pNext = NULL;
2712 ds_layout_ci.bindingCount = 1;
2713 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002714 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002715 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2716 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002717 ASSERT_VK_SUCCESS(err);
2718
2719 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002720 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002721 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002722 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002723 alloc_info.descriptorPool = ds_pool;
2724 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002725 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2726 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002727 ASSERT_VK_SUCCESS(err);
2728
Tony Barboureb254902015-07-15 12:50:33 -06002729 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002730 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2731 pipeline_layout_ci.pNext = NULL;
2732 pipeline_layout_ci.setLayoutCount = 1;
2733 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002734
2735 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002736 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2737 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002738 ASSERT_VK_SUCCESS(err);
2739
Karl Schultz6addd812016-02-02 17:17:23 -07002740 VkShaderObj vs(m_device, bindStateVertShaderText,
2741 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06002742 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07002743 // on more devices
2744 VkShaderObj fs(m_device, bindStateFragShaderText,
2745 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002746
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002747 VkPipelineObj pipe(m_device);
2748 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06002749 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06002750 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002751 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06002752
2753 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002754 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2755 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2756 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2757 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2758 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002759
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002760 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002761
Chia-I Wuf7458c52015-10-26 21:10:41 +08002762 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2763 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2764 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002765}
2766
Karl Schultz6addd812016-02-02 17:17:23 -07002767TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002768 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07002769 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002770
Karl Schultz6addd812016-02-02 17:17:23 -07002771 m_errorMonitor->SetDesiredFailureMsg(
2772 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002773 "Attempt to update descriptor with invalid bufferView ");
2774
2775 ASSERT_NO_FATAL_FAILURE(InitState());
2776 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002777 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2778 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002779
2780 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002781 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2782 ds_pool_ci.pNext = NULL;
2783 ds_pool_ci.maxSets = 1;
2784 ds_pool_ci.poolSizeCount = 1;
2785 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002786
2787 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002788 err =
2789 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002790 ASSERT_VK_SUCCESS(err);
2791
2792 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002793 dsl_binding.binding = 0;
2794 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2795 dsl_binding.descriptorCount = 1;
2796 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2797 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002798
2799 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002800 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2801 ds_layout_ci.pNext = NULL;
2802 ds_layout_ci.bindingCount = 1;
2803 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002804 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002805 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2806 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002807 ASSERT_VK_SUCCESS(err);
2808
2809 VkDescriptorSet descriptorSet;
2810 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002811 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002812 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002813 alloc_info.descriptorPool = ds_pool;
2814 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002815 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2816 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002817 ASSERT_VK_SUCCESS(err);
2818
Karl Schultz6addd812016-02-02 17:17:23 -07002819 VkBufferView view =
2820 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002821 VkWriteDescriptorSet descriptor_write;
2822 memset(&descriptor_write, 0, sizeof(descriptor_write));
2823 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2824 descriptor_write.dstSet = descriptorSet;
2825 descriptor_write.dstBinding = 0;
2826 descriptor_write.descriptorCount = 1;
2827 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2828 descriptor_write.pTexelBufferView = &view;
2829
2830 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2831
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002832 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002833
2834 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2835 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2836}
2837
Karl Schultz6addd812016-02-02 17:17:23 -07002838TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
2839 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
2840 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07002841 // 1. No dynamicOffset supplied
2842 // 2. Too many dynamicOffsets supplied
2843 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07002844 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002845 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002846 " requires 1 dynamicOffsets, but only "
2847 "0 dynamicOffsets are left in "
2848 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002849
2850 ASSERT_NO_FATAL_FAILURE(InitState());
2851 ASSERT_NO_FATAL_FAILURE(InitViewport());
2852 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2853
2854 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002855 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2856 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002857
2858 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002859 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2860 ds_pool_ci.pNext = NULL;
2861 ds_pool_ci.maxSets = 1;
2862 ds_pool_ci.poolSizeCount = 1;
2863 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002864
2865 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002866 err =
2867 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002868 ASSERT_VK_SUCCESS(err);
2869
2870 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002871 dsl_binding.binding = 0;
2872 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2873 dsl_binding.descriptorCount = 1;
2874 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2875 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002876
2877 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002878 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2879 ds_layout_ci.pNext = NULL;
2880 ds_layout_ci.bindingCount = 1;
2881 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002882 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002883 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2884 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002885 ASSERT_VK_SUCCESS(err);
2886
2887 VkDescriptorSet descriptorSet;
2888 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002889 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002890 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002891 alloc_info.descriptorPool = ds_pool;
2892 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002893 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2894 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002895 ASSERT_VK_SUCCESS(err);
2896
2897 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002898 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2899 pipeline_layout_ci.pNext = NULL;
2900 pipeline_layout_ci.setLayoutCount = 1;
2901 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002902
2903 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002904 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2905 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002906 ASSERT_VK_SUCCESS(err);
2907
2908 // Create a buffer to update the descriptor with
2909 uint32_t qfi = 0;
2910 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002911 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2912 buffCI.size = 1024;
2913 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2914 buffCI.queueFamilyIndexCount = 1;
2915 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002916
2917 VkBuffer dyub;
2918 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2919 ASSERT_VK_SUCCESS(err);
2920 // Correctly update descriptor to avoid "NOT_UPDATED" error
2921 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002922 buffInfo.buffer = dyub;
2923 buffInfo.offset = 0;
2924 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002925
2926 VkWriteDescriptorSet descriptor_write;
2927 memset(&descriptor_write, 0, sizeof(descriptor_write));
2928 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2929 descriptor_write.dstSet = descriptorSet;
2930 descriptor_write.dstBinding = 0;
2931 descriptor_write.descriptorCount = 1;
2932 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2933 descriptor_write.pBufferInfo = &buffInfo;
2934
2935 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2936
2937 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002938 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2939 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2940 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002941 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07002942 uint32_t pDynOff[2] = {512, 756};
2943 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07002944 m_errorMonitor->SetDesiredFailureMsg(
2945 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07002946 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07002947 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2948 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2949 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12002950 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07002951 // Finally cause error due to dynamicOffset being too big
Karl Schultz6addd812016-02-02 17:17:23 -07002952 m_errorMonitor->SetDesiredFailureMsg(
2953 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07002954 " from its update, this oversteps its buffer (");
2955 // Create PSO to be used for draw-time errors below
2956 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002957 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002958 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07002959 "out gl_PerVertex { \n"
2960 " vec4 gl_Position;\n"
2961 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002962 "void main(){\n"
2963 " gl_Position = vec4(1);\n"
2964 "}\n";
2965 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002966 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002967 "\n"
2968 "layout(location=0) out vec4 x;\n"
2969 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2970 "void main(){\n"
2971 " x = vec4(bar.y);\n"
2972 "}\n";
2973 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2974 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2975 VkPipelineObj pipe(m_device);
2976 pipe.AddShader(&vs);
2977 pipe.AddShader(&fs);
2978 pipe.AddColorAttachment();
2979 pipe.CreateVKPipeline(pipeline_layout, renderPass());
2980
Karl Schultz6addd812016-02-02 17:17:23 -07002981 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2982 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2983 // This update should succeed, but offset size of 512 will overstep buffer
2984 // /w range 1024 & size 1024
2985 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2986 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2987 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07002988 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002989 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002990
2991 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2992 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2993}
2994
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002995TEST_F(VkLayerTest, InvalidPushConstants) {
2996 // Hit push constant error cases:
2997 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
2998 // 2. Incorrectly set push constant size to 0
2999 // 3. Incorrectly set push constant size to non-multiple of 4
3000 // 4. Attempt push constant update that exceeds maxPushConstantSize
3001 VkResult err;
3002 m_errorMonitor->SetDesiredFailureMsg(
3003 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3004 "vkCreatePipelineLayout() call has push constants with offset ");
3005
3006 ASSERT_NO_FATAL_FAILURE(InitState());
3007 ASSERT_NO_FATAL_FAILURE(InitViewport());
3008 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3009
3010 VkPushConstantRange pc_range = {};
3011 pc_range.size = 0xFFFFFFFFu;
3012 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3013 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3014 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3015 pipeline_layout_ci.pushConstantRangeCount = 1;
3016 pipeline_layout_ci.pPushConstantRanges = &pc_range;
3017
3018 VkPipelineLayout pipeline_layout;
3019 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3020 &pipeline_layout);
3021
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003022 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003023 // Now cause errors due to size 0 and non-4 byte aligned size
3024 pc_range.size = 0;
3025 m_errorMonitor->SetDesiredFailureMsg(
3026 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3027 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
3028 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3029 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003030 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003031 pc_range.size = 1;
3032 m_errorMonitor->SetDesiredFailureMsg(
3033 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3034 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
3035 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3036 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003037 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003038 // Cause error due to bad size in vkCmdPushConstants() call
3039 m_errorMonitor->SetDesiredFailureMsg(
3040 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3041 "vkCmdPushConstants() call has push constants with offset ");
3042 pipeline_layout_ci.pushConstantRangeCount = 0;
3043 pipeline_layout_ci.pPushConstantRanges = NULL;
3044 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3045 &pipeline_layout);
3046 ASSERT_VK_SUCCESS(err);
3047 BeginCommandBuffer();
3048 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
3049 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003050 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003051 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3052}
3053
Karl Schultz6addd812016-02-02 17:17:23 -07003054TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003055 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07003056 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003057
3058 ASSERT_NO_FATAL_FAILURE(InitState());
3059 ASSERT_NO_FATAL_FAILURE(InitViewport());
3060 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3061
3062 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
3063 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003064 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3065 ds_type_count[0].descriptorCount = 10;
3066 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3067 ds_type_count[1].descriptorCount = 2;
3068 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3069 ds_type_count[2].descriptorCount = 2;
3070 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
3071 ds_type_count[3].descriptorCount = 5;
3072 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
3073 // type
3074 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
3075 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
3076 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003077
3078 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003079 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3080 ds_pool_ci.pNext = NULL;
3081 ds_pool_ci.maxSets = 5;
3082 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
3083 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003084
3085 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003086 err =
3087 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003088 ASSERT_VK_SUCCESS(err);
3089
3090 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
3091 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003092 dsl_binding[0].binding = 0;
3093 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3094 dsl_binding[0].descriptorCount = 5;
3095 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
3096 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003097
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003098 // Create layout identical to set0 layout but w/ different stageFlags
3099 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003100 dsl_fs_stage_only.binding = 0;
3101 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3102 dsl_fs_stage_only.descriptorCount = 5;
3103 dsl_fs_stage_only.stageFlags =
3104 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
3105 // bind time
3106 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003107 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003108 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3109 ds_layout_ci.pNext = NULL;
3110 ds_layout_ci.bindingCount = 1;
3111 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003112 static const uint32_t NUM_LAYOUTS = 4;
3113 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003114 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003115 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
3116 // layout for error case
3117 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3118 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003119 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003120 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003121 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3122 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003123 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003124 dsl_binding[0].binding = 0;
3125 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003126 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003127 dsl_binding[1].binding = 1;
3128 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3129 dsl_binding[1].descriptorCount = 2;
3130 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
3131 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003132 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003133 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003134 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3135 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003136 ASSERT_VK_SUCCESS(err);
3137 dsl_binding[0].binding = 0;
3138 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003139 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003140 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07003141 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3142 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003143 ASSERT_VK_SUCCESS(err);
3144 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003145 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003146 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3147 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003148 ASSERT_VK_SUCCESS(err);
3149
3150 static const uint32_t NUM_SETS = 4;
3151 VkDescriptorSet descriptorSet[NUM_SETS] = {};
3152 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003153 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003154 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003155 alloc_info.descriptorPool = ds_pool;
3156 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003157 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3158 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003159 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003160 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003161 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003162 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003163 err =
3164 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003165 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003166
3167 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003168 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3169 pipeline_layout_ci.pNext = NULL;
3170 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
3171 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003172
3173 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003174 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3175 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003176 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003177 // Create pipelineLayout with only one setLayout
3178 pipeline_layout_ci.setLayoutCount = 1;
3179 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003180 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3181 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003182 ASSERT_VK_SUCCESS(err);
3183 // Create pipelineLayout with 2 descriptor setLayout at index 0
3184 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
3185 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07003186 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3187 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003188 ASSERT_VK_SUCCESS(err);
3189 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
3190 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
3191 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07003192 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3193 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003194 ASSERT_VK_SUCCESS(err);
3195 // Create pipelineLayout with UB type, but stageFlags for FS only
3196 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
3197 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003198 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3199 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003200 ASSERT_VK_SUCCESS(err);
3201 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
3202 VkDescriptorSetLayout pl_bad_s0[2] = {};
3203 pl_bad_s0[0] = ds_layout_fs_only;
3204 pl_bad_s0[1] = ds_layout[1];
3205 pipeline_layout_ci.setLayoutCount = 2;
3206 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
3207 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07003208 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3209 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003210 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003211
3212 // Create a buffer to update the descriptor with
3213 uint32_t qfi = 0;
3214 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003215 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3216 buffCI.size = 1024;
3217 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3218 buffCI.queueFamilyIndexCount = 1;
3219 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003220
3221 VkBuffer dyub;
3222 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3223 ASSERT_VK_SUCCESS(err);
3224 // Correctly update descriptor to avoid "NOT_UPDATED" error
3225 static const uint32_t NUM_BUFFS = 5;
3226 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003227 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003228 buffInfo[i].buffer = dyub;
3229 buffInfo[i].offset = 0;
3230 buffInfo[i].range = 1024;
3231 }
Karl Schultz6addd812016-02-02 17:17:23 -07003232 VkImage image;
3233 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3234 const int32_t tex_width = 32;
3235 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003236 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003237 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3238 image_create_info.pNext = NULL;
3239 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3240 image_create_info.format = tex_format;
3241 image_create_info.extent.width = tex_width;
3242 image_create_info.extent.height = tex_height;
3243 image_create_info.extent.depth = 1;
3244 image_create_info.mipLevels = 1;
3245 image_create_info.arrayLayers = 1;
3246 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3247 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3248 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3249 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003250 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3251 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003252
Karl Schultz6addd812016-02-02 17:17:23 -07003253 VkMemoryRequirements memReqs;
3254 VkDeviceMemory imageMem;
3255 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003256 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003257 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3258 memAlloc.pNext = NULL;
3259 memAlloc.allocationSize = 0;
3260 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003261 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
3262 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003263 pass =
3264 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003265 ASSERT_TRUE(pass);
3266 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
3267 ASSERT_VK_SUCCESS(err);
3268 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
3269 ASSERT_VK_SUCCESS(err);
3270
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003271 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003272 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3273 image_view_create_info.image = image;
3274 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
3275 image_view_create_info.format = tex_format;
3276 image_view_create_info.subresourceRange.layerCount = 1;
3277 image_view_create_info.subresourceRange.baseMipLevel = 0;
3278 image_view_create_info.subresourceRange.levelCount = 1;
3279 image_view_create_info.subresourceRange.aspectMask =
3280 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003281
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003282 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07003283 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
3284 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003285 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003286 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003287 imageInfo[0].imageView = view;
3288 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3289 imageInfo[1].imageView = view;
3290 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003291 imageInfo[2].imageView = view;
3292 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3293 imageInfo[3].imageView = view;
3294 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003295
3296 static const uint32_t NUM_SET_UPDATES = 3;
3297 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
3298 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3299 descriptor_write[0].dstSet = descriptorSet[0];
3300 descriptor_write[0].dstBinding = 0;
3301 descriptor_write[0].descriptorCount = 5;
3302 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3303 descriptor_write[0].pBufferInfo = buffInfo;
3304 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3305 descriptor_write[1].dstSet = descriptorSet[1];
3306 descriptor_write[1].dstBinding = 0;
3307 descriptor_write[1].descriptorCount = 2;
3308 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3309 descriptor_write[1].pImageInfo = imageInfo;
3310 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3311 descriptor_write[2].dstSet = descriptorSet[1];
3312 descriptor_write[2].dstBinding = 1;
3313 descriptor_write[2].descriptorCount = 2;
3314 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003315 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003316
3317 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003318
Tobin Ehlis88452832015-12-03 09:40:56 -07003319 // Create PSO to be used for draw-time errors below
3320 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003321 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003322 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003323 "out gl_PerVertex {\n"
3324 " vec4 gl_Position;\n"
3325 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003326 "void main(){\n"
3327 " gl_Position = vec4(1);\n"
3328 "}\n";
3329 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003330 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003331 "\n"
3332 "layout(location=0) out vec4 x;\n"
3333 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3334 "void main(){\n"
3335 " x = vec4(bar.y);\n"
3336 "}\n";
3337 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3338 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003339 VkPipelineObj pipe(m_device);
3340 pipe.AddShader(&vs);
3341 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07003342 pipe.AddColorAttachment();
3343 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07003344
3345 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07003346
Karl Schultz6addd812016-02-02 17:17:23 -07003347 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3348 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3349 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
3350 // of PSO
3351 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
3352 // cmd_pipeline.c
3353 // due to the fact that cmd_alloc_dset_data() has not been called in
3354 // cmd_bind_graphics_pipeline()
3355 // TODO : Want to cause various binding incompatibility issues here to test
3356 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07003357 // First cause various verify_layout_compatibility() fails
3358 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003359 // verify_set_layout_compatibility fail cases:
3360 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07003361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3362 " due to: invalid VkPipelineLayout ");
3363 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3364 VK_PIPELINE_BIND_POINT_GRAPHICS,
3365 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
3366 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003367 m_errorMonitor->VerifyFound();
3368
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003369 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07003370 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3371 " attempting to bind set to index 1");
3372 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3373 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
3374 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003375 m_errorMonitor->VerifyFound();
3376
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003377 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003378 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
3379 // descriptors
3380 m_errorMonitor->SetDesiredFailureMsg(
3381 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003382 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003383 vkCmdBindDescriptorSets(
3384 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3385 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003386 m_errorMonitor->VerifyFound();
3387
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003388 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
3389 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07003390 m_errorMonitor->SetDesiredFailureMsg(
3391 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003392 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07003393 vkCmdBindDescriptorSets(
3394 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3395 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003396 m_errorMonitor->VerifyFound();
3397
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003398 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
3399 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07003400 m_errorMonitor->SetDesiredFailureMsg(
3401 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003402 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003403 vkCmdBindDescriptorSets(
3404 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3405 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003406 m_errorMonitor->VerifyFound();
3407
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003408 // Cause INFO messages due to disturbing previously bound Sets
3409 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07003410 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3411 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3412 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003413 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07003414 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003415 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003416 " previously bound as set #0 was disturbed ");
3417 vkCmdBindDescriptorSets(
3418 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3419 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003420 m_errorMonitor->VerifyFound();
3421
Karl Schultz6addd812016-02-02 17:17:23 -07003422 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3423 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3424 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003425 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003427 " newly bound as set #0 so set #1 and "
3428 "any subsequent sets were disturbed ");
3429 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3430 VK_PIPELINE_BIND_POINT_GRAPHICS,
3431 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003432 m_errorMonitor->VerifyFound();
3433
Tobin Ehlis88452832015-12-03 09:40:56 -07003434 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07003435 // 1. Error due to not binding required set (we actually use same code as
3436 // above to disturb set0)
3437 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3438 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3439 2, &descriptorSet[0], 0, NULL);
3440 vkCmdBindDescriptorSets(
3441 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3442 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
3443 m_errorMonitor->SetDesiredFailureMsg(
3444 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3445 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07003446 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003447 m_errorMonitor->VerifyFound();
3448
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003449 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003450 // 2. Error due to bound set not being compatible with PSO's
3451 // VkPipelineLayout (diff stageFlags in this case)
3452 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3453 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3454 2, &descriptorSet[0], 0, NULL);
3455 m_errorMonitor->SetDesiredFailureMsg(
3456 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3457 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07003458 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003459 m_errorMonitor->VerifyFound();
3460
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003461 // Remaining clean-up
3462 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003463 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003464 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
3465 }
3466 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
3467 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, descriptorSet);
3468 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003469 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3470 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3471}
Tobin Ehlis559c6382015-11-05 09:52:49 -07003472
Karl Schultz6addd812016-02-02 17:17:23 -07003473TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003474
Karl Schultz6addd812016-02-02 17:17:23 -07003475 m_errorMonitor->SetDesiredFailureMsg(
3476 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003477 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003478
3479 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003480 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003481 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003482 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003483
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003484 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003485}
3486
Karl Schultz6addd812016-02-02 17:17:23 -07003487TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
3488 VkResult err;
3489 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003490
Karl Schultz6addd812016-02-02 17:17:23 -07003491 m_errorMonitor->SetDesiredFailureMsg(
3492 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07003493 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003494
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003495 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003496
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003497 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003498 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003499 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003500 cmd.commandPool = m_commandPool;
3501 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003502 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06003503
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003504 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06003505 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003506
3507 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003508 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003509 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003510 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003511 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07003512 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
3513 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003514 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003515
3516 // The error should be caught by validation of the BeginCommandBuffer call
3517 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
3518
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003519 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003520 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003521}
3522
Karl Schultz6addd812016-02-02 17:17:23 -07003523TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003524 // Cause error due to Begin while recording CB
3525 // Then cause 2 errors for attempting to reset CB w/o having
3526 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
3527 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003529 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003530
3531 ASSERT_NO_FATAL_FAILURE(InitState());
3532
3533 // Calls AllocateCommandBuffers
3534 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
3535
Karl Schultz6addd812016-02-02 17:17:23 -07003536 // Force the failure by setting the Renderpass and Framebuffer fields with
3537 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003538 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003539 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003540 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3541 cmd_buf_info.pNext = NULL;
3542 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003543 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003544
3545 // Begin CB to transition to recording state
3546 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
3547 // Can't re-begin. This should trigger error
3548 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003549 m_errorMonitor->VerifyFound();
3550
Karl Schultz6addd812016-02-02 17:17:23 -07003551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3552 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003553 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
3554 // Reset attempt will trigger error due to incorrect CommandPool state
3555 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003556 m_errorMonitor->VerifyFound();
3557
Karl Schultz6addd812016-02-02 17:17:23 -07003558 m_errorMonitor->SetDesiredFailureMsg(
3559 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3560 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003561 // Transition CB to RECORDED state
3562 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
3563 // Now attempting to Begin will implicitly reset, which triggers error
3564 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003565 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003566}
3567
Karl Schultz6addd812016-02-02 17:17:23 -07003568TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003569 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003570 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003571
Karl Schultz6addd812016-02-02 17:17:23 -07003572 m_errorMonitor->SetDesiredFailureMsg(
3573 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003574 "Invalid Pipeline CreateInfo State: Vtx Shader required");
3575
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003576 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003577 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003578
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003579 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003580 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3581 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003582
3583 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003584 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3585 ds_pool_ci.pNext = NULL;
3586 ds_pool_ci.maxSets = 1;
3587 ds_pool_ci.poolSizeCount = 1;
3588 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003589
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003590 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003591 err =
3592 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003593 ASSERT_VK_SUCCESS(err);
3594
Tony Barboureb254902015-07-15 12:50:33 -06003595 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003596 dsl_binding.binding = 0;
3597 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3598 dsl_binding.descriptorCount = 1;
3599 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3600 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003601
Tony Barboureb254902015-07-15 12:50:33 -06003602 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003603 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3604 ds_layout_ci.pNext = NULL;
3605 ds_layout_ci.bindingCount = 1;
3606 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003607
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003608 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003609 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3610 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003611 ASSERT_VK_SUCCESS(err);
3612
3613 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003614 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003615 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003616 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003617 alloc_info.descriptorPool = ds_pool;
3618 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003619 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3620 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003621 ASSERT_VK_SUCCESS(err);
3622
Tony Barboureb254902015-07-15 12:50:33 -06003623 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003624 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3625 pipeline_layout_ci.setLayoutCount = 1;
3626 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003627
3628 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003629 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3630 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003631 ASSERT_VK_SUCCESS(err);
3632
Tobin Ehlise68360f2015-10-01 11:15:13 -06003633 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07003634 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06003635
3636 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003637 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3638 vp_state_ci.scissorCount = 1;
3639 vp_state_ci.pScissors = &sc;
3640 vp_state_ci.viewportCount = 1;
3641 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003642
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003643 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3644 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3645 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3646 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3647 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3648 rs_state_ci.depthClampEnable = VK_FALSE;
3649 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3650 rs_state_ci.depthBiasEnable = VK_FALSE;
3651
Tony Barboureb254902015-07-15 12:50:33 -06003652 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003653 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3654 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003655 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003656 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3657 gp_ci.layout = pipeline_layout;
3658 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06003659
3660 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003661 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3662 pc_ci.initialDataSize = 0;
3663 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003664
3665 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003666 VkPipelineCache pipelineCache;
3667
Karl Schultz6addd812016-02-02 17:17:23 -07003668 err =
3669 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06003670 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003671 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3672 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003673
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003674 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003675
Chia-I Wuf7458c52015-10-26 21:10:41 +08003676 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3677 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3678 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3679 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003680}
Tobin Ehlis912df022015-09-17 08:46:18 -06003681/*// TODO : This test should be good, but needs Tess support in compiler to run
3682TEST_F(VkLayerTest, InvalidPatchControlPoints)
3683{
3684 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06003685 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003686
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003688 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
3689primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003690
Tobin Ehlis912df022015-09-17 08:46:18 -06003691 ASSERT_NO_FATAL_FAILURE(InitState());
3692 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06003693
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003694 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06003695 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003696 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003697
3698 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3699 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3700 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003701 ds_pool_ci.poolSizeCount = 1;
3702 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06003703
3704 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003705 err = vkCreateDescriptorPool(m_device->device(),
3706VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06003707 ASSERT_VK_SUCCESS(err);
3708
3709 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08003710 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06003711 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08003712 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003713 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3714 dsl_binding.pImmutableSamplers = NULL;
3715
3716 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003717 ds_layout_ci.sType =
3718VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003719 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003720 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003721 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06003722
3723 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003724 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3725&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003726 ASSERT_VK_SUCCESS(err);
3727
3728 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07003729 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
3730VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06003731 ASSERT_VK_SUCCESS(err);
3732
3733 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003734 pipeline_layout_ci.sType =
3735VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003736 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003737 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003738 pipeline_layout_ci.pSetLayouts = &ds_layout;
3739
3740 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003741 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3742&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003743 ASSERT_VK_SUCCESS(err);
3744
3745 VkPipelineShaderStageCreateInfo shaderStages[3];
3746 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
3747
Karl Schultz6addd812016-02-02 17:17:23 -07003748 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
3749this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003750 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07003751 VkShaderObj
3752tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
3753this);
3754 VkShaderObj
3755te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
3756this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003757
Karl Schultz6addd812016-02-02 17:17:23 -07003758 shaderStages[0].sType =
3759VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003760 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003761 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003762 shaderStages[1].sType =
3763VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003764 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003765 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003766 shaderStages[2].sType =
3767VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003768 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003769 shaderStages[2].shader = te.handle();
3770
3771 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003772 iaCI.sType =
3773VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08003774 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06003775
3776 VkPipelineTessellationStateCreateInfo tsCI = {};
3777 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
3778 tsCI.patchControlPoints = 0; // This will cause an error
3779
3780 VkGraphicsPipelineCreateInfo gp_ci = {};
3781 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3782 gp_ci.pNext = NULL;
3783 gp_ci.stageCount = 3;
3784 gp_ci.pStages = shaderStages;
3785 gp_ci.pVertexInputState = NULL;
3786 gp_ci.pInputAssemblyState = &iaCI;
3787 gp_ci.pTessellationState = &tsCI;
3788 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003789 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06003790 gp_ci.pMultisampleState = NULL;
3791 gp_ci.pDepthStencilState = NULL;
3792 gp_ci.pColorBlendState = NULL;
3793 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3794 gp_ci.layout = pipeline_layout;
3795 gp_ci.renderPass = renderPass();
3796
3797 VkPipelineCacheCreateInfo pc_ci = {};
3798 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3799 pc_ci.pNext = NULL;
3800 pc_ci.initialSize = 0;
3801 pc_ci.initialData = 0;
3802 pc_ci.maxSize = 0;
3803
3804 VkPipeline pipeline;
3805 VkPipelineCache pipelineCache;
3806
Karl Schultz6addd812016-02-02 17:17:23 -07003807 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
3808&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06003809 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003810 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3811&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06003812
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003813 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003814
Chia-I Wuf7458c52015-10-26 21:10:41 +08003815 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3816 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3817 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3818 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06003819}
3820*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06003821// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07003822TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07003823 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003824
Karl Schultz6addd812016-02-02 17:17:23 -07003825 m_errorMonitor->SetDesiredFailureMsg(
3826 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003827 "Gfx Pipeline viewport count (1) must match scissor count (0).");
3828
Tobin Ehlise68360f2015-10-01 11:15:13 -06003829 ASSERT_NO_FATAL_FAILURE(InitState());
3830 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003831
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003832 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003833 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3834 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003835
3836 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003837 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3838 ds_pool_ci.maxSets = 1;
3839 ds_pool_ci.poolSizeCount = 1;
3840 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003841
3842 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003843 err =
3844 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003845 ASSERT_VK_SUCCESS(err);
3846
3847 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003848 dsl_binding.binding = 0;
3849 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3850 dsl_binding.descriptorCount = 1;
3851 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003852
3853 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003854 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3855 ds_layout_ci.bindingCount = 1;
3856 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003857
3858 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003859 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3860 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003861 ASSERT_VK_SUCCESS(err);
3862
3863 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003864 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003865 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003866 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003867 alloc_info.descriptorPool = ds_pool;
3868 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003869 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3870 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003871 ASSERT_VK_SUCCESS(err);
3872
3873 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003874 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3875 pipeline_layout_ci.setLayoutCount = 1;
3876 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003877
3878 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003879 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3880 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003881 ASSERT_VK_SUCCESS(err);
3882
3883 VkViewport vp = {}; // Just need dummy vp to point to
3884
3885 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003886 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3887 vp_state_ci.scissorCount = 0;
3888 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
3889 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003890
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003891 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3892 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3893 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3894 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3895 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3896 rs_state_ci.depthClampEnable = VK_FALSE;
3897 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3898 rs_state_ci.depthBiasEnable = VK_FALSE;
3899
Cody Northropeb3a6c12015-10-05 14:44:45 -06003900 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003901 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003902
Karl Schultz6addd812016-02-02 17:17:23 -07003903 VkShaderObj vs(m_device, bindStateVertShaderText,
3904 VK_SHADER_STAGE_VERTEX_BIT, this);
3905 VkShaderObj fs(m_device, bindStateFragShaderText,
3906 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003907 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003908 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003909 shaderStages[0] = vs.GetStageCreateInfo();
3910 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003911
3912 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003913 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3914 gp_ci.stageCount = 2;
3915 gp_ci.pStages = shaderStages;
3916 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003917 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003918 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3919 gp_ci.layout = pipeline_layout;
3920 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003921
3922 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003923 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003924
3925 VkPipeline pipeline;
3926 VkPipelineCache pipelineCache;
3927
Karl Schultz6addd812016-02-02 17:17:23 -07003928 err =
3929 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003930 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003931 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3932 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003933
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003934 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003935
Chia-I Wuf7458c52015-10-26 21:10:41 +08003936 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3937 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3938 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3939 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003940}
Karl Schultz6addd812016-02-02 17:17:23 -07003941// Don't set viewport state in PSO. This is an error b/c we always need this
3942// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06003943// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07003944TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06003945 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003946 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003947
Karl Schultz6addd812016-02-02 17:17:23 -07003948 m_errorMonitor->SetDesiredFailureMsg(
3949 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003950 "Gfx Pipeline pViewportState is null. Even if ");
3951
Tobin Ehlise68360f2015-10-01 11:15:13 -06003952 ASSERT_NO_FATAL_FAILURE(InitState());
3953 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003954
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003955 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003956 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3957 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003958
3959 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003960 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3961 ds_pool_ci.maxSets = 1;
3962 ds_pool_ci.poolSizeCount = 1;
3963 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003964
3965 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003966 err =
3967 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003968 ASSERT_VK_SUCCESS(err);
3969
3970 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003971 dsl_binding.binding = 0;
3972 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3973 dsl_binding.descriptorCount = 1;
3974 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003975
3976 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003977 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3978 ds_layout_ci.bindingCount = 1;
3979 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003980
3981 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003982 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3983 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003984 ASSERT_VK_SUCCESS(err);
3985
3986 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003987 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003988 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003989 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003990 alloc_info.descriptorPool = ds_pool;
3991 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003992 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3993 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003994 ASSERT_VK_SUCCESS(err);
3995
3996 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003997 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3998 pipeline_layout_ci.setLayoutCount = 1;
3999 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004000
4001 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004002 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4003 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004004 ASSERT_VK_SUCCESS(err);
4005
4006 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4007 // Set scissor as dynamic to avoid second error
4008 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004009 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4010 dyn_state_ci.dynamicStateCount = 1;
4011 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004012
Cody Northropeb3a6c12015-10-05 14:44:45 -06004013 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004014 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004015
Karl Schultz6addd812016-02-02 17:17:23 -07004016 VkShaderObj vs(m_device, bindStateVertShaderText,
4017 VK_SHADER_STAGE_VERTEX_BIT, this);
4018 VkShaderObj fs(m_device, bindStateFragShaderText,
4019 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004020 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004021 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004022 shaderStages[0] = vs.GetStageCreateInfo();
4023 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004024
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004025
4026 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4027 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4028 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4029 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4030 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4031 rs_state_ci.depthClampEnable = VK_FALSE;
4032 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4033 rs_state_ci.depthBiasEnable = VK_FALSE;
4034
Tobin Ehlise68360f2015-10-01 11:15:13 -06004035 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004036 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4037 gp_ci.stageCount = 2;
4038 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004039 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004040 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
4041 // should cause validation error
4042 gp_ci.pDynamicState = &dyn_state_ci;
4043 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4044 gp_ci.layout = pipeline_layout;
4045 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004046
4047 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004048 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004049
4050 VkPipeline pipeline;
4051 VkPipelineCache pipelineCache;
4052
Karl Schultz6addd812016-02-02 17:17:23 -07004053 err =
4054 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004055 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004056 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4057 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004058
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004059 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004060
Chia-I Wuf7458c52015-10-26 21:10:41 +08004061 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4062 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4063 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4064 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004065}
4066// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07004067// Then run second test where dynamic scissor count doesn't match PSO scissor
4068// count
4069TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
4070 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004071
Karl Schultz6addd812016-02-02 17:17:23 -07004072 m_errorMonitor->SetDesiredFailureMsg(
4073 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004074 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
4075
Tobin Ehlise68360f2015-10-01 11:15:13 -06004076 ASSERT_NO_FATAL_FAILURE(InitState());
4077 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004078
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004079 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004080 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4081 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004082
4083 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004084 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4085 ds_pool_ci.maxSets = 1;
4086 ds_pool_ci.poolSizeCount = 1;
4087 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004088
4089 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004090 err =
4091 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004092 ASSERT_VK_SUCCESS(err);
4093
4094 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004095 dsl_binding.binding = 0;
4096 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4097 dsl_binding.descriptorCount = 1;
4098 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004099
4100 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004101 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4102 ds_layout_ci.bindingCount = 1;
4103 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004104
4105 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004106 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4107 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004108 ASSERT_VK_SUCCESS(err);
4109
4110 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004111 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004112 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004113 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004114 alloc_info.descriptorPool = ds_pool;
4115 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004116 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4117 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004118 ASSERT_VK_SUCCESS(err);
4119
4120 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004121 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4122 pipeline_layout_ci.setLayoutCount = 1;
4123 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004124
4125 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004126 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4127 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004128 ASSERT_VK_SUCCESS(err);
4129
4130 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004131 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4132 vp_state_ci.viewportCount = 1;
4133 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
4134 vp_state_ci.scissorCount = 1;
4135 vp_state_ci.pScissors =
4136 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06004137
4138 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4139 // Set scissor as dynamic to avoid that error
4140 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004141 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4142 dyn_state_ci.dynamicStateCount = 1;
4143 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004144
Cody Northropeb3a6c12015-10-05 14:44:45 -06004145 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004146 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004147
Karl Schultz6addd812016-02-02 17:17:23 -07004148 VkShaderObj vs(m_device, bindStateVertShaderText,
4149 VK_SHADER_STAGE_VERTEX_BIT, this);
4150 VkShaderObj fs(m_device, bindStateFragShaderText,
4151 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004152 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004153 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004154 shaderStages[0] = vs.GetStageCreateInfo();
4155 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004156
Cody Northropf6622dc2015-10-06 10:33:21 -06004157 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4158 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4159 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004160 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004161 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004162 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004163 vi_ci.pVertexAttributeDescriptions = nullptr;
4164
4165 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4166 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4167 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4168
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004169 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004170 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06004171 rs_ci.pNext = nullptr;
4172
Mark Youngc89c6312016-03-31 16:03:20 -06004173 VkPipelineColorBlendAttachmentState att = {};
4174 att.blendEnable = VK_FALSE;
4175 att.colorWriteMask = 0xf;
4176
Cody Northropf6622dc2015-10-06 10:33:21 -06004177 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4178 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4179 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004180 cb_ci.attachmentCount = 1;
4181 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06004182
Tobin Ehlise68360f2015-10-01 11:15:13 -06004183 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004184 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4185 gp_ci.stageCount = 2;
4186 gp_ci.pStages = shaderStages;
4187 gp_ci.pVertexInputState = &vi_ci;
4188 gp_ci.pInputAssemblyState = &ia_ci;
4189 gp_ci.pViewportState = &vp_state_ci;
4190 gp_ci.pRasterizationState = &rs_ci;
4191 gp_ci.pColorBlendState = &cb_ci;
4192 gp_ci.pDynamicState = &dyn_state_ci;
4193 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4194 gp_ci.layout = pipeline_layout;
4195 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004196
4197 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004198 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004199
4200 VkPipeline pipeline;
4201 VkPipelineCache pipelineCache;
4202
Karl Schultz6addd812016-02-02 17:17:23 -07004203 err =
4204 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004205 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004206 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4207 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004208
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004209 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004210
Tobin Ehlisd332f282015-10-02 11:00:56 -06004211 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07004212 // First need to successfully create the PSO from above by setting
4213 // pViewports
4214 m_errorMonitor->SetDesiredFailureMsg(
4215 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4216 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
4217 "scissorCount is 1. These counts must match.");
4218
4219 VkViewport vp = {}; // Just need dummy vp to point to
4220 vp_state_ci.pViewports = &vp;
4221 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4222 &gp_ci, NULL, &pipeline);
4223 ASSERT_VK_SUCCESS(err);
4224 BeginCommandBuffer();
4225 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4226 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4227 VkRect2D scissors[2] = {}; // don't care about data
4228 // Count of 2 doesn't match PSO count of 1
4229 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
4230 Draw(1, 0, 0, 0);
4231
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004232 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004233
4234 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4235 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4236 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4237 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4238}
4239// Create PSO w/o non-zero scissorCount but no scissor data
4240// Then run second test where dynamic viewportCount doesn't match PSO
4241// viewportCount
4242TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
4243 VkResult err;
4244
4245 m_errorMonitor->SetDesiredFailureMsg(
4246 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4247 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
4248
4249 ASSERT_NO_FATAL_FAILURE(InitState());
4250 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4251
4252 VkDescriptorPoolSize ds_type_count = {};
4253 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4254 ds_type_count.descriptorCount = 1;
4255
4256 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4257 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4258 ds_pool_ci.maxSets = 1;
4259 ds_pool_ci.poolSizeCount = 1;
4260 ds_pool_ci.pPoolSizes = &ds_type_count;
4261
4262 VkDescriptorPool ds_pool;
4263 err =
4264 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4265 ASSERT_VK_SUCCESS(err);
4266
4267 VkDescriptorSetLayoutBinding dsl_binding = {};
4268 dsl_binding.binding = 0;
4269 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4270 dsl_binding.descriptorCount = 1;
4271 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4272
4273 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4274 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4275 ds_layout_ci.bindingCount = 1;
4276 ds_layout_ci.pBindings = &dsl_binding;
4277
4278 VkDescriptorSetLayout ds_layout;
4279 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4280 &ds_layout);
4281 ASSERT_VK_SUCCESS(err);
4282
4283 VkDescriptorSet descriptorSet;
4284 VkDescriptorSetAllocateInfo alloc_info = {};
4285 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4286 alloc_info.descriptorSetCount = 1;
4287 alloc_info.descriptorPool = ds_pool;
4288 alloc_info.pSetLayouts = &ds_layout;
4289 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4290 &descriptorSet);
4291 ASSERT_VK_SUCCESS(err);
4292
4293 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4294 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4295 pipeline_layout_ci.setLayoutCount = 1;
4296 pipeline_layout_ci.pSetLayouts = &ds_layout;
4297
4298 VkPipelineLayout pipeline_layout;
4299 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4300 &pipeline_layout);
4301 ASSERT_VK_SUCCESS(err);
4302
4303 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4304 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4305 vp_state_ci.scissorCount = 1;
4306 vp_state_ci.pScissors =
4307 NULL; // Null scissor w/ count of 1 should cause error
4308 vp_state_ci.viewportCount = 1;
4309 vp_state_ci.pViewports =
4310 NULL; // vp is dynamic (below) so this won't cause error
4311
4312 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
4313 // Set scissor as dynamic to avoid that error
4314 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4315 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4316 dyn_state_ci.dynamicStateCount = 1;
4317 dyn_state_ci.pDynamicStates = &vp_state;
4318
4319 VkPipelineShaderStageCreateInfo shaderStages[2];
4320 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4321
4322 VkShaderObj vs(m_device, bindStateVertShaderText,
4323 VK_SHADER_STAGE_VERTEX_BIT, this);
4324 VkShaderObj fs(m_device, bindStateFragShaderText,
4325 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004326 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004327 // but add it to be able to run on more devices
4328 shaderStages[0] = vs.GetStageCreateInfo();
4329 shaderStages[1] = fs.GetStageCreateInfo();
4330
4331 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4332 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4333 vi_ci.pNext = nullptr;
4334 vi_ci.vertexBindingDescriptionCount = 0;
4335 vi_ci.pVertexBindingDescriptions = nullptr;
4336 vi_ci.vertexAttributeDescriptionCount = 0;
4337 vi_ci.pVertexAttributeDescriptions = nullptr;
4338
4339 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4340 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4341 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4342
4343 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4344 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4345 rs_ci.pNext = nullptr;
4346
Mark Youngc89c6312016-03-31 16:03:20 -06004347 VkPipelineColorBlendAttachmentState att = {};
4348 att.blendEnable = VK_FALSE;
4349 att.colorWriteMask = 0xf;
4350
Karl Schultz6addd812016-02-02 17:17:23 -07004351 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4352 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4353 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004354 cb_ci.attachmentCount = 1;
4355 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07004356
4357 VkGraphicsPipelineCreateInfo gp_ci = {};
4358 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4359 gp_ci.stageCount = 2;
4360 gp_ci.pStages = shaderStages;
4361 gp_ci.pVertexInputState = &vi_ci;
4362 gp_ci.pInputAssemblyState = &ia_ci;
4363 gp_ci.pViewportState = &vp_state_ci;
4364 gp_ci.pRasterizationState = &rs_ci;
4365 gp_ci.pColorBlendState = &cb_ci;
4366 gp_ci.pDynamicState = &dyn_state_ci;
4367 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4368 gp_ci.layout = pipeline_layout;
4369 gp_ci.renderPass = renderPass();
4370
4371 VkPipelineCacheCreateInfo pc_ci = {};
4372 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4373
4374 VkPipeline pipeline;
4375 VkPipelineCache pipelineCache;
4376
4377 err =
4378 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4379 ASSERT_VK_SUCCESS(err);
4380 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4381 &gp_ci, NULL, &pipeline);
4382
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004383 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004384
4385 // Now hit second fail case where we set scissor w/ different count than PSO
4386 // First need to successfully create the PSO from above by setting
4387 // pViewports
4388 m_errorMonitor->SetDesiredFailureMsg(
4389 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4390 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
4391 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004392
Tobin Ehlisd332f282015-10-02 11:00:56 -06004393 VkRect2D sc = {}; // Just need dummy vp to point to
4394 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07004395 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4396 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004397 ASSERT_VK_SUCCESS(err);
4398 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004399 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4400 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004401 VkViewport viewports[2] = {}; // don't care about data
4402 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07004403 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004404 Draw(1, 0, 0, 0);
4405
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004406 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004407
Chia-I Wuf7458c52015-10-26 21:10:41 +08004408 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4409 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4410 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4411 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004412}
4413
Mark Young7394fdd2016-03-31 14:56:43 -06004414TEST_F(VkLayerTest, PSOLineWidthInvalid) {
4415 VkResult err;
4416
4417 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004418 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004419
4420 ASSERT_NO_FATAL_FAILURE(InitState());
4421 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4422
4423 VkDescriptorPoolSize ds_type_count = {};
4424 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4425 ds_type_count.descriptorCount = 1;
4426
4427 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4428 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4429 ds_pool_ci.maxSets = 1;
4430 ds_pool_ci.poolSizeCount = 1;
4431 ds_pool_ci.pPoolSizes = &ds_type_count;
4432
4433 VkDescriptorPool ds_pool;
4434 err =
4435 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4436 ASSERT_VK_SUCCESS(err);
4437
4438 VkDescriptorSetLayoutBinding dsl_binding = {};
4439 dsl_binding.binding = 0;
4440 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4441 dsl_binding.descriptorCount = 1;
4442 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4443
4444 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4445 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4446 ds_layout_ci.bindingCount = 1;
4447 ds_layout_ci.pBindings = &dsl_binding;
4448
4449 VkDescriptorSetLayout ds_layout;
4450 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4451 &ds_layout);
4452 ASSERT_VK_SUCCESS(err);
4453
4454 VkDescriptorSet descriptorSet;
4455 VkDescriptorSetAllocateInfo alloc_info = {};
4456 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4457 alloc_info.descriptorSetCount = 1;
4458 alloc_info.descriptorPool = ds_pool;
4459 alloc_info.pSetLayouts = &ds_layout;
4460 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4461 &descriptorSet);
4462 ASSERT_VK_SUCCESS(err);
4463
4464 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4465 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4466 pipeline_layout_ci.setLayoutCount = 1;
4467 pipeline_layout_ci.pSetLayouts = &ds_layout;
4468
4469 VkPipelineLayout pipeline_layout;
4470 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4471 &pipeline_layout);
4472 ASSERT_VK_SUCCESS(err);
4473
4474 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4475 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4476 vp_state_ci.scissorCount = 1;
4477 vp_state_ci.pScissors = NULL;
4478 vp_state_ci.viewportCount = 1;
4479 vp_state_ci.pViewports = NULL;
4480
4481 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
4482 VK_DYNAMIC_STATE_SCISSOR,
4483 VK_DYNAMIC_STATE_LINE_WIDTH};
4484 // Set scissor as dynamic to avoid that error
4485 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4486 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4487 dyn_state_ci.dynamicStateCount = 2;
4488 dyn_state_ci.pDynamicStates = dynamic_states;
4489
4490 VkPipelineShaderStageCreateInfo shaderStages[2];
4491 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4492
4493 VkShaderObj vs(m_device, bindStateVertShaderText,
4494 VK_SHADER_STAGE_VERTEX_BIT, this);
4495 VkShaderObj fs(m_device, bindStateFragShaderText,
4496 VK_SHADER_STAGE_FRAGMENT_BIT,
4497 this); // TODO - We shouldn't need a fragment shader
4498 // but add it to be able to run on more devices
4499 shaderStages[0] = vs.GetStageCreateInfo();
4500 shaderStages[1] = fs.GetStageCreateInfo();
4501
4502 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4503 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4504 vi_ci.pNext = nullptr;
4505 vi_ci.vertexBindingDescriptionCount = 0;
4506 vi_ci.pVertexBindingDescriptions = nullptr;
4507 vi_ci.vertexAttributeDescriptionCount = 0;
4508 vi_ci.pVertexAttributeDescriptions = nullptr;
4509
4510 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4511 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4512 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4513
4514 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4515 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4516 rs_ci.pNext = nullptr;
4517
Mark Young47107952016-05-02 15:59:55 -06004518 // Check too low (line width of -1.0f).
4519 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06004520
4521 VkPipelineColorBlendAttachmentState att = {};
4522 att.blendEnable = VK_FALSE;
4523 att.colorWriteMask = 0xf;
4524
4525 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4526 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4527 cb_ci.pNext = nullptr;
4528 cb_ci.attachmentCount = 1;
4529 cb_ci.pAttachments = &att;
4530
4531 VkGraphicsPipelineCreateInfo gp_ci = {};
4532 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4533 gp_ci.stageCount = 2;
4534 gp_ci.pStages = shaderStages;
4535 gp_ci.pVertexInputState = &vi_ci;
4536 gp_ci.pInputAssemblyState = &ia_ci;
4537 gp_ci.pViewportState = &vp_state_ci;
4538 gp_ci.pRasterizationState = &rs_ci;
4539 gp_ci.pColorBlendState = &cb_ci;
4540 gp_ci.pDynamicState = &dyn_state_ci;
4541 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4542 gp_ci.layout = pipeline_layout;
4543 gp_ci.renderPass = renderPass();
4544
4545 VkPipelineCacheCreateInfo pc_ci = {};
4546 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4547
4548 VkPipeline pipeline;
4549 VkPipelineCache pipelineCache;
4550
4551 err =
4552 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4553 ASSERT_VK_SUCCESS(err);
4554 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4555 &gp_ci, NULL, &pipeline);
4556
4557 m_errorMonitor->VerifyFound();
4558
4559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4560 "Attempt to set lineWidth to 65536");
4561
4562 // Check too high (line width of 65536.0f).
4563 rs_ci.lineWidth = 65536.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
4571 m_errorMonitor->VerifyFound();
4572
4573 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004574 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004575
4576 dyn_state_ci.dynamicStateCount = 3;
4577
4578 rs_ci.lineWidth = 1.0f;
4579
4580 err =
4581 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4582 ASSERT_VK_SUCCESS(err);
4583 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4584 &gp_ci, NULL, &pipeline);
4585 BeginCommandBuffer();
4586 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4587 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4588
4589 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06004590 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06004591 m_errorMonitor->VerifyFound();
4592
4593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4594 "Attempt to set lineWidth to 65536");
4595
4596 // Check too high with dynamic setting.
4597 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
4598 m_errorMonitor->VerifyFound();
4599 EndCommandBuffer();
4600
4601 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4602 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4603 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4604 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4605}
4606
Karl Schultz6addd812016-02-02 17:17:23 -07004607TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004608 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004609 m_errorMonitor->SetDesiredFailureMsg(
4610 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004611 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004612
4613 ASSERT_NO_FATAL_FAILURE(InitState());
4614 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004615
Tony Barbourfe3351b2015-07-28 10:17:20 -06004616 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004617 // Don't care about RenderPass handle b/c error should be flagged before
4618 // that
4619 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
4620 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004621
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004622 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004623}
4624
Karl Schultz6addd812016-02-02 17:17:23 -07004625TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004626 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004627 m_errorMonitor->SetDesiredFailureMsg(
4628 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004629 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004630
4631 ASSERT_NO_FATAL_FAILURE(InitState());
4632 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004633
Tony Barbourfe3351b2015-07-28 10:17:20 -06004634 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004635 // Just create a dummy Renderpass that's non-NULL so we can get to the
4636 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06004637 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004638 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4639 rp_begin.pNext = NULL;
4640 rp_begin.renderPass = renderPass();
4641 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004642
Karl Schultz6addd812016-02-02 17:17:23 -07004643 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
4644 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004645
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004646 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004647}
4648
Karl Schultz6addd812016-02-02 17:17:23 -07004649TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004650 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004651 m_errorMonitor->SetDesiredFailureMsg(
4652 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004653 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004654
4655 ASSERT_NO_FATAL_FAILURE(InitState());
4656 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004657
4658 // Renderpass is started here
4659 BeginCommandBuffer();
4660
4661 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004662 vk_testing::Buffer dstBuffer;
4663 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004664
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004665 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004666
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004667 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004668}
4669
Karl Schultz6addd812016-02-02 17:17:23 -07004670TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004671 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004672 m_errorMonitor->SetDesiredFailureMsg(
4673 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004674 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004675
4676 ASSERT_NO_FATAL_FAILURE(InitState());
4677 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004678
4679 // Renderpass is started here
4680 BeginCommandBuffer();
4681
4682 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004683 vk_testing::Buffer dstBuffer;
4684 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004685
Karl Schultz6addd812016-02-02 17:17:23 -07004686 VkDeviceSize dstOffset = 0;
4687 VkDeviceSize dataSize = 1024;
4688 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004689
Karl Schultz6addd812016-02-02 17:17:23 -07004690 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
4691 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004692
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004693 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004694}
4695
Karl Schultz6addd812016-02-02 17:17:23 -07004696TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004697 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004698 m_errorMonitor->SetDesiredFailureMsg(
4699 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004700 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004701
4702 ASSERT_NO_FATAL_FAILURE(InitState());
4703 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004704
4705 // Renderpass is started here
4706 BeginCommandBuffer();
4707
Michael Lentine0a369f62016-02-03 16:51:46 -06004708 VkClearColorValue clear_color;
4709 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07004710 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
4711 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4712 const int32_t tex_width = 32;
4713 const int32_t tex_height = 32;
4714 VkImageCreateInfo image_create_info = {};
4715 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4716 image_create_info.pNext = NULL;
4717 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4718 image_create_info.format = tex_format;
4719 image_create_info.extent.width = tex_width;
4720 image_create_info.extent.height = tex_height;
4721 image_create_info.extent.depth = 1;
4722 image_create_info.mipLevels = 1;
4723 image_create_info.arrayLayers = 1;
4724 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4725 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4726 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004727
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004728 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004729 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4730 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004731
Karl Schultz6addd812016-02-02 17:17:23 -07004732 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4733 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004734
Karl Schultz6addd812016-02-02 17:17:23 -07004735 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4736 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004737
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004738 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004739}
4740
Karl Schultz6addd812016-02-02 17:17:23 -07004741TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004742 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004743 m_errorMonitor->SetDesiredFailureMsg(
4744 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004745 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004746
4747 ASSERT_NO_FATAL_FAILURE(InitState());
4748 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004749
4750 // Renderpass is started here
4751 BeginCommandBuffer();
4752
4753 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07004754 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004755 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
4756 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4757 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
4758 image_create_info.extent.width = 64;
4759 image_create_info.extent.height = 64;
4760 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4761 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004762
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004763 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004764 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4765 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004766
Karl Schultz6addd812016-02-02 17:17:23 -07004767 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4768 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004769
Karl Schultz6addd812016-02-02 17:17:23 -07004770 vkCmdClearDepthStencilImage(
4771 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4772 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
4773 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004774
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004775 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004776}
4777
Karl Schultz6addd812016-02-02 17:17:23 -07004778TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004779 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004780 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004781
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004783 "vkCmdClearAttachments: This call "
4784 "must be issued inside an active "
4785 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004786
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004787 ASSERT_NO_FATAL_FAILURE(InitState());
4788 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004789
4790 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004791 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004792 ASSERT_VK_SUCCESS(err);
4793
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004794 VkClearAttachment color_attachment;
4795 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4796 color_attachment.clearValue.color.float32[0] = 0;
4797 color_attachment.clearValue.color.float32[1] = 0;
4798 color_attachment.clearValue.color.float32[2] = 0;
4799 color_attachment.clearValue.color.float32[3] = 0;
4800 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004801 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
4802 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
4803 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004804
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004805 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004806}
4807
Karl Schultz9e66a292016-04-21 15:57:51 -06004808TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
4809 // Try to add a buffer memory barrier with no buffer.
4810 m_errorMonitor->SetDesiredFailureMsg(
4811 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4812 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
4813
4814 ASSERT_NO_FATAL_FAILURE(InitState());
4815 BeginCommandBuffer();
4816
4817 VkBufferMemoryBarrier buf_barrier = {};
4818 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
4819 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4820 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4821 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4822 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4823 buf_barrier.buffer = VK_NULL_HANDLE;
4824 buf_barrier.offset = 0;
4825 buf_barrier.size = VK_WHOLE_SIZE;
4826 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4827 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
4828 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
4829
4830 m_errorMonitor->VerifyFound();
4831}
4832
Karl Schultz6addd812016-02-02 17:17:23 -07004833TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004834 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004835 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004836
Karl Schultz6addd812016-02-02 17:17:23 -07004837 m_errorMonitor->SetDesiredFailureMsg(
4838 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004839 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
4840
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004841 ASSERT_NO_FATAL_FAILURE(InitState());
4842 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004843 uint32_t qfi = 0;
4844 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004845 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4846 buffCI.size = 1024;
4847 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
4848 buffCI.queueFamilyIndexCount = 1;
4849 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004850
4851 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004852 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004853 ASSERT_VK_SUCCESS(err);
4854
4855 BeginCommandBuffer();
4856 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004857 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4858 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004859 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07004860 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
4861 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004862
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004863 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004864
Chia-I Wuf7458c52015-10-26 21:10:41 +08004865 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004866}
4867
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004868TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
4869 // Create an out-of-range queueFamilyIndex
4870 m_errorMonitor->SetDesiredFailureMsg(
4871 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06004872 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004873
4874 ASSERT_NO_FATAL_FAILURE(InitState());
4875 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4876 VkBufferCreateInfo buffCI = {};
4877 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4878 buffCI.size = 1024;
4879 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
4880 buffCI.queueFamilyIndexCount = 1;
4881 // Introduce failure by specifying invalid queue_family_index
4882 uint32_t qfi = 777;
4883 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06004884 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004885
4886 VkBuffer ib;
4887 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
4888
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004889 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004890}
4891
Karl Schultz6addd812016-02-02 17:17:23 -07004892TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
4893 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
4894 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004895
Karl Schultz6addd812016-02-02 17:17:23 -07004896 m_errorMonitor->SetDesiredFailureMsg(
4897 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004898 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004899
4900 ASSERT_NO_FATAL_FAILURE(InitState());
4901 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004902
4903 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004904 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004905 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
4906 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004907
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004908 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004909}
4910
Karl Schultz6addd812016-02-02 17:17:23 -07004911TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004912 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07004913 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004914
Karl Schultz6addd812016-02-02 17:17:23 -07004915 m_errorMonitor->SetDesiredFailureMsg(
4916 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Write descriptor update has descriptor "
4917 "type VK_DESCRIPTOR_TYPE_SAMPLER that "
4918 "does not match ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004919
Tobin Ehlis3b780662015-05-28 12:11:26 -06004920 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004921 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004922 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004923 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4924 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004925
4926 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004927 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4928 ds_pool_ci.pNext = NULL;
4929 ds_pool_ci.maxSets = 1;
4930 ds_pool_ci.poolSizeCount = 1;
4931 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004932
Tobin Ehlis3b780662015-05-28 12:11:26 -06004933 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004934 err =
4935 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004936 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06004937 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004938 dsl_binding.binding = 0;
4939 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4940 dsl_binding.descriptorCount = 1;
4941 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4942 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004943
Tony Barboureb254902015-07-15 12:50:33 -06004944 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004945 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4946 ds_layout_ci.pNext = NULL;
4947 ds_layout_ci.bindingCount = 1;
4948 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004949
Tobin Ehlis3b780662015-05-28 12:11:26 -06004950 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004951 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4952 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004953 ASSERT_VK_SUCCESS(err);
4954
4955 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004956 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004957 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004958 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004959 alloc_info.descriptorPool = ds_pool;
4960 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004961 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4962 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004963 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004964
Tony Barboureb254902015-07-15 12:50:33 -06004965 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004966 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4967 sampler_ci.pNext = NULL;
4968 sampler_ci.magFilter = VK_FILTER_NEAREST;
4969 sampler_ci.minFilter = VK_FILTER_NEAREST;
4970 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4971 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4972 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4973 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4974 sampler_ci.mipLodBias = 1.0;
4975 sampler_ci.anisotropyEnable = VK_FALSE;
4976 sampler_ci.maxAnisotropy = 1;
4977 sampler_ci.compareEnable = VK_FALSE;
4978 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4979 sampler_ci.minLod = 1.0;
4980 sampler_ci.maxLod = 1.0;
4981 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4982 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Mark Lobodzinski52ac6582015-09-01 15:42:56 -06004983
Tobin Ehlis3b780662015-05-28 12:11:26 -06004984 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004985 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004986 ASSERT_VK_SUCCESS(err);
4987
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004988 VkDescriptorImageInfo info = {};
4989 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004990
4991 VkWriteDescriptorSet descriptor_write;
4992 memset(&descriptor_write, 0, sizeof(descriptor_write));
4993 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004994 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004995 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004996 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004997 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004998 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004999
5000 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5001
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005002 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005003
Chia-I Wuf7458c52015-10-26 21:10:41 +08005004 vkDestroySampler(m_device->device(), sampler, NULL);
5005 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5006 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005007}
5008
Karl Schultz6addd812016-02-02 17:17:23 -07005009TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005010 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07005011 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005012
Karl Schultz6addd812016-02-02 17:17:23 -07005013 m_errorMonitor->SetDesiredFailureMsg(
5014 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Descriptor update type of "
5015 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET "
5016 "is out of bounds for matching binding");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005017
Tobin Ehlis3b780662015-05-28 12:11:26 -06005018 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005019 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005020 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005021 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5022 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005023
5024 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005025 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5026 ds_pool_ci.pNext = NULL;
5027 ds_pool_ci.maxSets = 1;
5028 ds_pool_ci.poolSizeCount = 1;
5029 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005030
Tobin Ehlis3b780662015-05-28 12:11:26 -06005031 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005032 err =
5033 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005034 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005035
Tony Barboureb254902015-07-15 12:50:33 -06005036 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005037 dsl_binding.binding = 0;
5038 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5039 dsl_binding.descriptorCount = 1;
5040 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5041 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005042
5043 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005044 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5045 ds_layout_ci.pNext = NULL;
5046 ds_layout_ci.bindingCount = 1;
5047 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005048
Tobin Ehlis3b780662015-05-28 12:11:26 -06005049 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005050 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5051 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005052 ASSERT_VK_SUCCESS(err);
5053
5054 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005055 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005056 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005057 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005058 alloc_info.descriptorPool = ds_pool;
5059 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005060 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5061 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005062 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005063
Tony Barboureb254902015-07-15 12:50:33 -06005064 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005065 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5066 sampler_ci.pNext = NULL;
5067 sampler_ci.magFilter = VK_FILTER_NEAREST;
5068 sampler_ci.minFilter = VK_FILTER_NEAREST;
5069 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5070 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5071 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5072 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5073 sampler_ci.mipLodBias = 1.0;
5074 sampler_ci.anisotropyEnable = VK_FALSE;
5075 sampler_ci.maxAnisotropy = 1;
5076 sampler_ci.compareEnable = VK_FALSE;
5077 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5078 sampler_ci.minLod = 1.0;
5079 sampler_ci.maxLod = 1.0;
5080 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5081 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005082
Tobin Ehlis3b780662015-05-28 12:11:26 -06005083 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005084 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005085 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005086
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005087 VkDescriptorImageInfo info = {};
5088 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005089
5090 VkWriteDescriptorSet descriptor_write;
5091 memset(&descriptor_write, 0, sizeof(descriptor_write));
5092 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005093 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005094 descriptor_write.dstArrayElement =
5095 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08005096 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005097 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005098 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005099 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005100
5101 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5102
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005103 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005104
Chia-I Wuf7458c52015-10-26 21:10:41 +08005105 vkDestroySampler(m_device->device(), sampler, NULL);
5106 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5107 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005108}
5109
Karl Schultz6addd812016-02-02 17:17:23 -07005110TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
5111 // Create layout w/ count of 1 and attempt update to that layout w/ binding
5112 // index 2
5113 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005114
Karl Schultz6addd812016-02-02 17:17:23 -07005115 m_errorMonitor->SetDesiredFailureMsg(
5116 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005117 " does not have binding to match update binding ");
5118
Tobin Ehlis3b780662015-05-28 12:11:26 -06005119 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005120 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005121 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005122 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5123 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005124
5125 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005126 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5127 ds_pool_ci.pNext = NULL;
5128 ds_pool_ci.maxSets = 1;
5129 ds_pool_ci.poolSizeCount = 1;
5130 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005131
Tobin Ehlis3b780662015-05-28 12:11:26 -06005132 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005133 err =
5134 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005135 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005136
Tony Barboureb254902015-07-15 12:50:33 -06005137 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005138 dsl_binding.binding = 0;
5139 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5140 dsl_binding.descriptorCount = 1;
5141 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5142 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005143
5144 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005145 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5146 ds_layout_ci.pNext = NULL;
5147 ds_layout_ci.bindingCount = 1;
5148 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005149 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005150 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5151 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005152 ASSERT_VK_SUCCESS(err);
5153
5154 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005155 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005156 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005157 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005158 alloc_info.descriptorPool = ds_pool;
5159 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005160 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5161 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005162 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005163
Tony Barboureb254902015-07-15 12:50:33 -06005164 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005165 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5166 sampler_ci.pNext = NULL;
5167 sampler_ci.magFilter = VK_FILTER_NEAREST;
5168 sampler_ci.minFilter = VK_FILTER_NEAREST;
5169 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5170 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5171 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5172 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5173 sampler_ci.mipLodBias = 1.0;
5174 sampler_ci.anisotropyEnable = VK_FALSE;
5175 sampler_ci.maxAnisotropy = 1;
5176 sampler_ci.compareEnable = VK_FALSE;
5177 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5178 sampler_ci.minLod = 1.0;
5179 sampler_ci.maxLod = 1.0;
5180 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5181 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005182
Tobin Ehlis3b780662015-05-28 12:11:26 -06005183 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005184 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005185 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005186
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005187 VkDescriptorImageInfo info = {};
5188 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005189
5190 VkWriteDescriptorSet descriptor_write;
5191 memset(&descriptor_write, 0, sizeof(descriptor_write));
5192 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005193 descriptor_write.dstSet = descriptorSet;
5194 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005195 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005196 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005197 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005198 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005199
5200 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5201
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005202 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005203
Chia-I Wuf7458c52015-10-26 21:10:41 +08005204 vkDestroySampler(m_device->device(), sampler, NULL);
5205 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5206 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005207}
5208
Karl Schultz6addd812016-02-02 17:17:23 -07005209TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
5210 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
5211 // types
5212 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005213
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005214 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005215 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005216
Tobin Ehlis3b780662015-05-28 12:11:26 -06005217 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005218
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005219 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005220 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5221 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005222
5223 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005224 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5225 ds_pool_ci.pNext = NULL;
5226 ds_pool_ci.maxSets = 1;
5227 ds_pool_ci.poolSizeCount = 1;
5228 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005229
Tobin Ehlis3b780662015-05-28 12:11:26 -06005230 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005231 err =
5232 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005233 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005234 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005235 dsl_binding.binding = 0;
5236 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5237 dsl_binding.descriptorCount = 1;
5238 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5239 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005240
Tony Barboureb254902015-07-15 12:50:33 -06005241 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005242 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5243 ds_layout_ci.pNext = NULL;
5244 ds_layout_ci.bindingCount = 1;
5245 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005246
Tobin Ehlis3b780662015-05-28 12:11:26 -06005247 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005248 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5249 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005250 ASSERT_VK_SUCCESS(err);
5251
5252 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005253 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005254 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005255 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005256 alloc_info.descriptorPool = ds_pool;
5257 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005258 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5259 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005260 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005261
Tony Barboureb254902015-07-15 12:50:33 -06005262 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005263 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5264 sampler_ci.pNext = NULL;
5265 sampler_ci.magFilter = VK_FILTER_NEAREST;
5266 sampler_ci.minFilter = VK_FILTER_NEAREST;
5267 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5268 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5269 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5270 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5271 sampler_ci.mipLodBias = 1.0;
5272 sampler_ci.anisotropyEnable = VK_FALSE;
5273 sampler_ci.maxAnisotropy = 1;
5274 sampler_ci.compareEnable = VK_FALSE;
5275 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5276 sampler_ci.minLod = 1.0;
5277 sampler_ci.maxLod = 1.0;
5278 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5279 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005280 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005281 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005282 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005283
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005284 VkDescriptorImageInfo info = {};
5285 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005286
5287 VkWriteDescriptorSet descriptor_write;
5288 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07005289 descriptor_write.sType =
5290 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005291 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005292 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005293 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005294 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005295 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005296
5297 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5298
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005299 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005300
Chia-I Wuf7458c52015-10-26 21:10:41 +08005301 vkDestroySampler(m_device->device(), sampler, NULL);
5302 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5303 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005304}
5305
Karl Schultz6addd812016-02-02 17:17:23 -07005306TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005307 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07005308 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005309
Karl Schultz6addd812016-02-02 17:17:23 -07005310 m_errorMonitor->SetDesiredFailureMsg(
5311 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005312 "Attempt to update descriptor with invalid sampler 0xbaadbeef");
5313
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005314 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005315 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
5316 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005317 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005318 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
5319 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005320
5321 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005322 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5323 ds_pool_ci.pNext = NULL;
5324 ds_pool_ci.maxSets = 1;
5325 ds_pool_ci.poolSizeCount = 1;
5326 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005327
5328 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005329 err =
5330 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005331 ASSERT_VK_SUCCESS(err);
5332
5333 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005334 dsl_binding.binding = 0;
5335 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5336 dsl_binding.descriptorCount = 1;
5337 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5338 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005339
5340 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005341 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5342 ds_layout_ci.pNext = NULL;
5343 ds_layout_ci.bindingCount = 1;
5344 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005345 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005346 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5347 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005348 ASSERT_VK_SUCCESS(err);
5349
5350 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005351 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005352 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005353 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005354 alloc_info.descriptorPool = ds_pool;
5355 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005356 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5357 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005358 ASSERT_VK_SUCCESS(err);
5359
Karl Schultz6addd812016-02-02 17:17:23 -07005360 VkSampler sampler =
5361 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005362
5363 VkDescriptorImageInfo descriptor_info;
5364 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5365 descriptor_info.sampler = sampler;
5366
5367 VkWriteDescriptorSet descriptor_write;
5368 memset(&descriptor_write, 0, sizeof(descriptor_write));
5369 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005370 descriptor_write.dstSet = descriptorSet;
5371 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005372 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005373 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5374 descriptor_write.pImageInfo = &descriptor_info;
5375
5376 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5377
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005378 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005379
Chia-I Wuf7458c52015-10-26 21:10:41 +08005380 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5381 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005382}
5383
Karl Schultz6addd812016-02-02 17:17:23 -07005384TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
5385 // Create a single combined Image/Sampler descriptor and send it an invalid
5386 // imageView
5387 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005388
Karl Schultz6addd812016-02-02 17:17:23 -07005389 m_errorMonitor->SetDesiredFailureMsg(
5390 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005391 "Attempt to update descriptor with invalid imageView 0xbaadbeef");
5392
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005393 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005394 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005395 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5396 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005397
5398 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005399 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5400 ds_pool_ci.pNext = NULL;
5401 ds_pool_ci.maxSets = 1;
5402 ds_pool_ci.poolSizeCount = 1;
5403 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005404
5405 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005406 err =
5407 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005408 ASSERT_VK_SUCCESS(err);
5409
5410 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005411 dsl_binding.binding = 0;
5412 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5413 dsl_binding.descriptorCount = 1;
5414 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5415 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005416
5417 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005418 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5419 ds_layout_ci.pNext = NULL;
5420 ds_layout_ci.bindingCount = 1;
5421 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005422 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005423 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5424 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005425 ASSERT_VK_SUCCESS(err);
5426
5427 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005428 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005429 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005430 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005431 alloc_info.descriptorPool = ds_pool;
5432 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005433 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5434 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005435 ASSERT_VK_SUCCESS(err);
5436
5437 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005438 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5439 sampler_ci.pNext = NULL;
5440 sampler_ci.magFilter = VK_FILTER_NEAREST;
5441 sampler_ci.minFilter = VK_FILTER_NEAREST;
5442 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5443 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5444 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5445 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5446 sampler_ci.mipLodBias = 1.0;
5447 sampler_ci.anisotropyEnable = VK_FALSE;
5448 sampler_ci.maxAnisotropy = 1;
5449 sampler_ci.compareEnable = VK_FALSE;
5450 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5451 sampler_ci.minLod = 1.0;
5452 sampler_ci.maxLod = 1.0;
5453 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5454 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005455
5456 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005457 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005458 ASSERT_VK_SUCCESS(err);
5459
Karl Schultz6addd812016-02-02 17:17:23 -07005460 VkImageView view =
5461 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005462
5463 VkDescriptorImageInfo descriptor_info;
5464 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5465 descriptor_info.sampler = sampler;
5466 descriptor_info.imageView = view;
5467
5468 VkWriteDescriptorSet descriptor_write;
5469 memset(&descriptor_write, 0, sizeof(descriptor_write));
5470 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005471 descriptor_write.dstSet = descriptorSet;
5472 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005473 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005474 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5475 descriptor_write.pImageInfo = &descriptor_info;
5476
5477 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5478
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005479 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005480
Chia-I Wuf7458c52015-10-26 21:10:41 +08005481 vkDestroySampler(m_device->device(), sampler, NULL);
5482 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5483 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005484}
5485
Karl Schultz6addd812016-02-02 17:17:23 -07005486TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
5487 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
5488 // into the other
5489 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005490
Karl Schultz6addd812016-02-02 17:17:23 -07005491 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06005492 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5493 "Copy descriptor update index 0, has src update descriptor "
5494 "type VK_DESCRIPTOR_TYPE_SAMPLER that does not match overlapping "
5495 "dest ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005496
Tobin Ehlis04356f92015-10-27 16:35:27 -06005497 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005498 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005499 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005500 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5501 ds_type_count[0].descriptorCount = 1;
5502 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
5503 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005504
5505 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005506 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5507 ds_pool_ci.pNext = NULL;
5508 ds_pool_ci.maxSets = 1;
5509 ds_pool_ci.poolSizeCount = 2;
5510 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005511
5512 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005513 err =
5514 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005515 ASSERT_VK_SUCCESS(err);
5516 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005517 dsl_binding[0].binding = 0;
5518 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5519 dsl_binding[0].descriptorCount = 1;
5520 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
5521 dsl_binding[0].pImmutableSamplers = NULL;
5522 dsl_binding[1].binding = 1;
5523 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5524 dsl_binding[1].descriptorCount = 1;
5525 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
5526 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005527
5528 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005529 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5530 ds_layout_ci.pNext = NULL;
5531 ds_layout_ci.bindingCount = 2;
5532 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005533
5534 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005535 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5536 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005537 ASSERT_VK_SUCCESS(err);
5538
5539 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005540 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005541 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005542 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005543 alloc_info.descriptorPool = ds_pool;
5544 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005545 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5546 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005547 ASSERT_VK_SUCCESS(err);
5548
5549 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005550 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5551 sampler_ci.pNext = NULL;
5552 sampler_ci.magFilter = VK_FILTER_NEAREST;
5553 sampler_ci.minFilter = VK_FILTER_NEAREST;
5554 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5555 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5556 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5557 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5558 sampler_ci.mipLodBias = 1.0;
5559 sampler_ci.anisotropyEnable = VK_FALSE;
5560 sampler_ci.maxAnisotropy = 1;
5561 sampler_ci.compareEnable = VK_FALSE;
5562 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5563 sampler_ci.minLod = 1.0;
5564 sampler_ci.maxLod = 1.0;
5565 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5566 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005567
5568 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005569 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005570 ASSERT_VK_SUCCESS(err);
5571
5572 VkDescriptorImageInfo info = {};
5573 info.sampler = sampler;
5574
5575 VkWriteDescriptorSet descriptor_write;
5576 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
5577 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005578 descriptor_write.dstSet = descriptorSet;
5579 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08005580 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005581 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5582 descriptor_write.pImageInfo = &info;
5583 // This write update should succeed
5584 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5585 // Now perform a copy update that fails due to type mismatch
5586 VkCopyDescriptorSet copy_ds_update;
5587 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5588 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5589 copy_ds_update.srcSet = descriptorSet;
5590 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005591 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005592 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
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();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005597 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005598 m_errorMonitor->SetDesiredFailureMsg(
5599 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005600 "Copy descriptor update 0 has srcBinding 3 which is out of bounds ");
Tobin Ehlis04356f92015-10-27 16:35:27 -06005601 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5602 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5603 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005604 copy_ds_update.srcBinding =
5605 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005606 copy_ds_update.dstSet = descriptorSet;
5607 copy_ds_update.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005608 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005609 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5610
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005611 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005612
Tobin Ehlis04356f92015-10-27 16:35:27 -06005613 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005614 m_errorMonitor->SetDesiredFailureMsg(
5615 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005616 "Copy descriptor src update is out of bounds for matching binding 1 ");
5617
Tobin Ehlis04356f92015-10-27 16:35:27 -06005618 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5619 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5620 copy_ds_update.srcSet = descriptorSet;
5621 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005622 copy_ds_update.dstSet = descriptorSet;
5623 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005624 copy_ds_update.descriptorCount =
5625 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06005626 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5627
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005628 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005629
Chia-I Wuf7458c52015-10-26 21:10:41 +08005630 vkDestroySampler(m_device->device(), sampler, NULL);
5631 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5632 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005633}
5634
Karl Schultz6addd812016-02-02 17:17:23 -07005635TEST_F(VkLayerTest, NumSamplesMismatch) {
5636 // Create CommandBuffer where MSAA samples doesn't match RenderPass
5637 // sampleCount
5638 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005639
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005640 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005641 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005642
Tobin Ehlis3b780662015-05-28 12:11:26 -06005643 ASSERT_NO_FATAL_FAILURE(InitState());
5644 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005645 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06005646 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005647 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005648
5649 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005650 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5651 ds_pool_ci.pNext = NULL;
5652 ds_pool_ci.maxSets = 1;
5653 ds_pool_ci.poolSizeCount = 1;
5654 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005655
Tobin Ehlis3b780662015-05-28 12:11:26 -06005656 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005657 err =
5658 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005659 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005660
Tony Barboureb254902015-07-15 12:50:33 -06005661 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08005662 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06005663 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08005664 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005665 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5666 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005667
Tony Barboureb254902015-07-15 12:50:33 -06005668 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5669 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5670 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005671 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07005672 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005673
Tobin Ehlis3b780662015-05-28 12:11:26 -06005674 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005675 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5676 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005677 ASSERT_VK_SUCCESS(err);
5678
5679 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005680 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005681 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005682 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005683 alloc_info.descriptorPool = ds_pool;
5684 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005685 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5686 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005687 ASSERT_VK_SUCCESS(err);
5688
Tony Barboureb254902015-07-15 12:50:33 -06005689 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005690 pipe_ms_state_ci.sType =
5691 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5692 pipe_ms_state_ci.pNext = NULL;
5693 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5694 pipe_ms_state_ci.sampleShadingEnable = 0;
5695 pipe_ms_state_ci.minSampleShading = 1.0;
5696 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005697
Tony Barboureb254902015-07-15 12:50:33 -06005698 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005699 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5700 pipeline_layout_ci.pNext = NULL;
5701 pipeline_layout_ci.setLayoutCount = 1;
5702 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005703
5704 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005705 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5706 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005707 ASSERT_VK_SUCCESS(err);
5708
Karl Schultz6addd812016-02-02 17:17:23 -07005709 VkShaderObj vs(m_device, bindStateVertShaderText,
5710 VK_SHADER_STAGE_VERTEX_BIT, this);
5711 VkShaderObj fs(m_device, bindStateFragShaderText,
5712 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005713 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005714 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005715 VkPipelineObj pipe(m_device);
5716 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005717 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005718 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005719 pipe.SetMSAA(&pipe_ms_state_ci);
5720 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005721
Tony Barbourfe3351b2015-07-28 10:17:20 -06005722 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005723 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5724 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005725
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005726 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005727
Chia-I Wuf7458c52015-10-26 21:10:41 +08005728 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5729 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5730 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005731}
Tobin Ehlis0f10db52016-04-04 10:00:21 -06005732#ifdef ADD_BACK_IN_WHEN_CHECK_IS_BACK // TODO : Re-enable when GH256 fixed
Mark Youngc89c6312016-03-31 16:03:20 -06005733TEST_F(VkLayerTest, NumBlendAttachMismatch) {
5734 // Create Pipeline where the number of blend attachments doesn't match the
5735 // number of color attachments. In this case, we don't add any color
5736 // blend attachments even though we have a color attachment.
5737 VkResult err;
5738
5739 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5740 "Mismatch between blend state attachment");
5741
5742 ASSERT_NO_FATAL_FAILURE(InitState());
5743 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5744 VkDescriptorPoolSize ds_type_count = {};
5745 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5746 ds_type_count.descriptorCount = 1;
5747
5748 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5749 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5750 ds_pool_ci.pNext = NULL;
5751 ds_pool_ci.maxSets = 1;
5752 ds_pool_ci.poolSizeCount = 1;
5753 ds_pool_ci.pPoolSizes = &ds_type_count;
5754
5755 VkDescriptorPool ds_pool;
5756 err =
5757 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5758 ASSERT_VK_SUCCESS(err);
5759
5760 VkDescriptorSetLayoutBinding dsl_binding = {};
5761 dsl_binding.binding = 0;
5762 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5763 dsl_binding.descriptorCount = 1;
5764 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5765 dsl_binding.pImmutableSamplers = NULL;
5766
5767 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5768 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5769 ds_layout_ci.pNext = NULL;
5770 ds_layout_ci.bindingCount = 1;
5771 ds_layout_ci.pBindings = &dsl_binding;
5772
5773 VkDescriptorSetLayout ds_layout;
5774 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5775 &ds_layout);
5776 ASSERT_VK_SUCCESS(err);
5777
5778 VkDescriptorSet descriptorSet;
5779 VkDescriptorSetAllocateInfo alloc_info = {};
5780 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5781 alloc_info.descriptorSetCount = 1;
5782 alloc_info.descriptorPool = ds_pool;
5783 alloc_info.pSetLayouts = &ds_layout;
5784 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5785 &descriptorSet);
5786 ASSERT_VK_SUCCESS(err);
5787
5788 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
5789 pipe_ms_state_ci.sType =
5790 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5791 pipe_ms_state_ci.pNext = NULL;
5792 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
5793 pipe_ms_state_ci.sampleShadingEnable = 0;
5794 pipe_ms_state_ci.minSampleShading = 1.0;
5795 pipe_ms_state_ci.pSampleMask = NULL;
5796
5797 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5798 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5799 pipeline_layout_ci.pNext = NULL;
5800 pipeline_layout_ci.setLayoutCount = 1;
5801 pipeline_layout_ci.pSetLayouts = &ds_layout;
5802
5803 VkPipelineLayout pipeline_layout;
5804 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5805 &pipeline_layout);
5806 ASSERT_VK_SUCCESS(err);
5807
5808 VkShaderObj vs(m_device, bindStateVertShaderText,
5809 VK_SHADER_STAGE_VERTEX_BIT, this);
5810 VkShaderObj fs(m_device, bindStateFragShaderText,
5811 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005812 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06005813 // but add it to be able to run on more devices
5814 VkPipelineObj pipe(m_device);
5815 pipe.AddShader(&vs);
5816 pipe.AddShader(&fs);
5817 pipe.SetMSAA(&pipe_ms_state_ci);
5818 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5819
5820 BeginCommandBuffer();
5821 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5822 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5823
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005824 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06005825
5826 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5827 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5828 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5829}
Tony Barbour4e81a202016-04-04 11:09:40 -06005830#endif //ADD_BACK_IN_WHEN_CHECK_IS_BACK
Karl Schultz6addd812016-02-02 17:17:23 -07005831TEST_F(VkLayerTest, ClearCmdNoDraw) {
5832 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
5833 // to issuing a Draw
5834 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005835
Karl Schultz6addd812016-02-02 17:17:23 -07005836 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07005837 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005838 "vkCmdClearAttachments() issued on CB object ");
5839
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005840 ASSERT_NO_FATAL_FAILURE(InitState());
5841 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06005842
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005843 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005844 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5845 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005846
5847 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005848 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5849 ds_pool_ci.pNext = NULL;
5850 ds_pool_ci.maxSets = 1;
5851 ds_pool_ci.poolSizeCount = 1;
5852 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005853
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005854 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005855 err =
5856 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005857 ASSERT_VK_SUCCESS(err);
5858
Tony Barboureb254902015-07-15 12:50:33 -06005859 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005860 dsl_binding.binding = 0;
5861 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5862 dsl_binding.descriptorCount = 1;
5863 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5864 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005865
Tony Barboureb254902015-07-15 12:50:33 -06005866 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005867 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5868 ds_layout_ci.pNext = NULL;
5869 ds_layout_ci.bindingCount = 1;
5870 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005871
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005872 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005873 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5874 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005875 ASSERT_VK_SUCCESS(err);
5876
5877 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005878 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005879 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005880 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005881 alloc_info.descriptorPool = ds_pool;
5882 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005883 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5884 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005885 ASSERT_VK_SUCCESS(err);
5886
Tony Barboureb254902015-07-15 12:50:33 -06005887 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005888 pipe_ms_state_ci.sType =
5889 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5890 pipe_ms_state_ci.pNext = NULL;
5891 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5892 pipe_ms_state_ci.sampleShadingEnable = 0;
5893 pipe_ms_state_ci.minSampleShading = 1.0;
5894 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005895
Tony Barboureb254902015-07-15 12:50:33 -06005896 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005897 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5898 pipeline_layout_ci.pNext = NULL;
5899 pipeline_layout_ci.setLayoutCount = 1;
5900 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005901
5902 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005903 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5904 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005905 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005906
Karl Schultz6addd812016-02-02 17:17:23 -07005907 VkShaderObj vs(m_device, bindStateVertShaderText,
5908 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06005909 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07005910 // on more devices
5911 VkShaderObj fs(m_device, bindStateFragShaderText,
5912 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005913
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005914 VkPipelineObj pipe(m_device);
5915 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005916 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005917 pipe.SetMSAA(&pipe_ms_state_ci);
5918 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06005919
5920 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005921
Karl Schultz6addd812016-02-02 17:17:23 -07005922 // Main thing we care about for this test is that the VkImage obj we're
5923 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005924 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005925 VkClearAttachment color_attachment;
5926 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5927 color_attachment.clearValue.color.float32[0] = 1.0;
5928 color_attachment.clearValue.color.float32[1] = 1.0;
5929 color_attachment.clearValue.color.float32[2] = 1.0;
5930 color_attachment.clearValue.color.float32[3] = 1.0;
5931 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005932 VkClearRect clear_rect = {
5933 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005934
Karl Schultz6addd812016-02-02 17:17:23 -07005935 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
5936 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005937
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005938 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005939
Chia-I Wuf7458c52015-10-26 21:10:41 +08005940 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5941 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5942 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005943}
5944
Karl Schultz6addd812016-02-02 17:17:23 -07005945TEST_F(VkLayerTest, VtxBufferBadIndex) {
5946 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005947
Karl Schultz6addd812016-02-02 17:17:23 -07005948 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005949 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07005950 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005951
Tobin Ehlis502480b2015-06-24 15:53:07 -06005952 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06005953 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06005954 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06005955
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005956 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005957 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5958 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005959
5960 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005961 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5962 ds_pool_ci.pNext = NULL;
5963 ds_pool_ci.maxSets = 1;
5964 ds_pool_ci.poolSizeCount = 1;
5965 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005966
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005967 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005968 err =
5969 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005970 ASSERT_VK_SUCCESS(err);
5971
Tony Barboureb254902015-07-15 12:50:33 -06005972 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005973 dsl_binding.binding = 0;
5974 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5975 dsl_binding.descriptorCount = 1;
5976 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5977 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005978
Tony Barboureb254902015-07-15 12:50:33 -06005979 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005980 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5981 ds_layout_ci.pNext = NULL;
5982 ds_layout_ci.bindingCount = 1;
5983 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005984
Tobin Ehlis502480b2015-06-24 15:53:07 -06005985 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005986 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5987 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005988 ASSERT_VK_SUCCESS(err);
5989
5990 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005991 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005992 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005993 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005994 alloc_info.descriptorPool = ds_pool;
5995 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005996 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5997 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005998 ASSERT_VK_SUCCESS(err);
5999
Tony Barboureb254902015-07-15 12:50:33 -06006000 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006001 pipe_ms_state_ci.sType =
6002 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6003 pipe_ms_state_ci.pNext = NULL;
6004 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6005 pipe_ms_state_ci.sampleShadingEnable = 0;
6006 pipe_ms_state_ci.minSampleShading = 1.0;
6007 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006008
Tony Barboureb254902015-07-15 12:50:33 -06006009 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006010 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6011 pipeline_layout_ci.pNext = NULL;
6012 pipeline_layout_ci.setLayoutCount = 1;
6013 pipeline_layout_ci.pSetLayouts = &ds_layout;
6014 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006015
Karl Schultz6addd812016-02-02 17:17:23 -07006016 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6017 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006018 ASSERT_VK_SUCCESS(err);
6019
Karl Schultz6addd812016-02-02 17:17:23 -07006020 VkShaderObj vs(m_device, bindStateVertShaderText,
6021 VK_SHADER_STAGE_VERTEX_BIT, this);
6022 VkShaderObj fs(m_device, bindStateFragShaderText,
6023 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006024 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006025 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006026 VkPipelineObj pipe(m_device);
6027 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006028 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006029 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006030 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006031 pipe.SetViewport(m_viewports);
6032 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006033 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006034
6035 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006036 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6037 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006038 // Don't care about actual data, just need to get to draw to flag error
6039 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07006040 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
6041 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006042 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06006043 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006044
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006045 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006046
Chia-I Wuf7458c52015-10-26 21:10:41 +08006047 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6048 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6049 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006050}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006051#endif // DRAW_STATE_TESTS
6052
Tobin Ehlis0788f522015-05-26 16:11:58 -06006053#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06006054#if GTEST_IS_THREADSAFE
6055struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006056 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006057 VkEvent event;
6058 bool bailout;
6059};
6060
Karl Schultz6addd812016-02-02 17:17:23 -07006061extern "C" void *AddToCommandBuffer(void *arg) {
6062 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006063
Karl Schultz6addd812016-02-02 17:17:23 -07006064 for (int i = 0; i < 10000; i++) {
6065 vkCmdSetEvent(data->commandBuffer, data->event,
6066 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006067 if (data->bailout) {
6068 break;
6069 }
6070 }
6071 return NULL;
6072}
6073
Karl Schultz6addd812016-02-02 17:17:23 -07006074TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006075 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006076
Karl Schultz6addd812016-02-02 17:17:23 -07006077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6078 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006079
Mike Stroyanaccf7692015-05-12 16:00:45 -06006080 ASSERT_NO_FATAL_FAILURE(InitState());
6081 ASSERT_NO_FATAL_FAILURE(InitViewport());
6082 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6083
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006084 // Calls AllocateCommandBuffers
6085 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006086
6087 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006088 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006089
6090 VkEventCreateInfo event_info;
6091 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006092 VkResult err;
6093
6094 memset(&event_info, 0, sizeof(event_info));
6095 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
6096
Chia-I Wuf7458c52015-10-26 21:10:41 +08006097 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006098 ASSERT_VK_SUCCESS(err);
6099
Mike Stroyanaccf7692015-05-12 16:00:45 -06006100 err = vkResetEvent(device(), event);
6101 ASSERT_VK_SUCCESS(err);
6102
6103 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006104 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006105 data.event = event;
6106 data.bailout = false;
6107 m_errorMonitor->SetBailout(&data.bailout);
6108 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006109 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006110 // Add many entries to command buffer from this thread at the same time.
6111 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006112
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006113 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006114 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006115
Mike Stroyan10b8cb72016-01-22 15:22:03 -07006116 m_errorMonitor->SetBailout(NULL);
6117
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006118 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006119
Chia-I Wuf7458c52015-10-26 21:10:41 +08006120 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006121}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006122#endif // GTEST_IS_THREADSAFE
6123#endif // THREADING_TESTS
6124
Chris Forbes9f7ff632015-05-25 11:13:08 +12006125#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006126TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006127 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006128 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006129
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006130 ASSERT_NO_FATAL_FAILURE(InitState());
6131 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6132
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006133 VkShaderModule module;
6134 VkShaderModuleCreateInfo moduleCreateInfo;
6135 struct icd_spv_header spv;
6136
6137 spv.magic = ICD_SPV_MAGIC;
6138 spv.version = ICD_SPV_VERSION;
6139 spv.gen_magic = 0;
6140
6141 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6142 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006143 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006144 moduleCreateInfo.codeSize = 4;
6145 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006146 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006147
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006148 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006149}
6150
Karl Schultz6addd812016-02-02 17:17:23 -07006151TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006152 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006153 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006154
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006155 ASSERT_NO_FATAL_FAILURE(InitState());
6156 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6157
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006158 VkShaderModule module;
6159 VkShaderModuleCreateInfo moduleCreateInfo;
6160 struct icd_spv_header spv;
6161
6162 spv.magic = ~ICD_SPV_MAGIC;
6163 spv.version = ICD_SPV_VERSION;
6164 spv.gen_magic = 0;
6165
6166 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6167 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006168 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006169 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6170 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006171 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006172
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006173 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006174}
6175
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006176#if 0
6177// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07006178TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006179 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006180 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006181
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006182 ASSERT_NO_FATAL_FAILURE(InitState());
6183 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6184
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006185 VkShaderModule module;
6186 VkShaderModuleCreateInfo moduleCreateInfo;
6187 struct icd_spv_header spv;
6188
6189 spv.magic = ICD_SPV_MAGIC;
6190 spv.version = ~ICD_SPV_VERSION;
6191 spv.gen_magic = 0;
6192
6193 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6194 moduleCreateInfo.pNext = NULL;
6195
Karl Schultz6addd812016-02-02 17:17:23 -07006196 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006197 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6198 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006199 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006200
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006201 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006202}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006203#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006204
Karl Schultz6addd812016-02-02 17:17:23 -07006205TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006207 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006208
Chris Forbes9f7ff632015-05-25 11:13:08 +12006209 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006210 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006211
6212 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006213 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006214 "\n"
6215 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006216 "out gl_PerVertex {\n"
6217 " vec4 gl_Position;\n"
6218 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006219 "void main(){\n"
6220 " gl_Position = vec4(1);\n"
6221 " x = 0;\n"
6222 "}\n";
6223 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006224 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006225 "\n"
6226 "layout(location=0) out vec4 color;\n"
6227 "void main(){\n"
6228 " color = vec4(1);\n"
6229 "}\n";
6230
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006231 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6232 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006233
6234 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006235 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006236 pipe.AddShader(&vs);
6237 pipe.AddShader(&fs);
6238
Chris Forbes9f7ff632015-05-25 11:13:08 +12006239 VkDescriptorSetObj descriptorSet(m_device);
6240 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006241 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006242
Tony Barbour5781e8f2015-08-04 16:23:11 -06006243 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006244
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006245 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006246}
Chris Forbes9f7ff632015-05-25 11:13:08 +12006247
Karl Schultz6addd812016-02-02 17:17:23 -07006248TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006249 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006250 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006251
Chris Forbes59cb88d2015-05-25 11:13:13 +12006252 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006253 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006254
6255 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006256 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006257 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006258 "out gl_PerVertex {\n"
6259 " vec4 gl_Position;\n"
6260 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006261 "void main(){\n"
6262 " gl_Position = vec4(1);\n"
6263 "}\n";
6264 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006265 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006266 "\n"
6267 "layout(location=0) in float x;\n"
6268 "layout(location=0) out vec4 color;\n"
6269 "void main(){\n"
6270 " color = vec4(x);\n"
6271 "}\n";
6272
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006273 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6274 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006275
6276 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006277 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006278 pipe.AddShader(&vs);
6279 pipe.AddShader(&fs);
6280
Chris Forbes59cb88d2015-05-25 11:13:13 +12006281 VkDescriptorSetObj descriptorSet(m_device);
6282 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006283 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006284
Tony Barbour5781e8f2015-08-04 16:23:11 -06006285 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006286
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006287 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006288}
6289
Karl Schultz6addd812016-02-02 17:17:23 -07006290TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006292 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006293
6294 ASSERT_NO_FATAL_FAILURE(InitState());
6295 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6296
6297 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006298 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006299 "\n"
6300 "out gl_PerVertex {\n"
6301 " vec4 gl_Position;\n"
6302 "};\n"
6303 "void main(){\n"
6304 " gl_Position = vec4(1);\n"
6305 "}\n";
6306 char const *fsSource =
6307 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006308 "\n"
6309 "in block { layout(location=0) float x; } ins;\n"
6310 "layout(location=0) out vec4 color;\n"
6311 "void main(){\n"
6312 " color = vec4(ins.x);\n"
6313 "}\n";
6314
6315 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6316 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6317
6318 VkPipelineObj pipe(m_device);
6319 pipe.AddColorAttachment();
6320 pipe.AddShader(&vs);
6321 pipe.AddShader(&fs);
6322
6323 VkDescriptorSetObj descriptorSet(m_device);
6324 descriptorSet.AppendDummy();
6325 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6326
6327 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6328
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006329 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006330}
6331
Karl Schultz6addd812016-02-02 17:17:23 -07006332TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13006333 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13006334 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07006335 "output arr[2] of float32' vs 'ptr to "
6336 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13006337
6338 ASSERT_NO_FATAL_FAILURE(InitState());
6339 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6340
6341 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006342 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006343 "\n"
6344 "layout(location=0) out float x[2];\n"
6345 "out gl_PerVertex {\n"
6346 " vec4 gl_Position;\n"
6347 "};\n"
6348 "void main(){\n"
6349 " x[0] = 0; x[1] = 0;\n"
6350 " gl_Position = vec4(1);\n"
6351 "}\n";
6352 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006353 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006354 "\n"
6355 "layout(location=0) in float x[3];\n"
6356 "layout(location=0) out vec4 color;\n"
6357 "void main(){\n"
6358 " color = vec4(x[0] + x[1] + x[2]);\n"
6359 "}\n";
6360
6361 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6362 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6363
6364 VkPipelineObj pipe(m_device);
6365 pipe.AddColorAttachment();
6366 pipe.AddShader(&vs);
6367 pipe.AddShader(&fs);
6368
6369 VkDescriptorSetObj descriptorSet(m_device);
6370 descriptorSet.AppendDummy();
6371 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6372
6373 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6374
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006375 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13006376}
6377
Karl Schultz6addd812016-02-02 17:17:23 -07006378TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006380 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006381
Chris Forbesb56af562015-05-25 11:13:17 +12006382 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006383 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12006384
6385 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006386 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006387 "\n"
6388 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006389 "out gl_PerVertex {\n"
6390 " vec4 gl_Position;\n"
6391 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006392 "void main(){\n"
6393 " x = 0;\n"
6394 " gl_Position = vec4(1);\n"
6395 "}\n";
6396 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006397 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006398 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006399 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12006400 "layout(location=0) out vec4 color;\n"
6401 "void main(){\n"
6402 " color = vec4(x);\n"
6403 "}\n";
6404
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006405 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6406 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12006407
6408 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006409 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12006410 pipe.AddShader(&vs);
6411 pipe.AddShader(&fs);
6412
Chris Forbesb56af562015-05-25 11:13:17 +12006413 VkDescriptorSetObj descriptorSet(m_device);
6414 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006415 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12006416
Tony Barbour5781e8f2015-08-04 16:23:11 -06006417 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12006418
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006419 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12006420}
6421
Karl Schultz6addd812016-02-02 17:17:23 -07006422TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006423 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006424 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006425
6426 ASSERT_NO_FATAL_FAILURE(InitState());
6427 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6428
6429 char const *vsSource =
6430 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006431 "\n"
6432 "out block { layout(location=0) int x; } outs;\n"
6433 "out gl_PerVertex {\n"
6434 " vec4 gl_Position;\n"
6435 "};\n"
6436 "void main(){\n"
6437 " outs.x = 0;\n"
6438 " gl_Position = vec4(1);\n"
6439 "}\n";
6440 char const *fsSource =
6441 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006442 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006443 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13006444 "layout(location=0) out vec4 color;\n"
6445 "void main(){\n"
6446 " color = vec4(ins.x);\n"
6447 "}\n";
6448
6449 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6450 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6451
6452 VkPipelineObj pipe(m_device);
6453 pipe.AddColorAttachment();
6454 pipe.AddShader(&vs);
6455 pipe.AddShader(&fs);
6456
6457 VkDescriptorSetObj descriptorSet(m_device);
6458 descriptorSet.AppendDummy();
6459 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6460
6461 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6462
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006463 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006464}
6465
6466TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
6467 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6468 "location 0.0 which is not written by vertex shader");
6469
6470 ASSERT_NO_FATAL_FAILURE(InitState());
6471 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6472
6473 char const *vsSource =
6474 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006475 "\n"
6476 "out block { layout(location=1) float x; } outs;\n"
6477 "out gl_PerVertex {\n"
6478 " vec4 gl_Position;\n"
6479 "};\n"
6480 "void main(){\n"
6481 " outs.x = 0;\n"
6482 " gl_Position = vec4(1);\n"
6483 "}\n";
6484 char const *fsSource =
6485 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006486 "\n"
6487 "in block { layout(location=0) float x; } ins;\n"
6488 "layout(location=0) out vec4 color;\n"
6489 "void main(){\n"
6490 " color = vec4(ins.x);\n"
6491 "}\n";
6492
6493 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6494 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6495
6496 VkPipelineObj pipe(m_device);
6497 pipe.AddColorAttachment();
6498 pipe.AddShader(&vs);
6499 pipe.AddShader(&fs);
6500
6501 VkDescriptorSetObj descriptorSet(m_device);
6502 descriptorSet.AppendDummy();
6503 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6504
6505 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6506
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006507 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006508}
6509
6510TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
6511 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6512 "location 0.1 which is not written by vertex shader");
6513
6514 ASSERT_NO_FATAL_FAILURE(InitState());
6515 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6516
6517 char const *vsSource =
6518 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006519 "\n"
6520 "out block { layout(location=0, component=0) float x; } outs;\n"
6521 "out gl_PerVertex {\n"
6522 " vec4 gl_Position;\n"
6523 "};\n"
6524 "void main(){\n"
6525 " outs.x = 0;\n"
6526 " gl_Position = vec4(1);\n"
6527 "}\n";
6528 char const *fsSource =
6529 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006530 "\n"
6531 "in block { layout(location=0, component=1) float x; } ins;\n"
6532 "layout(location=0) out vec4 color;\n"
6533 "void main(){\n"
6534 " color = vec4(ins.x);\n"
6535 "}\n";
6536
6537 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6538 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6539
6540 VkPipelineObj pipe(m_device);
6541 pipe.AddColorAttachment();
6542 pipe.AddShader(&vs);
6543 pipe.AddShader(&fs);
6544
6545 VkDescriptorSetObj descriptorSet(m_device);
6546 descriptorSet.AppendDummy();
6547 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6548
6549 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6550
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006551 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006552}
6553
Karl Schultz6addd812016-02-02 17:17:23 -07006554TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006555 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006556 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006557
Chris Forbesde136e02015-05-25 11:13:28 +12006558 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006559 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12006560
6561 VkVertexInputBindingDescription input_binding;
6562 memset(&input_binding, 0, sizeof(input_binding));
6563
6564 VkVertexInputAttributeDescription input_attrib;
6565 memset(&input_attrib, 0, sizeof(input_attrib));
6566 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6567
6568 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006569 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006570 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006571 "out gl_PerVertex {\n"
6572 " vec4 gl_Position;\n"
6573 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006574 "void main(){\n"
6575 " gl_Position = vec4(1);\n"
6576 "}\n";
6577 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006578 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006579 "\n"
6580 "layout(location=0) out vec4 color;\n"
6581 "void main(){\n"
6582 " color = vec4(1);\n"
6583 "}\n";
6584
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006585 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6586 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12006587
6588 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006589 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12006590 pipe.AddShader(&vs);
6591 pipe.AddShader(&fs);
6592
6593 pipe.AddVertexInputBindings(&input_binding, 1);
6594 pipe.AddVertexInputAttribs(&input_attrib, 1);
6595
Chris Forbesde136e02015-05-25 11:13:28 +12006596 VkDescriptorSetObj descriptorSet(m_device);
6597 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006598 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12006599
Tony Barbour5781e8f2015-08-04 16:23:11 -06006600 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12006601
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006602 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12006603}
6604
Karl Schultz6addd812016-02-02 17:17:23 -07006605TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006606 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006607 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13006608
6609 ASSERT_NO_FATAL_FAILURE(InitState());
6610 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6611
6612 VkVertexInputBindingDescription input_binding;
6613 memset(&input_binding, 0, sizeof(input_binding));
6614
6615 VkVertexInputAttributeDescription input_attrib;
6616 memset(&input_attrib, 0, sizeof(input_attrib));
6617 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6618
6619 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006620 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006621 "\n"
6622 "layout(location=1) in float x;\n"
6623 "out gl_PerVertex {\n"
6624 " vec4 gl_Position;\n"
6625 "};\n"
6626 "void main(){\n"
6627 " gl_Position = vec4(x);\n"
6628 "}\n";
6629 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006630 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006631 "\n"
6632 "layout(location=0) out vec4 color;\n"
6633 "void main(){\n"
6634 " color = vec4(1);\n"
6635 "}\n";
6636
6637 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6638 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6639
6640 VkPipelineObj pipe(m_device);
6641 pipe.AddColorAttachment();
6642 pipe.AddShader(&vs);
6643 pipe.AddShader(&fs);
6644
6645 pipe.AddVertexInputBindings(&input_binding, 1);
6646 pipe.AddVertexInputAttribs(&input_attrib, 1);
6647
6648 VkDescriptorSetObj descriptorSet(m_device);
6649 descriptorSet.AppendDummy();
6650 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6651
6652 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6653
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006654 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13006655}
6656
Karl Schultz6addd812016-02-02 17:17:23 -07006657TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
6658 m_errorMonitor->SetDesiredFailureMsg(
6659 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006660 "VS consumes input at location 0 but not provided");
6661
Chris Forbes62e8e502015-05-25 11:13:29 +12006662 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006663 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12006664
6665 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006666 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006667 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006668 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07006669 "out gl_PerVertex {\n"
6670 " vec4 gl_Position;\n"
6671 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006672 "void main(){\n"
6673 " gl_Position = x;\n"
6674 "}\n";
6675 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006676 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006677 "\n"
6678 "layout(location=0) out vec4 color;\n"
6679 "void main(){\n"
6680 " color = vec4(1);\n"
6681 "}\n";
6682
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006683 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6684 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12006685
6686 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006687 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12006688 pipe.AddShader(&vs);
6689 pipe.AddShader(&fs);
6690
Chris Forbes62e8e502015-05-25 11:13:29 +12006691 VkDescriptorSetObj descriptorSet(m_device);
6692 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006693 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12006694
Tony Barbour5781e8f2015-08-04 16:23:11 -06006695 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12006696
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006697 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12006698}
6699
Karl Schultz6addd812016-02-02 17:17:23 -07006700TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
6701 m_errorMonitor->SetDesiredFailureMsg(
6702 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006703 "location 0 does not match VS input type");
6704
Chris Forbesc97d98e2015-05-25 11:13:31 +12006705 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006706 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006707
6708 VkVertexInputBindingDescription input_binding;
6709 memset(&input_binding, 0, sizeof(input_binding));
6710
6711 VkVertexInputAttributeDescription input_attrib;
6712 memset(&input_attrib, 0, sizeof(input_attrib));
6713 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6714
6715 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006716 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006717 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006718 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07006719 "out gl_PerVertex {\n"
6720 " vec4 gl_Position;\n"
6721 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006722 "void main(){\n"
6723 " gl_Position = vec4(x);\n"
6724 "}\n";
6725 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006726 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006727 "\n"
6728 "layout(location=0) out vec4 color;\n"
6729 "void main(){\n"
6730 " color = vec4(1);\n"
6731 "}\n";
6732
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006733 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6734 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006735
6736 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006737 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006738 pipe.AddShader(&vs);
6739 pipe.AddShader(&fs);
6740
6741 pipe.AddVertexInputBindings(&input_binding, 1);
6742 pipe.AddVertexInputAttribs(&input_attrib, 1);
6743
Chris Forbesc97d98e2015-05-25 11:13:31 +12006744 VkDescriptorSetObj descriptorSet(m_device);
6745 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006746 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006747
Tony Barbour5781e8f2015-08-04 16:23:11 -06006748 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006749
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006750 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006751}
6752
Chris Forbesc68b43c2016-04-06 11:18:47 +12006753TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
6754 m_errorMonitor->SetDesiredFailureMsg(
6755 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6756 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
6757
6758 ASSERT_NO_FATAL_FAILURE(InitState());
6759 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6760
6761 char const *vsSource =
6762 "#version 450\n"
6763 "\n"
6764 "out gl_PerVertex {\n"
6765 " vec4 gl_Position;\n"
6766 "};\n"
6767 "void main(){\n"
6768 " gl_Position = vec4(1);\n"
6769 "}\n";
6770 char const *fsSource =
6771 "#version 450\n"
6772 "\n"
6773 "layout(location=0) out vec4 color;\n"
6774 "void main(){\n"
6775 " color = vec4(1);\n"
6776 "}\n";
6777
6778 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6779 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6780
6781 VkPipelineObj pipe(m_device);
6782 pipe.AddColorAttachment();
6783 pipe.AddShader(&vs);
6784 pipe.AddShader(&vs);
6785 pipe.AddShader(&fs);
6786
6787 VkDescriptorSetObj descriptorSet(m_device);
6788 descriptorSet.AppendDummy();
6789 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6790
6791 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6792
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006793 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12006794}
6795
Karl Schultz6addd812016-02-02 17:17:23 -07006796TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006797 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13006798
6799 ASSERT_NO_FATAL_FAILURE(InitState());
6800 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6801
6802 VkVertexInputBindingDescription input_binding;
6803 memset(&input_binding, 0, sizeof(input_binding));
6804
6805 VkVertexInputAttributeDescription input_attribs[2];
6806 memset(input_attribs, 0, sizeof(input_attribs));
6807
6808 for (int i = 0; i < 2; i++) {
6809 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
6810 input_attribs[i].location = i;
6811 }
6812
6813 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006814 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006815 "\n"
6816 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006817 "out gl_PerVertex {\n"
6818 " vec4 gl_Position;\n"
6819 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006820 "void main(){\n"
6821 " gl_Position = x[0] + x[1];\n"
6822 "}\n";
6823 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006824 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006825 "\n"
6826 "layout(location=0) out vec4 color;\n"
6827 "void main(){\n"
6828 " color = vec4(1);\n"
6829 "}\n";
6830
6831 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6832 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6833
6834 VkPipelineObj pipe(m_device);
6835 pipe.AddColorAttachment();
6836 pipe.AddShader(&vs);
6837 pipe.AddShader(&fs);
6838
6839 pipe.AddVertexInputBindings(&input_binding, 1);
6840 pipe.AddVertexInputAttribs(input_attribs, 2);
6841
6842 VkDescriptorSetObj descriptorSet(m_device);
6843 descriptorSet.AppendDummy();
6844 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6845
6846 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6847
6848 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006849 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13006850}
6851
Chris Forbes2682b242015-11-24 11:13:14 +13006852TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
6853{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006854 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13006855
6856 ASSERT_NO_FATAL_FAILURE(InitState());
6857 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6858
6859 VkVertexInputBindingDescription input_binding;
6860 memset(&input_binding, 0, sizeof(input_binding));
6861
6862 VkVertexInputAttributeDescription input_attribs[2];
6863 memset(input_attribs, 0, sizeof(input_attribs));
6864
6865 for (int i = 0; i < 2; i++) {
6866 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
6867 input_attribs[i].location = i;
6868 }
6869
6870 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006871 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006872 "\n"
6873 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07006874 "out gl_PerVertex {\n"
6875 " vec4 gl_Position;\n"
6876 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006877 "void main(){\n"
6878 " gl_Position = x[0] + x[1];\n"
6879 "}\n";
6880 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006881 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006882 "\n"
6883 "layout(location=0) out vec4 color;\n"
6884 "void main(){\n"
6885 " color = vec4(1);\n"
6886 "}\n";
6887
6888 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6889 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6890
6891 VkPipelineObj pipe(m_device);
6892 pipe.AddColorAttachment();
6893 pipe.AddShader(&vs);
6894 pipe.AddShader(&fs);
6895
6896 pipe.AddVertexInputBindings(&input_binding, 1);
6897 pipe.AddVertexInputAttribs(input_attribs, 2);
6898
6899 VkDescriptorSetObj descriptorSet(m_device);
6900 descriptorSet.AppendDummy();
6901 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6902
6903 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6904
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006905 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13006906}
Chris Forbes2682b242015-11-24 11:13:14 +13006907
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006908TEST_F(VkLayerTest, CreatePipelineSimplePositive)
6909{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006910 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006911
6912 ASSERT_NO_FATAL_FAILURE(InitState());
6913 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6914
6915 char const *vsSource =
6916 "#version 450\n"
6917 "out gl_PerVertex {\n"
6918 " vec4 gl_Position;\n"
6919 "};\n"
6920 "void main(){\n"
6921 " gl_Position = vec4(0);\n"
6922 "}\n";
6923 char const *fsSource =
6924 "#version 450\n"
6925 "\n"
6926 "layout(location=0) out vec4 color;\n"
6927 "void main(){\n"
6928 " color = vec4(1);\n"
6929 "}\n";
6930
6931 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6932 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6933
6934 VkPipelineObj pipe(m_device);
6935 pipe.AddColorAttachment();
6936 pipe.AddShader(&vs);
6937 pipe.AddShader(&fs);
6938
6939 VkDescriptorSetObj descriptorSet(m_device);
6940 descriptorSet.AppendDummy();
6941 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6942
6943 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6944
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006945 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006946}
6947
Chris Forbes912c9192016-04-05 17:50:35 +12006948TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
6949{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006950 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12006951
6952 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
6953
6954 ASSERT_NO_FATAL_FAILURE(InitState());
6955 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6956
6957 char const *vsSource =
6958 "#version 450\n"
6959 "out gl_PerVertex {\n"
6960 " vec4 gl_Position;\n"
6961 "};\n"
6962 "layout(location=0) out vec3 x;\n"
6963 "layout(location=1) out ivec3 y;\n"
6964 "layout(location=2) out vec3 z;\n"
6965 "void main(){\n"
6966 " gl_Position = vec4(0);\n"
6967 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
6968 "}\n";
6969 char const *fsSource =
6970 "#version 450\n"
6971 "\n"
6972 "layout(location=0) out vec4 color;\n"
6973 "layout(location=0) in float x;\n"
6974 "layout(location=1) flat in int y;\n"
6975 "layout(location=2) in vec2 z;\n"
6976 "void main(){\n"
6977 " color = vec4(1 + x + y + z.x);\n"
6978 "}\n";
6979
6980 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6981 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6982
6983 VkPipelineObj pipe(m_device);
6984 pipe.AddColorAttachment();
6985 pipe.AddShader(&vs);
6986 pipe.AddShader(&fs);
6987
6988 VkDescriptorSetObj descriptorSet(m_device);
6989 descriptorSet.AppendDummy();
6990 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6991
6992 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6993
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006994 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12006995}
6996
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006997TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
6998{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006999 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007000
7001 ASSERT_NO_FATAL_FAILURE(InitState());
7002 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7003
Chris Forbesc1e852d2016-04-04 19:26:42 +12007004 if (!m_device->phy().features().tessellationShader) {
7005 printf("Device does not support tessellation shaders; skipped.\n");
7006 return;
7007 }
7008
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007009 char const *vsSource =
7010 "#version 450\n"
7011 "void main(){}\n";
7012 char const *tcsSource =
7013 "#version 450\n"
7014 "layout(location=0) out int x[];\n"
7015 "layout(vertices=3) out;\n"
7016 "void main(){\n"
7017 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7018 " gl_TessLevelInner[0] = 1;\n"
7019 " x[gl_InvocationID] = gl_InvocationID;\n"
7020 "}\n";
7021 char const *tesSource =
7022 "#version 450\n"
7023 "layout(triangles, equal_spacing, cw) in;\n"
7024 "layout(location=0) in int x[];\n"
7025 "out gl_PerVertex { vec4 gl_Position; };\n"
7026 "void main(){\n"
7027 " gl_Position.xyz = gl_TessCoord;\n"
7028 " gl_Position.w = x[0] + x[1] + x[2];\n"
7029 "}\n";
7030 char const *fsSource =
7031 "#version 450\n"
7032 "layout(location=0) out vec4 color;\n"
7033 "void main(){\n"
7034 " color = vec4(1);\n"
7035 "}\n";
7036
7037 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7038 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7039 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7040 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7041
7042 VkPipelineInputAssemblyStateCreateInfo iasci{
7043 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7044 nullptr,
7045 0,
7046 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7047 VK_FALSE};
7048
Chris Forbesb4cacb62016-04-04 19:15:00 +12007049 VkPipelineTessellationStateCreateInfo tsci{
7050 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7051 nullptr,
7052 0,
7053 3};
7054
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007055 VkPipelineObj pipe(m_device);
7056 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12007057 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007058 pipe.AddColorAttachment();
7059 pipe.AddShader(&vs);
7060 pipe.AddShader(&tcs);
7061 pipe.AddShader(&tes);
7062 pipe.AddShader(&fs);
7063
7064 VkDescriptorSetObj descriptorSet(m_device);
7065 descriptorSet.AppendDummy();
7066 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7067
7068 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7069
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007070 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007071}
7072
Chris Forbesa0ab8152016-04-20 13:34:27 +12007073TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
7074{
7075 m_errorMonitor->ExpectSuccess();
7076
7077 ASSERT_NO_FATAL_FAILURE(InitState());
7078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7079
7080 if (!m_device->phy().features().geometryShader) {
7081 printf("Device does not support geometry shaders; skipped.\n");
7082 return;
7083 }
7084
7085 char const *vsSource =
7086 "#version 450\n"
7087 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
7088 "void main(){\n"
7089 " vs_out.x = vec4(1);\n"
7090 "}\n";
7091 char const *gsSource =
7092 "#version 450\n"
7093 "layout(triangles) in;\n"
7094 "layout(triangle_strip, max_vertices=3) out;\n"
7095 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
7096 "out gl_PerVertex { vec4 gl_Position; };\n"
7097 "void main() {\n"
7098 " gl_Position = gs_in[0].x;\n"
7099 " EmitVertex();\n"
7100 "}\n";
7101 char const *fsSource =
7102 "#version 450\n"
7103 "layout(location=0) out vec4 color;\n"
7104 "void main(){\n"
7105 " color = vec4(1);\n"
7106 "}\n";
7107
7108 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7109 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
7110 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7111
7112 VkPipelineObj pipe(m_device);
7113 pipe.AddColorAttachment();
7114 pipe.AddShader(&vs);
7115 pipe.AddShader(&gs);
7116 pipe.AddShader(&fs);
7117
7118 VkDescriptorSetObj descriptorSet(m_device);
7119 descriptorSet.AppendDummy();
7120 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7121
7122 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7123
7124 m_errorMonitor->VerifyNotFound();
7125}
7126
Chris Forbesa0193bc2016-04-04 19:19:47 +12007127TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
7128{
7129 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7130 "is per-vertex in tessellation control shader stage "
7131 "but per-patch in tessellation evaluation shader stage");
7132
7133 ASSERT_NO_FATAL_FAILURE(InitState());
7134 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7135
Chris Forbesc1e852d2016-04-04 19:26:42 +12007136 if (!m_device->phy().features().tessellationShader) {
7137 printf("Device does not support tessellation shaders; skipped.\n");
7138 return;
7139 }
7140
Chris Forbesa0193bc2016-04-04 19:19:47 +12007141 char const *vsSource =
7142 "#version 450\n"
7143 "void main(){}\n";
7144 char const *tcsSource =
7145 "#version 450\n"
7146 "layout(location=0) out int x[];\n"
7147 "layout(vertices=3) out;\n"
7148 "void main(){\n"
7149 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7150 " gl_TessLevelInner[0] = 1;\n"
7151 " x[gl_InvocationID] = gl_InvocationID;\n"
7152 "}\n";
7153 char const *tesSource =
7154 "#version 450\n"
7155 "layout(triangles, equal_spacing, cw) in;\n"
7156 "layout(location=0) patch in int x;\n"
7157 "out gl_PerVertex { vec4 gl_Position; };\n"
7158 "void main(){\n"
7159 " gl_Position.xyz = gl_TessCoord;\n"
7160 " gl_Position.w = x;\n"
7161 "}\n";
7162 char const *fsSource =
7163 "#version 450\n"
7164 "layout(location=0) out vec4 color;\n"
7165 "void main(){\n"
7166 " color = vec4(1);\n"
7167 "}\n";
7168
7169 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7170 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7171 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7172 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7173
7174 VkPipelineInputAssemblyStateCreateInfo iasci{
7175 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7176 nullptr,
7177 0,
7178 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7179 VK_FALSE};
7180
7181 VkPipelineTessellationStateCreateInfo tsci{
7182 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7183 nullptr,
7184 0,
7185 3};
7186
7187 VkPipelineObj pipe(m_device);
7188 pipe.SetInputAssembly(&iasci);
7189 pipe.SetTessellation(&tsci);
7190 pipe.AddColorAttachment();
7191 pipe.AddShader(&vs);
7192 pipe.AddShader(&tcs);
7193 pipe.AddShader(&tes);
7194 pipe.AddShader(&fs);
7195
7196 VkDescriptorSetObj descriptorSet(m_device);
7197 descriptorSet.AppendDummy();
7198 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7199
7200 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7201
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007202 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12007203}
7204
Karl Schultz6addd812016-02-02 17:17:23 -07007205TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
7206 m_errorMonitor->SetDesiredFailureMsg(
7207 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007208 "Duplicate vertex input binding descriptions for binding 0");
7209
Chris Forbes280ba2c2015-06-12 11:16:41 +12007210 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007211 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007212
7213 /* Two binding descriptions for binding 0 */
7214 VkVertexInputBindingDescription input_bindings[2];
7215 memset(input_bindings, 0, sizeof(input_bindings));
7216
7217 VkVertexInputAttributeDescription input_attrib;
7218 memset(&input_attrib, 0, sizeof(input_attrib));
7219 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7220
7221 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007222 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007223 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007224 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007225 "out gl_PerVertex {\n"
7226 " vec4 gl_Position;\n"
7227 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007228 "void main(){\n"
7229 " gl_Position = vec4(x);\n"
7230 "}\n";
7231 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007232 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007233 "\n"
7234 "layout(location=0) out vec4 color;\n"
7235 "void main(){\n"
7236 " color = vec4(1);\n"
7237 "}\n";
7238
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007239 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7240 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007241
7242 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007243 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007244 pipe.AddShader(&vs);
7245 pipe.AddShader(&fs);
7246
7247 pipe.AddVertexInputBindings(input_bindings, 2);
7248 pipe.AddVertexInputAttribs(&input_attrib, 1);
7249
Chris Forbes280ba2c2015-06-12 11:16:41 +12007250 VkDescriptorSetObj descriptorSet(m_device);
7251 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007252 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007253
Tony Barbour5781e8f2015-08-04 16:23:11 -06007254 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007255
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007256 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007257}
Chris Forbes8f68b562015-05-25 11:13:32 +12007258
Chris Forbes35efec72016-04-21 14:32:08 +12007259TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
7260 m_errorMonitor->ExpectSuccess();
7261
7262 ASSERT_NO_FATAL_FAILURE(InitState());
7263 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7264
7265 if (!m_device->phy().features().tessellationShader) {
7266 printf("Device does not support 64bit vertex attributes; skipped.\n");
7267 return;
7268 }
7269
7270 VkVertexInputBindingDescription input_bindings[1];
7271 memset(input_bindings, 0, sizeof(input_bindings));
7272
7273 VkVertexInputAttributeDescription input_attribs[4];
7274 memset(input_attribs, 0, sizeof(input_attribs));
7275 input_attribs[0].location = 0;
7276 input_attribs[0].offset = 0;
7277 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7278 input_attribs[1].location = 2;
7279 input_attribs[1].offset = 32;
7280 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7281 input_attribs[2].location = 4;
7282 input_attribs[2].offset = 64;
7283 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7284 input_attribs[3].location = 6;
7285 input_attribs[3].offset = 96;
7286 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7287
7288 char const *vsSource =
7289 "#version 450\n"
7290 "\n"
7291 "layout(location=0) in dmat4 x;\n"
7292 "out gl_PerVertex {\n"
7293 " vec4 gl_Position;\n"
7294 "};\n"
7295 "void main(){\n"
7296 " gl_Position = vec4(x[0][0]);\n"
7297 "}\n";
7298 char const *fsSource =
7299 "#version 450\n"
7300 "\n"
7301 "layout(location=0) out vec4 color;\n"
7302 "void main(){\n"
7303 " color = vec4(1);\n"
7304 "}\n";
7305
7306 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7307 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7308
7309 VkPipelineObj pipe(m_device);
7310 pipe.AddColorAttachment();
7311 pipe.AddShader(&vs);
7312 pipe.AddShader(&fs);
7313
7314 pipe.AddVertexInputBindings(input_bindings, 1);
7315 pipe.AddVertexInputAttribs(input_attribs, 4);
7316
7317 VkDescriptorSetObj descriptorSet(m_device);
7318 descriptorSet.AppendDummy();
7319 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7320
7321 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7322
7323 m_errorMonitor->VerifyNotFound();
7324}
7325
Karl Schultz6addd812016-02-02 17:17:23 -07007326TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007327 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007328 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007329
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007330 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007331
7332 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007333 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007334 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007335 "out gl_PerVertex {\n"
7336 " vec4 gl_Position;\n"
7337 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007338 "void main(){\n"
7339 " gl_Position = vec4(1);\n"
7340 "}\n";
7341 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007342 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007343 "\n"
7344 "void main(){\n"
7345 "}\n";
7346
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007347 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7348 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007349
7350 VkPipelineObj pipe(m_device);
7351 pipe.AddShader(&vs);
7352 pipe.AddShader(&fs);
7353
Chia-I Wu08accc62015-07-07 11:50:03 +08007354 /* set up CB 0, not written */
7355 pipe.AddColorAttachment();
7356 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007357
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007358 VkDescriptorSetObj descriptorSet(m_device);
7359 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007360 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007361
Tony Barbour5781e8f2015-08-04 16:23:11 -06007362 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007363
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007364 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007365}
7366
Karl Schultz6addd812016-02-02 17:17:23 -07007367TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07007368 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007369 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007370 "FS writes to output location 1 with no matching attachment");
7371
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007372 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007373
7374 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007375 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007376 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007377 "out gl_PerVertex {\n"
7378 " vec4 gl_Position;\n"
7379 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007380 "void main(){\n"
7381 " gl_Position = vec4(1);\n"
7382 "}\n";
7383 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007384 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007385 "\n"
7386 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007387 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007388 "void main(){\n"
7389 " x = vec4(1);\n"
7390 " y = vec4(1);\n"
7391 "}\n";
7392
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007393 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7394 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007395
7396 VkPipelineObj pipe(m_device);
7397 pipe.AddShader(&vs);
7398 pipe.AddShader(&fs);
7399
Chia-I Wu08accc62015-07-07 11:50:03 +08007400 /* set up CB 0, not written */
7401 pipe.AddColorAttachment();
7402 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007403 /* FS writes CB 1, but we don't configure it */
7404
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007405 VkDescriptorSetObj descriptorSet(m_device);
7406 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007407 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007408
Tony Barbour5781e8f2015-08-04 16:23:11 -06007409 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007410
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007411 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007412}
7413
Karl Schultz6addd812016-02-02 17:17:23 -07007414TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007415 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007416 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007417
Chris Forbesa36d69e2015-05-25 11:13:44 +12007418 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007419
7420 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007421 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007422 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007423 "out gl_PerVertex {\n"
7424 " vec4 gl_Position;\n"
7425 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007426 "void main(){\n"
7427 " gl_Position = vec4(1);\n"
7428 "}\n";
7429 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007430 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007431 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007432 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12007433 "void main(){\n"
7434 " x = ivec4(1);\n"
7435 "}\n";
7436
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007437 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7438 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007439
7440 VkPipelineObj pipe(m_device);
7441 pipe.AddShader(&vs);
7442 pipe.AddShader(&fs);
7443
Chia-I Wu08accc62015-07-07 11:50:03 +08007444 /* set up CB 0; type is UNORM by default */
7445 pipe.AddColorAttachment();
7446 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007447
Chris Forbesa36d69e2015-05-25 11:13:44 +12007448 VkDescriptorSetObj descriptorSet(m_device);
7449 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007450 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007451
Tony Barbour5781e8f2015-08-04 16:23:11 -06007452 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007453
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007454 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12007455}
Chris Forbes7b1b8932015-06-05 14:43:36 +12007456
Karl Schultz6addd812016-02-02 17:17:23 -07007457TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007458 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007459 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007460
Chris Forbes556c76c2015-08-14 12:04:59 +12007461 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12007462
7463 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007464 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007465 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007466 "out gl_PerVertex {\n"
7467 " vec4 gl_Position;\n"
7468 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007469 "void main(){\n"
7470 " gl_Position = vec4(1);\n"
7471 "}\n";
7472 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007473 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007474 "\n"
7475 "layout(location=0) out vec4 x;\n"
7476 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7477 "void main(){\n"
7478 " x = vec4(bar.y);\n"
7479 "}\n";
7480
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007481 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7482 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12007483
Chris Forbes556c76c2015-08-14 12:04:59 +12007484 VkPipelineObj pipe(m_device);
7485 pipe.AddShader(&vs);
7486 pipe.AddShader(&fs);
7487
7488 /* set up CB 0; type is UNORM by default */
7489 pipe.AddColorAttachment();
7490 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7491
7492 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007493 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12007494
7495 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7496
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007497 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12007498}
7499
Chris Forbes5c59e902016-02-26 16:56:09 +13007500TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
7501 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7502 "not declared in layout");
7503
7504 ASSERT_NO_FATAL_FAILURE(InitState());
7505
7506 char const *vsSource =
7507 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007508 "\n"
7509 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
7510 "out gl_PerVertex {\n"
7511 " vec4 gl_Position;\n"
7512 "};\n"
7513 "void main(){\n"
7514 " gl_Position = vec4(consts.x);\n"
7515 "}\n";
7516 char const *fsSource =
7517 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007518 "\n"
7519 "layout(location=0) out vec4 x;\n"
7520 "void main(){\n"
7521 " x = vec4(1);\n"
7522 "}\n";
7523
7524 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7525 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7526
7527 VkPipelineObj pipe(m_device);
7528 pipe.AddShader(&vs);
7529 pipe.AddShader(&fs);
7530
7531 /* set up CB 0; type is UNORM by default */
7532 pipe.AddColorAttachment();
7533 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7534
7535 VkDescriptorSetObj descriptorSet(m_device);
7536 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7537
7538 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7539
7540 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007541 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13007542}
7543
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007544#endif // SHADER_CHECKER_TESTS
7545
7546#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06007547TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07007548 m_errorMonitor->SetDesiredFailureMsg(
7549 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007550 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007551
7552 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007553
7554 // Create an image
7555 VkImage image;
7556
Karl Schultz6addd812016-02-02 17:17:23 -07007557 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7558 const int32_t tex_width = 32;
7559 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007560
7561 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007562 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7563 image_create_info.pNext = NULL;
7564 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7565 image_create_info.format = tex_format;
7566 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007567 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07007568 image_create_info.extent.depth = 1;
7569 image_create_info.mipLevels = 1;
7570 image_create_info.arrayLayers = 1;
7571 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7572 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7573 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7574 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007575
7576 // Introduce error by sending down a bogus width extent
7577 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007578 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007579
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007580 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007581}
7582
Mark Youngc48c4c12016-04-11 14:26:49 -06007583TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
7584 m_errorMonitor->SetDesiredFailureMsg(
7585 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7586 "CreateImage extents is 0 for at least one required dimension");
7587
7588 ASSERT_NO_FATAL_FAILURE(InitState());
7589
7590 // Create an image
7591 VkImage image;
7592
7593 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7594 const int32_t tex_width = 32;
7595 const int32_t tex_height = 32;
7596
7597 VkImageCreateInfo image_create_info = {};
7598 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7599 image_create_info.pNext = NULL;
7600 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7601 image_create_info.format = tex_format;
7602 image_create_info.extent.width = tex_width;
7603 image_create_info.extent.height = tex_height;
7604 image_create_info.extent.depth = 1;
7605 image_create_info.mipLevels = 1;
7606 image_create_info.arrayLayers = 1;
7607 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7608 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7609 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7610 image_create_info.flags = 0;
7611
7612 // Introduce error by sending down a bogus width extent
7613 image_create_info.extent.width = 0;
7614 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7615
7616 m_errorMonitor->VerifyFound();
7617}
7618
Karl Schultz6addd812016-02-02 17:17:23 -07007619TEST_F(VkLayerTest, UpdateBufferAlignment) {
7620 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06007621
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 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007624
Mike Stroyana3082432015-09-25 13:39:21 -06007625 ASSERT_NO_FATAL_FAILURE(InitState());
7626
7627 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7628 vk_testing::Buffer buffer;
7629 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7630
7631 BeginCommandBuffer();
7632 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007633 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007634 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007635
Mike Stroyana3082432015-09-25 13:39:21 -06007636 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007637 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007638 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007639
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007640 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007641 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007642 EndCommandBuffer();
7643}
7644
Karl Schultz6addd812016-02-02 17:17:23 -07007645TEST_F(VkLayerTest, FillBufferAlignment) {
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 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06007648
7649 ASSERT_NO_FATAL_FAILURE(InitState());
7650
7651 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7652 vk_testing::Buffer buffer;
7653 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7654
7655 BeginCommandBuffer();
7656 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007657 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007658 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007659
Mike Stroyana3082432015-09-25 13:39:21 -06007660 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007662 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007663
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007664 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007665
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007666 m_errorMonitor->VerifyFound();
7667
Mike Stroyana3082432015-09-25 13:39:21 -06007668 EndCommandBuffer();
7669}
7670
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007671#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12007672
Tobin Ehliscde08892015-09-22 10:11:37 -06007673#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07007674TEST_F(VkLayerTest, InvalidImageView) {
7675 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06007676
Karl Schultz6addd812016-02-02 17:17:23 -07007677 m_errorMonitor->SetDesiredFailureMsg(
7678 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007679 "vkCreateImageView called with baseMipLevel 10 ");
7680
Tobin Ehliscde08892015-09-22 10:11:37 -06007681 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06007682
Mike Stroyana3082432015-09-25 13:39:21 -06007683 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07007684 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06007685
Karl Schultz6addd812016-02-02 17:17:23 -07007686 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7687 const int32_t tex_width = 32;
7688 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06007689
7690 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007691 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7692 image_create_info.pNext = NULL;
7693 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7694 image_create_info.format = tex_format;
7695 image_create_info.extent.width = tex_width;
7696 image_create_info.extent.height = tex_height;
7697 image_create_info.extent.depth = 1;
7698 image_create_info.mipLevels = 1;
7699 image_create_info.arrayLayers = 1;
7700 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7701 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7702 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7703 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06007704
Chia-I Wuf7458c52015-10-26 21:10:41 +08007705 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06007706 ASSERT_VK_SUCCESS(err);
7707
7708 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007709 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7710 image_view_create_info.image = image;
7711 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7712 image_view_create_info.format = tex_format;
7713 image_view_create_info.subresourceRange.layerCount = 1;
7714 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
7715 image_view_create_info.subresourceRange.levelCount = 1;
7716 image_view_create_info.subresourceRange.aspectMask =
7717 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06007718
7719 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007720 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7721 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06007722
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007723 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06007724}
Mike Stroyana3082432015-09-25 13:39:21 -06007725
Karl Schultz6addd812016-02-02 17:17:23 -07007726TEST_F(VkLayerTest, InvalidImageViewAspect) {
7727 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007728
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007729 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007730 "vkCreateImageView: Color image "
7731 "formats must have ONLY the "
7732 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007733
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007734 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007735
7736 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07007737 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007738
Karl Schultz6addd812016-02-02 17:17:23 -07007739 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7740 const int32_t tex_width = 32;
7741 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007742
7743 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007744 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7745 image_create_info.pNext = NULL;
7746 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7747 image_create_info.format = tex_format;
7748 image_create_info.extent.width = tex_width;
7749 image_create_info.extent.height = tex_height;
7750 image_create_info.extent.depth = 1;
7751 image_create_info.mipLevels = 1;
7752 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7753 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7754 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7755 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007756
Chia-I Wuf7458c52015-10-26 21:10:41 +08007757 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007758 ASSERT_VK_SUCCESS(err);
7759
7760 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007761 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7762 image_view_create_info.image = image;
7763 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7764 image_view_create_info.format = tex_format;
7765 image_view_create_info.subresourceRange.baseMipLevel = 0;
7766 image_view_create_info.subresourceRange.levelCount = 1;
7767 // Cause an error by setting an invalid image aspect
7768 image_view_create_info.subresourceRange.aspectMask =
7769 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007770
7771 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007772 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7773 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007774
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007775 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007776}
7777
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007778TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07007779 VkResult err;
7780 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007781
Karl Schultz6addd812016-02-02 17:17:23 -07007782 m_errorMonitor->SetDesiredFailureMsg(
7783 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007784 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007785
Mike Stroyana3082432015-09-25 13:39:21 -06007786 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007787
7788 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007789 VkImage srcImage;
7790 VkImage dstImage;
7791 VkDeviceMemory srcMem;
7792 VkDeviceMemory destMem;
7793 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007794
7795 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007796 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7797 image_create_info.pNext = NULL;
7798 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7799 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7800 image_create_info.extent.width = 32;
7801 image_create_info.extent.height = 32;
7802 image_create_info.extent.depth = 1;
7803 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007804 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07007805 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7806 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7807 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7808 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007809
Karl Schultz6addd812016-02-02 17:17:23 -07007810 err =
7811 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007812 ASSERT_VK_SUCCESS(err);
7813
Karl Schultz6addd812016-02-02 17:17:23 -07007814 err =
7815 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007816 ASSERT_VK_SUCCESS(err);
7817
7818 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007819 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007820 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7821 memAlloc.pNext = NULL;
7822 memAlloc.allocationSize = 0;
7823 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007824
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007825 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007826 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007827 pass =
7828 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007829 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007830 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007831 ASSERT_VK_SUCCESS(err);
7832
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007833 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007834 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007835 pass =
7836 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007837 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007838 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007839 ASSERT_VK_SUCCESS(err);
7840
7841 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7842 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007843 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007844 ASSERT_VK_SUCCESS(err);
7845
7846 BeginCommandBuffer();
7847 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007848 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007849 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007850 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007851 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06007852 copyRegion.srcOffset.x = 0;
7853 copyRegion.srcOffset.y = 0;
7854 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007855 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007856 copyRegion.dstSubresource.mipLevel = 0;
7857 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007858 // Introduce failure by forcing the dst layerCount to differ from src
7859 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007860 copyRegion.dstOffset.x = 0;
7861 copyRegion.dstOffset.y = 0;
7862 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007863 copyRegion.extent.width = 1;
7864 copyRegion.extent.height = 1;
7865 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007866 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7867 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007868 EndCommandBuffer();
7869
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007870 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007871
Chia-I Wuf7458c52015-10-26 21:10:41 +08007872 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007873 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007874 vkFreeMemory(m_device->device(), srcMem, NULL);
7875 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007876}
7877
Karl Schultz6addd812016-02-02 17:17:23 -07007878TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06007879 VkResult err;
7880 bool pass;
7881
7882 // Create color images with different format sizes and try to copy between them
7883 m_errorMonitor->SetDesiredFailureMsg(
7884 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7885 "vkCmdCopyImage called with unmatched source and dest image format sizes");
7886
7887 ASSERT_NO_FATAL_FAILURE(InitState());
7888
7889 // Create two images of different types and try to copy between them
7890 VkImage srcImage;
7891 VkImage dstImage;
7892 VkDeviceMemory srcMem;
7893 VkDeviceMemory destMem;
7894 VkMemoryRequirements memReqs;
7895
7896 VkImageCreateInfo image_create_info = {};
7897 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7898 image_create_info.pNext = NULL;
7899 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7900 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7901 image_create_info.extent.width = 32;
7902 image_create_info.extent.height = 32;
7903 image_create_info.extent.depth = 1;
7904 image_create_info.mipLevels = 1;
7905 image_create_info.arrayLayers = 1;
7906 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7907 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7908 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7909 image_create_info.flags = 0;
7910
7911 err =
7912 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
7913 ASSERT_VK_SUCCESS(err);
7914
7915 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7916 // Introduce failure by creating second image with a different-sized format.
7917 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
7918
7919 err =
7920 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
7921 ASSERT_VK_SUCCESS(err);
7922
7923 // Allocate memory
7924 VkMemoryAllocateInfo memAlloc = {};
7925 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7926 memAlloc.pNext = NULL;
7927 memAlloc.allocationSize = 0;
7928 memAlloc.memoryTypeIndex = 0;
7929
7930 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
7931 memAlloc.allocationSize = memReqs.size;
7932 pass =
7933 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
7934 ASSERT_TRUE(pass);
7935 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
7936 ASSERT_VK_SUCCESS(err);
7937
7938 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
7939 memAlloc.allocationSize = memReqs.size;
7940 pass =
7941 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
7942 ASSERT_TRUE(pass);
7943 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
7944 ASSERT_VK_SUCCESS(err);
7945
7946 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7947 ASSERT_VK_SUCCESS(err);
7948 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
7949 ASSERT_VK_SUCCESS(err);
7950
7951 BeginCommandBuffer();
7952 VkImageCopy copyRegion;
7953 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7954 copyRegion.srcSubresource.mipLevel = 0;
7955 copyRegion.srcSubresource.baseArrayLayer = 0;
7956 copyRegion.srcSubresource.layerCount = 0;
7957 copyRegion.srcOffset.x = 0;
7958 copyRegion.srcOffset.y = 0;
7959 copyRegion.srcOffset.z = 0;
7960 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7961 copyRegion.dstSubresource.mipLevel = 0;
7962 copyRegion.dstSubresource.baseArrayLayer = 0;
7963 copyRegion.dstSubresource.layerCount = 0;
7964 copyRegion.dstOffset.x = 0;
7965 copyRegion.dstOffset.y = 0;
7966 copyRegion.dstOffset.z = 0;
7967 copyRegion.extent.width = 1;
7968 copyRegion.extent.height = 1;
7969 copyRegion.extent.depth = 1;
7970 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7971 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7972 EndCommandBuffer();
7973
7974 m_errorMonitor->VerifyFound();
7975
7976 vkDestroyImage(m_device->device(), srcImage, NULL);
7977 vkDestroyImage(m_device->device(), dstImage, NULL);
7978 vkFreeMemory(m_device->device(), srcMem, NULL);
7979 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007980}
7981
Karl Schultz6addd812016-02-02 17:17:23 -07007982TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
7983 VkResult err;
7984 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007985
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007986 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007987 m_errorMonitor->SetDesiredFailureMsg(
7988 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007989 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007990
Mike Stroyana3082432015-09-25 13:39:21 -06007991 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007992
7993 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007994 VkImage srcImage;
7995 VkImage dstImage;
7996 VkDeviceMemory srcMem;
7997 VkDeviceMemory destMem;
7998 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007999
8000 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008001 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8002 image_create_info.pNext = NULL;
8003 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8004 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8005 image_create_info.extent.width = 32;
8006 image_create_info.extent.height = 32;
8007 image_create_info.extent.depth = 1;
8008 image_create_info.mipLevels = 1;
8009 image_create_info.arrayLayers = 1;
8010 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8011 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8012 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8013 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008014
Karl Schultz6addd812016-02-02 17:17:23 -07008015 err =
8016 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008017 ASSERT_VK_SUCCESS(err);
8018
Karl Schultzbdb75952016-04-19 11:36:49 -06008019 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
8020
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008021 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07008022 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008023 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
8024 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008025
Karl Schultz6addd812016-02-02 17:17:23 -07008026 err =
8027 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008028 ASSERT_VK_SUCCESS(err);
8029
8030 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008031 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008032 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8033 memAlloc.pNext = NULL;
8034 memAlloc.allocationSize = 0;
8035 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008036
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008037 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008038 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008039 pass =
8040 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008041 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008042 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008043 ASSERT_VK_SUCCESS(err);
8044
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008045 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008046 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008047 pass =
8048 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008049 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008050 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008051 ASSERT_VK_SUCCESS(err);
8052
8053 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8054 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008055 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008056 ASSERT_VK_SUCCESS(err);
8057
8058 BeginCommandBuffer();
8059 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008060 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008061 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008062 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008063 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008064 copyRegion.srcOffset.x = 0;
8065 copyRegion.srcOffset.y = 0;
8066 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008067 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008068 copyRegion.dstSubresource.mipLevel = 0;
8069 copyRegion.dstSubresource.baseArrayLayer = 0;
8070 copyRegion.dstSubresource.layerCount = 0;
8071 copyRegion.dstOffset.x = 0;
8072 copyRegion.dstOffset.y = 0;
8073 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008074 copyRegion.extent.width = 1;
8075 copyRegion.extent.height = 1;
8076 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008077 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8078 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008079 EndCommandBuffer();
8080
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008081 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008082
Chia-I Wuf7458c52015-10-26 21:10:41 +08008083 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008084 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008085 vkFreeMemory(m_device->device(), srcMem, NULL);
8086 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008087}
8088
Karl Schultz6addd812016-02-02 17:17:23 -07008089TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
8090 VkResult err;
8091 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008092
Karl Schultz6addd812016-02-02 17:17:23 -07008093 m_errorMonitor->SetDesiredFailureMsg(
8094 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008095 "vkCmdResolveImage called with source sample count less than 2.");
8096
Mike Stroyana3082432015-09-25 13:39:21 -06008097 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008098
8099 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008100 VkImage srcImage;
8101 VkImage dstImage;
8102 VkDeviceMemory srcMem;
8103 VkDeviceMemory destMem;
8104 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008105
8106 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008107 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8108 image_create_info.pNext = NULL;
8109 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8110 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8111 image_create_info.extent.width = 32;
8112 image_create_info.extent.height = 1;
8113 image_create_info.extent.depth = 1;
8114 image_create_info.mipLevels = 1;
8115 image_create_info.arrayLayers = 1;
8116 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8117 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8118 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8119 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008120
Karl Schultz6addd812016-02-02 17:17:23 -07008121 err =
8122 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008123 ASSERT_VK_SUCCESS(err);
8124
Karl Schultz6addd812016-02-02 17:17:23 -07008125 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8126 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008127
Karl Schultz6addd812016-02-02 17:17:23 -07008128 err =
8129 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008130 ASSERT_VK_SUCCESS(err);
8131
8132 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008133 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008134 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8135 memAlloc.pNext = NULL;
8136 memAlloc.allocationSize = 0;
8137 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008138
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008139 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008140 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008141 pass =
8142 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008143 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008144 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008145 ASSERT_VK_SUCCESS(err);
8146
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008147 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008148 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008149 pass =
8150 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008151 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008152 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008153 ASSERT_VK_SUCCESS(err);
8154
8155 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8156 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008157 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008158 ASSERT_VK_SUCCESS(err);
8159
8160 BeginCommandBuffer();
8161 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008162 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8163 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008164 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008165 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008166 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008167 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008168 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008169 resolveRegion.srcOffset.x = 0;
8170 resolveRegion.srcOffset.y = 0;
8171 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008172 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008173 resolveRegion.dstSubresource.mipLevel = 0;
8174 resolveRegion.dstSubresource.baseArrayLayer = 0;
8175 resolveRegion.dstSubresource.layerCount = 0;
8176 resolveRegion.dstOffset.x = 0;
8177 resolveRegion.dstOffset.y = 0;
8178 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008179 resolveRegion.extent.width = 1;
8180 resolveRegion.extent.height = 1;
8181 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008182 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8183 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008184 EndCommandBuffer();
8185
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008186 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008187
Chia-I Wuf7458c52015-10-26 21:10:41 +08008188 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008189 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008190 vkFreeMemory(m_device->device(), srcMem, NULL);
8191 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008192}
8193
Karl Schultz6addd812016-02-02 17:17:23 -07008194TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
8195 VkResult err;
8196 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008197
Karl Schultz6addd812016-02-02 17:17:23 -07008198 m_errorMonitor->SetDesiredFailureMsg(
8199 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008200 "vkCmdResolveImage called with dest sample count greater than 1.");
8201
Mike Stroyana3082432015-09-25 13:39:21 -06008202 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008203
8204 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008205 VkImage srcImage;
8206 VkImage dstImage;
8207 VkDeviceMemory srcMem;
8208 VkDeviceMemory destMem;
8209 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008210
8211 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008212 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8213 image_create_info.pNext = NULL;
8214 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8215 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8216 image_create_info.extent.width = 32;
8217 image_create_info.extent.height = 1;
8218 image_create_info.extent.depth = 1;
8219 image_create_info.mipLevels = 1;
8220 image_create_info.arrayLayers = 1;
8221 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8222 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8223 // Note: Some implementations expect color attachment usage for any
8224 // multisample surface
8225 image_create_info.usage =
8226 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8227 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008228
Karl Schultz6addd812016-02-02 17:17:23 -07008229 err =
8230 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008231 ASSERT_VK_SUCCESS(err);
8232
Karl Schultz6addd812016-02-02 17:17:23 -07008233 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8234 // Note: Some implementations expect color attachment usage for any
8235 // multisample surface
8236 image_create_info.usage =
8237 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008238
Karl Schultz6addd812016-02-02 17:17:23 -07008239 err =
8240 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008241 ASSERT_VK_SUCCESS(err);
8242
8243 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008244 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008245 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8246 memAlloc.pNext = NULL;
8247 memAlloc.allocationSize = 0;
8248 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008249
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008250 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008251 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008252 pass =
8253 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008254 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008255 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008256 ASSERT_VK_SUCCESS(err);
8257
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008258 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008259 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008260 pass =
8261 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008262 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008263 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008264 ASSERT_VK_SUCCESS(err);
8265
8266 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8267 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008268 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008269 ASSERT_VK_SUCCESS(err);
8270
8271 BeginCommandBuffer();
8272 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008273 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8274 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008275 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008276 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008277 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008278 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008279 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008280 resolveRegion.srcOffset.x = 0;
8281 resolveRegion.srcOffset.y = 0;
8282 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008283 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008284 resolveRegion.dstSubresource.mipLevel = 0;
8285 resolveRegion.dstSubresource.baseArrayLayer = 0;
8286 resolveRegion.dstSubresource.layerCount = 0;
8287 resolveRegion.dstOffset.x = 0;
8288 resolveRegion.dstOffset.y = 0;
8289 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008290 resolveRegion.extent.width = 1;
8291 resolveRegion.extent.height = 1;
8292 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008293 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8294 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008295 EndCommandBuffer();
8296
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008297 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008298
Chia-I Wuf7458c52015-10-26 21:10:41 +08008299 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008300 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008301 vkFreeMemory(m_device->device(), srcMem, NULL);
8302 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008303}
8304
Karl Schultz6addd812016-02-02 17:17:23 -07008305TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
8306 VkResult err;
8307 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008308
Karl Schultz6addd812016-02-02 17:17:23 -07008309 m_errorMonitor->SetDesiredFailureMsg(
8310 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008311 "vkCmdResolveImage called with unmatched source and dest formats.");
8312
Mike Stroyana3082432015-09-25 13:39:21 -06008313 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008314
8315 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008316 VkImage srcImage;
8317 VkImage dstImage;
8318 VkDeviceMemory srcMem;
8319 VkDeviceMemory destMem;
8320 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008321
8322 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008323 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8324 image_create_info.pNext = NULL;
8325 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8326 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8327 image_create_info.extent.width = 32;
8328 image_create_info.extent.height = 1;
8329 image_create_info.extent.depth = 1;
8330 image_create_info.mipLevels = 1;
8331 image_create_info.arrayLayers = 1;
8332 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8333 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8334 // Note: Some implementations expect color attachment usage for any
8335 // multisample surface
8336 image_create_info.usage =
8337 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8338 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008339
Karl Schultz6addd812016-02-02 17:17:23 -07008340 err =
8341 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008342 ASSERT_VK_SUCCESS(err);
8343
Karl Schultz6addd812016-02-02 17:17:23 -07008344 // Set format to something other than source image
8345 image_create_info.format = VK_FORMAT_R32_SFLOAT;
8346 // Note: Some implementations expect color attachment usage for any
8347 // multisample surface
8348 image_create_info.usage =
8349 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8350 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008351
Karl Schultz6addd812016-02-02 17:17:23 -07008352 err =
8353 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008354 ASSERT_VK_SUCCESS(err);
8355
8356 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008357 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008358 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8359 memAlloc.pNext = NULL;
8360 memAlloc.allocationSize = 0;
8361 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008362
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008363 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008364 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008365 pass =
8366 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008367 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008368 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008369 ASSERT_VK_SUCCESS(err);
8370
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008371 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008372 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008373 pass =
8374 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008375 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008376 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008377 ASSERT_VK_SUCCESS(err);
8378
8379 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8380 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008381 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008382 ASSERT_VK_SUCCESS(err);
8383
8384 BeginCommandBuffer();
8385 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008386 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8387 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008388 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008389 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008390 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008391 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008392 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008393 resolveRegion.srcOffset.x = 0;
8394 resolveRegion.srcOffset.y = 0;
8395 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008396 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008397 resolveRegion.dstSubresource.mipLevel = 0;
8398 resolveRegion.dstSubresource.baseArrayLayer = 0;
8399 resolveRegion.dstSubresource.layerCount = 0;
8400 resolveRegion.dstOffset.x = 0;
8401 resolveRegion.dstOffset.y = 0;
8402 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008403 resolveRegion.extent.width = 1;
8404 resolveRegion.extent.height = 1;
8405 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008406 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8407 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008408 EndCommandBuffer();
8409
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008410 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008411
Chia-I Wuf7458c52015-10-26 21:10:41 +08008412 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008413 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008414 vkFreeMemory(m_device->device(), srcMem, NULL);
8415 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008416}
8417
Karl Schultz6addd812016-02-02 17:17:23 -07008418TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
8419 VkResult err;
8420 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008421
Karl Schultz6addd812016-02-02 17:17:23 -07008422 m_errorMonitor->SetDesiredFailureMsg(
8423 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008424 "vkCmdResolveImage called with unmatched source and dest image types.");
8425
Mike Stroyana3082432015-09-25 13:39:21 -06008426 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008427
8428 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008429 VkImage srcImage;
8430 VkImage dstImage;
8431 VkDeviceMemory srcMem;
8432 VkDeviceMemory destMem;
8433 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008434
8435 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008436 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8437 image_create_info.pNext = NULL;
8438 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8439 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8440 image_create_info.extent.width = 32;
8441 image_create_info.extent.height = 1;
8442 image_create_info.extent.depth = 1;
8443 image_create_info.mipLevels = 1;
8444 image_create_info.arrayLayers = 1;
8445 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8446 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8447 // Note: Some implementations expect color attachment usage for any
8448 // multisample surface
8449 image_create_info.usage =
8450 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8451 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008452
Karl Schultz6addd812016-02-02 17:17:23 -07008453 err =
8454 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008455 ASSERT_VK_SUCCESS(err);
8456
Karl Schultz6addd812016-02-02 17:17:23 -07008457 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8458 // Note: Some implementations expect color attachment usage for any
8459 // multisample surface
8460 image_create_info.usage =
8461 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8462 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008463
Karl Schultz6addd812016-02-02 17:17:23 -07008464 err =
8465 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008466 ASSERT_VK_SUCCESS(err);
8467
8468 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008469 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008470 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8471 memAlloc.pNext = NULL;
8472 memAlloc.allocationSize = 0;
8473 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008474
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008475 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008476 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008477 pass =
8478 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008479 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008480 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008481 ASSERT_VK_SUCCESS(err);
8482
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008483 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008484 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008485 pass =
8486 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008487 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008488 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008489 ASSERT_VK_SUCCESS(err);
8490
8491 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8492 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008493 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008494 ASSERT_VK_SUCCESS(err);
8495
8496 BeginCommandBuffer();
8497 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008498 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8499 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008500 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008501 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008502 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008503 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008504 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008505 resolveRegion.srcOffset.x = 0;
8506 resolveRegion.srcOffset.y = 0;
8507 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008508 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008509 resolveRegion.dstSubresource.mipLevel = 0;
8510 resolveRegion.dstSubresource.baseArrayLayer = 0;
8511 resolveRegion.dstSubresource.layerCount = 0;
8512 resolveRegion.dstOffset.x = 0;
8513 resolveRegion.dstOffset.y = 0;
8514 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008515 resolveRegion.extent.width = 1;
8516 resolveRegion.extent.height = 1;
8517 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008518 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8519 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008520 EndCommandBuffer();
8521
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008522 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008523
Chia-I Wuf7458c52015-10-26 21:10:41 +08008524 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008525 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008526 vkFreeMemory(m_device->device(), srcMem, NULL);
8527 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008528}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008529
Karl Schultz6addd812016-02-02 17:17:23 -07008530TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008531 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07008532 // to using a DS format, then cause it to hit error due to COLOR_BIT not
8533 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008534 // The image format check comes 2nd in validation so we trigger it first,
8535 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07008536 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008537
Karl Schultz6addd812016-02-02 17:17:23 -07008538 m_errorMonitor->SetDesiredFailureMsg(
8539 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008540 "Combination depth/stencil image formats can have only the ");
8541
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008542 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008543
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008544 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008545 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8546 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008547
8548 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008549 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8550 ds_pool_ci.pNext = NULL;
8551 ds_pool_ci.maxSets = 1;
8552 ds_pool_ci.poolSizeCount = 1;
8553 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008554
8555 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008556 err =
8557 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008558 ASSERT_VK_SUCCESS(err);
8559
8560 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008561 dsl_binding.binding = 0;
8562 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8563 dsl_binding.descriptorCount = 1;
8564 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8565 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008566
8567 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008568 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8569 ds_layout_ci.pNext = NULL;
8570 ds_layout_ci.bindingCount = 1;
8571 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008572 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008573 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8574 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008575 ASSERT_VK_SUCCESS(err);
8576
8577 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008578 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008579 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008580 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008581 alloc_info.descriptorPool = ds_pool;
8582 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008583 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8584 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008585 ASSERT_VK_SUCCESS(err);
8586
Karl Schultz6addd812016-02-02 17:17:23 -07008587 VkImage image_bad;
8588 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008589 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07008590 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008591 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07008592 const int32_t tex_width = 32;
8593 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008594
8595 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008596 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8597 image_create_info.pNext = NULL;
8598 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8599 image_create_info.format = tex_format_bad;
8600 image_create_info.extent.width = tex_width;
8601 image_create_info.extent.height = tex_height;
8602 image_create_info.extent.depth = 1;
8603 image_create_info.mipLevels = 1;
8604 image_create_info.arrayLayers = 1;
8605 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8606 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8607 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
8608 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
8609 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008610
Karl Schultz6addd812016-02-02 17:17:23 -07008611 err =
8612 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008613 ASSERT_VK_SUCCESS(err);
8614 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07008615 image_create_info.usage =
8616 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8617 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
8618 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008619 ASSERT_VK_SUCCESS(err);
8620
8621 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008622 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8623 image_view_create_info.image = image_bad;
8624 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8625 image_view_create_info.format = tex_format_bad;
8626 image_view_create_info.subresourceRange.baseArrayLayer = 0;
8627 image_view_create_info.subresourceRange.baseMipLevel = 0;
8628 image_view_create_info.subresourceRange.layerCount = 1;
8629 image_view_create_info.subresourceRange.levelCount = 1;
8630 image_view_create_info.subresourceRange.aspectMask =
8631 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008632
8633 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008634 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8635 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008636
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008637 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008638
Chia-I Wuf7458c52015-10-26 21:10:41 +08008639 vkDestroyImage(m_device->device(), image_bad, NULL);
8640 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008641 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8642 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008643}
Tobin Ehliscde08892015-09-22 10:11:37 -06008644#endif // IMAGE_TESTS
8645
Tony Barbour300a6082015-04-07 13:44:53 -06008646int main(int argc, char **argv) {
8647 int result;
8648
Cody Northrop8e54a402016-03-08 22:25:52 -07008649#ifdef ANDROID
8650 int vulkanSupport = InitVulkan();
8651 if (vulkanSupport == 0)
8652 return 1;
8653#endif
8654
Tony Barbour300a6082015-04-07 13:44:53 -06008655 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06008656 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06008657
8658 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
8659
8660 result = RUN_ALL_TESTS();
8661
Tony Barbour6918cd52015-04-09 12:58:51 -06008662 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06008663 return result;
8664}