blob: 99ce40a65233c7b35855069747945316b435a28f [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Michael Lentine0a369f62016-02-03 16:51:46 -06005 * Copyright (c) 2015-2016 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
20 */
Tony Barbour65c48b32015-11-17 10:02:56 -070021
Cody Northrop8e54a402016-03-08 22:25:52 -070022#ifdef ANDROID
23#include "vulkan_wrapper.h"
24#else
David Pinedo9316d3b2015-11-06 12:54:48 -070025#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070026#endif
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060027#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060028#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060029#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070030#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060031
Mark Lobodzinski3780e142015-05-14 15:08:13 -050032#define GLM_FORCE_RADIANS
33#include "glm/glm.hpp"
34#include <glm/gtc/matrix_transform.hpp>
35
Tobin Ehlis0788f522015-05-26 16:11:58 -060036#define MEM_TRACKER_TESTS 1
37#define OBJ_TRACKER_TESTS 1
38#define DRAW_STATE_TESTS 1
39#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120040#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060041#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060042#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060043
Mark Lobodzinski3780e142015-05-14 15:08:13 -050044//--------------------------------------------------------------------------------------
45// Mesh and VertexFormat Data
46//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070047struct Vertex {
48 float posX, posY, posZ, posW; // Position data
49 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050050};
51
Karl Schultz6addd812016-02-02 17:17:23 -070052#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050053
54typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070055 BsoFailNone = 0x00000000,
56 BsoFailLineWidth = 0x00000001,
57 BsoFailDepthBias = 0x00000002,
58 BsoFailViewport = 0x00000004,
59 BsoFailScissor = 0x00000008,
60 BsoFailBlend = 0x00000010,
61 BsoFailDepthBounds = 0x00000020,
62 BsoFailStencilReadMask = 0x00000040,
63 BsoFailStencilWriteMask = 0x00000080,
64 BsoFailStencilReference = 0x00000100,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050065} BsoFailSelect;
66
67struct vktriangle_vs_uniform {
68 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070069 float mvp[4][4];
70 float position[3][4];
71 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050072};
73
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050074static const char bindStateVertShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120075 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070076 "vec2 vertices[3];\n"
77 "out gl_PerVertex {\n"
78 " vec4 gl_Position;\n"
79 "};\n"
80 "void main() {\n"
81 " vertices[0] = vec2(-1.0, -1.0);\n"
82 " vertices[1] = vec2( 1.0, -1.0);\n"
83 " vertices[2] = vec2( 0.0, 1.0);\n"
84 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
85 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050086
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050087static const char bindStateFragShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120088 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070089 "\n"
90 "layout(location = 0) out vec4 uFragColor;\n"
91 "void main(){\n"
92 " uFragColor = vec4(0,1,0,1);\n"
93 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050094
Karl Schultz6addd812016-02-02 17:17:23 -070095static VKAPI_ATTR VkBool32 VKAPI_CALL
96myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
97 uint64_t srcObject, size_t location, int32_t msgCode,
98 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -060099
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600100// ********************************************************
101// ErrorMonitor Usage:
102//
103// Call SetDesiredFailureMsg with a string to be compared against all
104// encountered log messages. Passing NULL will match all log messages.
105// logMsg will return true for skipCall only if msg is matched or NULL.
106//
107// Call DesiredMsgFound to determine if the desired failure message
108// was encountered.
109
Tony Barbour300a6082015-04-07 13:44:53 -0600110class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700111 public:
112 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600113 test_platform_thread_create_mutex(&m_mutex);
114 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700115 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700116 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600117 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600118 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600119
Dustin Graves48458142016-04-29 16:11:55 -0600120 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
121
Karl Schultz6addd812016-02-02 17:17:23 -0700122 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200123 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600124 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600125 m_failureMsg.clear();
126 m_otherMsgs.clear();
127 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700128 m_msgFound = VK_FALSE;
129 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600130 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600131 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600132
Karl Schultz6addd812016-02-02 17:17:23 -0700133 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600134 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600135 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600136 if (m_bailout != NULL) {
137 *m_bailout = true;
138 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600139 string errorString(msgString);
140 if (msgFlags & m_msgFlags) {
141 if (errorString.find(m_desiredMsg) != string::npos) {
Chris Forbesc7b8ad72016-04-04 18:50:38 +1200142 if (m_msgFound) { /* if multiple matches, don't lose all but the last! */
143 m_otherMsgs.push_back(m_failureMsg);
144 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600145 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700146 m_msgFound = VK_TRUE;
147 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600148 } else {
149 m_otherMsgs.push_back(errorString);
150 }
151 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600152 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600153 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600154 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600155
Karl Schultz6addd812016-02-02 17:17:23 -0700156 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600157
Karl Schultz6addd812016-02-02 17:17:23 -0700158 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600159
Karl Schultz6addd812016-02-02 17:17:23 -0700160 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600161
Karl Schultz6addd812016-02-02 17:17:23 -0700162 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600163
Karl Schultz6addd812016-02-02 17:17:23 -0700164 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165 vector<string> otherMsgs = GetOtherFailureMsgs();
166 cout << "Other error messages logged for this test were:" << endl;
167 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
168 cout << " " << *iter << endl;
169 }
170 }
171
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200172 /* helpers */
173
174 void ExpectSuccess() {
175 // match anything
176 SetDesiredFailureMsg(~0u, "");
177 }
178
179 void VerifyFound() {
180 // Not seeing the desired message is a failure. /Before/ throwing, dump
181 // any other messages.
182 if (!DesiredMsgFound()) {
183 DumpFailureMsgs();
184 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
185 }
186 }
187
188 void VerifyNotFound() {
189 // ExpectSuccess() configured us to match anything. Any error is a
190 // failure.
191 if (DesiredMsgFound()) {
192 DumpFailureMsgs();
193 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
194 }
195 }
196
Karl Schultz6addd812016-02-02 17:17:23 -0700197 private:
198 VkFlags m_msgFlags;
199 string m_desiredMsg;
200 string m_failureMsg;
201 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600202 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700203 bool *m_bailout;
204 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600205};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500206
Karl Schultz6addd812016-02-02 17:17:23 -0700207static VKAPI_ATTR VkBool32 VKAPI_CALL
208myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
209 uint64_t srcObject, size_t location, int32_t msgCode,
210 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
211 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700212 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700213 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600214 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600215 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600216 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600217 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600218}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500219
Karl Schultz6addd812016-02-02 17:17:23 -0700220class VkLayerTest : public VkRenderFramework {
221 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800222 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
223 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700224 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
225 BsoFailSelect failMask);
226 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
227 VkPipelineObj &pipelineobj,
228 VkDescriptorSetObj &descriptorSet,
229 BsoFailSelect failMask);
230 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
231 VkDescriptorSetObj &descriptorSet,
232 BsoFailSelect failMask) {
233 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
234 failMask);
235 }
Tony Barbour300a6082015-04-07 13:44:53 -0600236
Tony Barbourfe3351b2015-07-28 10:17:20 -0600237 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700238 VkResult BeginCommandBuffer() {
239 return BeginCommandBuffer(*m_commandBuffer);
240 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800241 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700242 void Draw(uint32_t vertexCount, uint32_t instanceCount,
243 uint32_t firstVertex, uint32_t firstInstance) {
244 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
245 firstInstance);
246 }
247 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
248 uint32_t firstIndex, int32_t vertexOffset,
249 uint32_t firstInstance) {
250 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
251 vertexOffset, firstInstance);
252 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800253 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); }
Karl Schultz6addd812016-02-02 17:17:23 -0700254 void QueueCommandBuffer(const VkFence &fence) {
255 m_commandBuffer->QueueCommandBuffer(fence);
256 }
257 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
258 VkDeviceSize offset, uint32_t binding) {
259 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
260 }
261 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
262 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
263 }
264
265 protected:
266 ErrorMonitor *m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600267
268 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600269 std::vector<const char *> instance_layer_names;
270 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600271 std::vector<const char *> instance_extension_names;
272 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600273
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700274 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600275 /*
276 * Since CreateDbgMsgCallback is an instance level extension call
277 * any extension / layer that utilizes that feature also needs
278 * to be enabled at create instance time.
279 */
Karl Schultz6addd812016-02-02 17:17:23 -0700280 // Use Threading layer first to protect others from
281 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700282 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600283 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800284 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700285 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800286 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
287 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600288 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700289 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600290
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700291 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600292 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800293 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700294 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800295 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
296 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600297 device_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700298 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600299
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600300 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600301 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800302 this->app_info.pApplicationName = "layer_tests";
303 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600304 this->app_info.pEngineName = "unittest";
305 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600306 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600307
Tony Barbour15524c32015-04-29 17:34:29 -0600308 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600309 InitFramework(instance_layer_names, device_layer_names,
310 instance_extension_names, device_extension_names,
311 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600312 }
313
314 virtual void TearDown() {
315 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600316 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600317 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600318 }
319};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500320
Karl Schultz6addd812016-02-02 17:17:23 -0700321VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600322 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600323
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800324 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600325
326 /*
327 * For render test all drawing happens in a single render pass
328 * on a single command buffer.
329 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200330 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800331 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600332 }
333
334 return result;
335}
336
Karl Schultz6addd812016-02-02 17:17:23 -0700337VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600338 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600339
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200340 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800341 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200342 }
Tony Barbour300a6082015-04-07 13:44:53 -0600343
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800344 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600345
346 return result;
347}
348
Karl Schultz6addd812016-02-02 17:17:23 -0700349void VkLayerTest::VKTriangleTest(const char *vertShaderText,
350 const char *fragShaderText,
351 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500352 // Create identity matrix
353 int i;
354 struct vktriangle_vs_uniform data;
355
356 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700357 glm::mat4 View = glm::mat4(1.0f);
358 glm::mat4 Model = glm::mat4(1.0f);
359 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500360 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700361 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500362
363 memcpy(&data.mvp, &MVP[0][0], matrixSize);
364
Karl Schultz6addd812016-02-02 17:17:23 -0700365 static const Vertex tri_data[] = {
366 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
367 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
368 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500369 };
370
Karl Schultz6addd812016-02-02 17:17:23 -0700371 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500372 data.position[i][0] = tri_data[i].posX;
373 data.position[i][1] = tri_data[i].posY;
374 data.position[i][2] = tri_data[i].posZ;
375 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700376 data.color[i][0] = tri_data[i].r;
377 data.color[i][1] = tri_data[i].g;
378 data.color[i][2] = tri_data[i].b;
379 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500380 }
381
382 ASSERT_NO_FATAL_FAILURE(InitState());
383 ASSERT_NO_FATAL_FAILURE(InitViewport());
384
Karl Schultz6addd812016-02-02 17:17:23 -0700385 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
386 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500387
Karl Schultz6addd812016-02-02 17:17:23 -0700388 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
389 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
390 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500391
392 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800393 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500394 pipelineobj.AddShader(&vs);
395 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600396 if (failMask & BsoFailLineWidth) {
397 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600398 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
399 ia_state.sType =
400 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
401 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
402 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600403 }
404 if (failMask & BsoFailDepthBias) {
405 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600406 VkPipelineRasterizationStateCreateInfo rs_state = {};
407 rs_state.sType =
408 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
409 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600410 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600411 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600412 }
Karl Schultz6addd812016-02-02 17:17:23 -0700413 // Viewport and scissors must stay in synch or other errors will occur than
414 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600415 if (failMask & BsoFailViewport) {
416 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600417 m_viewports.clear();
418 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600419 }
420 if (failMask & BsoFailScissor) {
421 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600422 m_scissors.clear();
423 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600424 }
425 if (failMask & BsoFailBlend) {
426 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600427 VkPipelineColorBlendAttachmentState att_state = {};
428 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
429 att_state.blendEnable = VK_TRUE;
430 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600431 }
432 if (failMask & BsoFailDepthBounds) {
433 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
434 }
435 if (failMask & BsoFailStencilReadMask) {
436 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
437 }
438 if (failMask & BsoFailStencilWriteMask) {
439 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
440 }
441 if (failMask & BsoFailStencilReference) {
442 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
443 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500444
445 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700446 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
447 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500448
449 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600450 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500451
Tony Barbourfe3351b2015-07-28 10:17:20 -0600452 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500453
454 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600455 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500456
457 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600458 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500459
Tony Barbourfe3351b2015-07-28 10:17:20 -0600460 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500461}
462
Karl Schultz6addd812016-02-02 17:17:23 -0700463void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
464 VkPipelineObj &pipelineobj,
465 VkDescriptorSetObj &descriptorSet,
466 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500467 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700468 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
469 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500470 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700471 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
472 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500473 }
474
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800475 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700476 // Make sure depthWriteEnable is set so that Depth fail test will work
477 // correctly
478 // Make sure stencilTestEnable is set so that Stencil fail test will work
479 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600480 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800481 stencil.failOp = VK_STENCIL_OP_KEEP;
482 stencil.passOp = VK_STENCIL_OP_KEEP;
483 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
484 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600485
486 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
487 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600488 ds_ci.pNext = NULL;
489 ds_ci.depthTestEnable = VK_FALSE;
490 ds_ci.depthWriteEnable = VK_TRUE;
491 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
492 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600493 if (failMask & BsoFailDepthBounds) {
494 ds_ci.depthBoundsTestEnable = VK_TRUE;
495 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600496 ds_ci.stencilTestEnable = VK_TRUE;
497 ds_ci.front = stencil;
498 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600499
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600500 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600501 pipelineobj.SetViewport(m_viewports);
502 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800503 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700504 VkResult err = pipelineobj.CreateVKPipeline(
505 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600506 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800507 commandBuffer->BindPipeline(pipelineobj);
508 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500509}
510
511// ********************************************************************************************************************
512// ********************************************************************************************************************
513// ********************************************************************************************************************
514// ********************************************************************************************************************
Tobin Ehlis0788f522015-05-26 16:11:58 -0600515#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700516#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800517TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500518{
519 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500520 VkFenceCreateInfo fenceInfo = {};
521 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
522 fenceInfo.pNext = NULL;
523 fenceInfo.flags = 0;
524
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600526
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500527 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600528
529 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
530 vk_testing::Buffer buffer;
531 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500532
Tony Barbourfe3351b2015-07-28 10:17:20 -0600533 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800534 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600535 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500536
537 testFence.init(*m_device, fenceInfo);
538
539 // Bypass framework since it does the waits automatically
540 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600541 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800542 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
543 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800544 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600545 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700546 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800547 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800548 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800549 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600550 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600551
552 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500553 ASSERT_VK_SUCCESS( err );
554
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500555 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800556 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500557
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200558 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500559}
560
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800561TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500562{
563 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500564 VkFenceCreateInfo fenceInfo = {};
565 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
566 fenceInfo.pNext = NULL;
567 fenceInfo.flags = 0;
568
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600570
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500571 ASSERT_NO_FATAL_FAILURE(InitState());
572 ASSERT_NO_FATAL_FAILURE(InitViewport());
573 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
574
Tony Barbourfe3351b2015-07-28 10:17:20 -0600575 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800576 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600577 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500578
579 testFence.init(*m_device, fenceInfo);
580
581 // Bypass framework since it does the waits automatically
582 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600583 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800584 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
585 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800586 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600587 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700588 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800589 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800590 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800591 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600592 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600593
594 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500595 ASSERT_VK_SUCCESS( err );
596
Jon Ashburnf19916e2016-01-11 13:12:43 -0700597 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800598 VkCommandBufferBeginInfo info = {};
599 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
600 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600601 info.renderPass = VK_NULL_HANDLE;
602 info.subpass = 0;
603 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +0800604 info.occlusionQueryEnable = VK_FALSE;
605 info.queryFlags = 0;
606 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600607
608 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800609 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500610
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200611 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500612}
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700613#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200614
Ian Elliott1c32c772016-04-28 14:47:13 -0600615TEST_F(VkLayerTest, EnableWsiBeforeUse) {
616 VkResult err;
617 bool pass;
618
619 VkSurfaceKHR surface = VK_NULL_HANDLE;
620 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
621 VkSwapchainCreateInfoKHR swapchain_create_info = {};
622 uint32_t swapchain_image_count = 0;
623// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
624 uint32_t image_index = 0;
625// VkPresentInfoKHR present_info = {};
626
627 ASSERT_NO_FATAL_FAILURE(InitState());
628
Ian Elliott3f06ce52016-04-29 14:46:21 -0600629#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
630#if defined(VK_USE_PLATFORM_ANDROID_KHR)
631 // Use the functions from the VK_KHR_android_surface extension without
632 // enabling that extension:
633
634 // Create a surface:
635 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
636#if 0
637#endif
638 m_errorMonitor->SetDesiredFailureMsg(
639 VK_DEBUG_REPORT_ERROR_BIT_EXT,
640 "extension was not enabled for this");
641 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
642 &surface);
643 pass = (err != VK_SUCCESS);
644 ASSERT_TRUE(pass);
645 m_errorMonitor->VerifyFound();
646#endif // VK_USE_PLATFORM_ANDROID_KHR
647
648
649#if defined(VK_USE_PLATFORM_MIR_KHR)
650 // Use the functions from the VK_KHR_mir_surface extension without enabling
651 // that extension:
652
653 // Create a surface:
654 VkMirSurfaceCreateInfoKHR mir_create_info = {};
655#if 0
656#endif
657 m_errorMonitor->SetDesiredFailureMsg(
658 VK_DEBUG_REPORT_ERROR_BIT_EXT,
659 "extension was not enabled for this");
660 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
661 pass = (err != VK_SUCCESS);
662 ASSERT_TRUE(pass);
663 m_errorMonitor->VerifyFound();
664
665 // Tell whether an mir_connection supports presentation:
666 MirConnection *mir_connection = NULL;
667 m_errorMonitor->SetDesiredFailureMsg(
668 VK_DEBUG_REPORT_ERROR_BIT_EXT,
669 "extension was not enabled for this");
670 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
671 visual_id);
672 m_errorMonitor->VerifyFound();
673#endif // VK_USE_PLATFORM_MIR_KHR
674
675
676#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
677 // Use the functions from the VK_KHR_wayland_surface extension without
678 // enabling that extension:
679
680 // Create a surface:
681 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
682#if 0
683#endif
684 m_errorMonitor->SetDesiredFailureMsg(
685 VK_DEBUG_REPORT_ERROR_BIT_EXT,
686 "extension was not enabled for this");
687 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
688 &surface);
689 pass = (err != VK_SUCCESS);
690 ASSERT_TRUE(pass);
691 m_errorMonitor->VerifyFound();
692
693 // Tell whether an wayland_display supports presentation:
694 struct wl_display wayland_display = {};
695 m_errorMonitor->SetDesiredFailureMsg(
696 VK_DEBUG_REPORT_ERROR_BIT_EXT,
697 "extension was not enabled for this");
698 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
699 &wayland_display);
700 m_errorMonitor->VerifyFound();
701#endif // VK_USE_PLATFORM_WAYLAND_KHR
702
703
704#if defined(VK_USE_PLATFORM_WIN32_KHR)
705 // Use the functions from the VK_KHR_win32_surface extension without
706 // enabling that extension:
707
708 // Create a surface:
709 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
710#if 0
711#endif
712 m_errorMonitor->SetDesiredFailureMsg(
713 VK_DEBUG_REPORT_ERROR_BIT_EXT,
714 "extension was not enabled for this");
715 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
716 &surface);
717 pass = (err != VK_SUCCESS);
718 ASSERT_TRUE(pass);
719 m_errorMonitor->VerifyFound();
720
721 // Tell whether win32 supports presentation:
722 struct wl_display win32_display = {};
723 m_errorMonitor->SetDesiredFailureMsg(
724 VK_DEBUG_REPORT_ERROR_BIT_EXT,
725 "extension was not enabled for this");
726 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0,
727 &win32_display);
728 m_errorMonitor->VerifyFound();
729#endif // VK_USE_PLATFORM_WAYLAND_KHR
730#endif // NEED_TO_TEST_THIS_ON_PLATFORM
731
732
Ian Elliott1c32c772016-04-28 14:47:13 -0600733#if defined(VK_USE_PLATFORM_XCB_KHR)
734 // Use the functions from the VK_KHR_xcb_surface extension without enabling
735 // that extension:
736
737 // Create a surface:
738 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
739#if 0
740#endif
741 m_errorMonitor->SetDesiredFailureMsg(
742 VK_DEBUG_REPORT_ERROR_BIT_EXT,
743 "extension was not enabled for this");
744 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
745 pass = (err != VK_SUCCESS);
746 ASSERT_TRUE(pass);
747 m_errorMonitor->VerifyFound();
748
749 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -0600750 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -0600751 xcb_visualid_t visual_id = 0;
752 m_errorMonitor->SetDesiredFailureMsg(
753 VK_DEBUG_REPORT_ERROR_BIT_EXT,
754 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -0600755 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -0600756 visual_id);
757 m_errorMonitor->VerifyFound();
758#endif // VK_USE_PLATFORM_XCB_KHR
759
760
Ian Elliott12630812016-04-29 14:35:43 -0600761#if defined(VK_USE_PLATFORM_XLIB_KHR)
762 // Use the functions from the VK_KHR_xlib_surface extension without enabling
763 // that extension:
764
765 // Create a surface:
766 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
767#if 0
768#endif
769 m_errorMonitor->SetDesiredFailureMsg(
770 VK_DEBUG_REPORT_ERROR_BIT_EXT,
771 "extension was not enabled for this");
772 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
773 pass = (err != VK_SUCCESS);
774 ASSERT_TRUE(pass);
775 m_errorMonitor->VerifyFound();
776
777 // Tell whether an Xlib VisualID supports presentation:
778 Display *dpy = NULL;
779 VisualID visual = 0;
780 m_errorMonitor->SetDesiredFailureMsg(
781 VK_DEBUG_REPORT_ERROR_BIT_EXT,
782 "extension was not enabled for this");
783 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
784 m_errorMonitor->VerifyFound();
785#endif // VK_USE_PLATFORM_XLIB_KHR
786
787
Ian Elliott1c32c772016-04-28 14:47:13 -0600788 // Use the functions from the VK_KHR_surface extension without enabling
789 // that extension:
790
791 // Destroy a surface:
792 m_errorMonitor->SetDesiredFailureMsg(
793 VK_DEBUG_REPORT_ERROR_BIT_EXT,
794 "extension was not enabled for this");
795 vkDestroySurfaceKHR(instance(), surface, NULL);
796 m_errorMonitor->VerifyFound();
797
798 // Check if surface supports presentation:
799 VkBool32 supported = false;
800 m_errorMonitor->SetDesiredFailureMsg(
801 VK_DEBUG_REPORT_ERROR_BIT_EXT,
802 "extension was not enabled for this");
803 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
804 pass = (err != VK_SUCCESS);
805 ASSERT_TRUE(pass);
806 m_errorMonitor->VerifyFound();
807
808 // Check surface capabilities:
809 VkSurfaceCapabilitiesKHR capabilities = {};
810 m_errorMonitor->SetDesiredFailureMsg(
811 VK_DEBUG_REPORT_ERROR_BIT_EXT,
812 "extension was not enabled for this");
813 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
814 &capabilities);
815 pass = (err != VK_SUCCESS);
816 ASSERT_TRUE(pass);
817 m_errorMonitor->VerifyFound();
818
819 // Check surface formats:
820 uint32_t format_count = 0;
821 VkSurfaceFormatKHR *formats = NULL;
822 m_errorMonitor->SetDesiredFailureMsg(
823 VK_DEBUG_REPORT_ERROR_BIT_EXT,
824 "extension was not enabled for this");
825 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
826 &format_count, formats);
827 pass = (err != VK_SUCCESS);
828 ASSERT_TRUE(pass);
829 m_errorMonitor->VerifyFound();
830
831 // Check surface present modes:
832 uint32_t present_mode_count = 0;
833 VkSurfaceFormatKHR *present_modes = NULL;
834 m_errorMonitor->SetDesiredFailureMsg(
835 VK_DEBUG_REPORT_ERROR_BIT_EXT,
836 "extension was not enabled for this");
837 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
838 &present_mode_count, present_modes);
839 pass = (err != VK_SUCCESS);
840 ASSERT_TRUE(pass);
841 m_errorMonitor->VerifyFound();
842
843
844 // Use the functions from the VK_KHR_swapchain extension without enabling
845 // that extension:
846
847 // Create a swapchain:
848 m_errorMonitor->SetDesiredFailureMsg(
849 VK_DEBUG_REPORT_ERROR_BIT_EXT,
850 "extension was not enabled for this");
851 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
852 swapchain_create_info.pNext = NULL;
853#if 0
854 swapchain_create_info.flags = 0;
855 swapchain_create_info.surface = 0;
856 swapchain_create_info.minImageCount = 0;
857 swapchain_create_info.imageFormat = 0;
858 swapchain_create_info.imageColorSpace = 0;
859 swapchain_create_info.imageExtent.width = 0;
860 swapchain_create_info.imageExtent.height = 0;
861 swapchain_create_info.imageArrayLayers = 0;
862 swapchain_create_info.imageUsage = 0;
863 swapchain_create_info.imageSharingMode = 0;
864 swapchain_create_info.queueFamilyIndexCount = 0;
865 swapchain_create_info.preTransform = 0;
866 swapchain_create_info.compositeAlpha = 0;
867 swapchain_create_info.presentMode = 0;
868 swapchain_create_info.clipped = 0;
869 swapchain_create_info.oldSwapchain = NULL;
870#endif
871 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
872 NULL, &swapchain);
873 pass = (err != VK_SUCCESS);
874 ASSERT_TRUE(pass);
875 m_errorMonitor->VerifyFound();
876
877 // Get the images from the swapchain:
878 m_errorMonitor->SetDesiredFailureMsg(
879 VK_DEBUG_REPORT_ERROR_BIT_EXT,
880 "extension was not enabled for this");
881 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
882 &swapchain_image_count, NULL);
883 pass = (err != VK_SUCCESS);
884 ASSERT_TRUE(pass);
885 m_errorMonitor->VerifyFound();
886
887 // Try to acquire an image:
888 m_errorMonitor->SetDesiredFailureMsg(
889 VK_DEBUG_REPORT_ERROR_BIT_EXT,
890 "extension was not enabled for this");
891 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
892 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
893 pass = (err != VK_SUCCESS);
894 ASSERT_TRUE(pass);
895 m_errorMonitor->VerifyFound();
896
897 // Try to present an image:
898#if 0 // NOTE: Currently can't test this because a real swapchain is needed
899 // (as opposed to the fake one we created) in order for the layer to
900 // lookup the VkDevice used to enable the extension:
901 m_errorMonitor->SetDesiredFailureMsg(
902 VK_DEBUG_REPORT_ERROR_BIT_EXT,
903 "extension was not enabled for this");
904 present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
905 present_info.pNext = NULL;
906#if 0
907#endif
908 err = vkQueuePresentKHR(m_device->m_queue, &present_info);
909 pass = (err != VK_SUCCESS);
910 ASSERT_TRUE(pass);
911 m_errorMonitor->VerifyFound();
912#endif
913
914 // Destroy the swapchain:
915 m_errorMonitor->SetDesiredFailureMsg(
916 VK_DEBUG_REPORT_ERROR_BIT_EXT,
917 "extension was not enabled for this");
918 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
919 m_errorMonitor->VerifyFound();
920}
921
Karl Schultz6addd812016-02-02 17:17:23 -0700922TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
923 VkResult err;
924 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500925
Karl Schultz6addd812016-02-02 17:17:23 -0700926 m_errorMonitor->SetDesiredFailureMsg(
927 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600928 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
929
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500930 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500931
932 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700933 VkImage image;
934 VkDeviceMemory mem;
935 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500936
Karl Schultz6addd812016-02-02 17:17:23 -0700937 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
938 const int32_t tex_width = 32;
939 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500940
Tony Barboureb254902015-07-15 12:50:33 -0600941 VkImageCreateInfo image_create_info = {};
942 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700943 image_create_info.pNext = NULL;
944 image_create_info.imageType = VK_IMAGE_TYPE_2D;
945 image_create_info.format = tex_format;
946 image_create_info.extent.width = tex_width;
947 image_create_info.extent.height = tex_height;
948 image_create_info.extent.depth = 1;
949 image_create_info.mipLevels = 1;
950 image_create_info.arrayLayers = 1;
951 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
952 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
953 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
954 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600955
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800956 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800957 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700958 mem_alloc.pNext = NULL;
959 mem_alloc.allocationSize = 0;
960 // Introduce failure, do NOT set memProps to
961 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
962 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500963
Chia-I Wuf7458c52015-10-26 21:10:41 +0800964 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500965 ASSERT_VK_SUCCESS(err);
966
Karl Schultz6addd812016-02-02 17:17:23 -0700967 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500968
Mark Lobodzinski23065352015-05-29 09:32:35 -0500969 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500970
Karl Schultz6addd812016-02-02 17:17:23 -0700971 pass =
972 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
973 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
974 if (!pass) { // If we can't find any unmappable memory this test doesn't
975 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +0800976 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -0600977 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -0600978 }
Mike Stroyan713b2d72015-08-04 10:49:29 -0600979
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500980 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800981 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500982 ASSERT_VK_SUCCESS(err);
983
984 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -0600985 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500986 ASSERT_VK_SUCCESS(err);
987
988 // Map memory as if to initialize the image
989 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -0700990 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
991 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500992
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200993 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600994
Chia-I Wuf7458c52015-10-26 21:10:41 +0800995 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500996}
997
Karl Schultz6addd812016-02-02 17:17:23 -0700998TEST_F(VkLayerTest, RebindMemory) {
999 VkResult err;
1000 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001001
Karl Schultz6addd812016-02-02 17:17:23 -07001002 m_errorMonitor->SetDesiredFailureMsg(
1003 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001004 "which has already been bound to mem object");
1005
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001006 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001007
1008 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001009 VkImage image;
1010 VkDeviceMemory mem1;
1011 VkDeviceMemory mem2;
1012 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001013
Karl Schultz6addd812016-02-02 17:17:23 -07001014 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1015 const int32_t tex_width = 32;
1016 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001017
Tony Barboureb254902015-07-15 12:50:33 -06001018 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001019 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1020 image_create_info.pNext = NULL;
1021 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1022 image_create_info.format = tex_format;
1023 image_create_info.extent.width = tex_width;
1024 image_create_info.extent.height = tex_height;
1025 image_create_info.extent.depth = 1;
1026 image_create_info.mipLevels = 1;
1027 image_create_info.arrayLayers = 1;
1028 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1029 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1030 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1031 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001032
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001033 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001034 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1035 mem_alloc.pNext = NULL;
1036 mem_alloc.allocationSize = 0;
1037 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06001038
Karl Schultz6addd812016-02-02 17:17:23 -07001039 // Introduce failure, do NOT set memProps to
1040 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06001041 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08001042 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001043 ASSERT_VK_SUCCESS(err);
1044
Karl Schultz6addd812016-02-02 17:17:23 -07001045 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001046
1047 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001048 pass =
1049 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001050 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001051
1052 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001053 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001054 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001055 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001056 ASSERT_VK_SUCCESS(err);
1057
1058 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06001059 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001060 ASSERT_VK_SUCCESS(err);
1061
Karl Schultz6addd812016-02-02 17:17:23 -07001062 // Introduce validation failure, try to bind a different memory object to
1063 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06001064 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001065
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001066 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001067
Chia-I Wuf7458c52015-10-26 21:10:41 +08001068 vkDestroyImage(m_device->device(), image, NULL);
1069 vkFreeMemory(m_device->device(), mem1, NULL);
1070 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001071}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001072
Karl Schultz6addd812016-02-02 17:17:23 -07001073TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001074 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001075
Karl Schultz6addd812016-02-02 17:17:23 -07001076 m_errorMonitor->SetDesiredFailureMsg(
1077 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
1078 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001079
1080 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001081 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1082 fenceInfo.pNext = NULL;
1083 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06001084
Tony Barbour300a6082015-04-07 13:44:53 -06001085 ASSERT_NO_FATAL_FAILURE(InitState());
1086 ASSERT_NO_FATAL_FAILURE(InitViewport());
1087 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1088
Tony Barbourfe3351b2015-07-28 10:17:20 -06001089 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001090 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
1091 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001092 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06001093
1094 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001095
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001096 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001097 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1098 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001099 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001100 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001101 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001102 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001103 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001104 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001105 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001106
1107 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07001108 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001109
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001110 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001111}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001112// This is a positive test. We used to expect error in this case but spec now
1113// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07001114TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001115 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001116 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001117 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001118 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1119 fenceInfo.pNext = NULL;
1120
Tony Barbour0b4d9562015-04-09 10:48:04 -06001121 ASSERT_NO_FATAL_FAILURE(InitState());
1122 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08001123 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001124 VkResult result = vkResetFences(m_device->device(), 1, fences);
1125 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06001126
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001127 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06001128}
Tobin Ehlis41376e12015-07-03 08:45:14 -06001129
1130TEST_F(VkLayerTest, InvalidUsageBits)
1131{
Tony Barbourf92621a2016-05-02 14:28:12 -06001132 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001133 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06001134 "Initialize buffer with wrong usage then perform copy expecting errors "
1135 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001137 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06001138
1139 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06001140 VkImageObj image(m_device);
1141 // Initialize image with USAGE_INPUT_ATTACHMENT
1142 image.init(128, 128, VK_FORMAT_D32_SFLOAT_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001143 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1144 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06001145
Tony Barbourf92621a2016-05-02 14:28:12 -06001146 VkImageView dsv;
1147 VkImageViewCreateInfo dsvci = {};
1148 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1149 dsvci.image = image.handle();
1150 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
1151 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
1152 dsvci.subresourceRange.layerCount = 1;
1153 dsvci.subresourceRange.baseMipLevel = 0;
1154 dsvci.subresourceRange.levelCount = 1;
1155 dsvci.subresourceRange.aspectMask =
1156 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06001157
Tony Barbourf92621a2016-05-02 14:28:12 -06001158 // Create a view with depth / stencil aspect for image with different usage
1159 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001160
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001161 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06001162
1163 // Initialize buffer with TRANSFER_DST usage
1164 vk_testing::Buffer buffer;
1165 VkMemoryPropertyFlags reqs = 0;
1166 buffer.init_as_dst(*m_device, 128 * 128, reqs);
1167 VkBufferImageCopy region = {};
1168 region.bufferRowLength = 128;
1169 region.bufferImageHeight = 128;
1170 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1171 region.imageSubresource.layerCount = 1;
1172 region.imageExtent.height = 16;
1173 region.imageExtent.width = 16;
1174 region.imageExtent.depth = 1;
1175
1176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1177 "Invalid usage flag for buffer ");
1178 // Buffer usage not set to TRANSFER_SRC and image usage not set to
1179 // TRANSFER_DST
1180 BeginCommandBuffer();
1181 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1182 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1183 1, &region);
1184 m_errorMonitor->VerifyFound();
1185
1186 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1187 "Invalid usage flag for image ");
1188 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1189 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1190 1, &region);
1191 m_errorMonitor->VerifyFound();
1192
1193 vkDestroyImageView(m_device->device(), dsv, NULL);
Tobin Ehlis41376e12015-07-03 08:45:14 -06001194}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001195#endif // MEM_TRACKER_TESTS
1196
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06001197#if OBJ_TRACKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07001198TEST_F(VkLayerTest, PipelineNotBound) {
1199 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001200
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001202 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001203
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001204 ASSERT_NO_FATAL_FAILURE(InitState());
1205 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001206
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001207 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001208 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1209 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001210
1211 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001212 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1213 ds_pool_ci.pNext = NULL;
1214 ds_pool_ci.maxSets = 1;
1215 ds_pool_ci.poolSizeCount = 1;
1216 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001217
1218 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001219 err =
1220 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001221 ASSERT_VK_SUCCESS(err);
1222
1223 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001224 dsl_binding.binding = 0;
1225 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1226 dsl_binding.descriptorCount = 1;
1227 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1228 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001229
1230 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001231 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1232 ds_layout_ci.pNext = NULL;
1233 ds_layout_ci.bindingCount = 1;
1234 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001235
1236 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001237 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1238 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001239 ASSERT_VK_SUCCESS(err);
1240
1241 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001242 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001243 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001244 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001245 alloc_info.descriptorPool = ds_pool;
1246 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001247 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1248 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001249 ASSERT_VK_SUCCESS(err);
1250
1251 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001252 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1253 pipeline_layout_ci.pNext = NULL;
1254 pipeline_layout_ci.setLayoutCount = 1;
1255 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001256
1257 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001258 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1259 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001260 ASSERT_VK_SUCCESS(err);
1261
Mark Youngad779052016-01-06 14:26:04 -07001262 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001263
1264 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001265 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1266 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001267
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001268 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001269
Chia-I Wuf7458c52015-10-26 21:10:41 +08001270 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1271 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1272 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001273}
1274
Karl Schultz6addd812016-02-02 17:17:23 -07001275TEST_F(VkLayerTest, BindInvalidMemory) {
1276 VkResult err;
1277 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001278
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001280 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001281
Tobin Ehlisec598302015-09-15 15:02:17 -06001282 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001283
1284 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001285 VkImage image;
1286 VkDeviceMemory mem;
1287 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001288
Karl Schultz6addd812016-02-02 17:17:23 -07001289 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1290 const int32_t tex_width = 32;
1291 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001292
1293 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001294 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1295 image_create_info.pNext = NULL;
1296 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1297 image_create_info.format = tex_format;
1298 image_create_info.extent.width = tex_width;
1299 image_create_info.extent.height = tex_height;
1300 image_create_info.extent.depth = 1;
1301 image_create_info.mipLevels = 1;
1302 image_create_info.arrayLayers = 1;
1303 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1304 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1305 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1306 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001307
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001308 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001309 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1310 mem_alloc.pNext = NULL;
1311 mem_alloc.allocationSize = 0;
1312 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001313
Chia-I Wuf7458c52015-10-26 21:10:41 +08001314 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001315 ASSERT_VK_SUCCESS(err);
1316
Karl Schultz6addd812016-02-02 17:17:23 -07001317 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001318
1319 mem_alloc.allocationSize = mem_reqs.size;
1320
Karl Schultz6addd812016-02-02 17:17:23 -07001321 pass =
1322 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001323 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001324
1325 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001326 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001327 ASSERT_VK_SUCCESS(err);
1328
1329 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001330 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001331
1332 // Try to bind free memory that has been freed
1333 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1334 // This may very well return an error.
1335 (void)err;
1336
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001337 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001338
Chia-I Wuf7458c52015-10-26 21:10:41 +08001339 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001340}
1341
Karl Schultz6addd812016-02-02 17:17:23 -07001342TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1343 VkResult err;
1344 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001345
Karl Schultz6addd812016-02-02 17:17:23 -07001346 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1347 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001348
Tobin Ehlisec598302015-09-15 15:02:17 -06001349 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001350
Karl Schultz6addd812016-02-02 17:17:23 -07001351 // Create an image object, allocate memory, destroy the object and then try
1352 // to bind it
1353 VkImage image;
1354 VkDeviceMemory mem;
1355 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001356
Karl Schultz6addd812016-02-02 17:17:23 -07001357 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1358 const int32_t tex_width = 32;
1359 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001360
1361 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001362 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1363 image_create_info.pNext = NULL;
1364 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1365 image_create_info.format = tex_format;
1366 image_create_info.extent.width = tex_width;
1367 image_create_info.extent.height = tex_height;
1368 image_create_info.extent.depth = 1;
1369 image_create_info.mipLevels = 1;
1370 image_create_info.arrayLayers = 1;
1371 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1372 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1373 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1374 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001375
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001376 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001377 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1378 mem_alloc.pNext = NULL;
1379 mem_alloc.allocationSize = 0;
1380 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001381
Chia-I Wuf7458c52015-10-26 21:10:41 +08001382 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001383 ASSERT_VK_SUCCESS(err);
1384
Karl Schultz6addd812016-02-02 17:17:23 -07001385 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001386
1387 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001388 pass =
1389 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001390 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001391
1392 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001393 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001394 ASSERT_VK_SUCCESS(err);
1395
1396 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001397 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001398 ASSERT_VK_SUCCESS(err);
1399
1400 // Now Try to bind memory to this destroyed object
1401 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1402 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001403 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001404
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001405 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001406
Chia-I Wuf7458c52015-10-26 21:10:41 +08001407 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001408}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001409
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001410#endif // OBJ_TRACKER_TESTS
1411
Tobin Ehlis0788f522015-05-26 16:11:58 -06001412#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001413
1414// This is a positive test. No errors should be generated.
1415TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
1416
1417 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1418 "submitted on separate queues followed by a QueueWaitIdle.");
1419
Dustin Graves48458142016-04-29 16:11:55 -06001420 if ((m_device->queue_props.empty()) ||
1421 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001422 return;
1423
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001424 m_errorMonitor->ExpectSuccess();
1425
1426 VkSemaphore semaphore;
1427 VkSemaphoreCreateInfo semaphore_create_info{};
1428 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1429 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1430 &semaphore);
1431
1432 VkCommandPool command_pool;
1433 VkCommandPoolCreateInfo pool_create_info{};
1434 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1435 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1436 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1437 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1438 &command_pool);
1439
1440 VkCommandBuffer command_buffer[2];
1441 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1442 command_buffer_allocate_info.sType =
1443 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1444 command_buffer_allocate_info.commandPool = command_pool;
1445 command_buffer_allocate_info.commandBufferCount = 2;
1446 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1447 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1448 command_buffer);
1449
1450 VkQueue queue = VK_NULL_HANDLE;
1451 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1452 1, &queue);
1453
1454 {
1455 VkCommandBufferBeginInfo begin_info{};
1456 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1457 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1458
1459 vkCmdPipelineBarrier(command_buffer[0],
1460 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1461 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1462 0, nullptr, 0, nullptr);
1463
1464 VkViewport viewport{};
1465 viewport.maxDepth = 1.0f;
1466 viewport.minDepth = 0.0f;
1467 viewport.width = 512;
1468 viewport.height = 512;
1469 viewport.x = 0;
1470 viewport.y = 0;
1471 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1472 vkEndCommandBuffer(command_buffer[0]);
1473 }
1474 {
1475 VkCommandBufferBeginInfo begin_info{};
1476 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1477 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1478
1479 VkViewport viewport{};
1480 viewport.maxDepth = 1.0f;
1481 viewport.minDepth = 0.0f;
1482 viewport.width = 512;
1483 viewport.height = 512;
1484 viewport.x = 0;
1485 viewport.y = 0;
1486 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1487 vkEndCommandBuffer(command_buffer[1]);
1488 }
1489 {
1490 VkSubmitInfo submit_info{};
1491 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1492 submit_info.commandBufferCount = 1;
1493 submit_info.pCommandBuffers = &command_buffer[0];
1494 submit_info.signalSemaphoreCount = 1;
1495 submit_info.pSignalSemaphores = &semaphore;
1496 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1497 }
1498 {
1499 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1500 VkSubmitInfo submit_info{};
1501 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1502 submit_info.commandBufferCount = 1;
1503 submit_info.pCommandBuffers = &command_buffer[1];
1504 submit_info.waitSemaphoreCount = 1;
1505 submit_info.pWaitSemaphores = &semaphore;
1506 submit_info.pWaitDstStageMask = flags;
1507 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1508 }
1509
1510 vkQueueWaitIdle(m_device->m_queue);
1511
1512 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1513 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1514 &command_buffer[0]);
1515 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1516
1517 m_errorMonitor->VerifyNotFound();
1518}
1519
1520// This is a positive test. No errors should be generated.
1521TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
1522
1523 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1524 "submitted on separate queues, the second having a fence"
1525 "followed by a QueueWaitIdle.");
1526
Dustin Graves48458142016-04-29 16:11:55 -06001527 if ((m_device->queue_props.empty()) ||
1528 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001529 return;
1530
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001531 m_errorMonitor->ExpectSuccess();
1532
1533 VkFence fence;
1534 VkFenceCreateInfo fence_create_info{};
1535 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1536 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1537
1538 VkSemaphore semaphore;
1539 VkSemaphoreCreateInfo semaphore_create_info{};
1540 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1541 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1542 &semaphore);
1543
1544 VkCommandPool command_pool;
1545 VkCommandPoolCreateInfo pool_create_info{};
1546 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1547 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1548 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1549 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1550 &command_pool);
1551
1552 VkCommandBuffer command_buffer[2];
1553 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1554 command_buffer_allocate_info.sType =
1555 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1556 command_buffer_allocate_info.commandPool = command_pool;
1557 command_buffer_allocate_info.commandBufferCount = 2;
1558 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1559 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1560 command_buffer);
1561
1562 VkQueue queue = VK_NULL_HANDLE;
1563 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1564 1, &queue);
1565
1566 {
1567 VkCommandBufferBeginInfo begin_info{};
1568 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1569 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1570
1571 vkCmdPipelineBarrier(command_buffer[0],
1572 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1573 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1574 0, nullptr, 0, nullptr);
1575
1576 VkViewport viewport{};
1577 viewport.maxDepth = 1.0f;
1578 viewport.minDepth = 0.0f;
1579 viewport.width = 512;
1580 viewport.height = 512;
1581 viewport.x = 0;
1582 viewport.y = 0;
1583 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1584 vkEndCommandBuffer(command_buffer[0]);
1585 }
1586 {
1587 VkCommandBufferBeginInfo begin_info{};
1588 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1589 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1590
1591 VkViewport viewport{};
1592 viewport.maxDepth = 1.0f;
1593 viewport.minDepth = 0.0f;
1594 viewport.width = 512;
1595 viewport.height = 512;
1596 viewport.x = 0;
1597 viewport.y = 0;
1598 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1599 vkEndCommandBuffer(command_buffer[1]);
1600 }
1601 {
1602 VkSubmitInfo submit_info{};
1603 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1604 submit_info.commandBufferCount = 1;
1605 submit_info.pCommandBuffers = &command_buffer[0];
1606 submit_info.signalSemaphoreCount = 1;
1607 submit_info.pSignalSemaphores = &semaphore;
1608 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1609 }
1610 {
1611 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1612 VkSubmitInfo submit_info{};
1613 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1614 submit_info.commandBufferCount = 1;
1615 submit_info.pCommandBuffers = &command_buffer[1];
1616 submit_info.waitSemaphoreCount = 1;
1617 submit_info.pWaitSemaphores = &semaphore;
1618 submit_info.pWaitDstStageMask = flags;
1619 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1620 }
1621
1622 vkQueueWaitIdle(m_device->m_queue);
1623
1624 vkDestroyFence(m_device->device(), fence, nullptr);
1625 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1626 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1627 &command_buffer[0]);
1628 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1629
1630 m_errorMonitor->VerifyNotFound();
1631}
1632
1633// This is a positive test. No errors should be generated.
1634TEST_F(VkLayerTest,
1635 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
1636
1637 TEST_DESCRIPTION(
1638 "Two command buffers, each in a separate QueueSubmit call "
1639 "submitted on separate queues, the second having a fence"
1640 "followed by two consecutive WaitForFences calls on the same fence.");
1641
Dustin Graves48458142016-04-29 16:11:55 -06001642 if ((m_device->queue_props.empty()) ||
1643 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001644 return;
1645
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001646 m_errorMonitor->ExpectSuccess();
1647
1648 VkFence fence;
1649 VkFenceCreateInfo fence_create_info{};
1650 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1651 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1652
1653 VkSemaphore semaphore;
1654 VkSemaphoreCreateInfo semaphore_create_info{};
1655 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1656 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1657 &semaphore);
1658
1659 VkCommandPool command_pool;
1660 VkCommandPoolCreateInfo pool_create_info{};
1661 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1662 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1663 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1664 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1665 &command_pool);
1666
1667 VkCommandBuffer command_buffer[2];
1668 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1669 command_buffer_allocate_info.sType =
1670 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1671 command_buffer_allocate_info.commandPool = command_pool;
1672 command_buffer_allocate_info.commandBufferCount = 2;
1673 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1674 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1675 command_buffer);
1676
1677 VkQueue queue = VK_NULL_HANDLE;
1678 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1679 1, &queue);
1680
1681 {
1682 VkCommandBufferBeginInfo begin_info{};
1683 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1684 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1685
1686 vkCmdPipelineBarrier(command_buffer[0],
1687 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1688 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1689 0, nullptr, 0, nullptr);
1690
1691 VkViewport viewport{};
1692 viewport.maxDepth = 1.0f;
1693 viewport.minDepth = 0.0f;
1694 viewport.width = 512;
1695 viewport.height = 512;
1696 viewport.x = 0;
1697 viewport.y = 0;
1698 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1699 vkEndCommandBuffer(command_buffer[0]);
1700 }
1701 {
1702 VkCommandBufferBeginInfo begin_info{};
1703 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1704 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1705
1706 VkViewport viewport{};
1707 viewport.maxDepth = 1.0f;
1708 viewport.minDepth = 0.0f;
1709 viewport.width = 512;
1710 viewport.height = 512;
1711 viewport.x = 0;
1712 viewport.y = 0;
1713 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1714 vkEndCommandBuffer(command_buffer[1]);
1715 }
1716 {
1717 VkSubmitInfo submit_info{};
1718 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1719 submit_info.commandBufferCount = 1;
1720 submit_info.pCommandBuffers = &command_buffer[0];
1721 submit_info.signalSemaphoreCount = 1;
1722 submit_info.pSignalSemaphores = &semaphore;
1723 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1724 }
1725 {
1726 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1727 VkSubmitInfo submit_info{};
1728 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1729 submit_info.commandBufferCount = 1;
1730 submit_info.pCommandBuffers = &command_buffer[1];
1731 submit_info.waitSemaphoreCount = 1;
1732 submit_info.pWaitSemaphores = &semaphore;
1733 submit_info.pWaitDstStageMask = flags;
1734 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1735 }
1736
1737 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1738 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1739
1740 vkDestroyFence(m_device->device(), fence, nullptr);
1741 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1742 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1743 &command_buffer[0]);
1744 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1745
1746 m_errorMonitor->VerifyNotFound();
1747}
1748
1749// This is a positive test. No errors should be generated.
1750TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
1751
1752 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1753 "submitted on separate queues, the second having a fence, "
1754 "followed by a WaitForFences call.");
1755
Dustin Graves48458142016-04-29 16:11:55 -06001756 if ((m_device->queue_props.empty()) ||
1757 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001758 return;
1759
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001760 m_errorMonitor->ExpectSuccess();
1761
1762 VkFence fence;
1763 VkFenceCreateInfo fence_create_info{};
1764 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1765 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1766
1767 VkSemaphore semaphore;
1768 VkSemaphoreCreateInfo semaphore_create_info{};
1769 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1770 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1771 &semaphore);
1772
1773 VkCommandPool command_pool;
1774 VkCommandPoolCreateInfo pool_create_info{};
1775 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1776 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1777 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1778 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1779 &command_pool);
1780
1781 VkCommandBuffer command_buffer[2];
1782 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1783 command_buffer_allocate_info.sType =
1784 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1785 command_buffer_allocate_info.commandPool = command_pool;
1786 command_buffer_allocate_info.commandBufferCount = 2;
1787 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1788 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1789 command_buffer);
1790
1791 VkQueue queue = VK_NULL_HANDLE;
1792 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1793 1, &queue);
1794
1795
1796 {
1797 VkCommandBufferBeginInfo begin_info{};
1798 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1799 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1800
1801 vkCmdPipelineBarrier(command_buffer[0],
1802 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1803 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1804 0, nullptr, 0, nullptr);
1805
1806 VkViewport viewport{};
1807 viewport.maxDepth = 1.0f;
1808 viewport.minDepth = 0.0f;
1809 viewport.width = 512;
1810 viewport.height = 512;
1811 viewport.x = 0;
1812 viewport.y = 0;
1813 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1814 vkEndCommandBuffer(command_buffer[0]);
1815 }
1816 {
1817 VkCommandBufferBeginInfo begin_info{};
1818 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1819 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1820
1821 VkViewport viewport{};
1822 viewport.maxDepth = 1.0f;
1823 viewport.minDepth = 0.0f;
1824 viewport.width = 512;
1825 viewport.height = 512;
1826 viewport.x = 0;
1827 viewport.y = 0;
1828 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1829 vkEndCommandBuffer(command_buffer[1]);
1830 }
1831 {
1832 VkSubmitInfo submit_info{};
1833 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1834 submit_info.commandBufferCount = 1;
1835 submit_info.pCommandBuffers = &command_buffer[0];
1836 submit_info.signalSemaphoreCount = 1;
1837 submit_info.pSignalSemaphores = &semaphore;
1838 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1839 }
1840 {
1841 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1842 VkSubmitInfo submit_info{};
1843 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1844 submit_info.commandBufferCount = 1;
1845 submit_info.pCommandBuffers = &command_buffer[1];
1846 submit_info.waitSemaphoreCount = 1;
1847 submit_info.pWaitSemaphores = &semaphore;
1848 submit_info.pWaitDstStageMask = flags;
1849 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1850 }
1851
1852 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1853
1854 vkDestroyFence(m_device->device(), fence, nullptr);
1855 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1856 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1857 &command_buffer[0]);
1858 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1859
1860 m_errorMonitor->VerifyNotFound();
1861}
1862
1863// This is a positive test. No errors should be generated.
1864TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
1865
1866 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1867 "on the same queue, sharing a signal/wait semaphore, the "
1868 "second having a fence, "
1869 "followed by a WaitForFences call.");
1870
1871 m_errorMonitor->ExpectSuccess();
1872
1873 VkFence fence;
1874 VkFenceCreateInfo fence_create_info{};
1875 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1876 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1877
1878 VkSemaphore semaphore;
1879 VkSemaphoreCreateInfo semaphore_create_info{};
1880 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1881 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1882 &semaphore);
1883
1884 VkCommandPool command_pool;
1885 VkCommandPoolCreateInfo pool_create_info{};
1886 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1887 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1888 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1889 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1890 &command_pool);
1891
1892 VkCommandBuffer command_buffer[2];
1893 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1894 command_buffer_allocate_info.sType =
1895 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1896 command_buffer_allocate_info.commandPool = command_pool;
1897 command_buffer_allocate_info.commandBufferCount = 2;
1898 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1899 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1900 command_buffer);
1901
1902 {
1903 VkCommandBufferBeginInfo begin_info{};
1904 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1905 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1906
1907 vkCmdPipelineBarrier(command_buffer[0],
1908 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1909 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1910 0, nullptr, 0, nullptr);
1911
1912 VkViewport viewport{};
1913 viewport.maxDepth = 1.0f;
1914 viewport.minDepth = 0.0f;
1915 viewport.width = 512;
1916 viewport.height = 512;
1917 viewport.x = 0;
1918 viewport.y = 0;
1919 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1920 vkEndCommandBuffer(command_buffer[0]);
1921 }
1922 {
1923 VkCommandBufferBeginInfo begin_info{};
1924 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1925 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1926
1927 VkViewport viewport{};
1928 viewport.maxDepth = 1.0f;
1929 viewport.minDepth = 0.0f;
1930 viewport.width = 512;
1931 viewport.height = 512;
1932 viewport.x = 0;
1933 viewport.y = 0;
1934 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1935 vkEndCommandBuffer(command_buffer[1]);
1936 }
1937 {
1938 VkSubmitInfo submit_info{};
1939 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1940 submit_info.commandBufferCount = 1;
1941 submit_info.pCommandBuffers = &command_buffer[0];
1942 submit_info.signalSemaphoreCount = 1;
1943 submit_info.pSignalSemaphores = &semaphore;
1944 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1945 }
1946 {
1947 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1948 VkSubmitInfo submit_info{};
1949 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1950 submit_info.commandBufferCount = 1;
1951 submit_info.pCommandBuffers = &command_buffer[1];
1952 submit_info.waitSemaphoreCount = 1;
1953 submit_info.pWaitSemaphores = &semaphore;
1954 submit_info.pWaitDstStageMask = flags;
1955 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1956 }
1957
1958 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1959
1960 vkDestroyFence(m_device->device(), fence, nullptr);
1961 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1962 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1963 &command_buffer[0]);
1964 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1965
1966 m_errorMonitor->VerifyNotFound();
1967}
1968
1969// This is a positive test. No errors should be generated.
1970TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
1971
1972 TEST_DESCRIPTION(
1973 "Two command buffers, each in a separate QueueSubmit call "
1974 "on the same queue, no fences, followed by a third QueueSubmit with NO "
1975 "SubmitInfos but with a fence, followed by a WaitForFences call.");
1976
1977 m_errorMonitor->ExpectSuccess();
1978
1979 VkFence fence;
1980 VkFenceCreateInfo fence_create_info{};
1981 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1982 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1983
1984 VkCommandPool command_pool;
1985 VkCommandPoolCreateInfo pool_create_info{};
1986 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1987 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1988 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1989 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1990 &command_pool);
1991
1992 VkCommandBuffer command_buffer[2];
1993 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1994 command_buffer_allocate_info.sType =
1995 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1996 command_buffer_allocate_info.commandPool = command_pool;
1997 command_buffer_allocate_info.commandBufferCount = 2;
1998 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1999 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2000 command_buffer);
2001
2002 {
2003 VkCommandBufferBeginInfo begin_info{};
2004 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2005 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2006
2007 vkCmdPipelineBarrier(command_buffer[0],
2008 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2009 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2010 0, nullptr, 0, nullptr);
2011
2012 VkViewport viewport{};
2013 viewport.maxDepth = 1.0f;
2014 viewport.minDepth = 0.0f;
2015 viewport.width = 512;
2016 viewport.height = 512;
2017 viewport.x = 0;
2018 viewport.y = 0;
2019 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2020 vkEndCommandBuffer(command_buffer[0]);
2021 }
2022 {
2023 VkCommandBufferBeginInfo begin_info{};
2024 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2025 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2026
2027 VkViewport viewport{};
2028 viewport.maxDepth = 1.0f;
2029 viewport.minDepth = 0.0f;
2030 viewport.width = 512;
2031 viewport.height = 512;
2032 viewport.x = 0;
2033 viewport.y = 0;
2034 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2035 vkEndCommandBuffer(command_buffer[1]);
2036 }
2037 {
2038 VkSubmitInfo submit_info{};
2039 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2040 submit_info.commandBufferCount = 1;
2041 submit_info.pCommandBuffers = &command_buffer[0];
2042 submit_info.signalSemaphoreCount = 0;
2043 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2044 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2045 }
2046 {
2047 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2048 VkSubmitInfo submit_info{};
2049 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2050 submit_info.commandBufferCount = 1;
2051 submit_info.pCommandBuffers = &command_buffer[1];
2052 submit_info.waitSemaphoreCount = 0;
2053 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2054 submit_info.pWaitDstStageMask = flags;
2055 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2056 }
2057
2058 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
2059
2060 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2061
2062 vkDestroyFence(m_device->device(), fence, nullptr);
2063 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2064 &command_buffer[0]);
2065 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2066
2067 m_errorMonitor->VerifyNotFound();
2068}
2069
2070// This is a positive test. No errors should be generated.
2071TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
2072
2073 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2074 "on the same queue, the second having a fence, followed "
2075 "by a WaitForFences call.");
2076
2077 m_errorMonitor->ExpectSuccess();
2078
2079 VkFence fence;
2080 VkFenceCreateInfo fence_create_info{};
2081 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2082 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2083
2084 VkCommandPool command_pool;
2085 VkCommandPoolCreateInfo pool_create_info{};
2086 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2087 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2088 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2089 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2090 &command_pool);
2091
2092 VkCommandBuffer command_buffer[2];
2093 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2094 command_buffer_allocate_info.sType =
2095 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2096 command_buffer_allocate_info.commandPool = command_pool;
2097 command_buffer_allocate_info.commandBufferCount = 2;
2098 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2099 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2100 command_buffer);
2101
2102 {
2103 VkCommandBufferBeginInfo begin_info{};
2104 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2105 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2106
2107 vkCmdPipelineBarrier(command_buffer[0],
2108 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2109 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2110 0, nullptr, 0, nullptr);
2111
2112 VkViewport viewport{};
2113 viewport.maxDepth = 1.0f;
2114 viewport.minDepth = 0.0f;
2115 viewport.width = 512;
2116 viewport.height = 512;
2117 viewport.x = 0;
2118 viewport.y = 0;
2119 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2120 vkEndCommandBuffer(command_buffer[0]);
2121 }
2122 {
2123 VkCommandBufferBeginInfo begin_info{};
2124 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2125 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2126
2127 VkViewport viewport{};
2128 viewport.maxDepth = 1.0f;
2129 viewport.minDepth = 0.0f;
2130 viewport.width = 512;
2131 viewport.height = 512;
2132 viewport.x = 0;
2133 viewport.y = 0;
2134 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2135 vkEndCommandBuffer(command_buffer[1]);
2136 }
2137 {
2138 VkSubmitInfo submit_info{};
2139 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2140 submit_info.commandBufferCount = 1;
2141 submit_info.pCommandBuffers = &command_buffer[0];
2142 submit_info.signalSemaphoreCount = 0;
2143 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2144 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2145 }
2146 {
2147 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2148 VkSubmitInfo submit_info{};
2149 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2150 submit_info.commandBufferCount = 1;
2151 submit_info.pCommandBuffers = &command_buffer[1];
2152 submit_info.waitSemaphoreCount = 0;
2153 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2154 submit_info.pWaitDstStageMask = flags;
2155 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2156 }
2157
2158 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2159
2160 vkDestroyFence(m_device->device(), fence, nullptr);
2161 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2162 &command_buffer[0]);
2163 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2164
2165 m_errorMonitor->VerifyNotFound();
2166}
2167
2168// This is a positive test. No errors should be generated.
2169TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
2170
2171 TEST_DESCRIPTION(
2172 "Two command buffers each in a separate SubmitInfo sent in a single "
2173 "QueueSubmit call followed by a WaitForFences call.");
2174
2175 m_errorMonitor->ExpectSuccess();
2176
2177 VkFence fence;
2178 VkFenceCreateInfo fence_create_info{};
2179 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2180 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2181
2182 VkSemaphore semaphore;
2183 VkSemaphoreCreateInfo semaphore_create_info{};
2184 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2185 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2186 &semaphore);
2187
2188 VkCommandPool command_pool;
2189 VkCommandPoolCreateInfo pool_create_info{};
2190 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2191 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2192 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2193 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2194 &command_pool);
2195
2196 VkCommandBuffer command_buffer[2];
2197 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2198 command_buffer_allocate_info.sType =
2199 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2200 command_buffer_allocate_info.commandPool = command_pool;
2201 command_buffer_allocate_info.commandBufferCount = 2;
2202 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2203 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2204 command_buffer);
2205
2206 {
2207 VkCommandBufferBeginInfo begin_info{};
2208 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2209 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2210
2211 vkCmdPipelineBarrier(command_buffer[0],
2212 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2213 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2214 0, nullptr, 0, nullptr);
2215
2216 VkViewport viewport{};
2217 viewport.maxDepth = 1.0f;
2218 viewport.minDepth = 0.0f;
2219 viewport.width = 512;
2220 viewport.height = 512;
2221 viewport.x = 0;
2222 viewport.y = 0;
2223 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2224 vkEndCommandBuffer(command_buffer[0]);
2225 }
2226 {
2227 VkCommandBufferBeginInfo begin_info{};
2228 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2229 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2230
2231 VkViewport viewport{};
2232 viewport.maxDepth = 1.0f;
2233 viewport.minDepth = 0.0f;
2234 viewport.width = 512;
2235 viewport.height = 512;
2236 viewport.x = 0;
2237 viewport.y = 0;
2238 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2239 vkEndCommandBuffer(command_buffer[1]);
2240 }
2241 {
2242 VkSubmitInfo submit_info[2];
2243 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2244
2245 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2246 submit_info[0].pNext = NULL;
2247 submit_info[0].commandBufferCount = 1;
2248 submit_info[0].pCommandBuffers = &command_buffer[0];
2249 submit_info[0].signalSemaphoreCount = 1;
2250 submit_info[0].pSignalSemaphores = &semaphore;
2251 submit_info[0].waitSemaphoreCount = 0;
2252 submit_info[0].pWaitSemaphores = NULL;
2253 submit_info[0].pWaitDstStageMask = 0;
2254
2255 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2256 submit_info[1].pNext = NULL;
2257 submit_info[1].commandBufferCount = 1;
2258 submit_info[1].pCommandBuffers = &command_buffer[1];
2259 submit_info[1].waitSemaphoreCount = 1;
2260 submit_info[1].pWaitSemaphores = &semaphore;
2261 submit_info[1].pWaitDstStageMask = flags;
2262 submit_info[1].signalSemaphoreCount = 0;
2263 submit_info[1].pSignalSemaphores = NULL;
2264 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
2265 }
2266
2267 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2268
2269 vkDestroyFence(m_device->device(), fence, nullptr);
2270 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2271 &command_buffer[0]);
2272 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2273
2274 m_errorMonitor->VerifyNotFound();
2275}
2276
Karl Schultz6addd812016-02-02 17:17:23 -07002277TEST_F(VkLayerTest, LineWidthStateNotBound) {
2278 m_errorMonitor->SetDesiredFailureMsg(
2279 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002280 "Dynamic line width state not set for this command buffer");
2281
Karl Schultz6addd812016-02-02 17:17:23 -07002282 TEST_DESCRIPTION("Simple Draw Call that validates failure when a line "
2283 "width state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002284
Karl Schultz6addd812016-02-02 17:17:23 -07002285 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2286 BsoFailLineWidth);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002287
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002288 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002289}
2290
Karl Schultz6addd812016-02-02 17:17:23 -07002291TEST_F(VkLayerTest, DepthBiasStateNotBound) {
2292 m_errorMonitor->SetDesiredFailureMsg(
2293 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002294 "Dynamic depth bias state not set for this command buffer");
2295
Karl Schultz6addd812016-02-02 17:17:23 -07002296 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
2297 "bias state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002298
Karl Schultz6addd812016-02-02 17:17:23 -07002299 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2300 BsoFailDepthBias);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002301
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002302 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002303}
2304
Karl Schultz6addd812016-02-02 17:17:23 -07002305// Disable these two tests until we can sort out how to track multiple layer
2306// errors
2307TEST_F(VkLayerTest, ViewportStateNotBound) {
2308 m_errorMonitor->SetDesiredFailureMsg(
2309 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002310 "Dynamic viewport state not set for this command buffer");
2311
Karl Schultz6addd812016-02-02 17:17:23 -07002312 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
2313 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002314
Karl Schultz6addd812016-02-02 17:17:23 -07002315 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2316 BsoFailViewport);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002317
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002318 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002319}
2320
Karl Schultz6addd812016-02-02 17:17:23 -07002321TEST_F(VkLayerTest, ScissorStateNotBound) {
2322 m_errorMonitor->SetDesiredFailureMsg(
2323 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002324 "Dynamic scissor state not set for this command buffer");
2325
Karl Schultz6addd812016-02-02 17:17:23 -07002326 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
2327 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002328
Karl Schultz6addd812016-02-02 17:17:23 -07002329 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2330 BsoFailScissor);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002331
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002332 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002333}
2334
Karl Schultz6addd812016-02-02 17:17:23 -07002335TEST_F(VkLayerTest, BlendStateNotBound) {
2336 m_errorMonitor->SetDesiredFailureMsg(
2337 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7a1d2352016-03-28 11:18:19 -06002338 "Dynamic blend constants state not set for this command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002339
Karl Schultz6addd812016-02-02 17:17:23 -07002340 TEST_DESCRIPTION("Simple Draw Call that validates failure when a blend "
2341 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002342
Karl Schultz6addd812016-02-02 17:17:23 -07002343 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2344 BsoFailBlend);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002345
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002346 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002347}
2348
Karl Schultz6addd812016-02-02 17:17:23 -07002349TEST_F(VkLayerTest, DepthBoundsStateNotBound) {
2350 m_errorMonitor->SetDesiredFailureMsg(
2351 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002352 "Dynamic depth bounds state not set for this command buffer");
2353
Karl Schultz6addd812016-02-02 17:17:23 -07002354 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
2355 "bounds state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002356
Karl Schultz6addd812016-02-02 17:17:23 -07002357 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2358 BsoFailDepthBounds);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002359
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002360 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002361}
2362
Karl Schultz6addd812016-02-02 17:17:23 -07002363TEST_F(VkLayerTest, StencilReadMaskNotSet) {
2364 m_errorMonitor->SetDesiredFailureMsg(
2365 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002366 "Dynamic stencil read mask state not set for this command buffer");
2367
Tobin Ehlis963a4042015-09-29 08:18:34 -06002368 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002369
Karl Schultz6addd812016-02-02 17:17:23 -07002370 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2371 "read mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002372
Karl Schultz6addd812016-02-02 17:17:23 -07002373 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2374 BsoFailStencilReadMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002375
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002376 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002377}
2378
Karl Schultz6addd812016-02-02 17:17:23 -07002379TEST_F(VkLayerTest, StencilWriteMaskNotSet) {
2380 m_errorMonitor->SetDesiredFailureMsg(
2381 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002382 "Dynamic stencil write mask state not set for this command buffer");
2383
Tobin Ehlis963a4042015-09-29 08:18:34 -06002384 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002385
Karl Schultz6addd812016-02-02 17:17:23 -07002386 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2387 "write mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002388
Karl Schultz6addd812016-02-02 17:17:23 -07002389 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2390 BsoFailStencilWriteMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002391
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002392 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002393}
2394
Karl Schultz6addd812016-02-02 17:17:23 -07002395TEST_F(VkLayerTest, StencilReferenceNotSet) {
2396 m_errorMonitor->SetDesiredFailureMsg(
2397 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002398 "Dynamic stencil reference state not set for this command buffer");
2399
Karl Schultz6addd812016-02-02 17:17:23 -07002400 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2401 "reference is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002402
Karl Schultz6addd812016-02-02 17:17:23 -07002403 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2404 BsoFailStencilReference);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002405
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002406 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002407}
2408
Karl Schultz6addd812016-02-02 17:17:23 -07002409TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002410 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002411
Karl Schultz6addd812016-02-02 17:17:23 -07002412 m_errorMonitor->SetDesiredFailureMsg(
2413 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2414 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
2415 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002416
2417 VkFenceCreateInfo fenceInfo = {};
2418 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2419 fenceInfo.pNext = NULL;
2420 fenceInfo.flags = 0;
2421
2422 ASSERT_NO_FATAL_FAILURE(InitState());
2423 ASSERT_NO_FATAL_FAILURE(InitViewport());
2424 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2425
Karl Schultz6addd812016-02-02 17:17:23 -07002426 // We luck out b/c by default the framework creates CB w/ the
2427 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002428 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002429 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2430 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002431 EndCommandBuffer();
2432
2433 testFence.init(*m_device, fenceInfo);
2434
2435 // Bypass framework since it does the waits automatically
2436 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002437 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002438 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2439 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002440 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002441 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002442 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002443 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002444 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002445 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002446 submit_info.pSignalSemaphores = NULL;
2447
Karl Schultz6addd812016-02-02 17:17:23 -07002448 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
2449 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002450
Karl Schultz6addd812016-02-02 17:17:23 -07002451 // Cause validation error by re-submitting cmd buffer that should only be
2452 // submitted once
2453 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002454
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002455 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002456}
2457
Karl Schultz6addd812016-02-02 17:17:23 -07002458TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002459 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07002460 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002461
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002463 "Unable to allocate 1 descriptors of "
2464 "type "
2465 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002466
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002467 ASSERT_NO_FATAL_FAILURE(InitState());
2468 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002469
Karl Schultz6addd812016-02-02 17:17:23 -07002470 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
2471 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002472 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002473 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2474 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002475
2476 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002477 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2478 ds_pool_ci.pNext = NULL;
2479 ds_pool_ci.flags = 0;
2480 ds_pool_ci.maxSets = 1;
2481 ds_pool_ci.poolSizeCount = 1;
2482 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002483
2484 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002485 err =
2486 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002487 ASSERT_VK_SUCCESS(err);
2488
2489 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002490 dsl_binding.binding = 0;
2491 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2492 dsl_binding.descriptorCount = 1;
2493 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2494 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002495
2496 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002497 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2498 ds_layout_ci.pNext = NULL;
2499 ds_layout_ci.bindingCount = 1;
2500 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002501
2502 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002503 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2504 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002505 ASSERT_VK_SUCCESS(err);
2506
2507 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002508 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002509 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002510 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002511 alloc_info.descriptorPool = ds_pool;
2512 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002513 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2514 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002515
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002516 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002517
Chia-I Wuf7458c52015-10-26 21:10:41 +08002518 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2519 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002520}
2521
Karl Schultz6addd812016-02-02 17:17:23 -07002522TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
2523 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06002524
Karl Schultz6addd812016-02-02 17:17:23 -07002525 m_errorMonitor->SetDesiredFailureMsg(
2526 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2527 "It is invalid to call vkFreeDescriptorSets() with a pool created "
2528 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002529
Tobin Ehlise735c692015-10-08 13:13:50 -06002530 ASSERT_NO_FATAL_FAILURE(InitState());
2531 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06002532
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002533 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002534 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2535 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06002536
2537 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002538 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2539 ds_pool_ci.pNext = NULL;
2540 ds_pool_ci.maxSets = 1;
2541 ds_pool_ci.poolSizeCount = 1;
2542 ds_pool_ci.flags = 0;
2543 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
2544 // app can only call vkResetDescriptorPool on this pool.;
2545 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06002546
2547 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002548 err =
2549 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06002550 ASSERT_VK_SUCCESS(err);
2551
2552 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002553 dsl_binding.binding = 0;
2554 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2555 dsl_binding.descriptorCount = 1;
2556 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2557 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06002558
2559 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002560 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2561 ds_layout_ci.pNext = NULL;
2562 ds_layout_ci.bindingCount = 1;
2563 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06002564
2565 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002566 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2567 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06002568 ASSERT_VK_SUCCESS(err);
2569
2570 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002571 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002572 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002573 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002574 alloc_info.descriptorPool = ds_pool;
2575 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002576 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2577 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06002578 ASSERT_VK_SUCCESS(err);
2579
2580 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002581 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06002582
Chia-I Wuf7458c52015-10-26 21:10:41 +08002583 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2584 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06002585}
2586
Karl Schultz6addd812016-02-02 17:17:23 -07002587TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002588 // Attempt to clear Descriptor Pool with bad object.
2589 // ObjectTracker should catch this.
2590 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2591 "Invalid VkDescriptorPool Object 0xbaad6001");
2592 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
2593 vkResetDescriptorPool(device(), badPool, 0);
2594 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002595}
2596
Karl Schultz6addd812016-02-02 17:17:23 -07002597TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002598 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
2599 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002600 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06002601 // call vkCmdBindDescriptorSets w/ false Descriptor Set
2602 VkDescriptorSet badSet = (VkDescriptorSet)0xbaad6001;
2603 VkResult err;
2604 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2605 "Invalid VkDescriptorSet Object 0xbaad6001");
2606
2607 ASSERT_NO_FATAL_FAILURE(InitState());
2608
2609 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
2610 layout_bindings[0].binding = 0;
2611 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2612 layout_bindings[0].descriptorCount = 1;
2613 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2614 layout_bindings[0].pImmutableSamplers = NULL;
2615
2616 VkDescriptorSetLayout descriptor_set_layout;
2617 VkDescriptorSetLayoutCreateInfo dslci = {};
2618 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2619 dslci.pNext = NULL;
2620 dslci.bindingCount = 1;
2621 dslci.pBindings = layout_bindings;
2622 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002623 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002624
2625 VkPipelineLayout pipeline_layout;
2626 VkPipelineLayoutCreateInfo plci = {};
2627 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2628 plci.pNext = NULL;
2629 plci.setLayoutCount = 1;
2630 plci.pSetLayouts = &descriptor_set_layout;
2631 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002632 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002633
2634 BeginCommandBuffer();
2635 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2636 pipeline_layout, 0, 1, &badSet, 0, NULL);
2637 m_errorMonitor->VerifyFound();
2638 EndCommandBuffer();
2639 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
2640 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002641}
2642
Karl Schultz6addd812016-02-02 17:17:23 -07002643TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002644 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
2645 // ObjectTracker should catch this.
2646 VkDescriptorSetLayout bad_layout = (VkDescriptorSetLayout)0xbaad6001;
2647 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2648 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
2649
2650 VkPipelineLayout pipeline_layout;
2651 VkPipelineLayoutCreateInfo plci = {};
2652 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2653 plci.pNext = NULL;
2654 plci.setLayoutCount = 1;
2655 plci.pSetLayouts = &bad_layout;
2656 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
2657
2658 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002659}
2660
Karl Schultz6addd812016-02-02 17:17:23 -07002661TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002662 // Attempt to bind an invalid Pipeline to a valid Command Buffer
2663 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002664 // Create a valid cmd buffer
2665 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultzbdb75952016-04-19 11:36:49 -06002666 VkPipeline bad_pipeline = (VkPipeline)0xbaad6001;
2667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2668 "Invalid VkPipeline Object 0xbaad6001");
2669 ASSERT_NO_FATAL_FAILURE(InitState());
2670 BeginCommandBuffer();
2671 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2672 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
2673 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002674}
2675
Karl Schultz6addd812016-02-02 17:17:23 -07002676TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
2677 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
2678 // CommandBuffer
2679 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002680
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002682 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002683
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002684 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06002685 ASSERT_NO_FATAL_FAILURE(InitViewport());
2686 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002687 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002688 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2689 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06002690
2691 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002692 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2693 ds_pool_ci.pNext = NULL;
2694 ds_pool_ci.maxSets = 1;
2695 ds_pool_ci.poolSizeCount = 1;
2696 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06002697
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002698 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002699 err =
2700 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002701 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002702
Tony Barboureb254902015-07-15 12:50:33 -06002703 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002704 dsl_binding.binding = 0;
2705 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2706 dsl_binding.descriptorCount = 1;
2707 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2708 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002709
Tony Barboureb254902015-07-15 12:50:33 -06002710 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002711 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2712 ds_layout_ci.pNext = NULL;
2713 ds_layout_ci.bindingCount = 1;
2714 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002715 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002716 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2717 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002718 ASSERT_VK_SUCCESS(err);
2719
2720 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002721 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002722 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002723 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002724 alloc_info.descriptorPool = ds_pool;
2725 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002726 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2727 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002728 ASSERT_VK_SUCCESS(err);
2729
Tony Barboureb254902015-07-15 12:50:33 -06002730 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002731 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2732 pipeline_layout_ci.pNext = NULL;
2733 pipeline_layout_ci.setLayoutCount = 1;
2734 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002735
2736 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002737 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2738 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002739 ASSERT_VK_SUCCESS(err);
2740
Karl Schultz6addd812016-02-02 17:17:23 -07002741 VkShaderObj vs(m_device, bindStateVertShaderText,
2742 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06002743 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07002744 // on more devices
2745 VkShaderObj fs(m_device, bindStateFragShaderText,
2746 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002747
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002748 VkPipelineObj pipe(m_device);
2749 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06002750 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06002751 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002752 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06002753
2754 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002755 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2756 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2757 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2758 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2759 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002760
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002761 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002762
Chia-I Wuf7458c52015-10-26 21:10:41 +08002763 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2764 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2765 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002766}
2767
Karl Schultz6addd812016-02-02 17:17:23 -07002768TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002769 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07002770 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002771
Karl Schultz6addd812016-02-02 17:17:23 -07002772 m_errorMonitor->SetDesiredFailureMsg(
2773 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002774 "Attempt to update descriptor with invalid bufferView ");
2775
2776 ASSERT_NO_FATAL_FAILURE(InitState());
2777 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002778 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2779 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002780
2781 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002782 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2783 ds_pool_ci.pNext = NULL;
2784 ds_pool_ci.maxSets = 1;
2785 ds_pool_ci.poolSizeCount = 1;
2786 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002787
2788 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002789 err =
2790 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002791 ASSERT_VK_SUCCESS(err);
2792
2793 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002794 dsl_binding.binding = 0;
2795 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2796 dsl_binding.descriptorCount = 1;
2797 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2798 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002799
2800 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002801 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2802 ds_layout_ci.pNext = NULL;
2803 ds_layout_ci.bindingCount = 1;
2804 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002805 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002806 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2807 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002808 ASSERT_VK_SUCCESS(err);
2809
2810 VkDescriptorSet descriptorSet;
2811 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002812 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002813 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002814 alloc_info.descriptorPool = ds_pool;
2815 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002816 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2817 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002818 ASSERT_VK_SUCCESS(err);
2819
Karl Schultz6addd812016-02-02 17:17:23 -07002820 VkBufferView view =
2821 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002822 VkWriteDescriptorSet descriptor_write;
2823 memset(&descriptor_write, 0, sizeof(descriptor_write));
2824 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2825 descriptor_write.dstSet = descriptorSet;
2826 descriptor_write.dstBinding = 0;
2827 descriptor_write.descriptorCount = 1;
2828 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2829 descriptor_write.pTexelBufferView = &view;
2830
2831 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2832
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002833 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002834
2835 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2836 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2837}
2838
Karl Schultz6addd812016-02-02 17:17:23 -07002839TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
2840 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
2841 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07002842 // 1. No dynamicOffset supplied
2843 // 2. Too many dynamicOffsets supplied
2844 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07002845 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002847 " requires 1 dynamicOffsets, but only "
2848 "0 dynamicOffsets are left in "
2849 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002850
2851 ASSERT_NO_FATAL_FAILURE(InitState());
2852 ASSERT_NO_FATAL_FAILURE(InitViewport());
2853 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2854
2855 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002856 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2857 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002858
2859 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002860 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2861 ds_pool_ci.pNext = NULL;
2862 ds_pool_ci.maxSets = 1;
2863 ds_pool_ci.poolSizeCount = 1;
2864 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002865
2866 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002867 err =
2868 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002869 ASSERT_VK_SUCCESS(err);
2870
2871 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002872 dsl_binding.binding = 0;
2873 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2874 dsl_binding.descriptorCount = 1;
2875 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2876 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002877
2878 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002879 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2880 ds_layout_ci.pNext = NULL;
2881 ds_layout_ci.bindingCount = 1;
2882 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002883 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002884 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2885 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002886 ASSERT_VK_SUCCESS(err);
2887
2888 VkDescriptorSet descriptorSet;
2889 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002890 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002891 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002892 alloc_info.descriptorPool = ds_pool;
2893 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002894 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2895 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002896 ASSERT_VK_SUCCESS(err);
2897
2898 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002899 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2900 pipeline_layout_ci.pNext = NULL;
2901 pipeline_layout_ci.setLayoutCount = 1;
2902 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002903
2904 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002905 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2906 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002907 ASSERT_VK_SUCCESS(err);
2908
2909 // Create a buffer to update the descriptor with
2910 uint32_t qfi = 0;
2911 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002912 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2913 buffCI.size = 1024;
2914 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2915 buffCI.queueFamilyIndexCount = 1;
2916 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002917
2918 VkBuffer dyub;
2919 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2920 ASSERT_VK_SUCCESS(err);
2921 // Correctly update descriptor to avoid "NOT_UPDATED" error
2922 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002923 buffInfo.buffer = dyub;
2924 buffInfo.offset = 0;
2925 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002926
2927 VkWriteDescriptorSet descriptor_write;
2928 memset(&descriptor_write, 0, sizeof(descriptor_write));
2929 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2930 descriptor_write.dstSet = descriptorSet;
2931 descriptor_write.dstBinding = 0;
2932 descriptor_write.descriptorCount = 1;
2933 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2934 descriptor_write.pBufferInfo = &buffInfo;
2935
2936 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2937
2938 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002939 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2940 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2941 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002942 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07002943 uint32_t pDynOff[2] = {512, 756};
2944 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07002945 m_errorMonitor->SetDesiredFailureMsg(
2946 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07002947 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07002948 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2949 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2950 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12002951 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07002952 // Finally cause error due to dynamicOffset being too big
Karl Schultz6addd812016-02-02 17:17:23 -07002953 m_errorMonitor->SetDesiredFailureMsg(
2954 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07002955 " from its update, this oversteps its buffer (");
2956 // Create PSO to be used for draw-time errors below
2957 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002958 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002959 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07002960 "out gl_PerVertex { \n"
2961 " vec4 gl_Position;\n"
2962 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002963 "void main(){\n"
2964 " gl_Position = vec4(1);\n"
2965 "}\n";
2966 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002967 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002968 "\n"
2969 "layout(location=0) out vec4 x;\n"
2970 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2971 "void main(){\n"
2972 " x = vec4(bar.y);\n"
2973 "}\n";
2974 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2975 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2976 VkPipelineObj pipe(m_device);
2977 pipe.AddShader(&vs);
2978 pipe.AddShader(&fs);
2979 pipe.AddColorAttachment();
2980 pipe.CreateVKPipeline(pipeline_layout, renderPass());
2981
Karl Schultz6addd812016-02-02 17:17:23 -07002982 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2983 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2984 // This update should succeed, but offset size of 512 will overstep buffer
2985 // /w range 1024 & size 1024
2986 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2987 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2988 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07002989 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002990 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002991
2992 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2993 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2994}
2995
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002996TEST_F(VkLayerTest, InvalidPushConstants) {
2997 // Hit push constant error cases:
2998 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
2999 // 2. Incorrectly set push constant size to 0
3000 // 3. Incorrectly set push constant size to non-multiple of 4
3001 // 4. Attempt push constant update that exceeds maxPushConstantSize
3002 VkResult err;
3003 m_errorMonitor->SetDesiredFailureMsg(
3004 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3005 "vkCreatePipelineLayout() call has push constants with offset ");
3006
3007 ASSERT_NO_FATAL_FAILURE(InitState());
3008 ASSERT_NO_FATAL_FAILURE(InitViewport());
3009 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3010
3011 VkPushConstantRange pc_range = {};
3012 pc_range.size = 0xFFFFFFFFu;
3013 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3014 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3015 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3016 pipeline_layout_ci.pushConstantRangeCount = 1;
3017 pipeline_layout_ci.pPushConstantRanges = &pc_range;
3018
3019 VkPipelineLayout pipeline_layout;
3020 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3021 &pipeline_layout);
3022
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003023 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003024 // Now cause errors due to size 0 and non-4 byte aligned size
3025 pc_range.size = 0;
3026 m_errorMonitor->SetDesiredFailureMsg(
3027 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3028 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
3029 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3030 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003031 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003032 pc_range.size = 1;
3033 m_errorMonitor->SetDesiredFailureMsg(
3034 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3035 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
3036 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3037 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003038 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003039 // Cause error due to bad size in vkCmdPushConstants() call
3040 m_errorMonitor->SetDesiredFailureMsg(
3041 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3042 "vkCmdPushConstants() call has push constants with offset ");
3043 pipeline_layout_ci.pushConstantRangeCount = 0;
3044 pipeline_layout_ci.pPushConstantRanges = NULL;
3045 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3046 &pipeline_layout);
3047 ASSERT_VK_SUCCESS(err);
3048 BeginCommandBuffer();
3049 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
3050 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003051 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003052 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3053}
3054
Karl Schultz6addd812016-02-02 17:17:23 -07003055TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003056 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07003057 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003058
3059 ASSERT_NO_FATAL_FAILURE(InitState());
3060 ASSERT_NO_FATAL_FAILURE(InitViewport());
3061 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3062
3063 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
3064 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003065 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3066 ds_type_count[0].descriptorCount = 10;
3067 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3068 ds_type_count[1].descriptorCount = 2;
3069 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3070 ds_type_count[2].descriptorCount = 2;
3071 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
3072 ds_type_count[3].descriptorCount = 5;
3073 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
3074 // type
3075 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
3076 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
3077 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003078
3079 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003080 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3081 ds_pool_ci.pNext = NULL;
3082 ds_pool_ci.maxSets = 5;
3083 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
3084 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003085
3086 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003087 err =
3088 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003089 ASSERT_VK_SUCCESS(err);
3090
3091 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
3092 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003093 dsl_binding[0].binding = 0;
3094 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3095 dsl_binding[0].descriptorCount = 5;
3096 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
3097 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003098
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003099 // Create layout identical to set0 layout but w/ different stageFlags
3100 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003101 dsl_fs_stage_only.binding = 0;
3102 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3103 dsl_fs_stage_only.descriptorCount = 5;
3104 dsl_fs_stage_only.stageFlags =
3105 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
3106 // bind time
3107 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003108 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003109 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3110 ds_layout_ci.pNext = NULL;
3111 ds_layout_ci.bindingCount = 1;
3112 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003113 static const uint32_t NUM_LAYOUTS = 4;
3114 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003115 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003116 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
3117 // layout for error case
3118 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3119 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003120 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003121 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003122 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3123 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003124 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003125 dsl_binding[0].binding = 0;
3126 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003127 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003128 dsl_binding[1].binding = 1;
3129 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3130 dsl_binding[1].descriptorCount = 2;
3131 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
3132 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003133 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003134 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003135 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3136 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003137 ASSERT_VK_SUCCESS(err);
3138 dsl_binding[0].binding = 0;
3139 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003140 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003141 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07003142 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3143 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003144 ASSERT_VK_SUCCESS(err);
3145 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003146 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003147 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3148 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003149 ASSERT_VK_SUCCESS(err);
3150
3151 static const uint32_t NUM_SETS = 4;
3152 VkDescriptorSet descriptorSet[NUM_SETS] = {};
3153 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003154 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003155 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003156 alloc_info.descriptorPool = ds_pool;
3157 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003158 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3159 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003160 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003161 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003162 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003163 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003164 err =
3165 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003166 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003167
3168 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003169 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3170 pipeline_layout_ci.pNext = NULL;
3171 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
3172 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003173
3174 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003175 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3176 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003177 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003178 // Create pipelineLayout with only one setLayout
3179 pipeline_layout_ci.setLayoutCount = 1;
3180 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003181 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3182 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003183 ASSERT_VK_SUCCESS(err);
3184 // Create pipelineLayout with 2 descriptor setLayout at index 0
3185 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
3186 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07003187 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3188 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003189 ASSERT_VK_SUCCESS(err);
3190 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
3191 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
3192 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07003193 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3194 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003195 ASSERT_VK_SUCCESS(err);
3196 // Create pipelineLayout with UB type, but stageFlags for FS only
3197 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
3198 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003199 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3200 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003201 ASSERT_VK_SUCCESS(err);
3202 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
3203 VkDescriptorSetLayout pl_bad_s0[2] = {};
3204 pl_bad_s0[0] = ds_layout_fs_only;
3205 pl_bad_s0[1] = ds_layout[1];
3206 pipeline_layout_ci.setLayoutCount = 2;
3207 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
3208 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07003209 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3210 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003211 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003212
3213 // Create a buffer to update the descriptor with
3214 uint32_t qfi = 0;
3215 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003216 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3217 buffCI.size = 1024;
3218 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3219 buffCI.queueFamilyIndexCount = 1;
3220 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003221
3222 VkBuffer dyub;
3223 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3224 ASSERT_VK_SUCCESS(err);
3225 // Correctly update descriptor to avoid "NOT_UPDATED" error
3226 static const uint32_t NUM_BUFFS = 5;
3227 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003228 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003229 buffInfo[i].buffer = dyub;
3230 buffInfo[i].offset = 0;
3231 buffInfo[i].range = 1024;
3232 }
Karl Schultz6addd812016-02-02 17:17:23 -07003233 VkImage image;
3234 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3235 const int32_t tex_width = 32;
3236 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003237 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003238 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3239 image_create_info.pNext = NULL;
3240 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3241 image_create_info.format = tex_format;
3242 image_create_info.extent.width = tex_width;
3243 image_create_info.extent.height = tex_height;
3244 image_create_info.extent.depth = 1;
3245 image_create_info.mipLevels = 1;
3246 image_create_info.arrayLayers = 1;
3247 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3248 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3249 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3250 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003251 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3252 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003253
Karl Schultz6addd812016-02-02 17:17:23 -07003254 VkMemoryRequirements memReqs;
3255 VkDeviceMemory imageMem;
3256 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003257 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003258 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3259 memAlloc.pNext = NULL;
3260 memAlloc.allocationSize = 0;
3261 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003262 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
3263 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003264 pass =
3265 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003266 ASSERT_TRUE(pass);
3267 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
3268 ASSERT_VK_SUCCESS(err);
3269 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
3270 ASSERT_VK_SUCCESS(err);
3271
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003272 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003273 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3274 image_view_create_info.image = image;
3275 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
3276 image_view_create_info.format = tex_format;
3277 image_view_create_info.subresourceRange.layerCount = 1;
3278 image_view_create_info.subresourceRange.baseMipLevel = 0;
3279 image_view_create_info.subresourceRange.levelCount = 1;
3280 image_view_create_info.subresourceRange.aspectMask =
3281 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003282
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003283 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07003284 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
3285 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003286 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003287 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003288 imageInfo[0].imageView = view;
3289 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3290 imageInfo[1].imageView = view;
3291 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003292 imageInfo[2].imageView = view;
3293 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3294 imageInfo[3].imageView = view;
3295 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003296
3297 static const uint32_t NUM_SET_UPDATES = 3;
3298 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
3299 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3300 descriptor_write[0].dstSet = descriptorSet[0];
3301 descriptor_write[0].dstBinding = 0;
3302 descriptor_write[0].descriptorCount = 5;
3303 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3304 descriptor_write[0].pBufferInfo = buffInfo;
3305 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3306 descriptor_write[1].dstSet = descriptorSet[1];
3307 descriptor_write[1].dstBinding = 0;
3308 descriptor_write[1].descriptorCount = 2;
3309 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3310 descriptor_write[1].pImageInfo = imageInfo;
3311 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3312 descriptor_write[2].dstSet = descriptorSet[1];
3313 descriptor_write[2].dstBinding = 1;
3314 descriptor_write[2].descriptorCount = 2;
3315 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003316 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003317
3318 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003319
Tobin Ehlis88452832015-12-03 09:40:56 -07003320 // Create PSO to be used for draw-time errors below
3321 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003322 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003323 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003324 "out gl_PerVertex {\n"
3325 " vec4 gl_Position;\n"
3326 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003327 "void main(){\n"
3328 " gl_Position = vec4(1);\n"
3329 "}\n";
3330 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003331 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003332 "\n"
3333 "layout(location=0) out vec4 x;\n"
3334 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3335 "void main(){\n"
3336 " x = vec4(bar.y);\n"
3337 "}\n";
3338 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3339 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003340 VkPipelineObj pipe(m_device);
3341 pipe.AddShader(&vs);
3342 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07003343 pipe.AddColorAttachment();
3344 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07003345
3346 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07003347
Karl Schultz6addd812016-02-02 17:17:23 -07003348 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3349 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3350 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
3351 // of PSO
3352 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
3353 // cmd_pipeline.c
3354 // due to the fact that cmd_alloc_dset_data() has not been called in
3355 // cmd_bind_graphics_pipeline()
3356 // TODO : Want to cause various binding incompatibility issues here to test
3357 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07003358 // First cause various verify_layout_compatibility() fails
3359 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003360 // verify_set_layout_compatibility fail cases:
3361 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07003362 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3363 " due to: invalid VkPipelineLayout ");
3364 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3365 VK_PIPELINE_BIND_POINT_GRAPHICS,
3366 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
3367 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003368 m_errorMonitor->VerifyFound();
3369
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003370 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07003371 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3372 " attempting to bind set to index 1");
3373 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3374 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
3375 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003376 m_errorMonitor->VerifyFound();
3377
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003378 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003379 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
3380 // descriptors
3381 m_errorMonitor->SetDesiredFailureMsg(
3382 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003383 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003384 vkCmdBindDescriptorSets(
3385 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3386 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003387 m_errorMonitor->VerifyFound();
3388
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003389 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
3390 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07003391 m_errorMonitor->SetDesiredFailureMsg(
3392 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003393 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07003394 vkCmdBindDescriptorSets(
3395 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3396 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003397 m_errorMonitor->VerifyFound();
3398
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003399 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
3400 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07003401 m_errorMonitor->SetDesiredFailureMsg(
3402 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003403 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003404 vkCmdBindDescriptorSets(
3405 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3406 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003407 m_errorMonitor->VerifyFound();
3408
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003409 // Cause INFO messages due to disturbing previously bound Sets
3410 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07003411 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3412 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3413 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003414 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07003415 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003416 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003417 " previously bound as set #0 was disturbed ");
3418 vkCmdBindDescriptorSets(
3419 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3420 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003421 m_errorMonitor->VerifyFound();
3422
Karl Schultz6addd812016-02-02 17:17:23 -07003423 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3424 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3425 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003426 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003428 " newly bound as set #0 so set #1 and "
3429 "any subsequent sets were disturbed ");
3430 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3431 VK_PIPELINE_BIND_POINT_GRAPHICS,
3432 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003433 m_errorMonitor->VerifyFound();
3434
Tobin Ehlis88452832015-12-03 09:40:56 -07003435 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07003436 // 1. Error due to not binding required set (we actually use same code as
3437 // above to disturb set0)
3438 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3439 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3440 2, &descriptorSet[0], 0, NULL);
3441 vkCmdBindDescriptorSets(
3442 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3443 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
3444 m_errorMonitor->SetDesiredFailureMsg(
3445 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3446 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07003447 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003448 m_errorMonitor->VerifyFound();
3449
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003450 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003451 // 2. Error due to bound set not being compatible with PSO's
3452 // VkPipelineLayout (diff stageFlags in this case)
3453 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3454 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3455 2, &descriptorSet[0], 0, NULL);
3456 m_errorMonitor->SetDesiredFailureMsg(
3457 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3458 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07003459 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003460 m_errorMonitor->VerifyFound();
3461
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003462 // Remaining clean-up
3463 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003464 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003465 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
3466 }
3467 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
3468 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, descriptorSet);
3469 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003470 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3471 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3472}
Tobin Ehlis559c6382015-11-05 09:52:49 -07003473
Karl Schultz6addd812016-02-02 17:17:23 -07003474TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003475
Karl Schultz6addd812016-02-02 17:17:23 -07003476 m_errorMonitor->SetDesiredFailureMsg(
3477 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003478 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003479
3480 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003481 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003482 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003483 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003484
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003485 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003486}
3487
Karl Schultz6addd812016-02-02 17:17:23 -07003488TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
3489 VkResult err;
3490 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003491
Karl Schultz6addd812016-02-02 17:17:23 -07003492 m_errorMonitor->SetDesiredFailureMsg(
3493 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07003494 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003495
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003496 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003497
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003498 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003499 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003500 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003501 cmd.commandPool = m_commandPool;
3502 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003503 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06003504
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003505 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06003506 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003507
3508 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003509 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003510 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003511 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003512 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07003513 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
3514 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003515 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003516
3517 // The error should be caught by validation of the BeginCommandBuffer call
3518 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
3519
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003520 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003521 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003522}
3523
Karl Schultz6addd812016-02-02 17:17:23 -07003524TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003525 // Cause error due to Begin while recording CB
3526 // Then cause 2 errors for attempting to reset CB w/o having
3527 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
3528 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003530 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003531
3532 ASSERT_NO_FATAL_FAILURE(InitState());
3533
3534 // Calls AllocateCommandBuffers
3535 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
3536
Karl Schultz6addd812016-02-02 17:17:23 -07003537 // Force the failure by setting the Renderpass and Framebuffer fields with
3538 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003539 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003540 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003541 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3542 cmd_buf_info.pNext = NULL;
3543 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003544 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003545
3546 // Begin CB to transition to recording state
3547 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
3548 // Can't re-begin. This should trigger error
3549 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003550 m_errorMonitor->VerifyFound();
3551
Karl Schultz6addd812016-02-02 17:17:23 -07003552 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3553 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003554 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
3555 // Reset attempt will trigger error due to incorrect CommandPool state
3556 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003557 m_errorMonitor->VerifyFound();
3558
Karl Schultz6addd812016-02-02 17:17:23 -07003559 m_errorMonitor->SetDesiredFailureMsg(
3560 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3561 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003562 // Transition CB to RECORDED state
3563 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
3564 // Now attempting to Begin will implicitly reset, which triggers error
3565 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003566 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003567}
3568
Karl Schultz6addd812016-02-02 17:17:23 -07003569TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003570 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003571 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003572
Karl Schultz6addd812016-02-02 17:17:23 -07003573 m_errorMonitor->SetDesiredFailureMsg(
3574 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003575 "Invalid Pipeline CreateInfo State: Vtx Shader required");
3576
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003577 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003578 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003579
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003580 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003581 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3582 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003583
3584 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003585 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3586 ds_pool_ci.pNext = NULL;
3587 ds_pool_ci.maxSets = 1;
3588 ds_pool_ci.poolSizeCount = 1;
3589 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003590
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003591 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003592 err =
3593 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003594 ASSERT_VK_SUCCESS(err);
3595
Tony Barboureb254902015-07-15 12:50:33 -06003596 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003597 dsl_binding.binding = 0;
3598 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3599 dsl_binding.descriptorCount = 1;
3600 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3601 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003602
Tony Barboureb254902015-07-15 12:50:33 -06003603 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003604 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3605 ds_layout_ci.pNext = NULL;
3606 ds_layout_ci.bindingCount = 1;
3607 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003608
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003609 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003610 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3611 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003612 ASSERT_VK_SUCCESS(err);
3613
3614 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003615 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003616 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003617 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003618 alloc_info.descriptorPool = ds_pool;
3619 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003620 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3621 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003622 ASSERT_VK_SUCCESS(err);
3623
Tony Barboureb254902015-07-15 12:50:33 -06003624 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003625 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3626 pipeline_layout_ci.setLayoutCount = 1;
3627 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003628
3629 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003630 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3631 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003632 ASSERT_VK_SUCCESS(err);
3633
Tobin Ehlise68360f2015-10-01 11:15:13 -06003634 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07003635 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06003636
3637 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003638 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3639 vp_state_ci.scissorCount = 1;
3640 vp_state_ci.pScissors = &sc;
3641 vp_state_ci.viewportCount = 1;
3642 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003643
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003644 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3645 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3646 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3647 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3648 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3649 rs_state_ci.depthClampEnable = VK_FALSE;
3650 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3651 rs_state_ci.depthBiasEnable = VK_FALSE;
3652
Tony Barboureb254902015-07-15 12:50:33 -06003653 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003654 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3655 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003656 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003657 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3658 gp_ci.layout = pipeline_layout;
3659 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06003660
3661 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003662 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3663 pc_ci.initialDataSize = 0;
3664 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003665
3666 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003667 VkPipelineCache pipelineCache;
3668
Karl Schultz6addd812016-02-02 17:17:23 -07003669 err =
3670 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06003671 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003672 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3673 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003674
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003675 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003676
Chia-I Wuf7458c52015-10-26 21:10:41 +08003677 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3678 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3679 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3680 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003681}
Tobin Ehlis912df022015-09-17 08:46:18 -06003682/*// TODO : This test should be good, but needs Tess support in compiler to run
3683TEST_F(VkLayerTest, InvalidPatchControlPoints)
3684{
3685 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06003686 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003687
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003689 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
3690primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003691
Tobin Ehlis912df022015-09-17 08:46:18 -06003692 ASSERT_NO_FATAL_FAILURE(InitState());
3693 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06003694
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003695 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06003696 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003697 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003698
3699 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3700 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3701 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003702 ds_pool_ci.poolSizeCount = 1;
3703 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06003704
3705 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003706 err = vkCreateDescriptorPool(m_device->device(),
3707VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06003708 ASSERT_VK_SUCCESS(err);
3709
3710 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08003711 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06003712 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08003713 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003714 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3715 dsl_binding.pImmutableSamplers = NULL;
3716
3717 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003718 ds_layout_ci.sType =
3719VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003720 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003721 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003722 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06003723
3724 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003725 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3726&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003727 ASSERT_VK_SUCCESS(err);
3728
3729 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07003730 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
3731VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06003732 ASSERT_VK_SUCCESS(err);
3733
3734 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003735 pipeline_layout_ci.sType =
3736VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003737 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003738 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003739 pipeline_layout_ci.pSetLayouts = &ds_layout;
3740
3741 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003742 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3743&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003744 ASSERT_VK_SUCCESS(err);
3745
3746 VkPipelineShaderStageCreateInfo shaderStages[3];
3747 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
3748
Karl Schultz6addd812016-02-02 17:17:23 -07003749 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
3750this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003751 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07003752 VkShaderObj
3753tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
3754this);
3755 VkShaderObj
3756te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
3757this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003758
Karl Schultz6addd812016-02-02 17:17:23 -07003759 shaderStages[0].sType =
3760VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003761 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003762 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003763 shaderStages[1].sType =
3764VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003765 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003766 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003767 shaderStages[2].sType =
3768VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003769 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003770 shaderStages[2].shader = te.handle();
3771
3772 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003773 iaCI.sType =
3774VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08003775 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06003776
3777 VkPipelineTessellationStateCreateInfo tsCI = {};
3778 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
3779 tsCI.patchControlPoints = 0; // This will cause an error
3780
3781 VkGraphicsPipelineCreateInfo gp_ci = {};
3782 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3783 gp_ci.pNext = NULL;
3784 gp_ci.stageCount = 3;
3785 gp_ci.pStages = shaderStages;
3786 gp_ci.pVertexInputState = NULL;
3787 gp_ci.pInputAssemblyState = &iaCI;
3788 gp_ci.pTessellationState = &tsCI;
3789 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003790 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06003791 gp_ci.pMultisampleState = NULL;
3792 gp_ci.pDepthStencilState = NULL;
3793 gp_ci.pColorBlendState = NULL;
3794 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3795 gp_ci.layout = pipeline_layout;
3796 gp_ci.renderPass = renderPass();
3797
3798 VkPipelineCacheCreateInfo pc_ci = {};
3799 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3800 pc_ci.pNext = NULL;
3801 pc_ci.initialSize = 0;
3802 pc_ci.initialData = 0;
3803 pc_ci.maxSize = 0;
3804
3805 VkPipeline pipeline;
3806 VkPipelineCache pipelineCache;
3807
Karl Schultz6addd812016-02-02 17:17:23 -07003808 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
3809&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06003810 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003811 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3812&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06003813
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003814 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003815
Chia-I Wuf7458c52015-10-26 21:10:41 +08003816 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3817 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3818 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3819 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06003820}
3821*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06003822// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07003823TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07003824 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003825
Karl Schultz6addd812016-02-02 17:17:23 -07003826 m_errorMonitor->SetDesiredFailureMsg(
3827 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003828 "Gfx Pipeline viewport count (1) must match scissor count (0).");
3829
Tobin Ehlise68360f2015-10-01 11:15:13 -06003830 ASSERT_NO_FATAL_FAILURE(InitState());
3831 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003832
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003833 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003834 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3835 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003836
3837 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003838 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3839 ds_pool_ci.maxSets = 1;
3840 ds_pool_ci.poolSizeCount = 1;
3841 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003842
3843 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003844 err =
3845 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003846 ASSERT_VK_SUCCESS(err);
3847
3848 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003849 dsl_binding.binding = 0;
3850 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3851 dsl_binding.descriptorCount = 1;
3852 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003853
3854 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003855 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3856 ds_layout_ci.bindingCount = 1;
3857 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003858
3859 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003860 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3861 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003862 ASSERT_VK_SUCCESS(err);
3863
3864 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003865 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003866 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003867 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003868 alloc_info.descriptorPool = ds_pool;
3869 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003870 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3871 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003872 ASSERT_VK_SUCCESS(err);
3873
3874 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003875 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3876 pipeline_layout_ci.setLayoutCount = 1;
3877 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003878
3879 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003880 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3881 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003882 ASSERT_VK_SUCCESS(err);
3883
3884 VkViewport vp = {}; // Just need dummy vp to point to
3885
3886 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003887 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3888 vp_state_ci.scissorCount = 0;
3889 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
3890 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003891
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003892 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3893 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3894 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3895 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3896 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3897 rs_state_ci.depthClampEnable = VK_FALSE;
3898 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3899 rs_state_ci.depthBiasEnable = VK_FALSE;
3900
Cody Northropeb3a6c12015-10-05 14:44:45 -06003901 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003902 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003903
Karl Schultz6addd812016-02-02 17:17:23 -07003904 VkShaderObj vs(m_device, bindStateVertShaderText,
3905 VK_SHADER_STAGE_VERTEX_BIT, this);
3906 VkShaderObj fs(m_device, bindStateFragShaderText,
3907 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003908 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003909 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003910 shaderStages[0] = vs.GetStageCreateInfo();
3911 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003912
3913 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003914 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3915 gp_ci.stageCount = 2;
3916 gp_ci.pStages = shaderStages;
3917 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003918 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003919 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3920 gp_ci.layout = pipeline_layout;
3921 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003922
3923 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003924 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003925
3926 VkPipeline pipeline;
3927 VkPipelineCache pipelineCache;
3928
Karl Schultz6addd812016-02-02 17:17:23 -07003929 err =
3930 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003931 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003932 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3933 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003934
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003935 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003936
Chia-I Wuf7458c52015-10-26 21:10:41 +08003937 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3938 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3939 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3940 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003941}
Karl Schultz6addd812016-02-02 17:17:23 -07003942// Don't set viewport state in PSO. This is an error b/c we always need this
3943// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06003944// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07003945TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06003946 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003947 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003948
Karl Schultz6addd812016-02-02 17:17:23 -07003949 m_errorMonitor->SetDesiredFailureMsg(
3950 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003951 "Gfx Pipeline pViewportState is null. Even if ");
3952
Tobin Ehlise68360f2015-10-01 11:15:13 -06003953 ASSERT_NO_FATAL_FAILURE(InitState());
3954 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003955
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003956 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003957 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3958 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003959
3960 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003961 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3962 ds_pool_ci.maxSets = 1;
3963 ds_pool_ci.poolSizeCount = 1;
3964 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003965
3966 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003967 err =
3968 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003969 ASSERT_VK_SUCCESS(err);
3970
3971 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003972 dsl_binding.binding = 0;
3973 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3974 dsl_binding.descriptorCount = 1;
3975 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003976
3977 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003978 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3979 ds_layout_ci.bindingCount = 1;
3980 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003981
3982 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003983 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3984 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003985 ASSERT_VK_SUCCESS(err);
3986
3987 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003988 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003989 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003990 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003991 alloc_info.descriptorPool = ds_pool;
3992 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003993 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3994 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003995 ASSERT_VK_SUCCESS(err);
3996
3997 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003998 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3999 pipeline_layout_ci.setLayoutCount = 1;
4000 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004001
4002 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004003 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4004 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004005 ASSERT_VK_SUCCESS(err);
4006
4007 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4008 // Set scissor as dynamic to avoid second error
4009 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004010 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4011 dyn_state_ci.dynamicStateCount = 1;
4012 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004013
Cody Northropeb3a6c12015-10-05 14:44:45 -06004014 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004015 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004016
Karl Schultz6addd812016-02-02 17:17:23 -07004017 VkShaderObj vs(m_device, bindStateVertShaderText,
4018 VK_SHADER_STAGE_VERTEX_BIT, this);
4019 VkShaderObj fs(m_device, bindStateFragShaderText,
4020 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004021 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004022 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004023 shaderStages[0] = vs.GetStageCreateInfo();
4024 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004025
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004026
4027 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4028 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4029 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4030 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4031 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4032 rs_state_ci.depthClampEnable = VK_FALSE;
4033 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4034 rs_state_ci.depthBiasEnable = VK_FALSE;
4035
Tobin Ehlise68360f2015-10-01 11:15:13 -06004036 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004037 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4038 gp_ci.stageCount = 2;
4039 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004040 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004041 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
4042 // should cause validation error
4043 gp_ci.pDynamicState = &dyn_state_ci;
4044 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4045 gp_ci.layout = pipeline_layout;
4046 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004047
4048 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004049 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004050
4051 VkPipeline pipeline;
4052 VkPipelineCache pipelineCache;
4053
Karl Schultz6addd812016-02-02 17:17:23 -07004054 err =
4055 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004056 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004057 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4058 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004059
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004060 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004061
Chia-I Wuf7458c52015-10-26 21:10:41 +08004062 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4063 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4064 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4065 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004066}
4067// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07004068// Then run second test where dynamic scissor count doesn't match PSO scissor
4069// count
4070TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
4071 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004072
Karl Schultz6addd812016-02-02 17:17:23 -07004073 m_errorMonitor->SetDesiredFailureMsg(
4074 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004075 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
4076
Tobin Ehlise68360f2015-10-01 11:15:13 -06004077 ASSERT_NO_FATAL_FAILURE(InitState());
4078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004079
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004080 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004081 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4082 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004083
4084 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004085 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4086 ds_pool_ci.maxSets = 1;
4087 ds_pool_ci.poolSizeCount = 1;
4088 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004089
4090 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004091 err =
4092 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004093 ASSERT_VK_SUCCESS(err);
4094
4095 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004096 dsl_binding.binding = 0;
4097 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4098 dsl_binding.descriptorCount = 1;
4099 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004100
4101 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004102 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4103 ds_layout_ci.bindingCount = 1;
4104 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004105
4106 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004107 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4108 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004109 ASSERT_VK_SUCCESS(err);
4110
4111 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004112 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004113 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004114 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004115 alloc_info.descriptorPool = ds_pool;
4116 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004117 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4118 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004119 ASSERT_VK_SUCCESS(err);
4120
4121 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004122 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4123 pipeline_layout_ci.setLayoutCount = 1;
4124 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004125
4126 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004127 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4128 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004129 ASSERT_VK_SUCCESS(err);
4130
4131 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004132 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4133 vp_state_ci.viewportCount = 1;
4134 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
4135 vp_state_ci.scissorCount = 1;
4136 vp_state_ci.pScissors =
4137 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06004138
4139 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4140 // Set scissor as dynamic to avoid that error
4141 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004142 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4143 dyn_state_ci.dynamicStateCount = 1;
4144 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004145
Cody Northropeb3a6c12015-10-05 14:44:45 -06004146 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004147 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004148
Karl Schultz6addd812016-02-02 17:17:23 -07004149 VkShaderObj vs(m_device, bindStateVertShaderText,
4150 VK_SHADER_STAGE_VERTEX_BIT, this);
4151 VkShaderObj fs(m_device, bindStateFragShaderText,
4152 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004153 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004154 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004155 shaderStages[0] = vs.GetStageCreateInfo();
4156 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004157
Cody Northropf6622dc2015-10-06 10:33:21 -06004158 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4159 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4160 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004161 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004162 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004163 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004164 vi_ci.pVertexAttributeDescriptions = nullptr;
4165
4166 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4167 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4168 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4169
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004170 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004171 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06004172 rs_ci.pNext = nullptr;
4173
Mark Youngc89c6312016-03-31 16:03:20 -06004174 VkPipelineColorBlendAttachmentState att = {};
4175 att.blendEnable = VK_FALSE;
4176 att.colorWriteMask = 0xf;
4177
Cody Northropf6622dc2015-10-06 10:33:21 -06004178 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4179 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4180 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004181 cb_ci.attachmentCount = 1;
4182 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06004183
Tobin Ehlise68360f2015-10-01 11:15:13 -06004184 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004185 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4186 gp_ci.stageCount = 2;
4187 gp_ci.pStages = shaderStages;
4188 gp_ci.pVertexInputState = &vi_ci;
4189 gp_ci.pInputAssemblyState = &ia_ci;
4190 gp_ci.pViewportState = &vp_state_ci;
4191 gp_ci.pRasterizationState = &rs_ci;
4192 gp_ci.pColorBlendState = &cb_ci;
4193 gp_ci.pDynamicState = &dyn_state_ci;
4194 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4195 gp_ci.layout = pipeline_layout;
4196 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004197
4198 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004199 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004200
4201 VkPipeline pipeline;
4202 VkPipelineCache pipelineCache;
4203
Karl Schultz6addd812016-02-02 17:17:23 -07004204 err =
4205 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004206 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004207 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4208 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004209
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004210 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004211
Tobin Ehlisd332f282015-10-02 11:00:56 -06004212 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07004213 // First need to successfully create the PSO from above by setting
4214 // pViewports
4215 m_errorMonitor->SetDesiredFailureMsg(
4216 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4217 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
4218 "scissorCount is 1. These counts must match.");
4219
4220 VkViewport vp = {}; // Just need dummy vp to point to
4221 vp_state_ci.pViewports = &vp;
4222 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4223 &gp_ci, NULL, &pipeline);
4224 ASSERT_VK_SUCCESS(err);
4225 BeginCommandBuffer();
4226 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4227 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4228 VkRect2D scissors[2] = {}; // don't care about data
4229 // Count of 2 doesn't match PSO count of 1
4230 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
4231 Draw(1, 0, 0, 0);
4232
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004233 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004234
4235 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4236 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4237 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4238 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4239}
4240// Create PSO w/o non-zero scissorCount but no scissor data
4241// Then run second test where dynamic viewportCount doesn't match PSO
4242// viewportCount
4243TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
4244 VkResult err;
4245
4246 m_errorMonitor->SetDesiredFailureMsg(
4247 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4248 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
4249
4250 ASSERT_NO_FATAL_FAILURE(InitState());
4251 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4252
4253 VkDescriptorPoolSize ds_type_count = {};
4254 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4255 ds_type_count.descriptorCount = 1;
4256
4257 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4258 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4259 ds_pool_ci.maxSets = 1;
4260 ds_pool_ci.poolSizeCount = 1;
4261 ds_pool_ci.pPoolSizes = &ds_type_count;
4262
4263 VkDescriptorPool ds_pool;
4264 err =
4265 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4266 ASSERT_VK_SUCCESS(err);
4267
4268 VkDescriptorSetLayoutBinding dsl_binding = {};
4269 dsl_binding.binding = 0;
4270 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4271 dsl_binding.descriptorCount = 1;
4272 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4273
4274 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4275 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4276 ds_layout_ci.bindingCount = 1;
4277 ds_layout_ci.pBindings = &dsl_binding;
4278
4279 VkDescriptorSetLayout ds_layout;
4280 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4281 &ds_layout);
4282 ASSERT_VK_SUCCESS(err);
4283
4284 VkDescriptorSet descriptorSet;
4285 VkDescriptorSetAllocateInfo alloc_info = {};
4286 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4287 alloc_info.descriptorSetCount = 1;
4288 alloc_info.descriptorPool = ds_pool;
4289 alloc_info.pSetLayouts = &ds_layout;
4290 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4291 &descriptorSet);
4292 ASSERT_VK_SUCCESS(err);
4293
4294 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4295 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4296 pipeline_layout_ci.setLayoutCount = 1;
4297 pipeline_layout_ci.pSetLayouts = &ds_layout;
4298
4299 VkPipelineLayout pipeline_layout;
4300 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4301 &pipeline_layout);
4302 ASSERT_VK_SUCCESS(err);
4303
4304 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4305 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4306 vp_state_ci.scissorCount = 1;
4307 vp_state_ci.pScissors =
4308 NULL; // Null scissor w/ count of 1 should cause error
4309 vp_state_ci.viewportCount = 1;
4310 vp_state_ci.pViewports =
4311 NULL; // vp is dynamic (below) so this won't cause error
4312
4313 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
4314 // Set scissor as dynamic to avoid that error
4315 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4316 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4317 dyn_state_ci.dynamicStateCount = 1;
4318 dyn_state_ci.pDynamicStates = &vp_state;
4319
4320 VkPipelineShaderStageCreateInfo shaderStages[2];
4321 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4322
4323 VkShaderObj vs(m_device, bindStateVertShaderText,
4324 VK_SHADER_STAGE_VERTEX_BIT, this);
4325 VkShaderObj fs(m_device, bindStateFragShaderText,
4326 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004327 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004328 // but add it to be able to run on more devices
4329 shaderStages[0] = vs.GetStageCreateInfo();
4330 shaderStages[1] = fs.GetStageCreateInfo();
4331
4332 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4333 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4334 vi_ci.pNext = nullptr;
4335 vi_ci.vertexBindingDescriptionCount = 0;
4336 vi_ci.pVertexBindingDescriptions = nullptr;
4337 vi_ci.vertexAttributeDescriptionCount = 0;
4338 vi_ci.pVertexAttributeDescriptions = nullptr;
4339
4340 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4341 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4342 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4343
4344 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4345 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4346 rs_ci.pNext = nullptr;
4347
Mark Youngc89c6312016-03-31 16:03:20 -06004348 VkPipelineColorBlendAttachmentState att = {};
4349 att.blendEnable = VK_FALSE;
4350 att.colorWriteMask = 0xf;
4351
Karl Schultz6addd812016-02-02 17:17:23 -07004352 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4353 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4354 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004355 cb_ci.attachmentCount = 1;
4356 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07004357
4358 VkGraphicsPipelineCreateInfo gp_ci = {};
4359 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4360 gp_ci.stageCount = 2;
4361 gp_ci.pStages = shaderStages;
4362 gp_ci.pVertexInputState = &vi_ci;
4363 gp_ci.pInputAssemblyState = &ia_ci;
4364 gp_ci.pViewportState = &vp_state_ci;
4365 gp_ci.pRasterizationState = &rs_ci;
4366 gp_ci.pColorBlendState = &cb_ci;
4367 gp_ci.pDynamicState = &dyn_state_ci;
4368 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4369 gp_ci.layout = pipeline_layout;
4370 gp_ci.renderPass = renderPass();
4371
4372 VkPipelineCacheCreateInfo pc_ci = {};
4373 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4374
4375 VkPipeline pipeline;
4376 VkPipelineCache pipelineCache;
4377
4378 err =
4379 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4380 ASSERT_VK_SUCCESS(err);
4381 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4382 &gp_ci, NULL, &pipeline);
4383
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004384 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004385
4386 // Now hit second fail case where we set scissor w/ different count than PSO
4387 // First need to successfully create the PSO from above by setting
4388 // pViewports
4389 m_errorMonitor->SetDesiredFailureMsg(
4390 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4391 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
4392 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004393
Tobin Ehlisd332f282015-10-02 11:00:56 -06004394 VkRect2D sc = {}; // Just need dummy vp to point to
4395 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07004396 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4397 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004398 ASSERT_VK_SUCCESS(err);
4399 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004400 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4401 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004402 VkViewport viewports[2] = {}; // don't care about data
4403 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07004404 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004405 Draw(1, 0, 0, 0);
4406
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004407 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004408
Chia-I Wuf7458c52015-10-26 21:10:41 +08004409 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4410 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4411 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4412 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004413}
4414
Mark Young7394fdd2016-03-31 14:56:43 -06004415TEST_F(VkLayerTest, PSOLineWidthInvalid) {
4416 VkResult err;
4417
4418 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004419 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004420
4421 ASSERT_NO_FATAL_FAILURE(InitState());
4422 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4423
4424 VkDescriptorPoolSize ds_type_count = {};
4425 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4426 ds_type_count.descriptorCount = 1;
4427
4428 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4429 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4430 ds_pool_ci.maxSets = 1;
4431 ds_pool_ci.poolSizeCount = 1;
4432 ds_pool_ci.pPoolSizes = &ds_type_count;
4433
4434 VkDescriptorPool ds_pool;
4435 err =
4436 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4437 ASSERT_VK_SUCCESS(err);
4438
4439 VkDescriptorSetLayoutBinding dsl_binding = {};
4440 dsl_binding.binding = 0;
4441 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4442 dsl_binding.descriptorCount = 1;
4443 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4444
4445 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4446 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4447 ds_layout_ci.bindingCount = 1;
4448 ds_layout_ci.pBindings = &dsl_binding;
4449
4450 VkDescriptorSetLayout ds_layout;
4451 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4452 &ds_layout);
4453 ASSERT_VK_SUCCESS(err);
4454
4455 VkDescriptorSet descriptorSet;
4456 VkDescriptorSetAllocateInfo alloc_info = {};
4457 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4458 alloc_info.descriptorSetCount = 1;
4459 alloc_info.descriptorPool = ds_pool;
4460 alloc_info.pSetLayouts = &ds_layout;
4461 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4462 &descriptorSet);
4463 ASSERT_VK_SUCCESS(err);
4464
4465 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4466 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4467 pipeline_layout_ci.setLayoutCount = 1;
4468 pipeline_layout_ci.pSetLayouts = &ds_layout;
4469
4470 VkPipelineLayout pipeline_layout;
4471 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4472 &pipeline_layout);
4473 ASSERT_VK_SUCCESS(err);
4474
4475 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4476 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4477 vp_state_ci.scissorCount = 1;
4478 vp_state_ci.pScissors = NULL;
4479 vp_state_ci.viewportCount = 1;
4480 vp_state_ci.pViewports = NULL;
4481
4482 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
4483 VK_DYNAMIC_STATE_SCISSOR,
4484 VK_DYNAMIC_STATE_LINE_WIDTH};
4485 // Set scissor as dynamic to avoid that error
4486 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4487 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4488 dyn_state_ci.dynamicStateCount = 2;
4489 dyn_state_ci.pDynamicStates = dynamic_states;
4490
4491 VkPipelineShaderStageCreateInfo shaderStages[2];
4492 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4493
4494 VkShaderObj vs(m_device, bindStateVertShaderText,
4495 VK_SHADER_STAGE_VERTEX_BIT, this);
4496 VkShaderObj fs(m_device, bindStateFragShaderText,
4497 VK_SHADER_STAGE_FRAGMENT_BIT,
4498 this); // TODO - We shouldn't need a fragment shader
4499 // but add it to be able to run on more devices
4500 shaderStages[0] = vs.GetStageCreateInfo();
4501 shaderStages[1] = fs.GetStageCreateInfo();
4502
4503 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4504 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4505 vi_ci.pNext = nullptr;
4506 vi_ci.vertexBindingDescriptionCount = 0;
4507 vi_ci.pVertexBindingDescriptions = nullptr;
4508 vi_ci.vertexAttributeDescriptionCount = 0;
4509 vi_ci.pVertexAttributeDescriptions = nullptr;
4510
4511 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4512 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4513 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4514
4515 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4516 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4517 rs_ci.pNext = nullptr;
4518
Mark Young47107952016-05-02 15:59:55 -06004519 // Check too low (line width of -1.0f).
4520 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06004521
4522 VkPipelineColorBlendAttachmentState att = {};
4523 att.blendEnable = VK_FALSE;
4524 att.colorWriteMask = 0xf;
4525
4526 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4527 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4528 cb_ci.pNext = nullptr;
4529 cb_ci.attachmentCount = 1;
4530 cb_ci.pAttachments = &att;
4531
4532 VkGraphicsPipelineCreateInfo gp_ci = {};
4533 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4534 gp_ci.stageCount = 2;
4535 gp_ci.pStages = shaderStages;
4536 gp_ci.pVertexInputState = &vi_ci;
4537 gp_ci.pInputAssemblyState = &ia_ci;
4538 gp_ci.pViewportState = &vp_state_ci;
4539 gp_ci.pRasterizationState = &rs_ci;
4540 gp_ci.pColorBlendState = &cb_ci;
4541 gp_ci.pDynamicState = &dyn_state_ci;
4542 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4543 gp_ci.layout = pipeline_layout;
4544 gp_ci.renderPass = renderPass();
4545
4546 VkPipelineCacheCreateInfo pc_ci = {};
4547 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4548
4549 VkPipeline pipeline;
4550 VkPipelineCache pipelineCache;
4551
4552 err =
4553 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4554 ASSERT_VK_SUCCESS(err);
4555 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4556 &gp_ci, NULL, &pipeline);
4557
4558 m_errorMonitor->VerifyFound();
4559
4560 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4561 "Attempt to set lineWidth to 65536");
4562
4563 // Check too high (line width of 65536.0f).
4564 rs_ci.lineWidth = 65536.0f;
4565
4566 err =
4567 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4568 ASSERT_VK_SUCCESS(err);
4569 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4570 &gp_ci, NULL, &pipeline);
4571
4572 m_errorMonitor->VerifyFound();
4573
4574 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004575 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004576
4577 dyn_state_ci.dynamicStateCount = 3;
4578
4579 rs_ci.lineWidth = 1.0f;
4580
4581 err =
4582 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4583 ASSERT_VK_SUCCESS(err);
4584 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4585 &gp_ci, NULL, &pipeline);
4586 BeginCommandBuffer();
4587 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4588 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4589
4590 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06004591 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06004592 m_errorMonitor->VerifyFound();
4593
4594 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4595 "Attempt to set lineWidth to 65536");
4596
4597 // Check too high with dynamic setting.
4598 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
4599 m_errorMonitor->VerifyFound();
4600 EndCommandBuffer();
4601
4602 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4603 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4604 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4605 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4606}
4607
Karl Schultz6addd812016-02-02 17:17:23 -07004608TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004609 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004610 m_errorMonitor->SetDesiredFailureMsg(
4611 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004612 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004613
4614 ASSERT_NO_FATAL_FAILURE(InitState());
4615 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004616
Tony Barbourfe3351b2015-07-28 10:17:20 -06004617 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004618 // Don't care about RenderPass handle b/c error should be flagged before
4619 // that
4620 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
4621 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004622
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004623 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004624}
4625
Karl Schultz6addd812016-02-02 17:17:23 -07004626TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004627 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004628 m_errorMonitor->SetDesiredFailureMsg(
4629 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004630 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004631
4632 ASSERT_NO_FATAL_FAILURE(InitState());
4633 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004634
Tony Barbourfe3351b2015-07-28 10:17:20 -06004635 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004636 // Just create a dummy Renderpass that's non-NULL so we can get to the
4637 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06004638 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004639 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4640 rp_begin.pNext = NULL;
4641 rp_begin.renderPass = renderPass();
4642 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004643
Karl Schultz6addd812016-02-02 17:17:23 -07004644 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
4645 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004646
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004647 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004648}
4649
Karl Schultz6addd812016-02-02 17:17:23 -07004650TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004651 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004652 m_errorMonitor->SetDesiredFailureMsg(
4653 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004654 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004655
4656 ASSERT_NO_FATAL_FAILURE(InitState());
4657 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004658
4659 // Renderpass is started here
4660 BeginCommandBuffer();
4661
4662 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004663 vk_testing::Buffer dstBuffer;
4664 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004665
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004666 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004667
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004668 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004669}
4670
Karl Schultz6addd812016-02-02 17:17:23 -07004671TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004672 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004673 m_errorMonitor->SetDesiredFailureMsg(
4674 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004675 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004676
4677 ASSERT_NO_FATAL_FAILURE(InitState());
4678 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004679
4680 // Renderpass is started here
4681 BeginCommandBuffer();
4682
4683 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004684 vk_testing::Buffer dstBuffer;
4685 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004686
Karl Schultz6addd812016-02-02 17:17:23 -07004687 VkDeviceSize dstOffset = 0;
4688 VkDeviceSize dataSize = 1024;
4689 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004690
Karl Schultz6addd812016-02-02 17:17:23 -07004691 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
4692 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004693
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004694 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004695}
4696
Karl Schultz6addd812016-02-02 17:17:23 -07004697TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004698 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004699 m_errorMonitor->SetDesiredFailureMsg(
4700 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004701 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004702
4703 ASSERT_NO_FATAL_FAILURE(InitState());
4704 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004705
4706 // Renderpass is started here
4707 BeginCommandBuffer();
4708
Michael Lentine0a369f62016-02-03 16:51:46 -06004709 VkClearColorValue clear_color;
4710 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07004711 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
4712 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4713 const int32_t tex_width = 32;
4714 const int32_t tex_height = 32;
4715 VkImageCreateInfo image_create_info = {};
4716 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4717 image_create_info.pNext = NULL;
4718 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4719 image_create_info.format = tex_format;
4720 image_create_info.extent.width = tex_width;
4721 image_create_info.extent.height = tex_height;
4722 image_create_info.extent.depth = 1;
4723 image_create_info.mipLevels = 1;
4724 image_create_info.arrayLayers = 1;
4725 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4726 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4727 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004728
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004729 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004730 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4731 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004732
Karl Schultz6addd812016-02-02 17:17:23 -07004733 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4734 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004735
Karl Schultz6addd812016-02-02 17:17:23 -07004736 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4737 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004738
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004739 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004740}
4741
Karl Schultz6addd812016-02-02 17:17:23 -07004742TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004743 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004744 m_errorMonitor->SetDesiredFailureMsg(
4745 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004746 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004747
4748 ASSERT_NO_FATAL_FAILURE(InitState());
4749 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004750
4751 // Renderpass is started here
4752 BeginCommandBuffer();
4753
4754 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07004755 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004756 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
4757 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4758 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
4759 image_create_info.extent.width = 64;
4760 image_create_info.extent.height = 64;
4761 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4762 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004763
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004764 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004765 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4766 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004767
Karl Schultz6addd812016-02-02 17:17:23 -07004768 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4769 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004770
Karl Schultz6addd812016-02-02 17:17:23 -07004771 vkCmdClearDepthStencilImage(
4772 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4773 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
4774 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004775
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004776 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004777}
4778
Karl Schultz6addd812016-02-02 17:17:23 -07004779TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004780 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004781 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004782
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004783 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004784 "vkCmdClearAttachments: This call "
4785 "must be issued inside an active "
4786 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004787
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004788 ASSERT_NO_FATAL_FAILURE(InitState());
4789 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004790
4791 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004792 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004793 ASSERT_VK_SUCCESS(err);
4794
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004795 VkClearAttachment color_attachment;
4796 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4797 color_attachment.clearValue.color.float32[0] = 0;
4798 color_attachment.clearValue.color.float32[1] = 0;
4799 color_attachment.clearValue.color.float32[2] = 0;
4800 color_attachment.clearValue.color.float32[3] = 0;
4801 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004802 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
4803 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
4804 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004805
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004806 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004807}
4808
Karl Schultz9e66a292016-04-21 15:57:51 -06004809TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
4810 // Try to add a buffer memory barrier with no buffer.
4811 m_errorMonitor->SetDesiredFailureMsg(
4812 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4813 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
4814
4815 ASSERT_NO_FATAL_FAILURE(InitState());
4816 BeginCommandBuffer();
4817
4818 VkBufferMemoryBarrier buf_barrier = {};
4819 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
4820 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4821 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4822 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4823 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4824 buf_barrier.buffer = VK_NULL_HANDLE;
4825 buf_barrier.offset = 0;
4826 buf_barrier.size = VK_WHOLE_SIZE;
4827 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4828 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
4829 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
4830
4831 m_errorMonitor->VerifyFound();
4832}
4833
Karl Schultz6addd812016-02-02 17:17:23 -07004834TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004835 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004836 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004837
Karl Schultz6addd812016-02-02 17:17:23 -07004838 m_errorMonitor->SetDesiredFailureMsg(
4839 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004840 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
4841
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004842 ASSERT_NO_FATAL_FAILURE(InitState());
4843 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004844 uint32_t qfi = 0;
4845 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004846 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4847 buffCI.size = 1024;
4848 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
4849 buffCI.queueFamilyIndexCount = 1;
4850 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004851
4852 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004853 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004854 ASSERT_VK_SUCCESS(err);
4855
4856 BeginCommandBuffer();
4857 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004858 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4859 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004860 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07004861 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
4862 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004863
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004864 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004865
Chia-I Wuf7458c52015-10-26 21:10:41 +08004866 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004867}
4868
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004869TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
4870 // Create an out-of-range queueFamilyIndex
4871 m_errorMonitor->SetDesiredFailureMsg(
4872 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06004873 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004874
4875 ASSERT_NO_FATAL_FAILURE(InitState());
4876 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4877 VkBufferCreateInfo buffCI = {};
4878 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4879 buffCI.size = 1024;
4880 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
4881 buffCI.queueFamilyIndexCount = 1;
4882 // Introduce failure by specifying invalid queue_family_index
4883 uint32_t qfi = 777;
4884 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06004885 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004886
4887 VkBuffer ib;
4888 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
4889
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004890 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004891}
4892
Karl Schultz6addd812016-02-02 17:17:23 -07004893TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
4894 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
4895 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004896
Karl Schultz6addd812016-02-02 17:17:23 -07004897 m_errorMonitor->SetDesiredFailureMsg(
4898 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004899 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004900
4901 ASSERT_NO_FATAL_FAILURE(InitState());
4902 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004903
4904 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004905 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004906 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
4907 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004908
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004909 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004910}
4911
Karl Schultz6addd812016-02-02 17:17:23 -07004912TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004913 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07004914 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004915
Karl Schultz6addd812016-02-02 17:17:23 -07004916 m_errorMonitor->SetDesiredFailureMsg(
4917 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Write descriptor update has descriptor "
4918 "type VK_DESCRIPTOR_TYPE_SAMPLER that "
4919 "does not match ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004920
Tobin Ehlis3b780662015-05-28 12:11:26 -06004921 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004922 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004923 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004924 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4925 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004926
4927 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004928 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4929 ds_pool_ci.pNext = NULL;
4930 ds_pool_ci.maxSets = 1;
4931 ds_pool_ci.poolSizeCount = 1;
4932 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004933
Tobin Ehlis3b780662015-05-28 12:11:26 -06004934 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004935 err =
4936 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004937 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06004938 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004939 dsl_binding.binding = 0;
4940 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4941 dsl_binding.descriptorCount = 1;
4942 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4943 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004944
Tony Barboureb254902015-07-15 12:50:33 -06004945 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004946 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4947 ds_layout_ci.pNext = NULL;
4948 ds_layout_ci.bindingCount = 1;
4949 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004950
Tobin Ehlis3b780662015-05-28 12:11:26 -06004951 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004952 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4953 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004954 ASSERT_VK_SUCCESS(err);
4955
4956 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004957 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004958 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004959 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004960 alloc_info.descriptorPool = ds_pool;
4961 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004962 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4963 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004964 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004965
Tony Barboureb254902015-07-15 12:50:33 -06004966 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004967 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4968 sampler_ci.pNext = NULL;
4969 sampler_ci.magFilter = VK_FILTER_NEAREST;
4970 sampler_ci.minFilter = VK_FILTER_NEAREST;
4971 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4972 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4973 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4974 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4975 sampler_ci.mipLodBias = 1.0;
4976 sampler_ci.anisotropyEnable = VK_FALSE;
4977 sampler_ci.maxAnisotropy = 1;
4978 sampler_ci.compareEnable = VK_FALSE;
4979 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4980 sampler_ci.minLod = 1.0;
4981 sampler_ci.maxLod = 1.0;
4982 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4983 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Mark Lobodzinski52ac6582015-09-01 15:42:56 -06004984
Tobin Ehlis3b780662015-05-28 12:11:26 -06004985 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004986 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004987 ASSERT_VK_SUCCESS(err);
4988
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004989 VkDescriptorImageInfo info = {};
4990 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004991
4992 VkWriteDescriptorSet descriptor_write;
4993 memset(&descriptor_write, 0, sizeof(descriptor_write));
4994 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004995 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004996 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004997 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004998 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004999 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005000
5001 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5002
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005003 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005004
Chia-I Wuf7458c52015-10-26 21:10:41 +08005005 vkDestroySampler(m_device->device(), sampler, NULL);
5006 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5007 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005008}
5009
Karl Schultz6addd812016-02-02 17:17:23 -07005010TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005011 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07005012 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005013
Karl Schultz6addd812016-02-02 17:17:23 -07005014 m_errorMonitor->SetDesiredFailureMsg(
5015 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Descriptor update type of "
5016 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET "
5017 "is out of bounds for matching binding");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005018
Tobin Ehlis3b780662015-05-28 12:11:26 -06005019 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005020 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005021 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005022 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5023 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005024
5025 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005026 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5027 ds_pool_ci.pNext = NULL;
5028 ds_pool_ci.maxSets = 1;
5029 ds_pool_ci.poolSizeCount = 1;
5030 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005031
Tobin Ehlis3b780662015-05-28 12:11:26 -06005032 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005033 err =
5034 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005035 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005036
Tony Barboureb254902015-07-15 12:50:33 -06005037 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005038 dsl_binding.binding = 0;
5039 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5040 dsl_binding.descriptorCount = 1;
5041 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5042 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005043
5044 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005045 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5046 ds_layout_ci.pNext = NULL;
5047 ds_layout_ci.bindingCount = 1;
5048 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005049
Tobin Ehlis3b780662015-05-28 12:11:26 -06005050 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005051 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5052 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005053 ASSERT_VK_SUCCESS(err);
5054
5055 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005056 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005057 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005058 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005059 alloc_info.descriptorPool = ds_pool;
5060 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005061 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5062 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005063 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005064
Tony Barboureb254902015-07-15 12:50:33 -06005065 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005066 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5067 sampler_ci.pNext = NULL;
5068 sampler_ci.magFilter = VK_FILTER_NEAREST;
5069 sampler_ci.minFilter = VK_FILTER_NEAREST;
5070 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5071 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5072 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5073 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5074 sampler_ci.mipLodBias = 1.0;
5075 sampler_ci.anisotropyEnable = VK_FALSE;
5076 sampler_ci.maxAnisotropy = 1;
5077 sampler_ci.compareEnable = VK_FALSE;
5078 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5079 sampler_ci.minLod = 1.0;
5080 sampler_ci.maxLod = 1.0;
5081 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5082 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005083
Tobin Ehlis3b780662015-05-28 12:11:26 -06005084 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005085 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005086 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005087
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005088 VkDescriptorImageInfo info = {};
5089 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005090
5091 VkWriteDescriptorSet descriptor_write;
5092 memset(&descriptor_write, 0, sizeof(descriptor_write));
5093 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005094 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005095 descriptor_write.dstArrayElement =
5096 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08005097 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005098 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005099 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005100 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005101
5102 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5103
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005104 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005105
Chia-I Wuf7458c52015-10-26 21:10:41 +08005106 vkDestroySampler(m_device->device(), sampler, NULL);
5107 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5108 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005109}
5110
Karl Schultz6addd812016-02-02 17:17:23 -07005111TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
5112 // Create layout w/ count of 1 and attempt update to that layout w/ binding
5113 // index 2
5114 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005115
Karl Schultz6addd812016-02-02 17:17:23 -07005116 m_errorMonitor->SetDesiredFailureMsg(
5117 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005118 " does not have binding to match update binding ");
5119
Tobin Ehlis3b780662015-05-28 12:11:26 -06005120 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005121 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005122 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005123 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5124 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005125
5126 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005127 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5128 ds_pool_ci.pNext = NULL;
5129 ds_pool_ci.maxSets = 1;
5130 ds_pool_ci.poolSizeCount = 1;
5131 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005132
Tobin Ehlis3b780662015-05-28 12:11:26 -06005133 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005134 err =
5135 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005136 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005137
Tony Barboureb254902015-07-15 12:50:33 -06005138 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005139 dsl_binding.binding = 0;
5140 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5141 dsl_binding.descriptorCount = 1;
5142 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5143 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005144
5145 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005146 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5147 ds_layout_ci.pNext = NULL;
5148 ds_layout_ci.bindingCount = 1;
5149 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005150 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005151 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5152 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005153 ASSERT_VK_SUCCESS(err);
5154
5155 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005156 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005157 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005158 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005159 alloc_info.descriptorPool = ds_pool;
5160 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005161 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5162 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005163 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005164
Tony Barboureb254902015-07-15 12:50:33 -06005165 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005166 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5167 sampler_ci.pNext = NULL;
5168 sampler_ci.magFilter = VK_FILTER_NEAREST;
5169 sampler_ci.minFilter = VK_FILTER_NEAREST;
5170 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5171 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5172 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5173 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5174 sampler_ci.mipLodBias = 1.0;
5175 sampler_ci.anisotropyEnable = VK_FALSE;
5176 sampler_ci.maxAnisotropy = 1;
5177 sampler_ci.compareEnable = VK_FALSE;
5178 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5179 sampler_ci.minLod = 1.0;
5180 sampler_ci.maxLod = 1.0;
5181 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5182 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005183
Tobin Ehlis3b780662015-05-28 12:11:26 -06005184 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005185 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005186 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005187
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005188 VkDescriptorImageInfo info = {};
5189 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005190
5191 VkWriteDescriptorSet descriptor_write;
5192 memset(&descriptor_write, 0, sizeof(descriptor_write));
5193 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005194 descriptor_write.dstSet = descriptorSet;
5195 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005196 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005197 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005198 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005199 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005200
5201 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5202
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005203 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005204
Chia-I Wuf7458c52015-10-26 21:10:41 +08005205 vkDestroySampler(m_device->device(), sampler, NULL);
5206 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5207 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005208}
5209
Karl Schultz6addd812016-02-02 17:17:23 -07005210TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
5211 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
5212 // types
5213 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005214
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005216 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005217
Tobin Ehlis3b780662015-05-28 12:11:26 -06005218 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005219
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005220 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005221 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5222 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005223
5224 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005225 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5226 ds_pool_ci.pNext = NULL;
5227 ds_pool_ci.maxSets = 1;
5228 ds_pool_ci.poolSizeCount = 1;
5229 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005230
Tobin Ehlis3b780662015-05-28 12:11:26 -06005231 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005232 err =
5233 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005234 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005235 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005236 dsl_binding.binding = 0;
5237 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5238 dsl_binding.descriptorCount = 1;
5239 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5240 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005241
Tony Barboureb254902015-07-15 12:50:33 -06005242 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005243 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5244 ds_layout_ci.pNext = NULL;
5245 ds_layout_ci.bindingCount = 1;
5246 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005247
Tobin Ehlis3b780662015-05-28 12:11:26 -06005248 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005249 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5250 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005251 ASSERT_VK_SUCCESS(err);
5252
5253 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005254 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005255 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005256 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005257 alloc_info.descriptorPool = ds_pool;
5258 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005259 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5260 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005261 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005262
Tony Barboureb254902015-07-15 12:50:33 -06005263 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005264 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5265 sampler_ci.pNext = NULL;
5266 sampler_ci.magFilter = VK_FILTER_NEAREST;
5267 sampler_ci.minFilter = VK_FILTER_NEAREST;
5268 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5269 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5270 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5271 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5272 sampler_ci.mipLodBias = 1.0;
5273 sampler_ci.anisotropyEnable = VK_FALSE;
5274 sampler_ci.maxAnisotropy = 1;
5275 sampler_ci.compareEnable = VK_FALSE;
5276 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5277 sampler_ci.minLod = 1.0;
5278 sampler_ci.maxLod = 1.0;
5279 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5280 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005281 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005282 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005283 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005284
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005285 VkDescriptorImageInfo info = {};
5286 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005287
5288 VkWriteDescriptorSet descriptor_write;
5289 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07005290 descriptor_write.sType =
5291 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005292 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005293 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005294 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005295 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005296 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005297
5298 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5299
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005300 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005301
Chia-I Wuf7458c52015-10-26 21:10:41 +08005302 vkDestroySampler(m_device->device(), sampler, NULL);
5303 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5304 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005305}
5306
Karl Schultz6addd812016-02-02 17:17:23 -07005307TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005308 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07005309 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005310
Karl Schultz6addd812016-02-02 17:17:23 -07005311 m_errorMonitor->SetDesiredFailureMsg(
5312 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005313 "Attempt to update descriptor with invalid sampler 0xbaadbeef");
5314
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005315 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005316 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
5317 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005318 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005319 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
5320 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005321
5322 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005323 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5324 ds_pool_ci.pNext = NULL;
5325 ds_pool_ci.maxSets = 1;
5326 ds_pool_ci.poolSizeCount = 1;
5327 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005328
5329 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005330 err =
5331 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005332 ASSERT_VK_SUCCESS(err);
5333
5334 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005335 dsl_binding.binding = 0;
5336 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5337 dsl_binding.descriptorCount = 1;
5338 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5339 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005340
5341 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005342 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5343 ds_layout_ci.pNext = NULL;
5344 ds_layout_ci.bindingCount = 1;
5345 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005346 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005347 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5348 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005349 ASSERT_VK_SUCCESS(err);
5350
5351 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005352 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005353 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005354 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005355 alloc_info.descriptorPool = ds_pool;
5356 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005357 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5358 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005359 ASSERT_VK_SUCCESS(err);
5360
Karl Schultz6addd812016-02-02 17:17:23 -07005361 VkSampler sampler =
5362 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005363
5364 VkDescriptorImageInfo descriptor_info;
5365 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5366 descriptor_info.sampler = sampler;
5367
5368 VkWriteDescriptorSet descriptor_write;
5369 memset(&descriptor_write, 0, sizeof(descriptor_write));
5370 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005371 descriptor_write.dstSet = descriptorSet;
5372 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005373 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005374 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5375 descriptor_write.pImageInfo = &descriptor_info;
5376
5377 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5378
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005379 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005380
Chia-I Wuf7458c52015-10-26 21:10:41 +08005381 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5382 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005383}
5384
Karl Schultz6addd812016-02-02 17:17:23 -07005385TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
5386 // Create a single combined Image/Sampler descriptor and send it an invalid
5387 // imageView
5388 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005389
Karl Schultz6addd812016-02-02 17:17:23 -07005390 m_errorMonitor->SetDesiredFailureMsg(
5391 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005392 "Attempt to update descriptor with invalid imageView 0xbaadbeef");
5393
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005394 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005395 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005396 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5397 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005398
5399 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005400 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5401 ds_pool_ci.pNext = NULL;
5402 ds_pool_ci.maxSets = 1;
5403 ds_pool_ci.poolSizeCount = 1;
5404 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005405
5406 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005407 err =
5408 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005409 ASSERT_VK_SUCCESS(err);
5410
5411 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005412 dsl_binding.binding = 0;
5413 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5414 dsl_binding.descriptorCount = 1;
5415 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5416 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005417
5418 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005419 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5420 ds_layout_ci.pNext = NULL;
5421 ds_layout_ci.bindingCount = 1;
5422 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005423 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005424 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5425 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005426 ASSERT_VK_SUCCESS(err);
5427
5428 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005429 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005430 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005431 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005432 alloc_info.descriptorPool = ds_pool;
5433 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005434 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5435 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005436 ASSERT_VK_SUCCESS(err);
5437
5438 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005439 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5440 sampler_ci.pNext = NULL;
5441 sampler_ci.magFilter = VK_FILTER_NEAREST;
5442 sampler_ci.minFilter = VK_FILTER_NEAREST;
5443 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5444 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5445 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5446 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5447 sampler_ci.mipLodBias = 1.0;
5448 sampler_ci.anisotropyEnable = VK_FALSE;
5449 sampler_ci.maxAnisotropy = 1;
5450 sampler_ci.compareEnable = VK_FALSE;
5451 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5452 sampler_ci.minLod = 1.0;
5453 sampler_ci.maxLod = 1.0;
5454 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5455 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005456
5457 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005458 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005459 ASSERT_VK_SUCCESS(err);
5460
Karl Schultz6addd812016-02-02 17:17:23 -07005461 VkImageView view =
5462 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005463
5464 VkDescriptorImageInfo descriptor_info;
5465 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5466 descriptor_info.sampler = sampler;
5467 descriptor_info.imageView = view;
5468
5469 VkWriteDescriptorSet descriptor_write;
5470 memset(&descriptor_write, 0, sizeof(descriptor_write));
5471 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005472 descriptor_write.dstSet = descriptorSet;
5473 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005474 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005475 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5476 descriptor_write.pImageInfo = &descriptor_info;
5477
5478 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5479
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005480 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005481
Chia-I Wuf7458c52015-10-26 21:10:41 +08005482 vkDestroySampler(m_device->device(), sampler, NULL);
5483 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5484 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005485}
5486
Karl Schultz6addd812016-02-02 17:17:23 -07005487TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
5488 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
5489 // into the other
5490 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005491
Karl Schultz6addd812016-02-02 17:17:23 -07005492 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06005493 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5494 "Copy descriptor update index 0, has src update descriptor "
5495 "type VK_DESCRIPTOR_TYPE_SAMPLER that does not match overlapping "
5496 "dest ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005497
Tobin Ehlis04356f92015-10-27 16:35:27 -06005498 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005499 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005500 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005501 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5502 ds_type_count[0].descriptorCount = 1;
5503 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
5504 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005505
5506 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005507 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5508 ds_pool_ci.pNext = NULL;
5509 ds_pool_ci.maxSets = 1;
5510 ds_pool_ci.poolSizeCount = 2;
5511 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005512
5513 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005514 err =
5515 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005516 ASSERT_VK_SUCCESS(err);
5517 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005518 dsl_binding[0].binding = 0;
5519 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5520 dsl_binding[0].descriptorCount = 1;
5521 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
5522 dsl_binding[0].pImmutableSamplers = NULL;
5523 dsl_binding[1].binding = 1;
5524 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5525 dsl_binding[1].descriptorCount = 1;
5526 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
5527 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005528
5529 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005530 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5531 ds_layout_ci.pNext = NULL;
5532 ds_layout_ci.bindingCount = 2;
5533 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005534
5535 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005536 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5537 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005538 ASSERT_VK_SUCCESS(err);
5539
5540 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005541 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005542 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005543 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005544 alloc_info.descriptorPool = ds_pool;
5545 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005546 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5547 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005548 ASSERT_VK_SUCCESS(err);
5549
5550 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005551 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5552 sampler_ci.pNext = NULL;
5553 sampler_ci.magFilter = VK_FILTER_NEAREST;
5554 sampler_ci.minFilter = VK_FILTER_NEAREST;
5555 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5556 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5557 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5558 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5559 sampler_ci.mipLodBias = 1.0;
5560 sampler_ci.anisotropyEnable = VK_FALSE;
5561 sampler_ci.maxAnisotropy = 1;
5562 sampler_ci.compareEnable = VK_FALSE;
5563 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5564 sampler_ci.minLod = 1.0;
5565 sampler_ci.maxLod = 1.0;
5566 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5567 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005568
5569 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005570 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005571 ASSERT_VK_SUCCESS(err);
5572
5573 VkDescriptorImageInfo info = {};
5574 info.sampler = sampler;
5575
5576 VkWriteDescriptorSet descriptor_write;
5577 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
5578 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005579 descriptor_write.dstSet = descriptorSet;
5580 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08005581 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005582 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5583 descriptor_write.pImageInfo = &info;
5584 // This write update should succeed
5585 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5586 // Now perform a copy update that fails due to type mismatch
5587 VkCopyDescriptorSet copy_ds_update;
5588 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5589 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5590 copy_ds_update.srcSet = descriptorSet;
5591 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005592 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005593 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08005594 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005595 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5596
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005597 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005598 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005599 m_errorMonitor->SetDesiredFailureMsg(
5600 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005601 "Copy descriptor update 0 has srcBinding 3 which is out of bounds ");
Tobin Ehlis04356f92015-10-27 16:35:27 -06005602 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5603 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5604 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005605 copy_ds_update.srcBinding =
5606 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005607 copy_ds_update.dstSet = descriptorSet;
5608 copy_ds_update.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005609 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005610 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5611
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005612 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005613
Tobin Ehlis04356f92015-10-27 16:35:27 -06005614 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005615 m_errorMonitor->SetDesiredFailureMsg(
5616 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005617 "Copy descriptor src update is out of bounds for matching binding 1 ");
5618
Tobin Ehlis04356f92015-10-27 16:35:27 -06005619 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5620 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5621 copy_ds_update.srcSet = descriptorSet;
5622 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005623 copy_ds_update.dstSet = descriptorSet;
5624 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005625 copy_ds_update.descriptorCount =
5626 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06005627 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5628
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005629 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005630
Chia-I Wuf7458c52015-10-26 21:10:41 +08005631 vkDestroySampler(m_device->device(), sampler, NULL);
5632 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5633 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005634}
5635
Karl Schultz6addd812016-02-02 17:17:23 -07005636TEST_F(VkLayerTest, NumSamplesMismatch) {
5637 // Create CommandBuffer where MSAA samples doesn't match RenderPass
5638 // sampleCount
5639 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005640
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005642 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005643
Tobin Ehlis3b780662015-05-28 12:11:26 -06005644 ASSERT_NO_FATAL_FAILURE(InitState());
5645 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005646 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06005647 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005648 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005649
5650 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005651 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5652 ds_pool_ci.pNext = NULL;
5653 ds_pool_ci.maxSets = 1;
5654 ds_pool_ci.poolSizeCount = 1;
5655 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005656
Tobin Ehlis3b780662015-05-28 12:11:26 -06005657 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005658 err =
5659 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005660 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005661
Tony Barboureb254902015-07-15 12:50:33 -06005662 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08005663 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06005664 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08005665 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005666 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5667 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005668
Tony Barboureb254902015-07-15 12:50:33 -06005669 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5670 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5671 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005672 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07005673 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005674
Tobin Ehlis3b780662015-05-28 12:11:26 -06005675 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005676 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5677 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005678 ASSERT_VK_SUCCESS(err);
5679
5680 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005681 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005682 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005683 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005684 alloc_info.descriptorPool = ds_pool;
5685 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005686 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5687 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005688 ASSERT_VK_SUCCESS(err);
5689
Tony Barboureb254902015-07-15 12:50:33 -06005690 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005691 pipe_ms_state_ci.sType =
5692 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5693 pipe_ms_state_ci.pNext = NULL;
5694 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5695 pipe_ms_state_ci.sampleShadingEnable = 0;
5696 pipe_ms_state_ci.minSampleShading = 1.0;
5697 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005698
Tony Barboureb254902015-07-15 12:50:33 -06005699 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005700 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5701 pipeline_layout_ci.pNext = NULL;
5702 pipeline_layout_ci.setLayoutCount = 1;
5703 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005704
5705 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005706 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5707 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005708 ASSERT_VK_SUCCESS(err);
5709
Karl Schultz6addd812016-02-02 17:17:23 -07005710 VkShaderObj vs(m_device, bindStateVertShaderText,
5711 VK_SHADER_STAGE_VERTEX_BIT, this);
5712 VkShaderObj fs(m_device, bindStateFragShaderText,
5713 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005714 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005715 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005716 VkPipelineObj pipe(m_device);
5717 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005718 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005719 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005720 pipe.SetMSAA(&pipe_ms_state_ci);
5721 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005722
Tony Barbourfe3351b2015-07-28 10:17:20 -06005723 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005724 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5725 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005726
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005727 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005728
Chia-I Wuf7458c52015-10-26 21:10:41 +08005729 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5730 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5731 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005732}
Tobin Ehlis0f10db52016-04-04 10:00:21 -06005733#ifdef ADD_BACK_IN_WHEN_CHECK_IS_BACK // TODO : Re-enable when GH256 fixed
Mark Youngc89c6312016-03-31 16:03:20 -06005734TEST_F(VkLayerTest, NumBlendAttachMismatch) {
5735 // Create Pipeline where the number of blend attachments doesn't match the
5736 // number of color attachments. In this case, we don't add any color
5737 // blend attachments even though we have a color attachment.
5738 VkResult err;
5739
5740 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5741 "Mismatch between blend state attachment");
5742
5743 ASSERT_NO_FATAL_FAILURE(InitState());
5744 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5745 VkDescriptorPoolSize ds_type_count = {};
5746 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5747 ds_type_count.descriptorCount = 1;
5748
5749 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5750 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5751 ds_pool_ci.pNext = NULL;
5752 ds_pool_ci.maxSets = 1;
5753 ds_pool_ci.poolSizeCount = 1;
5754 ds_pool_ci.pPoolSizes = &ds_type_count;
5755
5756 VkDescriptorPool ds_pool;
5757 err =
5758 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5759 ASSERT_VK_SUCCESS(err);
5760
5761 VkDescriptorSetLayoutBinding dsl_binding = {};
5762 dsl_binding.binding = 0;
5763 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5764 dsl_binding.descriptorCount = 1;
5765 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5766 dsl_binding.pImmutableSamplers = NULL;
5767
5768 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5769 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5770 ds_layout_ci.pNext = NULL;
5771 ds_layout_ci.bindingCount = 1;
5772 ds_layout_ci.pBindings = &dsl_binding;
5773
5774 VkDescriptorSetLayout ds_layout;
5775 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5776 &ds_layout);
5777 ASSERT_VK_SUCCESS(err);
5778
5779 VkDescriptorSet descriptorSet;
5780 VkDescriptorSetAllocateInfo alloc_info = {};
5781 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5782 alloc_info.descriptorSetCount = 1;
5783 alloc_info.descriptorPool = ds_pool;
5784 alloc_info.pSetLayouts = &ds_layout;
5785 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5786 &descriptorSet);
5787 ASSERT_VK_SUCCESS(err);
5788
5789 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
5790 pipe_ms_state_ci.sType =
5791 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5792 pipe_ms_state_ci.pNext = NULL;
5793 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
5794 pipe_ms_state_ci.sampleShadingEnable = 0;
5795 pipe_ms_state_ci.minSampleShading = 1.0;
5796 pipe_ms_state_ci.pSampleMask = NULL;
5797
5798 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5799 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5800 pipeline_layout_ci.pNext = NULL;
5801 pipeline_layout_ci.setLayoutCount = 1;
5802 pipeline_layout_ci.pSetLayouts = &ds_layout;
5803
5804 VkPipelineLayout pipeline_layout;
5805 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5806 &pipeline_layout);
5807 ASSERT_VK_SUCCESS(err);
5808
5809 VkShaderObj vs(m_device, bindStateVertShaderText,
5810 VK_SHADER_STAGE_VERTEX_BIT, this);
5811 VkShaderObj fs(m_device, bindStateFragShaderText,
5812 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005813 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06005814 // but add it to be able to run on more devices
5815 VkPipelineObj pipe(m_device);
5816 pipe.AddShader(&vs);
5817 pipe.AddShader(&fs);
5818 pipe.SetMSAA(&pipe_ms_state_ci);
5819 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5820
5821 BeginCommandBuffer();
5822 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5823 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5824
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005825 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06005826
5827 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5828 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5829 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5830}
Tony Barbour4e81a202016-04-04 11:09:40 -06005831#endif //ADD_BACK_IN_WHEN_CHECK_IS_BACK
Karl Schultz6addd812016-02-02 17:17:23 -07005832TEST_F(VkLayerTest, ClearCmdNoDraw) {
5833 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
5834 // to issuing a Draw
5835 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005836
Karl Schultz6addd812016-02-02 17:17:23 -07005837 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07005838 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005839 "vkCmdClearAttachments() issued on CB object ");
5840
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005841 ASSERT_NO_FATAL_FAILURE(InitState());
5842 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06005843
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005844 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005845 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5846 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005847
5848 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005849 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5850 ds_pool_ci.pNext = NULL;
5851 ds_pool_ci.maxSets = 1;
5852 ds_pool_ci.poolSizeCount = 1;
5853 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005854
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005855 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005856 err =
5857 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005858 ASSERT_VK_SUCCESS(err);
5859
Tony Barboureb254902015-07-15 12:50:33 -06005860 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005861 dsl_binding.binding = 0;
5862 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5863 dsl_binding.descriptorCount = 1;
5864 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5865 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005866
Tony Barboureb254902015-07-15 12:50:33 -06005867 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005868 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5869 ds_layout_ci.pNext = NULL;
5870 ds_layout_ci.bindingCount = 1;
5871 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005872
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005873 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005874 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5875 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005876 ASSERT_VK_SUCCESS(err);
5877
5878 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005879 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005880 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005881 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005882 alloc_info.descriptorPool = ds_pool;
5883 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005884 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5885 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005886 ASSERT_VK_SUCCESS(err);
5887
Tony Barboureb254902015-07-15 12:50:33 -06005888 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005889 pipe_ms_state_ci.sType =
5890 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5891 pipe_ms_state_ci.pNext = NULL;
5892 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5893 pipe_ms_state_ci.sampleShadingEnable = 0;
5894 pipe_ms_state_ci.minSampleShading = 1.0;
5895 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005896
Tony Barboureb254902015-07-15 12:50:33 -06005897 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005898 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5899 pipeline_layout_ci.pNext = NULL;
5900 pipeline_layout_ci.setLayoutCount = 1;
5901 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005902
5903 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005904 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5905 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005906 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005907
Karl Schultz6addd812016-02-02 17:17:23 -07005908 VkShaderObj vs(m_device, bindStateVertShaderText,
5909 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06005910 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07005911 // on more devices
5912 VkShaderObj fs(m_device, bindStateFragShaderText,
5913 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005914
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005915 VkPipelineObj pipe(m_device);
5916 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005917 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005918 pipe.SetMSAA(&pipe_ms_state_ci);
5919 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06005920
5921 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005922
Karl Schultz6addd812016-02-02 17:17:23 -07005923 // Main thing we care about for this test is that the VkImage obj we're
5924 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005925 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005926 VkClearAttachment color_attachment;
5927 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5928 color_attachment.clearValue.color.float32[0] = 1.0;
5929 color_attachment.clearValue.color.float32[1] = 1.0;
5930 color_attachment.clearValue.color.float32[2] = 1.0;
5931 color_attachment.clearValue.color.float32[3] = 1.0;
5932 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005933 VkClearRect clear_rect = {
5934 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005935
Karl Schultz6addd812016-02-02 17:17:23 -07005936 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
5937 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005938
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005939 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005940
Chia-I Wuf7458c52015-10-26 21:10:41 +08005941 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5942 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5943 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005944}
5945
Karl Schultz6addd812016-02-02 17:17:23 -07005946TEST_F(VkLayerTest, VtxBufferBadIndex) {
5947 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005948
Karl Schultz6addd812016-02-02 17:17:23 -07005949 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005950 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07005951 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005952
Tobin Ehlis502480b2015-06-24 15:53:07 -06005953 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06005954 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06005955 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06005956
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005957 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005958 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5959 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005960
5961 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005962 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5963 ds_pool_ci.pNext = NULL;
5964 ds_pool_ci.maxSets = 1;
5965 ds_pool_ci.poolSizeCount = 1;
5966 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005967
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005968 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005969 err =
5970 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005971 ASSERT_VK_SUCCESS(err);
5972
Tony Barboureb254902015-07-15 12:50:33 -06005973 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005974 dsl_binding.binding = 0;
5975 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5976 dsl_binding.descriptorCount = 1;
5977 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5978 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005979
Tony Barboureb254902015-07-15 12:50:33 -06005980 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005981 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5982 ds_layout_ci.pNext = NULL;
5983 ds_layout_ci.bindingCount = 1;
5984 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005985
Tobin Ehlis502480b2015-06-24 15:53:07 -06005986 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005987 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5988 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005989 ASSERT_VK_SUCCESS(err);
5990
5991 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005992 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005993 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005994 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005995 alloc_info.descriptorPool = ds_pool;
5996 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005997 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5998 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005999 ASSERT_VK_SUCCESS(err);
6000
Tony Barboureb254902015-07-15 12:50:33 -06006001 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006002 pipe_ms_state_ci.sType =
6003 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6004 pipe_ms_state_ci.pNext = NULL;
6005 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6006 pipe_ms_state_ci.sampleShadingEnable = 0;
6007 pipe_ms_state_ci.minSampleShading = 1.0;
6008 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006009
Tony Barboureb254902015-07-15 12:50:33 -06006010 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006011 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6012 pipeline_layout_ci.pNext = NULL;
6013 pipeline_layout_ci.setLayoutCount = 1;
6014 pipeline_layout_ci.pSetLayouts = &ds_layout;
6015 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006016
Karl Schultz6addd812016-02-02 17:17:23 -07006017 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6018 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006019 ASSERT_VK_SUCCESS(err);
6020
Karl Schultz6addd812016-02-02 17:17:23 -07006021 VkShaderObj vs(m_device, bindStateVertShaderText,
6022 VK_SHADER_STAGE_VERTEX_BIT, this);
6023 VkShaderObj fs(m_device, bindStateFragShaderText,
6024 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006025 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006026 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006027 VkPipelineObj pipe(m_device);
6028 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006029 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006030 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006031 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006032 pipe.SetViewport(m_viewports);
6033 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006034 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006035
6036 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006037 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6038 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006039 // Don't care about actual data, just need to get to draw to flag error
6040 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07006041 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
6042 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006043 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06006044 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006045
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006046 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006047
Chia-I Wuf7458c52015-10-26 21:10:41 +08006048 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6049 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6050 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006051}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006052#endif // DRAW_STATE_TESTS
6053
Tobin Ehlis0788f522015-05-26 16:11:58 -06006054#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06006055#if GTEST_IS_THREADSAFE
6056struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006057 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006058 VkEvent event;
6059 bool bailout;
6060};
6061
Karl Schultz6addd812016-02-02 17:17:23 -07006062extern "C" void *AddToCommandBuffer(void *arg) {
6063 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006064
Karl Schultz6addd812016-02-02 17:17:23 -07006065 for (int i = 0; i < 10000; i++) {
6066 vkCmdSetEvent(data->commandBuffer, data->event,
6067 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006068 if (data->bailout) {
6069 break;
6070 }
6071 }
6072 return NULL;
6073}
6074
Karl Schultz6addd812016-02-02 17:17:23 -07006075TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006076 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006077
Karl Schultz6addd812016-02-02 17:17:23 -07006078 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6079 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006080
Mike Stroyanaccf7692015-05-12 16:00:45 -06006081 ASSERT_NO_FATAL_FAILURE(InitState());
6082 ASSERT_NO_FATAL_FAILURE(InitViewport());
6083 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6084
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006085 // Calls AllocateCommandBuffers
6086 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006087
6088 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006089 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006090
6091 VkEventCreateInfo event_info;
6092 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006093 VkResult err;
6094
6095 memset(&event_info, 0, sizeof(event_info));
6096 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
6097
Chia-I Wuf7458c52015-10-26 21:10:41 +08006098 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006099 ASSERT_VK_SUCCESS(err);
6100
Mike Stroyanaccf7692015-05-12 16:00:45 -06006101 err = vkResetEvent(device(), event);
6102 ASSERT_VK_SUCCESS(err);
6103
6104 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006105 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006106 data.event = event;
6107 data.bailout = false;
6108 m_errorMonitor->SetBailout(&data.bailout);
6109 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006110 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006111 // Add many entries to command buffer from this thread at the same time.
6112 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006113
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006114 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006115 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006116
Mike Stroyan10b8cb72016-01-22 15:22:03 -07006117 m_errorMonitor->SetBailout(NULL);
6118
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006119 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006120
Chia-I Wuf7458c52015-10-26 21:10:41 +08006121 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006122}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006123#endif // GTEST_IS_THREADSAFE
6124#endif // THREADING_TESTS
6125
Chris Forbes9f7ff632015-05-25 11:13:08 +12006126#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006127TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006129 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006130
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006131 ASSERT_NO_FATAL_FAILURE(InitState());
6132 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6133
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006134 VkShaderModule module;
6135 VkShaderModuleCreateInfo moduleCreateInfo;
6136 struct icd_spv_header spv;
6137
6138 spv.magic = ICD_SPV_MAGIC;
6139 spv.version = ICD_SPV_VERSION;
6140 spv.gen_magic = 0;
6141
6142 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6143 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006144 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006145 moduleCreateInfo.codeSize = 4;
6146 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006147 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006148
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006149 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006150}
6151
Karl Schultz6addd812016-02-02 17:17:23 -07006152TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006153 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006154 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006155
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006156 ASSERT_NO_FATAL_FAILURE(InitState());
6157 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6158
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006159 VkShaderModule module;
6160 VkShaderModuleCreateInfo moduleCreateInfo;
6161 struct icd_spv_header spv;
6162
6163 spv.magic = ~ICD_SPV_MAGIC;
6164 spv.version = ICD_SPV_VERSION;
6165 spv.gen_magic = 0;
6166
6167 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6168 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006169 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006170 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6171 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006172 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006173
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006174 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006175}
6176
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006177#if 0
6178// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07006179TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006180 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006181 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006182
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006183 ASSERT_NO_FATAL_FAILURE(InitState());
6184 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6185
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006186 VkShaderModule module;
6187 VkShaderModuleCreateInfo moduleCreateInfo;
6188 struct icd_spv_header spv;
6189
6190 spv.magic = ICD_SPV_MAGIC;
6191 spv.version = ~ICD_SPV_VERSION;
6192 spv.gen_magic = 0;
6193
6194 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6195 moduleCreateInfo.pNext = NULL;
6196
Karl Schultz6addd812016-02-02 17:17:23 -07006197 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006198 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6199 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006200 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006201
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006202 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006203}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006204#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006205
Karl Schultz6addd812016-02-02 17:17:23 -07006206TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006207 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006208 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006209
Chris Forbes9f7ff632015-05-25 11:13:08 +12006210 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006211 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006212
6213 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006214 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006215 "\n"
6216 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006217 "out gl_PerVertex {\n"
6218 " vec4 gl_Position;\n"
6219 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006220 "void main(){\n"
6221 " gl_Position = vec4(1);\n"
6222 " x = 0;\n"
6223 "}\n";
6224 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006225 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006226 "\n"
6227 "layout(location=0) out vec4 color;\n"
6228 "void main(){\n"
6229 " color = vec4(1);\n"
6230 "}\n";
6231
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006232 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6233 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006234
6235 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006236 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006237 pipe.AddShader(&vs);
6238 pipe.AddShader(&fs);
6239
Chris Forbes9f7ff632015-05-25 11:13:08 +12006240 VkDescriptorSetObj descriptorSet(m_device);
6241 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006242 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006243
Tony Barbour5781e8f2015-08-04 16:23:11 -06006244 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006245
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006246 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006247}
Chris Forbes9f7ff632015-05-25 11:13:08 +12006248
Karl Schultz6addd812016-02-02 17:17:23 -07006249TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006250 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006251 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006252
Chris Forbes59cb88d2015-05-25 11:13:13 +12006253 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006254 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006255
6256 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006257 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006258 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006259 "out gl_PerVertex {\n"
6260 " vec4 gl_Position;\n"
6261 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006262 "void main(){\n"
6263 " gl_Position = vec4(1);\n"
6264 "}\n";
6265 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006266 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006267 "\n"
6268 "layout(location=0) in float x;\n"
6269 "layout(location=0) out vec4 color;\n"
6270 "void main(){\n"
6271 " color = vec4(x);\n"
6272 "}\n";
6273
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006274 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6275 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006276
6277 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006278 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006279 pipe.AddShader(&vs);
6280 pipe.AddShader(&fs);
6281
Chris Forbes59cb88d2015-05-25 11:13:13 +12006282 VkDescriptorSetObj descriptorSet(m_device);
6283 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006284 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006285
Tony Barbour5781e8f2015-08-04 16:23:11 -06006286 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006287
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006288 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006289}
6290
Karl Schultz6addd812016-02-02 17:17:23 -07006291TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006292 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006293 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006294
6295 ASSERT_NO_FATAL_FAILURE(InitState());
6296 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6297
6298 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006299 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006300 "\n"
6301 "out gl_PerVertex {\n"
6302 " vec4 gl_Position;\n"
6303 "};\n"
6304 "void main(){\n"
6305 " gl_Position = vec4(1);\n"
6306 "}\n";
6307 char const *fsSource =
6308 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006309 "\n"
6310 "in block { layout(location=0) float x; } ins;\n"
6311 "layout(location=0) out vec4 color;\n"
6312 "void main(){\n"
6313 " color = vec4(ins.x);\n"
6314 "}\n";
6315
6316 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6317 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6318
6319 VkPipelineObj pipe(m_device);
6320 pipe.AddColorAttachment();
6321 pipe.AddShader(&vs);
6322 pipe.AddShader(&fs);
6323
6324 VkDescriptorSetObj descriptorSet(m_device);
6325 descriptorSet.AppendDummy();
6326 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6327
6328 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6329
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006330 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006331}
6332
Karl Schultz6addd812016-02-02 17:17:23 -07006333TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13006334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13006335 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07006336 "output arr[2] of float32' vs 'ptr to "
6337 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13006338
6339 ASSERT_NO_FATAL_FAILURE(InitState());
6340 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6341
6342 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006343 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006344 "\n"
6345 "layout(location=0) out float x[2];\n"
6346 "out gl_PerVertex {\n"
6347 " vec4 gl_Position;\n"
6348 "};\n"
6349 "void main(){\n"
6350 " x[0] = 0; x[1] = 0;\n"
6351 " gl_Position = vec4(1);\n"
6352 "}\n";
6353 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006354 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006355 "\n"
6356 "layout(location=0) in float x[3];\n"
6357 "layout(location=0) out vec4 color;\n"
6358 "void main(){\n"
6359 " color = vec4(x[0] + x[1] + x[2]);\n"
6360 "}\n";
6361
6362 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6363 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6364
6365 VkPipelineObj pipe(m_device);
6366 pipe.AddColorAttachment();
6367 pipe.AddShader(&vs);
6368 pipe.AddShader(&fs);
6369
6370 VkDescriptorSetObj descriptorSet(m_device);
6371 descriptorSet.AppendDummy();
6372 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6373
6374 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6375
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006376 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13006377}
6378
Karl Schultz6addd812016-02-02 17:17:23 -07006379TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006380 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006381 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006382
Chris Forbesb56af562015-05-25 11:13:17 +12006383 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006384 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12006385
6386 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006387 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006388 "\n"
6389 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006390 "out gl_PerVertex {\n"
6391 " vec4 gl_Position;\n"
6392 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006393 "void main(){\n"
6394 " x = 0;\n"
6395 " gl_Position = vec4(1);\n"
6396 "}\n";
6397 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006398 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006399 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006400 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12006401 "layout(location=0) out vec4 color;\n"
6402 "void main(){\n"
6403 " color = vec4(x);\n"
6404 "}\n";
6405
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006406 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6407 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12006408
6409 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006410 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12006411 pipe.AddShader(&vs);
6412 pipe.AddShader(&fs);
6413
Chris Forbesb56af562015-05-25 11:13:17 +12006414 VkDescriptorSetObj descriptorSet(m_device);
6415 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006416 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12006417
Tony Barbour5781e8f2015-08-04 16:23:11 -06006418 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12006419
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006420 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12006421}
6422
Karl Schultz6addd812016-02-02 17:17:23 -07006423TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006424 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006425 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006426
6427 ASSERT_NO_FATAL_FAILURE(InitState());
6428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6429
6430 char const *vsSource =
6431 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006432 "\n"
6433 "out block { layout(location=0) int x; } outs;\n"
6434 "out gl_PerVertex {\n"
6435 " vec4 gl_Position;\n"
6436 "};\n"
6437 "void main(){\n"
6438 " outs.x = 0;\n"
6439 " gl_Position = vec4(1);\n"
6440 "}\n";
6441 char const *fsSource =
6442 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006443 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006444 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13006445 "layout(location=0) out vec4 color;\n"
6446 "void main(){\n"
6447 " color = vec4(ins.x);\n"
6448 "}\n";
6449
6450 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6451 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6452
6453 VkPipelineObj pipe(m_device);
6454 pipe.AddColorAttachment();
6455 pipe.AddShader(&vs);
6456 pipe.AddShader(&fs);
6457
6458 VkDescriptorSetObj descriptorSet(m_device);
6459 descriptorSet.AppendDummy();
6460 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6461
6462 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6463
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006464 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006465}
6466
6467TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
6468 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6469 "location 0.0 which is not written by vertex shader");
6470
6471 ASSERT_NO_FATAL_FAILURE(InitState());
6472 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6473
6474 char const *vsSource =
6475 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006476 "\n"
6477 "out block { layout(location=1) float x; } outs;\n"
6478 "out gl_PerVertex {\n"
6479 " vec4 gl_Position;\n"
6480 "};\n"
6481 "void main(){\n"
6482 " outs.x = 0;\n"
6483 " gl_Position = vec4(1);\n"
6484 "}\n";
6485 char const *fsSource =
6486 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006487 "\n"
6488 "in block { layout(location=0) float x; } ins;\n"
6489 "layout(location=0) out vec4 color;\n"
6490 "void main(){\n"
6491 " color = vec4(ins.x);\n"
6492 "}\n";
6493
6494 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6495 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6496
6497 VkPipelineObj pipe(m_device);
6498 pipe.AddColorAttachment();
6499 pipe.AddShader(&vs);
6500 pipe.AddShader(&fs);
6501
6502 VkDescriptorSetObj descriptorSet(m_device);
6503 descriptorSet.AppendDummy();
6504 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6505
6506 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6507
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006508 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006509}
6510
6511TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
6512 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6513 "location 0.1 which is not written by vertex shader");
6514
6515 ASSERT_NO_FATAL_FAILURE(InitState());
6516 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6517
6518 char const *vsSource =
6519 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006520 "\n"
6521 "out block { layout(location=0, component=0) float x; } outs;\n"
6522 "out gl_PerVertex {\n"
6523 " vec4 gl_Position;\n"
6524 "};\n"
6525 "void main(){\n"
6526 " outs.x = 0;\n"
6527 " gl_Position = vec4(1);\n"
6528 "}\n";
6529 char const *fsSource =
6530 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006531 "\n"
6532 "in block { layout(location=0, component=1) float x; } ins;\n"
6533 "layout(location=0) out vec4 color;\n"
6534 "void main(){\n"
6535 " color = vec4(ins.x);\n"
6536 "}\n";
6537
6538 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6539 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6540
6541 VkPipelineObj pipe(m_device);
6542 pipe.AddColorAttachment();
6543 pipe.AddShader(&vs);
6544 pipe.AddShader(&fs);
6545
6546 VkDescriptorSetObj descriptorSet(m_device);
6547 descriptorSet.AppendDummy();
6548 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6549
6550 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6551
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006552 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006553}
6554
Karl Schultz6addd812016-02-02 17:17:23 -07006555TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006556 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006557 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006558
Chris Forbesde136e02015-05-25 11:13:28 +12006559 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006560 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12006561
6562 VkVertexInputBindingDescription input_binding;
6563 memset(&input_binding, 0, sizeof(input_binding));
6564
6565 VkVertexInputAttributeDescription input_attrib;
6566 memset(&input_attrib, 0, sizeof(input_attrib));
6567 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6568
6569 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006570 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006571 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006572 "out gl_PerVertex {\n"
6573 " vec4 gl_Position;\n"
6574 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006575 "void main(){\n"
6576 " gl_Position = vec4(1);\n"
6577 "}\n";
6578 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006579 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006580 "\n"
6581 "layout(location=0) out vec4 color;\n"
6582 "void main(){\n"
6583 " color = vec4(1);\n"
6584 "}\n";
6585
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006586 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6587 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12006588
6589 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006590 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12006591 pipe.AddShader(&vs);
6592 pipe.AddShader(&fs);
6593
6594 pipe.AddVertexInputBindings(&input_binding, 1);
6595 pipe.AddVertexInputAttribs(&input_attrib, 1);
6596
Chris Forbesde136e02015-05-25 11:13:28 +12006597 VkDescriptorSetObj descriptorSet(m_device);
6598 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006599 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12006600
Tony Barbour5781e8f2015-08-04 16:23:11 -06006601 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12006602
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006603 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12006604}
6605
Karl Schultz6addd812016-02-02 17:17:23 -07006606TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006608 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13006609
6610 ASSERT_NO_FATAL_FAILURE(InitState());
6611 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6612
6613 VkVertexInputBindingDescription input_binding;
6614 memset(&input_binding, 0, sizeof(input_binding));
6615
6616 VkVertexInputAttributeDescription input_attrib;
6617 memset(&input_attrib, 0, sizeof(input_attrib));
6618 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6619
6620 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006621 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006622 "\n"
6623 "layout(location=1) in float x;\n"
6624 "out gl_PerVertex {\n"
6625 " vec4 gl_Position;\n"
6626 "};\n"
6627 "void main(){\n"
6628 " gl_Position = vec4(x);\n"
6629 "}\n";
6630 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006631 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006632 "\n"
6633 "layout(location=0) out vec4 color;\n"
6634 "void main(){\n"
6635 " color = vec4(1);\n"
6636 "}\n";
6637
6638 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6639 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6640
6641 VkPipelineObj pipe(m_device);
6642 pipe.AddColorAttachment();
6643 pipe.AddShader(&vs);
6644 pipe.AddShader(&fs);
6645
6646 pipe.AddVertexInputBindings(&input_binding, 1);
6647 pipe.AddVertexInputAttribs(&input_attrib, 1);
6648
6649 VkDescriptorSetObj descriptorSet(m_device);
6650 descriptorSet.AppendDummy();
6651 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6652
6653 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6654
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006655 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13006656}
6657
Karl Schultz6addd812016-02-02 17:17:23 -07006658TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
6659 m_errorMonitor->SetDesiredFailureMsg(
6660 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006661 "VS consumes input at location 0 but not provided");
6662
Chris Forbes62e8e502015-05-25 11:13:29 +12006663 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006664 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12006665
6666 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006667 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006668 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006669 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07006670 "out gl_PerVertex {\n"
6671 " vec4 gl_Position;\n"
6672 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006673 "void main(){\n"
6674 " gl_Position = x;\n"
6675 "}\n";
6676 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006677 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006678 "\n"
6679 "layout(location=0) out vec4 color;\n"
6680 "void main(){\n"
6681 " color = vec4(1);\n"
6682 "}\n";
6683
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006684 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6685 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12006686
6687 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006688 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12006689 pipe.AddShader(&vs);
6690 pipe.AddShader(&fs);
6691
Chris Forbes62e8e502015-05-25 11:13:29 +12006692 VkDescriptorSetObj descriptorSet(m_device);
6693 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006694 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12006695
Tony Barbour5781e8f2015-08-04 16:23:11 -06006696 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12006697
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006698 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12006699}
6700
Karl Schultz6addd812016-02-02 17:17:23 -07006701TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
6702 m_errorMonitor->SetDesiredFailureMsg(
6703 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006704 "location 0 does not match VS input type");
6705
Chris Forbesc97d98e2015-05-25 11:13:31 +12006706 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006707 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006708
6709 VkVertexInputBindingDescription input_binding;
6710 memset(&input_binding, 0, sizeof(input_binding));
6711
6712 VkVertexInputAttributeDescription input_attrib;
6713 memset(&input_attrib, 0, sizeof(input_attrib));
6714 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6715
6716 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006717 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006718 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006719 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07006720 "out gl_PerVertex {\n"
6721 " vec4 gl_Position;\n"
6722 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006723 "void main(){\n"
6724 " gl_Position = vec4(x);\n"
6725 "}\n";
6726 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006727 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006728 "\n"
6729 "layout(location=0) out vec4 color;\n"
6730 "void main(){\n"
6731 " color = vec4(1);\n"
6732 "}\n";
6733
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006734 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6735 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006736
6737 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006738 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006739 pipe.AddShader(&vs);
6740 pipe.AddShader(&fs);
6741
6742 pipe.AddVertexInputBindings(&input_binding, 1);
6743 pipe.AddVertexInputAttribs(&input_attrib, 1);
6744
Chris Forbesc97d98e2015-05-25 11:13:31 +12006745 VkDescriptorSetObj descriptorSet(m_device);
6746 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006747 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006748
Tony Barbour5781e8f2015-08-04 16:23:11 -06006749 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006750
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006751 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006752}
6753
Chris Forbesc68b43c2016-04-06 11:18:47 +12006754TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
6755 m_errorMonitor->SetDesiredFailureMsg(
6756 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6757 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
6758
6759 ASSERT_NO_FATAL_FAILURE(InitState());
6760 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6761
6762 char const *vsSource =
6763 "#version 450\n"
6764 "\n"
6765 "out gl_PerVertex {\n"
6766 " vec4 gl_Position;\n"
6767 "};\n"
6768 "void main(){\n"
6769 " gl_Position = vec4(1);\n"
6770 "}\n";
6771 char const *fsSource =
6772 "#version 450\n"
6773 "\n"
6774 "layout(location=0) out vec4 color;\n"
6775 "void main(){\n"
6776 " color = vec4(1);\n"
6777 "}\n";
6778
6779 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6780 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6781
6782 VkPipelineObj pipe(m_device);
6783 pipe.AddColorAttachment();
6784 pipe.AddShader(&vs);
6785 pipe.AddShader(&vs);
6786 pipe.AddShader(&fs);
6787
6788 VkDescriptorSetObj descriptorSet(m_device);
6789 descriptorSet.AppendDummy();
6790 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6791
6792 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6793
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006794 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12006795}
6796
Karl Schultz6addd812016-02-02 17:17:23 -07006797TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006798 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13006799
6800 ASSERT_NO_FATAL_FAILURE(InitState());
6801 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6802
6803 VkVertexInputBindingDescription input_binding;
6804 memset(&input_binding, 0, sizeof(input_binding));
6805
6806 VkVertexInputAttributeDescription input_attribs[2];
6807 memset(input_attribs, 0, sizeof(input_attribs));
6808
6809 for (int i = 0; i < 2; i++) {
6810 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
6811 input_attribs[i].location = i;
6812 }
6813
6814 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006815 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006816 "\n"
6817 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006818 "out gl_PerVertex {\n"
6819 " vec4 gl_Position;\n"
6820 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006821 "void main(){\n"
6822 " gl_Position = x[0] + x[1];\n"
6823 "}\n";
6824 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006825 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006826 "\n"
6827 "layout(location=0) out vec4 color;\n"
6828 "void main(){\n"
6829 " color = vec4(1);\n"
6830 "}\n";
6831
6832 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6833 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6834
6835 VkPipelineObj pipe(m_device);
6836 pipe.AddColorAttachment();
6837 pipe.AddShader(&vs);
6838 pipe.AddShader(&fs);
6839
6840 pipe.AddVertexInputBindings(&input_binding, 1);
6841 pipe.AddVertexInputAttribs(input_attribs, 2);
6842
6843 VkDescriptorSetObj descriptorSet(m_device);
6844 descriptorSet.AppendDummy();
6845 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6846
6847 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6848
6849 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006850 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13006851}
6852
Chris Forbes2682b242015-11-24 11:13:14 +13006853TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
6854{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006855 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13006856
6857 ASSERT_NO_FATAL_FAILURE(InitState());
6858 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6859
6860 VkVertexInputBindingDescription input_binding;
6861 memset(&input_binding, 0, sizeof(input_binding));
6862
6863 VkVertexInputAttributeDescription input_attribs[2];
6864 memset(input_attribs, 0, sizeof(input_attribs));
6865
6866 for (int i = 0; i < 2; i++) {
6867 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
6868 input_attribs[i].location = i;
6869 }
6870
6871 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006872 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006873 "\n"
6874 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07006875 "out gl_PerVertex {\n"
6876 " vec4 gl_Position;\n"
6877 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006878 "void main(){\n"
6879 " gl_Position = x[0] + x[1];\n"
6880 "}\n";
6881 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006882 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006883 "\n"
6884 "layout(location=0) out vec4 color;\n"
6885 "void main(){\n"
6886 " color = vec4(1);\n"
6887 "}\n";
6888
6889 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6890 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6891
6892 VkPipelineObj pipe(m_device);
6893 pipe.AddColorAttachment();
6894 pipe.AddShader(&vs);
6895 pipe.AddShader(&fs);
6896
6897 pipe.AddVertexInputBindings(&input_binding, 1);
6898 pipe.AddVertexInputAttribs(input_attribs, 2);
6899
6900 VkDescriptorSetObj descriptorSet(m_device);
6901 descriptorSet.AppendDummy();
6902 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6903
6904 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6905
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006906 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13006907}
Chris Forbes2682b242015-11-24 11:13:14 +13006908
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006909TEST_F(VkLayerTest, CreatePipelineSimplePositive)
6910{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006911 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006912
6913 ASSERT_NO_FATAL_FAILURE(InitState());
6914 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6915
6916 char const *vsSource =
6917 "#version 450\n"
6918 "out gl_PerVertex {\n"
6919 " vec4 gl_Position;\n"
6920 "};\n"
6921 "void main(){\n"
6922 " gl_Position = vec4(0);\n"
6923 "}\n";
6924 char const *fsSource =
6925 "#version 450\n"
6926 "\n"
6927 "layout(location=0) out vec4 color;\n"
6928 "void main(){\n"
6929 " color = vec4(1);\n"
6930 "}\n";
6931
6932 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6933 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6934
6935 VkPipelineObj pipe(m_device);
6936 pipe.AddColorAttachment();
6937 pipe.AddShader(&vs);
6938 pipe.AddShader(&fs);
6939
6940 VkDescriptorSetObj descriptorSet(m_device);
6941 descriptorSet.AppendDummy();
6942 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6943
6944 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6945
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006946 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006947}
6948
Chris Forbes912c9192016-04-05 17:50:35 +12006949TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
6950{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006951 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12006952
6953 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
6954
6955 ASSERT_NO_FATAL_FAILURE(InitState());
6956 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6957
6958 char const *vsSource =
6959 "#version 450\n"
6960 "out gl_PerVertex {\n"
6961 " vec4 gl_Position;\n"
6962 "};\n"
6963 "layout(location=0) out vec3 x;\n"
6964 "layout(location=1) out ivec3 y;\n"
6965 "layout(location=2) out vec3 z;\n"
6966 "void main(){\n"
6967 " gl_Position = vec4(0);\n"
6968 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
6969 "}\n";
6970 char const *fsSource =
6971 "#version 450\n"
6972 "\n"
6973 "layout(location=0) out vec4 color;\n"
6974 "layout(location=0) in float x;\n"
6975 "layout(location=1) flat in int y;\n"
6976 "layout(location=2) in vec2 z;\n"
6977 "void main(){\n"
6978 " color = vec4(1 + x + y + z.x);\n"
6979 "}\n";
6980
6981 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6982 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6983
6984 VkPipelineObj pipe(m_device);
6985 pipe.AddColorAttachment();
6986 pipe.AddShader(&vs);
6987 pipe.AddShader(&fs);
6988
6989 VkDescriptorSetObj descriptorSet(m_device);
6990 descriptorSet.AppendDummy();
6991 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6992
6993 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6994
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006995 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12006996}
6997
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006998TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
6999{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007000 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007001
7002 ASSERT_NO_FATAL_FAILURE(InitState());
7003 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7004
Chris Forbesc1e852d2016-04-04 19:26:42 +12007005 if (!m_device->phy().features().tessellationShader) {
7006 printf("Device does not support tessellation shaders; skipped.\n");
7007 return;
7008 }
7009
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007010 char const *vsSource =
7011 "#version 450\n"
7012 "void main(){}\n";
7013 char const *tcsSource =
7014 "#version 450\n"
7015 "layout(location=0) out int x[];\n"
7016 "layout(vertices=3) out;\n"
7017 "void main(){\n"
7018 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7019 " gl_TessLevelInner[0] = 1;\n"
7020 " x[gl_InvocationID] = gl_InvocationID;\n"
7021 "}\n";
7022 char const *tesSource =
7023 "#version 450\n"
7024 "layout(triangles, equal_spacing, cw) in;\n"
7025 "layout(location=0) in int x[];\n"
7026 "out gl_PerVertex { vec4 gl_Position; };\n"
7027 "void main(){\n"
7028 " gl_Position.xyz = gl_TessCoord;\n"
7029 " gl_Position.w = x[0] + x[1] + x[2];\n"
7030 "}\n";
7031 char const *fsSource =
7032 "#version 450\n"
7033 "layout(location=0) out vec4 color;\n"
7034 "void main(){\n"
7035 " color = vec4(1);\n"
7036 "}\n";
7037
7038 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7039 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7040 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7041 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7042
7043 VkPipelineInputAssemblyStateCreateInfo iasci{
7044 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7045 nullptr,
7046 0,
7047 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7048 VK_FALSE};
7049
Chris Forbesb4cacb62016-04-04 19:15:00 +12007050 VkPipelineTessellationStateCreateInfo tsci{
7051 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7052 nullptr,
7053 0,
7054 3};
7055
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007056 VkPipelineObj pipe(m_device);
7057 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12007058 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007059 pipe.AddColorAttachment();
7060 pipe.AddShader(&vs);
7061 pipe.AddShader(&tcs);
7062 pipe.AddShader(&tes);
7063 pipe.AddShader(&fs);
7064
7065 VkDescriptorSetObj descriptorSet(m_device);
7066 descriptorSet.AppendDummy();
7067 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7068
7069 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7070
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007071 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007072}
7073
Chris Forbesa0ab8152016-04-20 13:34:27 +12007074TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
7075{
7076 m_errorMonitor->ExpectSuccess();
7077
7078 ASSERT_NO_FATAL_FAILURE(InitState());
7079 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7080
7081 if (!m_device->phy().features().geometryShader) {
7082 printf("Device does not support geometry shaders; skipped.\n");
7083 return;
7084 }
7085
7086 char const *vsSource =
7087 "#version 450\n"
7088 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
7089 "void main(){\n"
7090 " vs_out.x = vec4(1);\n"
7091 "}\n";
7092 char const *gsSource =
7093 "#version 450\n"
7094 "layout(triangles) in;\n"
7095 "layout(triangle_strip, max_vertices=3) out;\n"
7096 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
7097 "out gl_PerVertex { vec4 gl_Position; };\n"
7098 "void main() {\n"
7099 " gl_Position = gs_in[0].x;\n"
7100 " EmitVertex();\n"
7101 "}\n";
7102 char const *fsSource =
7103 "#version 450\n"
7104 "layout(location=0) out vec4 color;\n"
7105 "void main(){\n"
7106 " color = vec4(1);\n"
7107 "}\n";
7108
7109 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7110 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
7111 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7112
7113 VkPipelineObj pipe(m_device);
7114 pipe.AddColorAttachment();
7115 pipe.AddShader(&vs);
7116 pipe.AddShader(&gs);
7117 pipe.AddShader(&fs);
7118
7119 VkDescriptorSetObj descriptorSet(m_device);
7120 descriptorSet.AppendDummy();
7121 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7122
7123 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7124
7125 m_errorMonitor->VerifyNotFound();
7126}
7127
Chris Forbesa0193bc2016-04-04 19:19:47 +12007128TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
7129{
7130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7131 "is per-vertex in tessellation control shader stage "
7132 "but per-patch in tessellation evaluation shader stage");
7133
7134 ASSERT_NO_FATAL_FAILURE(InitState());
7135 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7136
Chris Forbesc1e852d2016-04-04 19:26:42 +12007137 if (!m_device->phy().features().tessellationShader) {
7138 printf("Device does not support tessellation shaders; skipped.\n");
7139 return;
7140 }
7141
Chris Forbesa0193bc2016-04-04 19:19:47 +12007142 char const *vsSource =
7143 "#version 450\n"
7144 "void main(){}\n";
7145 char const *tcsSource =
7146 "#version 450\n"
7147 "layout(location=0) out int x[];\n"
7148 "layout(vertices=3) out;\n"
7149 "void main(){\n"
7150 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7151 " gl_TessLevelInner[0] = 1;\n"
7152 " x[gl_InvocationID] = gl_InvocationID;\n"
7153 "}\n";
7154 char const *tesSource =
7155 "#version 450\n"
7156 "layout(triangles, equal_spacing, cw) in;\n"
7157 "layout(location=0) patch in int x;\n"
7158 "out gl_PerVertex { vec4 gl_Position; };\n"
7159 "void main(){\n"
7160 " gl_Position.xyz = gl_TessCoord;\n"
7161 " gl_Position.w = x;\n"
7162 "}\n";
7163 char const *fsSource =
7164 "#version 450\n"
7165 "layout(location=0) out vec4 color;\n"
7166 "void main(){\n"
7167 " color = vec4(1);\n"
7168 "}\n";
7169
7170 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7171 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7172 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7173 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7174
7175 VkPipelineInputAssemblyStateCreateInfo iasci{
7176 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7177 nullptr,
7178 0,
7179 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7180 VK_FALSE};
7181
7182 VkPipelineTessellationStateCreateInfo tsci{
7183 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7184 nullptr,
7185 0,
7186 3};
7187
7188 VkPipelineObj pipe(m_device);
7189 pipe.SetInputAssembly(&iasci);
7190 pipe.SetTessellation(&tsci);
7191 pipe.AddColorAttachment();
7192 pipe.AddShader(&vs);
7193 pipe.AddShader(&tcs);
7194 pipe.AddShader(&tes);
7195 pipe.AddShader(&fs);
7196
7197 VkDescriptorSetObj descriptorSet(m_device);
7198 descriptorSet.AppendDummy();
7199 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7200
7201 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7202
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007203 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12007204}
7205
Karl Schultz6addd812016-02-02 17:17:23 -07007206TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
7207 m_errorMonitor->SetDesiredFailureMsg(
7208 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007209 "Duplicate vertex input binding descriptions for binding 0");
7210
Chris Forbes280ba2c2015-06-12 11:16:41 +12007211 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007212 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007213
7214 /* Two binding descriptions for binding 0 */
7215 VkVertexInputBindingDescription input_bindings[2];
7216 memset(input_bindings, 0, sizeof(input_bindings));
7217
7218 VkVertexInputAttributeDescription input_attrib;
7219 memset(&input_attrib, 0, sizeof(input_attrib));
7220 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7221
7222 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007223 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007224 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007225 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007226 "out gl_PerVertex {\n"
7227 " vec4 gl_Position;\n"
7228 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007229 "void main(){\n"
7230 " gl_Position = vec4(x);\n"
7231 "}\n";
7232 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007233 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007234 "\n"
7235 "layout(location=0) out vec4 color;\n"
7236 "void main(){\n"
7237 " color = vec4(1);\n"
7238 "}\n";
7239
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007240 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7241 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007242
7243 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007244 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007245 pipe.AddShader(&vs);
7246 pipe.AddShader(&fs);
7247
7248 pipe.AddVertexInputBindings(input_bindings, 2);
7249 pipe.AddVertexInputAttribs(&input_attrib, 1);
7250
Chris Forbes280ba2c2015-06-12 11:16:41 +12007251 VkDescriptorSetObj descriptorSet(m_device);
7252 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007253 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007254
Tony Barbour5781e8f2015-08-04 16:23:11 -06007255 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007256
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007257 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007258}
Chris Forbes8f68b562015-05-25 11:13:32 +12007259
Chris Forbes35efec72016-04-21 14:32:08 +12007260TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
7261 m_errorMonitor->ExpectSuccess();
7262
7263 ASSERT_NO_FATAL_FAILURE(InitState());
7264 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7265
7266 if (!m_device->phy().features().tessellationShader) {
7267 printf("Device does not support 64bit vertex attributes; skipped.\n");
7268 return;
7269 }
7270
7271 VkVertexInputBindingDescription input_bindings[1];
7272 memset(input_bindings, 0, sizeof(input_bindings));
7273
7274 VkVertexInputAttributeDescription input_attribs[4];
7275 memset(input_attribs, 0, sizeof(input_attribs));
7276 input_attribs[0].location = 0;
7277 input_attribs[0].offset = 0;
7278 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7279 input_attribs[1].location = 2;
7280 input_attribs[1].offset = 32;
7281 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7282 input_attribs[2].location = 4;
7283 input_attribs[2].offset = 64;
7284 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7285 input_attribs[3].location = 6;
7286 input_attribs[3].offset = 96;
7287 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7288
7289 char const *vsSource =
7290 "#version 450\n"
7291 "\n"
7292 "layout(location=0) in dmat4 x;\n"
7293 "out gl_PerVertex {\n"
7294 " vec4 gl_Position;\n"
7295 "};\n"
7296 "void main(){\n"
7297 " gl_Position = vec4(x[0][0]);\n"
7298 "}\n";
7299 char const *fsSource =
7300 "#version 450\n"
7301 "\n"
7302 "layout(location=0) out vec4 color;\n"
7303 "void main(){\n"
7304 " color = vec4(1);\n"
7305 "}\n";
7306
7307 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7308 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7309
7310 VkPipelineObj pipe(m_device);
7311 pipe.AddColorAttachment();
7312 pipe.AddShader(&vs);
7313 pipe.AddShader(&fs);
7314
7315 pipe.AddVertexInputBindings(input_bindings, 1);
7316 pipe.AddVertexInputAttribs(input_attribs, 4);
7317
7318 VkDescriptorSetObj descriptorSet(m_device);
7319 descriptorSet.AppendDummy();
7320 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7321
7322 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7323
7324 m_errorMonitor->VerifyNotFound();
7325}
7326
Karl Schultz6addd812016-02-02 17:17:23 -07007327TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007328 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007329 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007330
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007331 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007332
7333 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007334 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007335 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007336 "out gl_PerVertex {\n"
7337 " vec4 gl_Position;\n"
7338 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007339 "void main(){\n"
7340 " gl_Position = vec4(1);\n"
7341 "}\n";
7342 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007343 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007344 "\n"
7345 "void main(){\n"
7346 "}\n";
7347
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007348 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7349 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007350
7351 VkPipelineObj pipe(m_device);
7352 pipe.AddShader(&vs);
7353 pipe.AddShader(&fs);
7354
Chia-I Wu08accc62015-07-07 11:50:03 +08007355 /* set up CB 0, not written */
7356 pipe.AddColorAttachment();
7357 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007358
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007359 VkDescriptorSetObj descriptorSet(m_device);
7360 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007361 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007362
Tony Barbour5781e8f2015-08-04 16:23:11 -06007363 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007364
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007365 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007366}
7367
Karl Schultz6addd812016-02-02 17:17:23 -07007368TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07007369 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007370 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007371 "FS writes to output location 1 with no matching attachment");
7372
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007373 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007374
7375 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007376 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007377 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007378 "out gl_PerVertex {\n"
7379 " vec4 gl_Position;\n"
7380 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007381 "void main(){\n"
7382 " gl_Position = vec4(1);\n"
7383 "}\n";
7384 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007385 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007386 "\n"
7387 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007388 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007389 "void main(){\n"
7390 " x = vec4(1);\n"
7391 " y = vec4(1);\n"
7392 "}\n";
7393
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007394 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7395 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007396
7397 VkPipelineObj pipe(m_device);
7398 pipe.AddShader(&vs);
7399 pipe.AddShader(&fs);
7400
Chia-I Wu08accc62015-07-07 11:50:03 +08007401 /* set up CB 0, not written */
7402 pipe.AddColorAttachment();
7403 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007404 /* FS writes CB 1, but we don't configure it */
7405
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007406 VkDescriptorSetObj descriptorSet(m_device);
7407 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007408 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007409
Tony Barbour5781e8f2015-08-04 16:23:11 -06007410 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007411
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007412 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007413}
7414
Karl Schultz6addd812016-02-02 17:17:23 -07007415TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007416 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007417 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007418
Chris Forbesa36d69e2015-05-25 11:13:44 +12007419 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007420
7421 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007422 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007423 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007424 "out gl_PerVertex {\n"
7425 " vec4 gl_Position;\n"
7426 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007427 "void main(){\n"
7428 " gl_Position = vec4(1);\n"
7429 "}\n";
7430 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007431 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007432 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007433 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12007434 "void main(){\n"
7435 " x = ivec4(1);\n"
7436 "}\n";
7437
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007438 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7439 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007440
7441 VkPipelineObj pipe(m_device);
7442 pipe.AddShader(&vs);
7443 pipe.AddShader(&fs);
7444
Chia-I Wu08accc62015-07-07 11:50:03 +08007445 /* set up CB 0; type is UNORM by default */
7446 pipe.AddColorAttachment();
7447 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007448
Chris Forbesa36d69e2015-05-25 11:13:44 +12007449 VkDescriptorSetObj descriptorSet(m_device);
7450 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007451 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007452
Tony Barbour5781e8f2015-08-04 16:23:11 -06007453 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007454
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007455 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12007456}
Chris Forbes7b1b8932015-06-05 14:43:36 +12007457
Karl Schultz6addd812016-02-02 17:17:23 -07007458TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007459 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007460 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007461
Chris Forbes556c76c2015-08-14 12:04:59 +12007462 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12007463
7464 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007465 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007466 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007467 "out gl_PerVertex {\n"
7468 " vec4 gl_Position;\n"
7469 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007470 "void main(){\n"
7471 " gl_Position = vec4(1);\n"
7472 "}\n";
7473 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007474 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007475 "\n"
7476 "layout(location=0) out vec4 x;\n"
7477 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7478 "void main(){\n"
7479 " x = vec4(bar.y);\n"
7480 "}\n";
7481
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007482 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7483 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12007484
Chris Forbes556c76c2015-08-14 12:04:59 +12007485 VkPipelineObj pipe(m_device);
7486 pipe.AddShader(&vs);
7487 pipe.AddShader(&fs);
7488
7489 /* set up CB 0; type is UNORM by default */
7490 pipe.AddColorAttachment();
7491 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7492
7493 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007494 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12007495
7496 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7497
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007498 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12007499}
7500
Chris Forbes5c59e902016-02-26 16:56:09 +13007501TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
7502 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7503 "not declared in layout");
7504
7505 ASSERT_NO_FATAL_FAILURE(InitState());
7506
7507 char const *vsSource =
7508 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007509 "\n"
7510 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
7511 "out gl_PerVertex {\n"
7512 " vec4 gl_Position;\n"
7513 "};\n"
7514 "void main(){\n"
7515 " gl_Position = vec4(consts.x);\n"
7516 "}\n";
7517 char const *fsSource =
7518 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007519 "\n"
7520 "layout(location=0) out vec4 x;\n"
7521 "void main(){\n"
7522 " x = vec4(1);\n"
7523 "}\n";
7524
7525 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7526 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7527
7528 VkPipelineObj pipe(m_device);
7529 pipe.AddShader(&vs);
7530 pipe.AddShader(&fs);
7531
7532 /* set up CB 0; type is UNORM by default */
7533 pipe.AddColorAttachment();
7534 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7535
7536 VkDescriptorSetObj descriptorSet(m_device);
7537 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7538
7539 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7540
7541 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007542 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13007543}
7544
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007545#endif // SHADER_CHECKER_TESTS
7546
7547#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06007548TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07007549 m_errorMonitor->SetDesiredFailureMsg(
7550 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007551 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007552
7553 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007554
7555 // Create an image
7556 VkImage image;
7557
Karl Schultz6addd812016-02-02 17:17:23 -07007558 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7559 const int32_t tex_width = 32;
7560 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007561
7562 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007563 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7564 image_create_info.pNext = NULL;
7565 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7566 image_create_info.format = tex_format;
7567 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007568 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07007569 image_create_info.extent.depth = 1;
7570 image_create_info.mipLevels = 1;
7571 image_create_info.arrayLayers = 1;
7572 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7573 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7574 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7575 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007576
7577 // Introduce error by sending down a bogus width extent
7578 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007579 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007580
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007581 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007582}
7583
Mark Youngc48c4c12016-04-11 14:26:49 -06007584TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
7585 m_errorMonitor->SetDesiredFailureMsg(
7586 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7587 "CreateImage extents is 0 for at least one required dimension");
7588
7589 ASSERT_NO_FATAL_FAILURE(InitState());
7590
7591 // Create an image
7592 VkImage image;
7593
7594 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7595 const int32_t tex_width = 32;
7596 const int32_t tex_height = 32;
7597
7598 VkImageCreateInfo image_create_info = {};
7599 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7600 image_create_info.pNext = NULL;
7601 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7602 image_create_info.format = tex_format;
7603 image_create_info.extent.width = tex_width;
7604 image_create_info.extent.height = tex_height;
7605 image_create_info.extent.depth = 1;
7606 image_create_info.mipLevels = 1;
7607 image_create_info.arrayLayers = 1;
7608 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7609 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7610 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7611 image_create_info.flags = 0;
7612
7613 // Introduce error by sending down a bogus width extent
7614 image_create_info.extent.width = 0;
7615 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7616
7617 m_errorMonitor->VerifyFound();
7618}
7619
Karl Schultz6addd812016-02-02 17:17:23 -07007620TEST_F(VkLayerTest, UpdateBufferAlignment) {
7621 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06007622
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007623 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007624 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007625
Mike Stroyana3082432015-09-25 13:39:21 -06007626 ASSERT_NO_FATAL_FAILURE(InitState());
7627
7628 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7629 vk_testing::Buffer buffer;
7630 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7631
7632 BeginCommandBuffer();
7633 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007634 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007635 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007636
Mike Stroyana3082432015-09-25 13:39:21 -06007637 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007639 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007640
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007641 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007642 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007643 EndCommandBuffer();
7644}
7645
Karl Schultz6addd812016-02-02 17:17:23 -07007646TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007647 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007648 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06007649
7650 ASSERT_NO_FATAL_FAILURE(InitState());
7651
7652 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7653 vk_testing::Buffer buffer;
7654 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7655
7656 BeginCommandBuffer();
7657 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007658 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007659 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007660
Mike Stroyana3082432015-09-25 13:39:21 -06007661 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007662 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007663 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007664
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007665 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007666
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007667 m_errorMonitor->VerifyFound();
7668
Mike Stroyana3082432015-09-25 13:39:21 -06007669 EndCommandBuffer();
7670}
7671
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007672#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12007673
Tobin Ehliscde08892015-09-22 10:11:37 -06007674#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07007675TEST_F(VkLayerTest, InvalidImageView) {
7676 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06007677
Karl Schultz6addd812016-02-02 17:17:23 -07007678 m_errorMonitor->SetDesiredFailureMsg(
7679 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007680 "vkCreateImageView called with baseMipLevel 10 ");
7681
Tobin Ehliscde08892015-09-22 10:11:37 -06007682 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06007683
Mike Stroyana3082432015-09-25 13:39:21 -06007684 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07007685 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06007686
Karl Schultz6addd812016-02-02 17:17:23 -07007687 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7688 const int32_t tex_width = 32;
7689 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06007690
7691 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007692 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7693 image_create_info.pNext = NULL;
7694 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7695 image_create_info.format = tex_format;
7696 image_create_info.extent.width = tex_width;
7697 image_create_info.extent.height = tex_height;
7698 image_create_info.extent.depth = 1;
7699 image_create_info.mipLevels = 1;
7700 image_create_info.arrayLayers = 1;
7701 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7702 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7703 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7704 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06007705
Chia-I Wuf7458c52015-10-26 21:10:41 +08007706 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06007707 ASSERT_VK_SUCCESS(err);
7708
7709 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007710 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7711 image_view_create_info.image = image;
7712 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7713 image_view_create_info.format = tex_format;
7714 image_view_create_info.subresourceRange.layerCount = 1;
7715 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
7716 image_view_create_info.subresourceRange.levelCount = 1;
7717 image_view_create_info.subresourceRange.aspectMask =
7718 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06007719
7720 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007721 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7722 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06007723
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007724 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06007725}
Mike Stroyana3082432015-09-25 13:39:21 -06007726
Karl Schultz6addd812016-02-02 17:17:23 -07007727TEST_F(VkLayerTest, InvalidImageViewAspect) {
7728 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007729
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007731 "vkCreateImageView: Color image "
7732 "formats must have ONLY the "
7733 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007734
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007735 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007736
7737 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07007738 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007739
Karl Schultz6addd812016-02-02 17:17:23 -07007740 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7741 const int32_t tex_width = 32;
7742 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007743
7744 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007745 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7746 image_create_info.pNext = NULL;
7747 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7748 image_create_info.format = tex_format;
7749 image_create_info.extent.width = tex_width;
7750 image_create_info.extent.height = tex_height;
7751 image_create_info.extent.depth = 1;
7752 image_create_info.mipLevels = 1;
7753 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7754 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7755 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7756 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007757
Chia-I Wuf7458c52015-10-26 21:10:41 +08007758 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007759 ASSERT_VK_SUCCESS(err);
7760
7761 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007762 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7763 image_view_create_info.image = image;
7764 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7765 image_view_create_info.format = tex_format;
7766 image_view_create_info.subresourceRange.baseMipLevel = 0;
7767 image_view_create_info.subresourceRange.levelCount = 1;
7768 // Cause an error by setting an invalid image aspect
7769 image_view_create_info.subresourceRange.aspectMask =
7770 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007771
7772 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007773 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7774 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007775
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007776 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007777}
7778
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007779TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07007780 VkResult err;
7781 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007782
Karl Schultz6addd812016-02-02 17:17:23 -07007783 m_errorMonitor->SetDesiredFailureMsg(
7784 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007785 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007786
Mike Stroyana3082432015-09-25 13:39:21 -06007787 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007788
7789 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007790 VkImage srcImage;
7791 VkImage dstImage;
7792 VkDeviceMemory srcMem;
7793 VkDeviceMemory destMem;
7794 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007795
7796 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007797 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7798 image_create_info.pNext = NULL;
7799 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7800 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7801 image_create_info.extent.width = 32;
7802 image_create_info.extent.height = 32;
7803 image_create_info.extent.depth = 1;
7804 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007805 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07007806 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7807 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7808 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7809 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007810
Karl Schultz6addd812016-02-02 17:17:23 -07007811 err =
7812 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007813 ASSERT_VK_SUCCESS(err);
7814
Karl Schultz6addd812016-02-02 17:17:23 -07007815 err =
7816 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007817 ASSERT_VK_SUCCESS(err);
7818
7819 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007820 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007821 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7822 memAlloc.pNext = NULL;
7823 memAlloc.allocationSize = 0;
7824 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007825
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007826 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007827 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007828 pass =
7829 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007830 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007831 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007832 ASSERT_VK_SUCCESS(err);
7833
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007834 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007835 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007836 pass =
7837 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007838 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007839 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007840 ASSERT_VK_SUCCESS(err);
7841
7842 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7843 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007844 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007845 ASSERT_VK_SUCCESS(err);
7846
7847 BeginCommandBuffer();
7848 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007849 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007850 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007851 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007852 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06007853 copyRegion.srcOffset.x = 0;
7854 copyRegion.srcOffset.y = 0;
7855 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007856 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007857 copyRegion.dstSubresource.mipLevel = 0;
7858 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007859 // Introduce failure by forcing the dst layerCount to differ from src
7860 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007861 copyRegion.dstOffset.x = 0;
7862 copyRegion.dstOffset.y = 0;
7863 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007864 copyRegion.extent.width = 1;
7865 copyRegion.extent.height = 1;
7866 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007867 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7868 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007869 EndCommandBuffer();
7870
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007871 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007872
Chia-I Wuf7458c52015-10-26 21:10:41 +08007873 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007874 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007875 vkFreeMemory(m_device->device(), srcMem, NULL);
7876 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007877}
7878
Karl Schultz6addd812016-02-02 17:17:23 -07007879TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06007880 VkResult err;
7881 bool pass;
7882
7883 // Create color images with different format sizes and try to copy between them
7884 m_errorMonitor->SetDesiredFailureMsg(
7885 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7886 "vkCmdCopyImage called with unmatched source and dest image format sizes");
7887
7888 ASSERT_NO_FATAL_FAILURE(InitState());
7889
7890 // Create two images of different types and try to copy between them
7891 VkImage srcImage;
7892 VkImage dstImage;
7893 VkDeviceMemory srcMem;
7894 VkDeviceMemory destMem;
7895 VkMemoryRequirements memReqs;
7896
7897 VkImageCreateInfo image_create_info = {};
7898 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7899 image_create_info.pNext = NULL;
7900 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7901 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7902 image_create_info.extent.width = 32;
7903 image_create_info.extent.height = 32;
7904 image_create_info.extent.depth = 1;
7905 image_create_info.mipLevels = 1;
7906 image_create_info.arrayLayers = 1;
7907 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7908 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7909 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7910 image_create_info.flags = 0;
7911
7912 err =
7913 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
7914 ASSERT_VK_SUCCESS(err);
7915
7916 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7917 // Introduce failure by creating second image with a different-sized format.
7918 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
7919
7920 err =
7921 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
7922 ASSERT_VK_SUCCESS(err);
7923
7924 // Allocate memory
7925 VkMemoryAllocateInfo memAlloc = {};
7926 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7927 memAlloc.pNext = NULL;
7928 memAlloc.allocationSize = 0;
7929 memAlloc.memoryTypeIndex = 0;
7930
7931 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
7932 memAlloc.allocationSize = memReqs.size;
7933 pass =
7934 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
7935 ASSERT_TRUE(pass);
7936 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
7937 ASSERT_VK_SUCCESS(err);
7938
7939 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
7940 memAlloc.allocationSize = memReqs.size;
7941 pass =
7942 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
7943 ASSERT_TRUE(pass);
7944 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
7945 ASSERT_VK_SUCCESS(err);
7946
7947 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7948 ASSERT_VK_SUCCESS(err);
7949 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
7950 ASSERT_VK_SUCCESS(err);
7951
7952 BeginCommandBuffer();
7953 VkImageCopy copyRegion;
7954 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7955 copyRegion.srcSubresource.mipLevel = 0;
7956 copyRegion.srcSubresource.baseArrayLayer = 0;
7957 copyRegion.srcSubresource.layerCount = 0;
7958 copyRegion.srcOffset.x = 0;
7959 copyRegion.srcOffset.y = 0;
7960 copyRegion.srcOffset.z = 0;
7961 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7962 copyRegion.dstSubresource.mipLevel = 0;
7963 copyRegion.dstSubresource.baseArrayLayer = 0;
7964 copyRegion.dstSubresource.layerCount = 0;
7965 copyRegion.dstOffset.x = 0;
7966 copyRegion.dstOffset.y = 0;
7967 copyRegion.dstOffset.z = 0;
7968 copyRegion.extent.width = 1;
7969 copyRegion.extent.height = 1;
7970 copyRegion.extent.depth = 1;
7971 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7972 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7973 EndCommandBuffer();
7974
7975 m_errorMonitor->VerifyFound();
7976
7977 vkDestroyImage(m_device->device(), srcImage, NULL);
7978 vkDestroyImage(m_device->device(), dstImage, NULL);
7979 vkFreeMemory(m_device->device(), srcMem, NULL);
7980 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007981}
7982
Karl Schultz6addd812016-02-02 17:17:23 -07007983TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
7984 VkResult err;
7985 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007986
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007987 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007988 m_errorMonitor->SetDesiredFailureMsg(
7989 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007990 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007991
Mike Stroyana3082432015-09-25 13:39:21 -06007992 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007993
7994 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007995 VkImage srcImage;
7996 VkImage dstImage;
7997 VkDeviceMemory srcMem;
7998 VkDeviceMemory destMem;
7999 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008000
8001 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008002 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8003 image_create_info.pNext = NULL;
8004 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8005 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8006 image_create_info.extent.width = 32;
8007 image_create_info.extent.height = 32;
8008 image_create_info.extent.depth = 1;
8009 image_create_info.mipLevels = 1;
8010 image_create_info.arrayLayers = 1;
8011 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8012 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8013 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8014 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008015
Karl Schultz6addd812016-02-02 17:17:23 -07008016 err =
8017 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008018 ASSERT_VK_SUCCESS(err);
8019
Karl Schultzbdb75952016-04-19 11:36:49 -06008020 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
8021
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008022 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07008023 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008024 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
8025 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008026
Karl Schultz6addd812016-02-02 17:17:23 -07008027 err =
8028 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008029 ASSERT_VK_SUCCESS(err);
8030
8031 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008032 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008033 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8034 memAlloc.pNext = NULL;
8035 memAlloc.allocationSize = 0;
8036 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008037
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008038 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008039 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008040 pass =
8041 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008042 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008043 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008044 ASSERT_VK_SUCCESS(err);
8045
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008046 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008047 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008048 pass =
8049 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008050 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008051 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008052 ASSERT_VK_SUCCESS(err);
8053
8054 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8055 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008056 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008057 ASSERT_VK_SUCCESS(err);
8058
8059 BeginCommandBuffer();
8060 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008061 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008062 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008063 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008064 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008065 copyRegion.srcOffset.x = 0;
8066 copyRegion.srcOffset.y = 0;
8067 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008068 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008069 copyRegion.dstSubresource.mipLevel = 0;
8070 copyRegion.dstSubresource.baseArrayLayer = 0;
8071 copyRegion.dstSubresource.layerCount = 0;
8072 copyRegion.dstOffset.x = 0;
8073 copyRegion.dstOffset.y = 0;
8074 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008075 copyRegion.extent.width = 1;
8076 copyRegion.extent.height = 1;
8077 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008078 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8079 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008080 EndCommandBuffer();
8081
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008082 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008083
Chia-I Wuf7458c52015-10-26 21:10:41 +08008084 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008085 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008086 vkFreeMemory(m_device->device(), srcMem, NULL);
8087 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008088}
8089
Karl Schultz6addd812016-02-02 17:17:23 -07008090TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
8091 VkResult err;
8092 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008093
Karl Schultz6addd812016-02-02 17:17:23 -07008094 m_errorMonitor->SetDesiredFailureMsg(
8095 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008096 "vkCmdResolveImage called with source sample count less than 2.");
8097
Mike Stroyana3082432015-09-25 13:39:21 -06008098 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008099
8100 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008101 VkImage srcImage;
8102 VkImage dstImage;
8103 VkDeviceMemory srcMem;
8104 VkDeviceMemory destMem;
8105 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008106
8107 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008108 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8109 image_create_info.pNext = NULL;
8110 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8111 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8112 image_create_info.extent.width = 32;
8113 image_create_info.extent.height = 1;
8114 image_create_info.extent.depth = 1;
8115 image_create_info.mipLevels = 1;
8116 image_create_info.arrayLayers = 1;
8117 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8118 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8119 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8120 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008121
Karl Schultz6addd812016-02-02 17:17:23 -07008122 err =
8123 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008124 ASSERT_VK_SUCCESS(err);
8125
Karl Schultz6addd812016-02-02 17:17:23 -07008126 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8127 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008128
Karl Schultz6addd812016-02-02 17:17:23 -07008129 err =
8130 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008131 ASSERT_VK_SUCCESS(err);
8132
8133 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008134 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008135 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8136 memAlloc.pNext = NULL;
8137 memAlloc.allocationSize = 0;
8138 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008139
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008140 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008141 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008142 pass =
8143 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008144 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008145 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008146 ASSERT_VK_SUCCESS(err);
8147
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008148 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008149 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008150 pass =
8151 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008152 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008153 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008154 ASSERT_VK_SUCCESS(err);
8155
8156 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8157 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008158 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008159 ASSERT_VK_SUCCESS(err);
8160
8161 BeginCommandBuffer();
8162 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008163 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8164 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008165 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008166 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008167 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008168 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008169 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008170 resolveRegion.srcOffset.x = 0;
8171 resolveRegion.srcOffset.y = 0;
8172 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008173 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008174 resolveRegion.dstSubresource.mipLevel = 0;
8175 resolveRegion.dstSubresource.baseArrayLayer = 0;
8176 resolveRegion.dstSubresource.layerCount = 0;
8177 resolveRegion.dstOffset.x = 0;
8178 resolveRegion.dstOffset.y = 0;
8179 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008180 resolveRegion.extent.width = 1;
8181 resolveRegion.extent.height = 1;
8182 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008183 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8184 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008185 EndCommandBuffer();
8186
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008187 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008188
Chia-I Wuf7458c52015-10-26 21:10:41 +08008189 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008190 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008191 vkFreeMemory(m_device->device(), srcMem, NULL);
8192 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008193}
8194
Karl Schultz6addd812016-02-02 17:17:23 -07008195TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
8196 VkResult err;
8197 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008198
Karl Schultz6addd812016-02-02 17:17:23 -07008199 m_errorMonitor->SetDesiredFailureMsg(
8200 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008201 "vkCmdResolveImage called with dest sample count greater than 1.");
8202
Mike Stroyana3082432015-09-25 13:39:21 -06008203 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008204
8205 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008206 VkImage srcImage;
8207 VkImage dstImage;
8208 VkDeviceMemory srcMem;
8209 VkDeviceMemory destMem;
8210 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008211
8212 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008213 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8214 image_create_info.pNext = NULL;
8215 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8216 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8217 image_create_info.extent.width = 32;
8218 image_create_info.extent.height = 1;
8219 image_create_info.extent.depth = 1;
8220 image_create_info.mipLevels = 1;
8221 image_create_info.arrayLayers = 1;
8222 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8223 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8224 // Note: Some implementations expect color attachment usage for any
8225 // multisample surface
8226 image_create_info.usage =
8227 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8228 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008229
Karl Schultz6addd812016-02-02 17:17:23 -07008230 err =
8231 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008232 ASSERT_VK_SUCCESS(err);
8233
Karl Schultz6addd812016-02-02 17:17:23 -07008234 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8235 // Note: Some implementations expect color attachment usage for any
8236 // multisample surface
8237 image_create_info.usage =
8238 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008239
Karl Schultz6addd812016-02-02 17:17:23 -07008240 err =
8241 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008242 ASSERT_VK_SUCCESS(err);
8243
8244 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008245 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008246 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8247 memAlloc.pNext = NULL;
8248 memAlloc.allocationSize = 0;
8249 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008250
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008251 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008252 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008253 pass =
8254 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008255 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008256 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008257 ASSERT_VK_SUCCESS(err);
8258
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008259 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008260 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008261 pass =
8262 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008263 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008264 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008265 ASSERT_VK_SUCCESS(err);
8266
8267 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8268 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008269 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008270 ASSERT_VK_SUCCESS(err);
8271
8272 BeginCommandBuffer();
8273 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008274 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8275 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008276 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008277 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008278 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008279 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008280 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008281 resolveRegion.srcOffset.x = 0;
8282 resolveRegion.srcOffset.y = 0;
8283 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008284 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008285 resolveRegion.dstSubresource.mipLevel = 0;
8286 resolveRegion.dstSubresource.baseArrayLayer = 0;
8287 resolveRegion.dstSubresource.layerCount = 0;
8288 resolveRegion.dstOffset.x = 0;
8289 resolveRegion.dstOffset.y = 0;
8290 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008291 resolveRegion.extent.width = 1;
8292 resolveRegion.extent.height = 1;
8293 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008294 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8295 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008296 EndCommandBuffer();
8297
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008298 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008299
Chia-I Wuf7458c52015-10-26 21:10:41 +08008300 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008301 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008302 vkFreeMemory(m_device->device(), srcMem, NULL);
8303 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008304}
8305
Karl Schultz6addd812016-02-02 17:17:23 -07008306TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
8307 VkResult err;
8308 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008309
Karl Schultz6addd812016-02-02 17:17:23 -07008310 m_errorMonitor->SetDesiredFailureMsg(
8311 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008312 "vkCmdResolveImage called with unmatched source and dest formats.");
8313
Mike Stroyana3082432015-09-25 13:39:21 -06008314 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008315
8316 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008317 VkImage srcImage;
8318 VkImage dstImage;
8319 VkDeviceMemory srcMem;
8320 VkDeviceMemory destMem;
8321 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008322
8323 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008324 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8325 image_create_info.pNext = NULL;
8326 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8327 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8328 image_create_info.extent.width = 32;
8329 image_create_info.extent.height = 1;
8330 image_create_info.extent.depth = 1;
8331 image_create_info.mipLevels = 1;
8332 image_create_info.arrayLayers = 1;
8333 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8334 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8335 // Note: Some implementations expect color attachment usage for any
8336 // multisample surface
8337 image_create_info.usage =
8338 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8339 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008340
Karl Schultz6addd812016-02-02 17:17:23 -07008341 err =
8342 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008343 ASSERT_VK_SUCCESS(err);
8344
Karl Schultz6addd812016-02-02 17:17:23 -07008345 // Set format to something other than source image
8346 image_create_info.format = VK_FORMAT_R32_SFLOAT;
8347 // Note: Some implementations expect color attachment usage for any
8348 // multisample surface
8349 image_create_info.usage =
8350 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8351 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008352
Karl Schultz6addd812016-02-02 17:17:23 -07008353 err =
8354 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008355 ASSERT_VK_SUCCESS(err);
8356
8357 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008358 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008359 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8360 memAlloc.pNext = NULL;
8361 memAlloc.allocationSize = 0;
8362 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008363
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008364 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008365 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008366 pass =
8367 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008368 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008369 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008370 ASSERT_VK_SUCCESS(err);
8371
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008372 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008373 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008374 pass =
8375 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008376 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008377 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008378 ASSERT_VK_SUCCESS(err);
8379
8380 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8381 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008382 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008383 ASSERT_VK_SUCCESS(err);
8384
8385 BeginCommandBuffer();
8386 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008387 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8388 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008389 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008390 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008391 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008392 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008393 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008394 resolveRegion.srcOffset.x = 0;
8395 resolveRegion.srcOffset.y = 0;
8396 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008397 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008398 resolveRegion.dstSubresource.mipLevel = 0;
8399 resolveRegion.dstSubresource.baseArrayLayer = 0;
8400 resolveRegion.dstSubresource.layerCount = 0;
8401 resolveRegion.dstOffset.x = 0;
8402 resolveRegion.dstOffset.y = 0;
8403 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008404 resolveRegion.extent.width = 1;
8405 resolveRegion.extent.height = 1;
8406 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008407 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8408 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008409 EndCommandBuffer();
8410
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008411 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008412
Chia-I Wuf7458c52015-10-26 21:10:41 +08008413 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008414 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008415 vkFreeMemory(m_device->device(), srcMem, NULL);
8416 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008417}
8418
Karl Schultz6addd812016-02-02 17:17:23 -07008419TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
8420 VkResult err;
8421 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008422
Karl Schultz6addd812016-02-02 17:17:23 -07008423 m_errorMonitor->SetDesiredFailureMsg(
8424 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008425 "vkCmdResolveImage called with unmatched source and dest image types.");
8426
Mike Stroyana3082432015-09-25 13:39:21 -06008427 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008428
8429 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008430 VkImage srcImage;
8431 VkImage dstImage;
8432 VkDeviceMemory srcMem;
8433 VkDeviceMemory destMem;
8434 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008435
8436 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008437 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8438 image_create_info.pNext = NULL;
8439 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8440 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8441 image_create_info.extent.width = 32;
8442 image_create_info.extent.height = 1;
8443 image_create_info.extent.depth = 1;
8444 image_create_info.mipLevels = 1;
8445 image_create_info.arrayLayers = 1;
8446 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8447 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8448 // Note: Some implementations expect color attachment usage for any
8449 // multisample surface
8450 image_create_info.usage =
8451 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8452 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008453
Karl Schultz6addd812016-02-02 17:17:23 -07008454 err =
8455 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008456 ASSERT_VK_SUCCESS(err);
8457
Karl Schultz6addd812016-02-02 17:17:23 -07008458 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8459 // Note: Some implementations expect color attachment usage for any
8460 // multisample surface
8461 image_create_info.usage =
8462 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8463 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008464
Karl Schultz6addd812016-02-02 17:17:23 -07008465 err =
8466 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008467 ASSERT_VK_SUCCESS(err);
8468
8469 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008470 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008471 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8472 memAlloc.pNext = NULL;
8473 memAlloc.allocationSize = 0;
8474 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008475
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008476 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008477 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008478 pass =
8479 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008480 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008481 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008482 ASSERT_VK_SUCCESS(err);
8483
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008484 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008485 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008486 pass =
8487 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008488 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008489 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008490 ASSERT_VK_SUCCESS(err);
8491
8492 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8493 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008494 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008495 ASSERT_VK_SUCCESS(err);
8496
8497 BeginCommandBuffer();
8498 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008499 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8500 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008501 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008502 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008503 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008504 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008505 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008506 resolveRegion.srcOffset.x = 0;
8507 resolveRegion.srcOffset.y = 0;
8508 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008509 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008510 resolveRegion.dstSubresource.mipLevel = 0;
8511 resolveRegion.dstSubresource.baseArrayLayer = 0;
8512 resolveRegion.dstSubresource.layerCount = 0;
8513 resolveRegion.dstOffset.x = 0;
8514 resolveRegion.dstOffset.y = 0;
8515 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008516 resolveRegion.extent.width = 1;
8517 resolveRegion.extent.height = 1;
8518 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008519 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8520 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008521 EndCommandBuffer();
8522
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008523 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008524
Chia-I Wuf7458c52015-10-26 21:10:41 +08008525 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008526 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008527 vkFreeMemory(m_device->device(), srcMem, NULL);
8528 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008529}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008530
Karl Schultz6addd812016-02-02 17:17:23 -07008531TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008532 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07008533 // to using a DS format, then cause it to hit error due to COLOR_BIT not
8534 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008535 // The image format check comes 2nd in validation so we trigger it first,
8536 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07008537 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008538
Karl Schultz6addd812016-02-02 17:17:23 -07008539 m_errorMonitor->SetDesiredFailureMsg(
8540 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008541 "Combination depth/stencil image formats can have only the ");
8542
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008543 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008544
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008545 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008546 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8547 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008548
8549 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008550 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8551 ds_pool_ci.pNext = NULL;
8552 ds_pool_ci.maxSets = 1;
8553 ds_pool_ci.poolSizeCount = 1;
8554 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008555
8556 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008557 err =
8558 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008559 ASSERT_VK_SUCCESS(err);
8560
8561 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008562 dsl_binding.binding = 0;
8563 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8564 dsl_binding.descriptorCount = 1;
8565 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8566 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008567
8568 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008569 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8570 ds_layout_ci.pNext = NULL;
8571 ds_layout_ci.bindingCount = 1;
8572 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008573 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008574 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8575 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008576 ASSERT_VK_SUCCESS(err);
8577
8578 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008579 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008580 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008581 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008582 alloc_info.descriptorPool = ds_pool;
8583 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008584 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8585 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008586 ASSERT_VK_SUCCESS(err);
8587
Karl Schultz6addd812016-02-02 17:17:23 -07008588 VkImage image_bad;
8589 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008590 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07008591 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008592 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07008593 const int32_t tex_width = 32;
8594 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008595
8596 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008597 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8598 image_create_info.pNext = NULL;
8599 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8600 image_create_info.format = tex_format_bad;
8601 image_create_info.extent.width = tex_width;
8602 image_create_info.extent.height = tex_height;
8603 image_create_info.extent.depth = 1;
8604 image_create_info.mipLevels = 1;
8605 image_create_info.arrayLayers = 1;
8606 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8607 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8608 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
8609 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
8610 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008611
Karl Schultz6addd812016-02-02 17:17:23 -07008612 err =
8613 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008614 ASSERT_VK_SUCCESS(err);
8615 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07008616 image_create_info.usage =
8617 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8618 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
8619 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008620 ASSERT_VK_SUCCESS(err);
8621
8622 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008623 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8624 image_view_create_info.image = image_bad;
8625 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8626 image_view_create_info.format = tex_format_bad;
8627 image_view_create_info.subresourceRange.baseArrayLayer = 0;
8628 image_view_create_info.subresourceRange.baseMipLevel = 0;
8629 image_view_create_info.subresourceRange.layerCount = 1;
8630 image_view_create_info.subresourceRange.levelCount = 1;
8631 image_view_create_info.subresourceRange.aspectMask =
8632 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008633
8634 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008635 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8636 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008637
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008638 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008639
Chia-I Wuf7458c52015-10-26 21:10:41 +08008640 vkDestroyImage(m_device->device(), image_bad, NULL);
8641 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008642 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8643 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008644}
Tobin Ehliscde08892015-09-22 10:11:37 -06008645#endif // IMAGE_TESTS
8646
Tony Barbour300a6082015-04-07 13:44:53 -06008647int main(int argc, char **argv) {
8648 int result;
8649
Cody Northrop8e54a402016-03-08 22:25:52 -07008650#ifdef ANDROID
8651 int vulkanSupport = InitVulkan();
8652 if (vulkanSupport == 0)
8653 return 1;
8654#endif
8655
Tony Barbour300a6082015-04-07 13:44:53 -06008656 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06008657 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06008658
8659 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
8660
8661 result = RUN_ALL_TESTS();
8662
Tony Barbour6918cd52015-04-09 12:58:51 -06008663 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06008664 return result;
8665}