blob: cbcc071b927a938fe5e03c5b764d310edd0f454e [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Michael Lentine0a369f62016-02-03 16:51:46 -06005 * Copyright (c) 2015-2016 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
20 */
Tony Barbour65c48b32015-11-17 10:02:56 -070021
Cody Northrop8e54a402016-03-08 22:25:52 -070022#ifdef ANDROID
23#include "vulkan_wrapper.h"
24#else
David Pinedo9316d3b2015-11-06 12:54:48 -070025#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070026#endif
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060027#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060028#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060029#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070030#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060031
Mark Lobodzinski3780e142015-05-14 15:08:13 -050032#define GLM_FORCE_RADIANS
33#include "glm/glm.hpp"
34#include <glm/gtc/matrix_transform.hpp>
35
Tobin Ehlis0788f522015-05-26 16:11:58 -060036#define MEM_TRACKER_TESTS 1
37#define OBJ_TRACKER_TESTS 1
38#define DRAW_STATE_TESTS 1
39#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120040#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060041#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060042#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060043
Mark Lobodzinski3780e142015-05-14 15:08:13 -050044//--------------------------------------------------------------------------------------
45// Mesh and VertexFormat Data
46//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070047struct Vertex {
48 float posX, posY, posZ, posW; // Position data
49 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050050};
51
Karl Schultz6addd812016-02-02 17:17:23 -070052#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050053
54typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070055 BsoFailNone = 0x00000000,
56 BsoFailLineWidth = 0x00000001,
57 BsoFailDepthBias = 0x00000002,
58 BsoFailViewport = 0x00000004,
59 BsoFailScissor = 0x00000008,
60 BsoFailBlend = 0x00000010,
61 BsoFailDepthBounds = 0x00000020,
62 BsoFailStencilReadMask = 0x00000040,
63 BsoFailStencilWriteMask = 0x00000080,
64 BsoFailStencilReference = 0x00000100,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050065} BsoFailSelect;
66
67struct vktriangle_vs_uniform {
68 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070069 float mvp[4][4];
70 float position[3][4];
71 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050072};
73
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050074static const char bindStateVertShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120075 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070076 "vec2 vertices[3];\n"
77 "out gl_PerVertex {\n"
78 " vec4 gl_Position;\n"
79 "};\n"
80 "void main() {\n"
81 " vertices[0] = vec2(-1.0, -1.0);\n"
82 " vertices[1] = vec2( 1.0, -1.0);\n"
83 " vertices[2] = vec2( 0.0, 1.0);\n"
84 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
85 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050086
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050087static const char bindStateFragShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120088 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070089 "\n"
90 "layout(location = 0) out vec4 uFragColor;\n"
91 "void main(){\n"
92 " uFragColor = vec4(0,1,0,1);\n"
93 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050094
Karl Schultz6addd812016-02-02 17:17:23 -070095static VKAPI_ATTR VkBool32 VKAPI_CALL
96myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
97 uint64_t srcObject, size_t location, int32_t msgCode,
98 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -060099
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600100// ********************************************************
101// ErrorMonitor Usage:
102//
103// Call SetDesiredFailureMsg with a string to be compared against all
104// encountered log messages. Passing NULL will match all log messages.
105// logMsg will return true for skipCall only if msg is matched or NULL.
106//
107// Call DesiredMsgFound to determine if the desired failure message
108// was encountered.
109
Tony Barbour300a6082015-04-07 13:44:53 -0600110class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700111 public:
112 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600113 test_platform_thread_create_mutex(&m_mutex);
114 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700115 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700116 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600117 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600118 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600119
Dustin Graves48458142016-04-29 16:11:55 -0600120 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
121
Karl Schultz6addd812016-02-02 17:17:23 -0700122 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200123 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600124 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600125 m_failureMsg.clear();
126 m_otherMsgs.clear();
127 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700128 m_msgFound = VK_FALSE;
129 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600130 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600131 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600132
Karl Schultz6addd812016-02-02 17:17:23 -0700133 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600134 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600135 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600136 if (m_bailout != NULL) {
137 *m_bailout = true;
138 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600139 string errorString(msgString);
140 if (msgFlags & m_msgFlags) {
141 if (errorString.find(m_desiredMsg) != string::npos) {
Chris Forbesc7b8ad72016-04-04 18:50:38 +1200142 if (m_msgFound) { /* if multiple matches, don't lose all but the last! */
143 m_otherMsgs.push_back(m_failureMsg);
144 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600145 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700146 m_msgFound = VK_TRUE;
147 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600148 } else {
149 m_otherMsgs.push_back(errorString);
150 }
151 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600152 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600153 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600154 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600155
Karl Schultz6addd812016-02-02 17:17:23 -0700156 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600157
Karl Schultz6addd812016-02-02 17:17:23 -0700158 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600159
Karl Schultz6addd812016-02-02 17:17:23 -0700160 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600161
Karl Schultz6addd812016-02-02 17:17:23 -0700162 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600163
Karl Schultz6addd812016-02-02 17:17:23 -0700164 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165 vector<string> otherMsgs = GetOtherFailureMsgs();
166 cout << "Other error messages logged for this test were:" << endl;
167 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
168 cout << " " << *iter << endl;
169 }
170 }
171
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200172 /* helpers */
173
174 void ExpectSuccess() {
175 // match anything
176 SetDesiredFailureMsg(~0u, "");
177 }
178
179 void VerifyFound() {
180 // Not seeing the desired message is a failure. /Before/ throwing, dump
181 // any other messages.
182 if (!DesiredMsgFound()) {
183 DumpFailureMsgs();
184 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
185 }
186 }
187
188 void VerifyNotFound() {
189 // ExpectSuccess() configured us to match anything. Any error is a
190 // failure.
191 if (DesiredMsgFound()) {
192 DumpFailureMsgs();
193 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
194 }
195 }
196
Karl Schultz6addd812016-02-02 17:17:23 -0700197 private:
198 VkFlags m_msgFlags;
199 string m_desiredMsg;
200 string m_failureMsg;
201 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600202 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700203 bool *m_bailout;
204 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600205};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500206
Karl Schultz6addd812016-02-02 17:17:23 -0700207static VKAPI_ATTR VkBool32 VKAPI_CALL
208myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
209 uint64_t srcObject, size_t location, int32_t msgCode,
210 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
211 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700212 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700213 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600214 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600215 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600216 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600217 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600218}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500219
Karl Schultz6addd812016-02-02 17:17:23 -0700220class VkLayerTest : public VkRenderFramework {
221 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800222 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
223 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700224 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
225 BsoFailSelect failMask);
226 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
227 VkPipelineObj &pipelineobj,
228 VkDescriptorSetObj &descriptorSet,
229 BsoFailSelect failMask);
230 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
231 VkDescriptorSetObj &descriptorSet,
232 BsoFailSelect failMask) {
233 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
234 failMask);
235 }
Tony Barbour300a6082015-04-07 13:44:53 -0600236
Tony Barbourfe3351b2015-07-28 10:17:20 -0600237 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700238 VkResult BeginCommandBuffer() {
239 return BeginCommandBuffer(*m_commandBuffer);
240 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800241 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700242 void Draw(uint32_t vertexCount, uint32_t instanceCount,
243 uint32_t firstVertex, uint32_t firstInstance) {
244 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
245 firstInstance);
246 }
247 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
248 uint32_t firstIndex, int32_t vertexOffset,
249 uint32_t firstInstance) {
250 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
251 vertexOffset, firstInstance);
252 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800253 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); }
Karl Schultz6addd812016-02-02 17:17:23 -0700254 void QueueCommandBuffer(const VkFence &fence) {
255 m_commandBuffer->QueueCommandBuffer(fence);
256 }
257 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
258 VkDeviceSize offset, uint32_t binding) {
259 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
260 }
261 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
262 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
263 }
264
265 protected:
266 ErrorMonitor *m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600267
268 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600269 std::vector<const char *> instance_layer_names;
270 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600271 std::vector<const char *> instance_extension_names;
272 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600273
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700274 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600275 /*
276 * Since CreateDbgMsgCallback is an instance level extension call
277 * any extension / layer that utilizes that feature also needs
278 * to be enabled at create instance time.
279 */
Karl Schultz6addd812016-02-02 17:17:23 -0700280 // Use Threading layer first to protect others from
281 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700282 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600283 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800284 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700285 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800286 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
287 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600288 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700289 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600290
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700291 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600292 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800293 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700294 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800295 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
296 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600297 device_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700298 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600299
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600300 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600301 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800302 this->app_info.pApplicationName = "layer_tests";
303 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600304 this->app_info.pEngineName = "unittest";
305 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600306 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600307
Tony Barbour15524c32015-04-29 17:34:29 -0600308 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600309 InitFramework(instance_layer_names, device_layer_names,
310 instance_extension_names, device_extension_names,
311 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600312 }
313
314 virtual void TearDown() {
315 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600316 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600317 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600318 }
319};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500320
Karl Schultz6addd812016-02-02 17:17:23 -0700321VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600322 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600323
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800324 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600325
326 /*
327 * For render test all drawing happens in a single render pass
328 * on a single command buffer.
329 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200330 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800331 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600332 }
333
334 return result;
335}
336
Karl Schultz6addd812016-02-02 17:17:23 -0700337VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600338 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600339
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200340 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800341 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200342 }
Tony Barbour300a6082015-04-07 13:44:53 -0600343
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800344 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600345
346 return result;
347}
348
Karl Schultz6addd812016-02-02 17:17:23 -0700349void VkLayerTest::VKTriangleTest(const char *vertShaderText,
350 const char *fragShaderText,
351 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500352 // Create identity matrix
353 int i;
354 struct vktriangle_vs_uniform data;
355
356 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700357 glm::mat4 View = glm::mat4(1.0f);
358 glm::mat4 Model = glm::mat4(1.0f);
359 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500360 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700361 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500362
363 memcpy(&data.mvp, &MVP[0][0], matrixSize);
364
Karl Schultz6addd812016-02-02 17:17:23 -0700365 static const Vertex tri_data[] = {
366 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
367 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
368 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500369 };
370
Karl Schultz6addd812016-02-02 17:17:23 -0700371 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500372 data.position[i][0] = tri_data[i].posX;
373 data.position[i][1] = tri_data[i].posY;
374 data.position[i][2] = tri_data[i].posZ;
375 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700376 data.color[i][0] = tri_data[i].r;
377 data.color[i][1] = tri_data[i].g;
378 data.color[i][2] = tri_data[i].b;
379 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500380 }
381
382 ASSERT_NO_FATAL_FAILURE(InitState());
383 ASSERT_NO_FATAL_FAILURE(InitViewport());
384
Karl Schultz6addd812016-02-02 17:17:23 -0700385 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
386 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500387
Karl Schultz6addd812016-02-02 17:17:23 -0700388 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
389 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
390 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500391
392 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800393 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500394 pipelineobj.AddShader(&vs);
395 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600396 if (failMask & BsoFailLineWidth) {
397 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600398 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
399 ia_state.sType =
400 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
401 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
402 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600403 }
404 if (failMask & BsoFailDepthBias) {
405 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600406 VkPipelineRasterizationStateCreateInfo rs_state = {};
407 rs_state.sType =
408 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
409 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600410 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600411 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600412 }
Karl Schultz6addd812016-02-02 17:17:23 -0700413 // Viewport and scissors must stay in synch or other errors will occur than
414 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600415 if (failMask & BsoFailViewport) {
416 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600417 m_viewports.clear();
418 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600419 }
420 if (failMask & BsoFailScissor) {
421 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600422 m_scissors.clear();
423 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600424 }
425 if (failMask & BsoFailBlend) {
426 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600427 VkPipelineColorBlendAttachmentState att_state = {};
428 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
429 att_state.blendEnable = VK_TRUE;
430 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600431 }
432 if (failMask & BsoFailDepthBounds) {
433 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
434 }
435 if (failMask & BsoFailStencilReadMask) {
436 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
437 }
438 if (failMask & BsoFailStencilWriteMask) {
439 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
440 }
441 if (failMask & BsoFailStencilReference) {
442 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
443 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500444
445 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700446 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
447 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500448
449 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600450 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500451
Tony Barbourfe3351b2015-07-28 10:17:20 -0600452 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500453
454 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600455 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500456
457 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600458 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500459
Tony Barbourfe3351b2015-07-28 10:17:20 -0600460 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500461}
462
Karl Schultz6addd812016-02-02 17:17:23 -0700463void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
464 VkPipelineObj &pipelineobj,
465 VkDescriptorSetObj &descriptorSet,
466 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500467 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700468 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
469 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500470 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700471 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
472 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500473 }
474
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800475 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700476 // Make sure depthWriteEnable is set so that Depth fail test will work
477 // correctly
478 // Make sure stencilTestEnable is set so that Stencil fail test will work
479 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600480 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800481 stencil.failOp = VK_STENCIL_OP_KEEP;
482 stencil.passOp = VK_STENCIL_OP_KEEP;
483 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
484 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600485
486 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
487 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600488 ds_ci.pNext = NULL;
489 ds_ci.depthTestEnable = VK_FALSE;
490 ds_ci.depthWriteEnable = VK_TRUE;
491 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
492 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600493 if (failMask & BsoFailDepthBounds) {
494 ds_ci.depthBoundsTestEnable = VK_TRUE;
495 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600496 ds_ci.stencilTestEnable = VK_TRUE;
497 ds_ci.front = stencil;
498 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600499
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600500 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600501 pipelineobj.SetViewport(m_viewports);
502 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800503 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700504 VkResult err = pipelineobj.CreateVKPipeline(
505 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600506 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800507 commandBuffer->BindPipeline(pipelineobj);
508 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500509}
510
511// ********************************************************************************************************************
512// ********************************************************************************************************************
513// ********************************************************************************************************************
514// ********************************************************************************************************************
Tobin Ehlis0788f522015-05-26 16:11:58 -0600515#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700516#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800517TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500518{
519 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500520 VkFenceCreateInfo fenceInfo = {};
521 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
522 fenceInfo.pNext = NULL;
523 fenceInfo.flags = 0;
524
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600526
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500527 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600528
529 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
530 vk_testing::Buffer buffer;
531 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500532
Tony Barbourfe3351b2015-07-28 10:17:20 -0600533 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800534 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600535 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500536
537 testFence.init(*m_device, fenceInfo);
538
539 // Bypass framework since it does the waits automatically
540 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600541 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800542 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
543 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800544 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600545 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700546 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800547 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800548 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800549 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600550 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600551
552 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500553 ASSERT_VK_SUCCESS( err );
554
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500555 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800556 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500557
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200558 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500559}
560
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800561TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500562{
563 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500564 VkFenceCreateInfo fenceInfo = {};
565 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
566 fenceInfo.pNext = NULL;
567 fenceInfo.flags = 0;
568
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600570
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500571 ASSERT_NO_FATAL_FAILURE(InitState());
572 ASSERT_NO_FATAL_FAILURE(InitViewport());
573 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
574
Tony Barbourfe3351b2015-07-28 10:17:20 -0600575 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800576 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600577 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500578
579 testFence.init(*m_device, fenceInfo);
580
581 // Bypass framework since it does the waits automatically
582 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600583 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800584 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
585 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800586 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600587 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700588 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800589 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800590 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800591 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600592 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600593
594 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500595 ASSERT_VK_SUCCESS( err );
596
Jon Ashburnf19916e2016-01-11 13:12:43 -0700597 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800598 VkCommandBufferBeginInfo info = {};
599 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
600 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600601 info.renderPass = VK_NULL_HANDLE;
602 info.subpass = 0;
603 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +0800604 info.occlusionQueryEnable = VK_FALSE;
605 info.queryFlags = 0;
606 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600607
608 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800609 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500610
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200611 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500612}
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700613#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200614
Mark Lobodzinski152fe252016-05-03 16:49:15 -0600615// This is a positive test. No failures are expected.
616TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
617 VkResult err;
618 bool pass;
619
620 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
621 "the buffer, create an image, and bind the same memory to "
622 "it");
623
624 m_errorMonitor->ExpectSuccess();
625
626 ASSERT_NO_FATAL_FAILURE(InitState());
627
628 VkBuffer buffer;
629 VkImage image;
630 VkDeviceMemory mem;
631 VkMemoryRequirements mem_reqs;
632
633 VkBufferCreateInfo buf_info = {};
634 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
635 buf_info.pNext = NULL;
636 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
637 buf_info.size = 256;
638 buf_info.queueFamilyIndexCount = 0;
639 buf_info.pQueueFamilyIndices = NULL;
640 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
641 buf_info.flags = 0;
642 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
643 ASSERT_VK_SUCCESS(err);
644
645 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
646
647 VkMemoryAllocateInfo alloc_info = {};
648 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
649 alloc_info.pNext = NULL;
650 alloc_info.memoryTypeIndex = 0;
651
652 // Ensure memory is big enough for both bindings
653 alloc_info.allocationSize = 0x10000;
654
655 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
656 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
657 if (!pass) {
658 vkDestroyBuffer(m_device->device(), buffer, NULL);
659 return;
660 }
661
662 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
663 ASSERT_VK_SUCCESS(err);
664
665 uint8_t *pData;
666 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
667 (void **)&pData);
668 ASSERT_VK_SUCCESS(err);
669
670 memset(pData, 0xCADECADE, mem_reqs.size);
671
672 vkUnmapMemory(m_device->device(), mem);
673
674 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
675 ASSERT_VK_SUCCESS(err);
676
677 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
678 // memory. In fact, it was never used by the GPU.
679 // Just be be sure, wait for idle.
680 vkDestroyBuffer(m_device->device(), buffer, NULL);
681 vkDeviceWaitIdle(m_device->device());
682
683 VkImageCreateInfo image_create_info = {};
684 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
685 image_create_info.pNext = NULL;
686 image_create_info.imageType = VK_IMAGE_TYPE_2D;
687 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
688 image_create_info.extent.width = 64;
689 image_create_info.extent.height = 64;
690 image_create_info.extent.depth = 1;
691 image_create_info.mipLevels = 1;
692 image_create_info.arrayLayers = 1;
693 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
694 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
695 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
696 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
697 image_create_info.queueFamilyIndexCount = 0;
698 image_create_info.pQueueFamilyIndices = NULL;
699 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
700 image_create_info.flags = 0;
701
702 VkMemoryAllocateInfo mem_alloc = {};
703 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
704 mem_alloc.pNext = NULL;
705 mem_alloc.allocationSize = 0;
706 mem_alloc.memoryTypeIndex = 0;
707
708 /* Create a mappable image. It will be the texture if linear images are ok
709 * to be textures or it will be the staging image if they are not.
710 */
711 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
712 ASSERT_VK_SUCCESS(err);
713
714 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
715
716 mem_alloc.allocationSize = mem_reqs.size;
717
718 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
719 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
720 if (!pass) {
721 vkDestroyImage(m_device->device(), image, NULL);
722 return;
723 }
724
725 // VALDIATION FAILURE:
726 err = vkBindImageMemory(m_device->device(), image, mem, 0);
727 ASSERT_VK_SUCCESS(err);
728
729 m_errorMonitor->VerifyNotFound();
730
731 vkDestroyBuffer(m_device->device(), buffer, NULL);
732 vkDestroyImage(m_device->device(), image, NULL);
733}
734
Ian Elliott1c32c772016-04-28 14:47:13 -0600735TEST_F(VkLayerTest, EnableWsiBeforeUse) {
736 VkResult err;
737 bool pass;
738
739 VkSurfaceKHR surface = VK_NULL_HANDLE;
740 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
741 VkSwapchainCreateInfoKHR swapchain_create_info = {};
742 uint32_t swapchain_image_count = 0;
743// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
744 uint32_t image_index = 0;
745// VkPresentInfoKHR present_info = {};
746
747 ASSERT_NO_FATAL_FAILURE(InitState());
748
Ian Elliott3f06ce52016-04-29 14:46:21 -0600749#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
750#if defined(VK_USE_PLATFORM_ANDROID_KHR)
751 // Use the functions from the VK_KHR_android_surface extension without
752 // enabling that extension:
753
754 // Create a surface:
755 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
756#if 0
757#endif
758 m_errorMonitor->SetDesiredFailureMsg(
759 VK_DEBUG_REPORT_ERROR_BIT_EXT,
760 "extension was not enabled for this");
761 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
762 &surface);
763 pass = (err != VK_SUCCESS);
764 ASSERT_TRUE(pass);
765 m_errorMonitor->VerifyFound();
766#endif // VK_USE_PLATFORM_ANDROID_KHR
767
768
769#if defined(VK_USE_PLATFORM_MIR_KHR)
770 // Use the functions from the VK_KHR_mir_surface extension without enabling
771 // that extension:
772
773 // Create a surface:
774 VkMirSurfaceCreateInfoKHR mir_create_info = {};
775#if 0
776#endif
777 m_errorMonitor->SetDesiredFailureMsg(
778 VK_DEBUG_REPORT_ERROR_BIT_EXT,
779 "extension was not enabled for this");
780 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
781 pass = (err != VK_SUCCESS);
782 ASSERT_TRUE(pass);
783 m_errorMonitor->VerifyFound();
784
785 // Tell whether an mir_connection supports presentation:
786 MirConnection *mir_connection = NULL;
787 m_errorMonitor->SetDesiredFailureMsg(
788 VK_DEBUG_REPORT_ERROR_BIT_EXT,
789 "extension was not enabled for this");
790 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
791 visual_id);
792 m_errorMonitor->VerifyFound();
793#endif // VK_USE_PLATFORM_MIR_KHR
794
795
796#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
797 // Use the functions from the VK_KHR_wayland_surface extension without
798 // enabling that extension:
799
800 // Create a surface:
801 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
802#if 0
803#endif
804 m_errorMonitor->SetDesiredFailureMsg(
805 VK_DEBUG_REPORT_ERROR_BIT_EXT,
806 "extension was not enabled for this");
807 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
808 &surface);
809 pass = (err != VK_SUCCESS);
810 ASSERT_TRUE(pass);
811 m_errorMonitor->VerifyFound();
812
813 // Tell whether an wayland_display supports presentation:
814 struct wl_display wayland_display = {};
815 m_errorMonitor->SetDesiredFailureMsg(
816 VK_DEBUG_REPORT_ERROR_BIT_EXT,
817 "extension was not enabled for this");
818 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
819 &wayland_display);
820 m_errorMonitor->VerifyFound();
821#endif // VK_USE_PLATFORM_WAYLAND_KHR
822
823
824#if defined(VK_USE_PLATFORM_WIN32_KHR)
825 // Use the functions from the VK_KHR_win32_surface extension without
826 // enabling that extension:
827
828 // Create a surface:
829 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
830#if 0
831#endif
832 m_errorMonitor->SetDesiredFailureMsg(
833 VK_DEBUG_REPORT_ERROR_BIT_EXT,
834 "extension was not enabled for this");
835 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
836 &surface);
837 pass = (err != VK_SUCCESS);
838 ASSERT_TRUE(pass);
839 m_errorMonitor->VerifyFound();
840
841 // Tell whether win32 supports presentation:
842 struct wl_display win32_display = {};
843 m_errorMonitor->SetDesiredFailureMsg(
844 VK_DEBUG_REPORT_ERROR_BIT_EXT,
845 "extension was not enabled for this");
846 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0,
847 &win32_display);
848 m_errorMonitor->VerifyFound();
849#endif // VK_USE_PLATFORM_WAYLAND_KHR
850#endif // NEED_TO_TEST_THIS_ON_PLATFORM
851
852
Ian Elliott1c32c772016-04-28 14:47:13 -0600853#if defined(VK_USE_PLATFORM_XCB_KHR)
854 // Use the functions from the VK_KHR_xcb_surface extension without enabling
855 // that extension:
856
857 // Create a surface:
858 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
859#if 0
860#endif
861 m_errorMonitor->SetDesiredFailureMsg(
862 VK_DEBUG_REPORT_ERROR_BIT_EXT,
863 "extension was not enabled for this");
864 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
865 pass = (err != VK_SUCCESS);
866 ASSERT_TRUE(pass);
867 m_errorMonitor->VerifyFound();
868
869 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -0600870 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -0600871 xcb_visualid_t visual_id = 0;
872 m_errorMonitor->SetDesiredFailureMsg(
873 VK_DEBUG_REPORT_ERROR_BIT_EXT,
874 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -0600875 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -0600876 visual_id);
877 m_errorMonitor->VerifyFound();
878#endif // VK_USE_PLATFORM_XCB_KHR
879
880
Ian Elliott12630812016-04-29 14:35:43 -0600881#if defined(VK_USE_PLATFORM_XLIB_KHR)
882 // Use the functions from the VK_KHR_xlib_surface extension without enabling
883 // that extension:
884
885 // Create a surface:
886 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
887#if 0
888#endif
889 m_errorMonitor->SetDesiredFailureMsg(
890 VK_DEBUG_REPORT_ERROR_BIT_EXT,
891 "extension was not enabled for this");
892 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
893 pass = (err != VK_SUCCESS);
894 ASSERT_TRUE(pass);
895 m_errorMonitor->VerifyFound();
896
897 // Tell whether an Xlib VisualID supports presentation:
898 Display *dpy = NULL;
899 VisualID visual = 0;
900 m_errorMonitor->SetDesiredFailureMsg(
901 VK_DEBUG_REPORT_ERROR_BIT_EXT,
902 "extension was not enabled for this");
903 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
904 m_errorMonitor->VerifyFound();
905#endif // VK_USE_PLATFORM_XLIB_KHR
906
907
Ian Elliott1c32c772016-04-28 14:47:13 -0600908 // Use the functions from the VK_KHR_surface extension without enabling
909 // that extension:
910
911 // Destroy a surface:
912 m_errorMonitor->SetDesiredFailureMsg(
913 VK_DEBUG_REPORT_ERROR_BIT_EXT,
914 "extension was not enabled for this");
915 vkDestroySurfaceKHR(instance(), surface, NULL);
916 m_errorMonitor->VerifyFound();
917
918 // Check if surface supports presentation:
919 VkBool32 supported = false;
920 m_errorMonitor->SetDesiredFailureMsg(
921 VK_DEBUG_REPORT_ERROR_BIT_EXT,
922 "extension was not enabled for this");
923 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
924 pass = (err != VK_SUCCESS);
925 ASSERT_TRUE(pass);
926 m_errorMonitor->VerifyFound();
927
928 // Check surface capabilities:
929 VkSurfaceCapabilitiesKHR capabilities = {};
930 m_errorMonitor->SetDesiredFailureMsg(
931 VK_DEBUG_REPORT_ERROR_BIT_EXT,
932 "extension was not enabled for this");
933 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
934 &capabilities);
935 pass = (err != VK_SUCCESS);
936 ASSERT_TRUE(pass);
937 m_errorMonitor->VerifyFound();
938
939 // Check surface formats:
940 uint32_t format_count = 0;
941 VkSurfaceFormatKHR *formats = NULL;
942 m_errorMonitor->SetDesiredFailureMsg(
943 VK_DEBUG_REPORT_ERROR_BIT_EXT,
944 "extension was not enabled for this");
945 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
946 &format_count, formats);
947 pass = (err != VK_SUCCESS);
948 ASSERT_TRUE(pass);
949 m_errorMonitor->VerifyFound();
950
951 // Check surface present modes:
952 uint32_t present_mode_count = 0;
953 VkSurfaceFormatKHR *present_modes = NULL;
954 m_errorMonitor->SetDesiredFailureMsg(
955 VK_DEBUG_REPORT_ERROR_BIT_EXT,
956 "extension was not enabled for this");
957 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
958 &present_mode_count, present_modes);
959 pass = (err != VK_SUCCESS);
960 ASSERT_TRUE(pass);
961 m_errorMonitor->VerifyFound();
962
963
964 // Use the functions from the VK_KHR_swapchain extension without enabling
965 // that extension:
966
967 // Create a swapchain:
968 m_errorMonitor->SetDesiredFailureMsg(
969 VK_DEBUG_REPORT_ERROR_BIT_EXT,
970 "extension was not enabled for this");
971 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
972 swapchain_create_info.pNext = NULL;
973#if 0
974 swapchain_create_info.flags = 0;
975 swapchain_create_info.surface = 0;
976 swapchain_create_info.minImageCount = 0;
977 swapchain_create_info.imageFormat = 0;
978 swapchain_create_info.imageColorSpace = 0;
979 swapchain_create_info.imageExtent.width = 0;
980 swapchain_create_info.imageExtent.height = 0;
981 swapchain_create_info.imageArrayLayers = 0;
982 swapchain_create_info.imageUsage = 0;
983 swapchain_create_info.imageSharingMode = 0;
984 swapchain_create_info.queueFamilyIndexCount = 0;
985 swapchain_create_info.preTransform = 0;
986 swapchain_create_info.compositeAlpha = 0;
987 swapchain_create_info.presentMode = 0;
988 swapchain_create_info.clipped = 0;
989 swapchain_create_info.oldSwapchain = NULL;
990#endif
991 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
992 NULL, &swapchain);
993 pass = (err != VK_SUCCESS);
994 ASSERT_TRUE(pass);
995 m_errorMonitor->VerifyFound();
996
997 // Get the images from the swapchain:
998 m_errorMonitor->SetDesiredFailureMsg(
999 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1000 "extension was not enabled for this");
1001 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
1002 &swapchain_image_count, NULL);
1003 pass = (err != VK_SUCCESS);
1004 ASSERT_TRUE(pass);
1005 m_errorMonitor->VerifyFound();
1006
1007 // Try to acquire an image:
1008 m_errorMonitor->SetDesiredFailureMsg(
1009 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1010 "extension was not enabled for this");
1011 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
1012 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
1013 pass = (err != VK_SUCCESS);
1014 ASSERT_TRUE(pass);
1015 m_errorMonitor->VerifyFound();
1016
1017 // Try to present an image:
1018#if 0 // NOTE: Currently can't test this because a real swapchain is needed
1019 // (as opposed to the fake one we created) in order for the layer to
1020 // lookup the VkDevice used to enable the extension:
1021 m_errorMonitor->SetDesiredFailureMsg(
1022 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1023 "extension was not enabled for this");
1024 present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
1025 present_info.pNext = NULL;
1026#if 0
1027#endif
1028 err = vkQueuePresentKHR(m_device->m_queue, &present_info);
1029 pass = (err != VK_SUCCESS);
1030 ASSERT_TRUE(pass);
1031 m_errorMonitor->VerifyFound();
1032#endif
1033
1034 // Destroy the swapchain:
1035 m_errorMonitor->SetDesiredFailureMsg(
1036 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1037 "extension was not enabled for this");
1038 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1039 m_errorMonitor->VerifyFound();
1040}
1041
Karl Schultz6addd812016-02-02 17:17:23 -07001042TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1043 VkResult err;
1044 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001045
Karl Schultz6addd812016-02-02 17:17:23 -07001046 m_errorMonitor->SetDesiredFailureMsg(
1047 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001048 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
1049
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001050 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001051
1052 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001053 VkImage image;
1054 VkDeviceMemory mem;
1055 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001056
Karl Schultz6addd812016-02-02 17:17:23 -07001057 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1058 const int32_t tex_width = 32;
1059 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001060
Tony Barboureb254902015-07-15 12:50:33 -06001061 VkImageCreateInfo image_create_info = {};
1062 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001063 image_create_info.pNext = NULL;
1064 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1065 image_create_info.format = tex_format;
1066 image_create_info.extent.width = tex_width;
1067 image_create_info.extent.height = tex_height;
1068 image_create_info.extent.depth = 1;
1069 image_create_info.mipLevels = 1;
1070 image_create_info.arrayLayers = 1;
1071 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1072 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1073 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1074 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001075
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001076 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001077 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001078 mem_alloc.pNext = NULL;
1079 mem_alloc.allocationSize = 0;
1080 // Introduce failure, do NOT set memProps to
1081 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
1082 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001083
Chia-I Wuf7458c52015-10-26 21:10:41 +08001084 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001085 ASSERT_VK_SUCCESS(err);
1086
Karl Schultz6addd812016-02-02 17:17:23 -07001087 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001088
Mark Lobodzinski23065352015-05-29 09:32:35 -05001089 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001090
Karl Schultz6addd812016-02-02 17:17:23 -07001091 pass =
1092 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
1093 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1094 if (!pass) { // If we can't find any unmappable memory this test doesn't
1095 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08001096 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06001097 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06001098 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06001099
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001100 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001101 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001102 ASSERT_VK_SUCCESS(err);
1103
1104 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06001105 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001106 ASSERT_VK_SUCCESS(err);
1107
1108 // Map memory as if to initialize the image
1109 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07001110 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
1111 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001112
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001113 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001114
Chia-I Wuf7458c52015-10-26 21:10:41 +08001115 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001116}
1117
Karl Schultz6addd812016-02-02 17:17:23 -07001118TEST_F(VkLayerTest, RebindMemory) {
1119 VkResult err;
1120 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001121
Karl Schultz6addd812016-02-02 17:17:23 -07001122 m_errorMonitor->SetDesiredFailureMsg(
1123 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001124 "which has already been bound to mem object");
1125
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001126 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001127
1128 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001129 VkImage image;
1130 VkDeviceMemory mem1;
1131 VkDeviceMemory mem2;
1132 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001133
Karl Schultz6addd812016-02-02 17:17:23 -07001134 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1135 const int32_t tex_width = 32;
1136 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001137
Tony Barboureb254902015-07-15 12:50:33 -06001138 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001139 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1140 image_create_info.pNext = NULL;
1141 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1142 image_create_info.format = tex_format;
1143 image_create_info.extent.width = tex_width;
1144 image_create_info.extent.height = tex_height;
1145 image_create_info.extent.depth = 1;
1146 image_create_info.mipLevels = 1;
1147 image_create_info.arrayLayers = 1;
1148 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1149 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1150 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1151 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001152
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001153 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001154 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1155 mem_alloc.pNext = NULL;
1156 mem_alloc.allocationSize = 0;
1157 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06001158
Karl Schultz6addd812016-02-02 17:17:23 -07001159 // Introduce failure, do NOT set memProps to
1160 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06001161 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08001162 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001163 ASSERT_VK_SUCCESS(err);
1164
Karl Schultz6addd812016-02-02 17:17:23 -07001165 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001166
1167 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001168 pass =
1169 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001170 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001171
1172 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001173 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001174 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001175 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001176 ASSERT_VK_SUCCESS(err);
1177
1178 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06001179 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001180 ASSERT_VK_SUCCESS(err);
1181
Karl Schultz6addd812016-02-02 17:17:23 -07001182 // Introduce validation failure, try to bind a different memory object to
1183 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06001184 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001185
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001186 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001187
Chia-I Wuf7458c52015-10-26 21:10:41 +08001188 vkDestroyImage(m_device->device(), image, NULL);
1189 vkFreeMemory(m_device->device(), mem1, NULL);
1190 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001191}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001192
Karl Schultz6addd812016-02-02 17:17:23 -07001193TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001194 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001195
Karl Schultz6addd812016-02-02 17:17:23 -07001196 m_errorMonitor->SetDesiredFailureMsg(
1197 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
1198 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001199
1200 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001201 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1202 fenceInfo.pNext = NULL;
1203 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06001204
Tony Barbour300a6082015-04-07 13:44:53 -06001205 ASSERT_NO_FATAL_FAILURE(InitState());
1206 ASSERT_NO_FATAL_FAILURE(InitViewport());
1207 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1208
Tony Barbourfe3351b2015-07-28 10:17:20 -06001209 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001210 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
1211 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001212 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06001213
1214 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001215
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001216 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001217 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1218 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001219 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001220 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001221 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001222 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001223 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001224 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001225 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001226
1227 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07001228 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001229
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001230 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001231}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001232// This is a positive test. We used to expect error in this case but spec now
1233// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07001234TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001235 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001236 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001237 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001238 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1239 fenceInfo.pNext = NULL;
1240
Tony Barbour0b4d9562015-04-09 10:48:04 -06001241 ASSERT_NO_FATAL_FAILURE(InitState());
1242 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08001243 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001244 VkResult result = vkResetFences(m_device->device(), 1, fences);
1245 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06001246
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001247 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06001248}
Tobin Ehlis41376e12015-07-03 08:45:14 -06001249
1250TEST_F(VkLayerTest, InvalidUsageBits)
1251{
Tony Barbourf92621a2016-05-02 14:28:12 -06001252 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001253 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06001254 "Initialize buffer with wrong usage then perform copy expecting errors "
1255 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001256 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001257 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06001258
1259 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06001260 VkImageObj image(m_device);
1261 // Initialize image with USAGE_INPUT_ATTACHMENT
1262 image.init(128, 128, VK_FORMAT_D32_SFLOAT_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001263 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1264 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06001265
Tony Barbourf92621a2016-05-02 14:28:12 -06001266 VkImageView dsv;
1267 VkImageViewCreateInfo dsvci = {};
1268 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1269 dsvci.image = image.handle();
1270 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
1271 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
1272 dsvci.subresourceRange.layerCount = 1;
1273 dsvci.subresourceRange.baseMipLevel = 0;
1274 dsvci.subresourceRange.levelCount = 1;
1275 dsvci.subresourceRange.aspectMask =
1276 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06001277
Tony Barbourf92621a2016-05-02 14:28:12 -06001278 // Create a view with depth / stencil aspect for image with different usage
1279 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001280
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001281 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06001282
1283 // Initialize buffer with TRANSFER_DST usage
1284 vk_testing::Buffer buffer;
1285 VkMemoryPropertyFlags reqs = 0;
1286 buffer.init_as_dst(*m_device, 128 * 128, reqs);
1287 VkBufferImageCopy region = {};
1288 region.bufferRowLength = 128;
1289 region.bufferImageHeight = 128;
1290 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1291 region.imageSubresource.layerCount = 1;
1292 region.imageExtent.height = 16;
1293 region.imageExtent.width = 16;
1294 region.imageExtent.depth = 1;
1295
1296 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1297 "Invalid usage flag for buffer ");
1298 // Buffer usage not set to TRANSFER_SRC and image usage not set to
1299 // TRANSFER_DST
1300 BeginCommandBuffer();
1301 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1302 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1303 1, &region);
1304 m_errorMonitor->VerifyFound();
1305
1306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1307 "Invalid usage flag for image ");
1308 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1309 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1310 1, &region);
1311 m_errorMonitor->VerifyFound();
1312
1313 vkDestroyImageView(m_device->device(), dsv, NULL);
Tobin Ehlis41376e12015-07-03 08:45:14 -06001314}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001315#endif // MEM_TRACKER_TESTS
1316
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06001317#if OBJ_TRACKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07001318TEST_F(VkLayerTest, PipelineNotBound) {
1319 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001320
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001322 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001323
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001324 ASSERT_NO_FATAL_FAILURE(InitState());
1325 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001326
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001327 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001328 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1329 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001330
1331 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001332 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1333 ds_pool_ci.pNext = NULL;
1334 ds_pool_ci.maxSets = 1;
1335 ds_pool_ci.poolSizeCount = 1;
1336 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001337
1338 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001339 err =
1340 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001341 ASSERT_VK_SUCCESS(err);
1342
1343 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001344 dsl_binding.binding = 0;
1345 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1346 dsl_binding.descriptorCount = 1;
1347 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1348 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001349
1350 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001351 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1352 ds_layout_ci.pNext = NULL;
1353 ds_layout_ci.bindingCount = 1;
1354 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001355
1356 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001357 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1358 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001359 ASSERT_VK_SUCCESS(err);
1360
1361 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001362 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001363 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001364 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001365 alloc_info.descriptorPool = ds_pool;
1366 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001367 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1368 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001369 ASSERT_VK_SUCCESS(err);
1370
1371 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001372 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1373 pipeline_layout_ci.pNext = NULL;
1374 pipeline_layout_ci.setLayoutCount = 1;
1375 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001376
1377 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001378 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1379 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001380 ASSERT_VK_SUCCESS(err);
1381
Mark Youngad779052016-01-06 14:26:04 -07001382 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001383
1384 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001385 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1386 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001387
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001388 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001389
Chia-I Wuf7458c52015-10-26 21:10:41 +08001390 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1391 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1392 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001393}
1394
Karl Schultz6addd812016-02-02 17:17:23 -07001395TEST_F(VkLayerTest, BindInvalidMemory) {
1396 VkResult err;
1397 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001398
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001399 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001400 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001401
Tobin Ehlisec598302015-09-15 15:02:17 -06001402 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001403
1404 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001405 VkImage image;
1406 VkDeviceMemory mem;
1407 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001408
Karl Schultz6addd812016-02-02 17:17:23 -07001409 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1410 const int32_t tex_width = 32;
1411 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001412
1413 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001414 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1415 image_create_info.pNext = NULL;
1416 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1417 image_create_info.format = tex_format;
1418 image_create_info.extent.width = tex_width;
1419 image_create_info.extent.height = tex_height;
1420 image_create_info.extent.depth = 1;
1421 image_create_info.mipLevels = 1;
1422 image_create_info.arrayLayers = 1;
1423 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1424 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1425 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1426 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001427
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001428 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001429 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1430 mem_alloc.pNext = NULL;
1431 mem_alloc.allocationSize = 0;
1432 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001433
Chia-I Wuf7458c52015-10-26 21:10:41 +08001434 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001435 ASSERT_VK_SUCCESS(err);
1436
Karl Schultz6addd812016-02-02 17:17:23 -07001437 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001438
1439 mem_alloc.allocationSize = mem_reqs.size;
1440
Karl Schultz6addd812016-02-02 17:17:23 -07001441 pass =
1442 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001443 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001444
1445 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001446 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001447 ASSERT_VK_SUCCESS(err);
1448
1449 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001450 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001451
1452 // Try to bind free memory that has been freed
1453 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1454 // This may very well return an error.
1455 (void)err;
1456
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001457 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001458
Chia-I Wuf7458c52015-10-26 21:10:41 +08001459 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001460}
1461
Karl Schultz6addd812016-02-02 17:17:23 -07001462TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1463 VkResult err;
1464 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001465
Karl Schultz6addd812016-02-02 17:17:23 -07001466 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1467 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001468
Tobin Ehlisec598302015-09-15 15:02:17 -06001469 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001470
Karl Schultz6addd812016-02-02 17:17:23 -07001471 // Create an image object, allocate memory, destroy the object and then try
1472 // to bind it
1473 VkImage image;
1474 VkDeviceMemory mem;
1475 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001476
Karl Schultz6addd812016-02-02 17:17:23 -07001477 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1478 const int32_t tex_width = 32;
1479 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001480
1481 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001482 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1483 image_create_info.pNext = NULL;
1484 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1485 image_create_info.format = tex_format;
1486 image_create_info.extent.width = tex_width;
1487 image_create_info.extent.height = tex_height;
1488 image_create_info.extent.depth = 1;
1489 image_create_info.mipLevels = 1;
1490 image_create_info.arrayLayers = 1;
1491 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1492 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1493 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1494 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001495
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001496 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001497 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1498 mem_alloc.pNext = NULL;
1499 mem_alloc.allocationSize = 0;
1500 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001501
Chia-I Wuf7458c52015-10-26 21:10:41 +08001502 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001503 ASSERT_VK_SUCCESS(err);
1504
Karl Schultz6addd812016-02-02 17:17:23 -07001505 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001506
1507 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001508 pass =
1509 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001510 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001511
1512 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001513 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001514 ASSERT_VK_SUCCESS(err);
1515
1516 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001517 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001518 ASSERT_VK_SUCCESS(err);
1519
1520 // Now Try to bind memory to this destroyed object
1521 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1522 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001523 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001524
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001525 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001526
Chia-I Wuf7458c52015-10-26 21:10:41 +08001527 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001528}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001529
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001530#endif // OBJ_TRACKER_TESTS
1531
Tobin Ehlis0788f522015-05-26 16:11:58 -06001532#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001533
1534// This is a positive test. No errors should be generated.
1535TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
1536
1537 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1538 "submitted on separate queues followed by a QueueWaitIdle.");
1539
Dustin Graves48458142016-04-29 16:11:55 -06001540 if ((m_device->queue_props.empty()) ||
1541 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001542 return;
1543
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001544 m_errorMonitor->ExpectSuccess();
1545
1546 VkSemaphore semaphore;
1547 VkSemaphoreCreateInfo semaphore_create_info{};
1548 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1549 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1550 &semaphore);
1551
1552 VkCommandPool command_pool;
1553 VkCommandPoolCreateInfo pool_create_info{};
1554 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1555 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1556 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1557 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1558 &command_pool);
1559
1560 VkCommandBuffer command_buffer[2];
1561 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1562 command_buffer_allocate_info.sType =
1563 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1564 command_buffer_allocate_info.commandPool = command_pool;
1565 command_buffer_allocate_info.commandBufferCount = 2;
1566 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1567 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1568 command_buffer);
1569
1570 VkQueue queue = VK_NULL_HANDLE;
1571 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1572 1, &queue);
1573
1574 {
1575 VkCommandBufferBeginInfo begin_info{};
1576 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1577 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1578
1579 vkCmdPipelineBarrier(command_buffer[0],
1580 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1581 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1582 0, nullptr, 0, nullptr);
1583
1584 VkViewport viewport{};
1585 viewport.maxDepth = 1.0f;
1586 viewport.minDepth = 0.0f;
1587 viewport.width = 512;
1588 viewport.height = 512;
1589 viewport.x = 0;
1590 viewport.y = 0;
1591 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1592 vkEndCommandBuffer(command_buffer[0]);
1593 }
1594 {
1595 VkCommandBufferBeginInfo begin_info{};
1596 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1597 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1598
1599 VkViewport viewport{};
1600 viewport.maxDepth = 1.0f;
1601 viewport.minDepth = 0.0f;
1602 viewport.width = 512;
1603 viewport.height = 512;
1604 viewport.x = 0;
1605 viewport.y = 0;
1606 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1607 vkEndCommandBuffer(command_buffer[1]);
1608 }
1609 {
1610 VkSubmitInfo submit_info{};
1611 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1612 submit_info.commandBufferCount = 1;
1613 submit_info.pCommandBuffers = &command_buffer[0];
1614 submit_info.signalSemaphoreCount = 1;
1615 submit_info.pSignalSemaphores = &semaphore;
1616 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1617 }
1618 {
1619 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1620 VkSubmitInfo submit_info{};
1621 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1622 submit_info.commandBufferCount = 1;
1623 submit_info.pCommandBuffers = &command_buffer[1];
1624 submit_info.waitSemaphoreCount = 1;
1625 submit_info.pWaitSemaphores = &semaphore;
1626 submit_info.pWaitDstStageMask = flags;
1627 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1628 }
1629
1630 vkQueueWaitIdle(m_device->m_queue);
1631
1632 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1633 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1634 &command_buffer[0]);
1635 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1636
1637 m_errorMonitor->VerifyNotFound();
1638}
1639
1640// This is a positive test. No errors should be generated.
1641TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
1642
1643 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1644 "submitted on separate queues, the second having a fence"
1645 "followed by a QueueWaitIdle.");
1646
Dustin Graves48458142016-04-29 16:11:55 -06001647 if ((m_device->queue_props.empty()) ||
1648 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001649 return;
1650
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001651 m_errorMonitor->ExpectSuccess();
1652
1653 VkFence fence;
1654 VkFenceCreateInfo fence_create_info{};
1655 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1656 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1657
1658 VkSemaphore semaphore;
1659 VkSemaphoreCreateInfo semaphore_create_info{};
1660 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1661 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1662 &semaphore);
1663
1664 VkCommandPool command_pool;
1665 VkCommandPoolCreateInfo pool_create_info{};
1666 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1667 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1668 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1669 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1670 &command_pool);
1671
1672 VkCommandBuffer command_buffer[2];
1673 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1674 command_buffer_allocate_info.sType =
1675 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1676 command_buffer_allocate_info.commandPool = command_pool;
1677 command_buffer_allocate_info.commandBufferCount = 2;
1678 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1679 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1680 command_buffer);
1681
1682 VkQueue queue = VK_NULL_HANDLE;
1683 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1684 1, &queue);
1685
1686 {
1687 VkCommandBufferBeginInfo begin_info{};
1688 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1689 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1690
1691 vkCmdPipelineBarrier(command_buffer[0],
1692 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1693 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1694 0, nullptr, 0, nullptr);
1695
1696 VkViewport viewport{};
1697 viewport.maxDepth = 1.0f;
1698 viewport.minDepth = 0.0f;
1699 viewport.width = 512;
1700 viewport.height = 512;
1701 viewport.x = 0;
1702 viewport.y = 0;
1703 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1704 vkEndCommandBuffer(command_buffer[0]);
1705 }
1706 {
1707 VkCommandBufferBeginInfo begin_info{};
1708 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1709 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1710
1711 VkViewport viewport{};
1712 viewport.maxDepth = 1.0f;
1713 viewport.minDepth = 0.0f;
1714 viewport.width = 512;
1715 viewport.height = 512;
1716 viewport.x = 0;
1717 viewport.y = 0;
1718 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1719 vkEndCommandBuffer(command_buffer[1]);
1720 }
1721 {
1722 VkSubmitInfo submit_info{};
1723 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1724 submit_info.commandBufferCount = 1;
1725 submit_info.pCommandBuffers = &command_buffer[0];
1726 submit_info.signalSemaphoreCount = 1;
1727 submit_info.pSignalSemaphores = &semaphore;
1728 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1729 }
1730 {
1731 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1732 VkSubmitInfo submit_info{};
1733 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1734 submit_info.commandBufferCount = 1;
1735 submit_info.pCommandBuffers = &command_buffer[1];
1736 submit_info.waitSemaphoreCount = 1;
1737 submit_info.pWaitSemaphores = &semaphore;
1738 submit_info.pWaitDstStageMask = flags;
1739 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1740 }
1741
1742 vkQueueWaitIdle(m_device->m_queue);
1743
1744 vkDestroyFence(m_device->device(), fence, nullptr);
1745 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1746 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1747 &command_buffer[0]);
1748 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1749
1750 m_errorMonitor->VerifyNotFound();
1751}
1752
1753// This is a positive test. No errors should be generated.
1754TEST_F(VkLayerTest,
1755 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
1756
1757 TEST_DESCRIPTION(
1758 "Two command buffers, each in a separate QueueSubmit call "
1759 "submitted on separate queues, the second having a fence"
1760 "followed by two consecutive WaitForFences calls on the same fence.");
1761
Dustin Graves48458142016-04-29 16:11:55 -06001762 if ((m_device->queue_props.empty()) ||
1763 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001764 return;
1765
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001766 m_errorMonitor->ExpectSuccess();
1767
1768 VkFence fence;
1769 VkFenceCreateInfo fence_create_info{};
1770 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1771 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1772
1773 VkSemaphore semaphore;
1774 VkSemaphoreCreateInfo semaphore_create_info{};
1775 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1776 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1777 &semaphore);
1778
1779 VkCommandPool command_pool;
1780 VkCommandPoolCreateInfo pool_create_info{};
1781 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1782 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1783 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1784 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1785 &command_pool);
1786
1787 VkCommandBuffer command_buffer[2];
1788 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1789 command_buffer_allocate_info.sType =
1790 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1791 command_buffer_allocate_info.commandPool = command_pool;
1792 command_buffer_allocate_info.commandBufferCount = 2;
1793 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1794 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1795 command_buffer);
1796
1797 VkQueue queue = VK_NULL_HANDLE;
1798 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1799 1, &queue);
1800
1801 {
1802 VkCommandBufferBeginInfo begin_info{};
1803 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1804 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1805
1806 vkCmdPipelineBarrier(command_buffer[0],
1807 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1808 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1809 0, nullptr, 0, nullptr);
1810
1811 VkViewport viewport{};
1812 viewport.maxDepth = 1.0f;
1813 viewport.minDepth = 0.0f;
1814 viewport.width = 512;
1815 viewport.height = 512;
1816 viewport.x = 0;
1817 viewport.y = 0;
1818 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1819 vkEndCommandBuffer(command_buffer[0]);
1820 }
1821 {
1822 VkCommandBufferBeginInfo begin_info{};
1823 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1824 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1825
1826 VkViewport viewport{};
1827 viewport.maxDepth = 1.0f;
1828 viewport.minDepth = 0.0f;
1829 viewport.width = 512;
1830 viewport.height = 512;
1831 viewport.x = 0;
1832 viewport.y = 0;
1833 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1834 vkEndCommandBuffer(command_buffer[1]);
1835 }
1836 {
1837 VkSubmitInfo submit_info{};
1838 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1839 submit_info.commandBufferCount = 1;
1840 submit_info.pCommandBuffers = &command_buffer[0];
1841 submit_info.signalSemaphoreCount = 1;
1842 submit_info.pSignalSemaphores = &semaphore;
1843 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1844 }
1845 {
1846 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1847 VkSubmitInfo submit_info{};
1848 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1849 submit_info.commandBufferCount = 1;
1850 submit_info.pCommandBuffers = &command_buffer[1];
1851 submit_info.waitSemaphoreCount = 1;
1852 submit_info.pWaitSemaphores = &semaphore;
1853 submit_info.pWaitDstStageMask = flags;
1854 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1855 }
1856
1857 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1858 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1859
1860 vkDestroyFence(m_device->device(), fence, nullptr);
1861 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1862 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1863 &command_buffer[0]);
1864 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1865
1866 m_errorMonitor->VerifyNotFound();
1867}
1868
1869// This is a positive test. No errors should be generated.
1870TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
1871
1872 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1873 "submitted on separate queues, the second having a fence, "
1874 "followed by a WaitForFences call.");
1875
Dustin Graves48458142016-04-29 16:11:55 -06001876 if ((m_device->queue_props.empty()) ||
1877 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001878 return;
1879
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001880 m_errorMonitor->ExpectSuccess();
1881
1882 VkFence fence;
1883 VkFenceCreateInfo fence_create_info{};
1884 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1885 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1886
1887 VkSemaphore semaphore;
1888 VkSemaphoreCreateInfo semaphore_create_info{};
1889 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1890 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1891 &semaphore);
1892
1893 VkCommandPool command_pool;
1894 VkCommandPoolCreateInfo pool_create_info{};
1895 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1896 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1897 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1898 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1899 &command_pool);
1900
1901 VkCommandBuffer command_buffer[2];
1902 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1903 command_buffer_allocate_info.sType =
1904 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1905 command_buffer_allocate_info.commandPool = command_pool;
1906 command_buffer_allocate_info.commandBufferCount = 2;
1907 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1908 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1909 command_buffer);
1910
1911 VkQueue queue = VK_NULL_HANDLE;
1912 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1913 1, &queue);
1914
1915
1916 {
1917 VkCommandBufferBeginInfo begin_info{};
1918 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1919 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1920
1921 vkCmdPipelineBarrier(command_buffer[0],
1922 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1923 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1924 0, nullptr, 0, nullptr);
1925
1926 VkViewport viewport{};
1927 viewport.maxDepth = 1.0f;
1928 viewport.minDepth = 0.0f;
1929 viewport.width = 512;
1930 viewport.height = 512;
1931 viewport.x = 0;
1932 viewport.y = 0;
1933 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1934 vkEndCommandBuffer(command_buffer[0]);
1935 }
1936 {
1937 VkCommandBufferBeginInfo begin_info{};
1938 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1939 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1940
1941 VkViewport viewport{};
1942 viewport.maxDepth = 1.0f;
1943 viewport.minDepth = 0.0f;
1944 viewport.width = 512;
1945 viewport.height = 512;
1946 viewport.x = 0;
1947 viewport.y = 0;
1948 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1949 vkEndCommandBuffer(command_buffer[1]);
1950 }
1951 {
1952 VkSubmitInfo submit_info{};
1953 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1954 submit_info.commandBufferCount = 1;
1955 submit_info.pCommandBuffers = &command_buffer[0];
1956 submit_info.signalSemaphoreCount = 1;
1957 submit_info.pSignalSemaphores = &semaphore;
1958 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1959 }
1960 {
1961 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1962 VkSubmitInfo submit_info{};
1963 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1964 submit_info.commandBufferCount = 1;
1965 submit_info.pCommandBuffers = &command_buffer[1];
1966 submit_info.waitSemaphoreCount = 1;
1967 submit_info.pWaitSemaphores = &semaphore;
1968 submit_info.pWaitDstStageMask = flags;
1969 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1970 }
1971
1972 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1973
1974 vkDestroyFence(m_device->device(), fence, nullptr);
1975 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1976 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1977 &command_buffer[0]);
1978 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1979
1980 m_errorMonitor->VerifyNotFound();
1981}
1982
1983// This is a positive test. No errors should be generated.
1984TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
1985
1986 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1987 "on the same queue, sharing a signal/wait semaphore, the "
1988 "second having a fence, "
1989 "followed by a WaitForFences call.");
1990
1991 m_errorMonitor->ExpectSuccess();
1992
1993 VkFence fence;
1994 VkFenceCreateInfo fence_create_info{};
1995 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1996 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1997
1998 VkSemaphore semaphore;
1999 VkSemaphoreCreateInfo semaphore_create_info{};
2000 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2001 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2002 &semaphore);
2003
2004 VkCommandPool command_pool;
2005 VkCommandPoolCreateInfo pool_create_info{};
2006 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2007 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2008 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2009 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2010 &command_pool);
2011
2012 VkCommandBuffer command_buffer[2];
2013 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2014 command_buffer_allocate_info.sType =
2015 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2016 command_buffer_allocate_info.commandPool = command_pool;
2017 command_buffer_allocate_info.commandBufferCount = 2;
2018 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2019 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2020 command_buffer);
2021
2022 {
2023 VkCommandBufferBeginInfo begin_info{};
2024 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2025 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2026
2027 vkCmdPipelineBarrier(command_buffer[0],
2028 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2029 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2030 0, nullptr, 0, nullptr);
2031
2032 VkViewport viewport{};
2033 viewport.maxDepth = 1.0f;
2034 viewport.minDepth = 0.0f;
2035 viewport.width = 512;
2036 viewport.height = 512;
2037 viewport.x = 0;
2038 viewport.y = 0;
2039 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2040 vkEndCommandBuffer(command_buffer[0]);
2041 }
2042 {
2043 VkCommandBufferBeginInfo begin_info{};
2044 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2045 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2046
2047 VkViewport viewport{};
2048 viewport.maxDepth = 1.0f;
2049 viewport.minDepth = 0.0f;
2050 viewport.width = 512;
2051 viewport.height = 512;
2052 viewport.x = 0;
2053 viewport.y = 0;
2054 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2055 vkEndCommandBuffer(command_buffer[1]);
2056 }
2057 {
2058 VkSubmitInfo submit_info{};
2059 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2060 submit_info.commandBufferCount = 1;
2061 submit_info.pCommandBuffers = &command_buffer[0];
2062 submit_info.signalSemaphoreCount = 1;
2063 submit_info.pSignalSemaphores = &semaphore;
2064 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2065 }
2066 {
2067 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2068 VkSubmitInfo submit_info{};
2069 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2070 submit_info.commandBufferCount = 1;
2071 submit_info.pCommandBuffers = &command_buffer[1];
2072 submit_info.waitSemaphoreCount = 1;
2073 submit_info.pWaitSemaphores = &semaphore;
2074 submit_info.pWaitDstStageMask = flags;
2075 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2076 }
2077
2078 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2079
2080 vkDestroyFence(m_device->device(), fence, nullptr);
2081 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2082 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2083 &command_buffer[0]);
2084 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2085
2086 m_errorMonitor->VerifyNotFound();
2087}
2088
2089// This is a positive test. No errors should be generated.
2090TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
2091
2092 TEST_DESCRIPTION(
2093 "Two command buffers, each in a separate QueueSubmit call "
2094 "on the same queue, no fences, followed by a third QueueSubmit with NO "
2095 "SubmitInfos but with a fence, followed by a WaitForFences call.");
2096
2097 m_errorMonitor->ExpectSuccess();
2098
2099 VkFence fence;
2100 VkFenceCreateInfo fence_create_info{};
2101 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2102 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2103
2104 VkCommandPool command_pool;
2105 VkCommandPoolCreateInfo pool_create_info{};
2106 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2107 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2108 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2109 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2110 &command_pool);
2111
2112 VkCommandBuffer command_buffer[2];
2113 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2114 command_buffer_allocate_info.sType =
2115 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2116 command_buffer_allocate_info.commandPool = command_pool;
2117 command_buffer_allocate_info.commandBufferCount = 2;
2118 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2119 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2120 command_buffer);
2121
2122 {
2123 VkCommandBufferBeginInfo begin_info{};
2124 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2125 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2126
2127 vkCmdPipelineBarrier(command_buffer[0],
2128 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2129 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2130 0, nullptr, 0, nullptr);
2131
2132 VkViewport viewport{};
2133 viewport.maxDepth = 1.0f;
2134 viewport.minDepth = 0.0f;
2135 viewport.width = 512;
2136 viewport.height = 512;
2137 viewport.x = 0;
2138 viewport.y = 0;
2139 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2140 vkEndCommandBuffer(command_buffer[0]);
2141 }
2142 {
2143 VkCommandBufferBeginInfo begin_info{};
2144 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2145 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2146
2147 VkViewport viewport{};
2148 viewport.maxDepth = 1.0f;
2149 viewport.minDepth = 0.0f;
2150 viewport.width = 512;
2151 viewport.height = 512;
2152 viewport.x = 0;
2153 viewport.y = 0;
2154 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2155 vkEndCommandBuffer(command_buffer[1]);
2156 }
2157 {
2158 VkSubmitInfo submit_info{};
2159 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2160 submit_info.commandBufferCount = 1;
2161 submit_info.pCommandBuffers = &command_buffer[0];
2162 submit_info.signalSemaphoreCount = 0;
2163 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2164 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2165 }
2166 {
2167 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2168 VkSubmitInfo submit_info{};
2169 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2170 submit_info.commandBufferCount = 1;
2171 submit_info.pCommandBuffers = &command_buffer[1];
2172 submit_info.waitSemaphoreCount = 0;
2173 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2174 submit_info.pWaitDstStageMask = flags;
2175 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2176 }
2177
2178 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
2179
2180 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2181
2182 vkDestroyFence(m_device->device(), fence, nullptr);
2183 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2184 &command_buffer[0]);
2185 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2186
2187 m_errorMonitor->VerifyNotFound();
2188}
2189
2190// This is a positive test. No errors should be generated.
2191TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
2192
2193 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2194 "on the same queue, the second having a fence, followed "
2195 "by a WaitForFences call.");
2196
2197 m_errorMonitor->ExpectSuccess();
2198
2199 VkFence fence;
2200 VkFenceCreateInfo fence_create_info{};
2201 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2202 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2203
2204 VkCommandPool command_pool;
2205 VkCommandPoolCreateInfo pool_create_info{};
2206 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2207 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2208 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2209 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2210 &command_pool);
2211
2212 VkCommandBuffer command_buffer[2];
2213 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2214 command_buffer_allocate_info.sType =
2215 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2216 command_buffer_allocate_info.commandPool = command_pool;
2217 command_buffer_allocate_info.commandBufferCount = 2;
2218 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2219 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2220 command_buffer);
2221
2222 {
2223 VkCommandBufferBeginInfo begin_info{};
2224 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2225 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2226
2227 vkCmdPipelineBarrier(command_buffer[0],
2228 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2229 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2230 0, nullptr, 0, nullptr);
2231
2232 VkViewport viewport{};
2233 viewport.maxDepth = 1.0f;
2234 viewport.minDepth = 0.0f;
2235 viewport.width = 512;
2236 viewport.height = 512;
2237 viewport.x = 0;
2238 viewport.y = 0;
2239 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2240 vkEndCommandBuffer(command_buffer[0]);
2241 }
2242 {
2243 VkCommandBufferBeginInfo begin_info{};
2244 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2245 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2246
2247 VkViewport viewport{};
2248 viewport.maxDepth = 1.0f;
2249 viewport.minDepth = 0.0f;
2250 viewport.width = 512;
2251 viewport.height = 512;
2252 viewport.x = 0;
2253 viewport.y = 0;
2254 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2255 vkEndCommandBuffer(command_buffer[1]);
2256 }
2257 {
2258 VkSubmitInfo submit_info{};
2259 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2260 submit_info.commandBufferCount = 1;
2261 submit_info.pCommandBuffers = &command_buffer[0];
2262 submit_info.signalSemaphoreCount = 0;
2263 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2264 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2265 }
2266 {
2267 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2268 VkSubmitInfo submit_info{};
2269 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2270 submit_info.commandBufferCount = 1;
2271 submit_info.pCommandBuffers = &command_buffer[1];
2272 submit_info.waitSemaphoreCount = 0;
2273 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2274 submit_info.pWaitDstStageMask = flags;
2275 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2276 }
2277
2278 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2279
2280 vkDestroyFence(m_device->device(), fence, nullptr);
2281 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2282 &command_buffer[0]);
2283 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2284
2285 m_errorMonitor->VerifyNotFound();
2286}
2287
2288// This is a positive test. No errors should be generated.
2289TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
2290
2291 TEST_DESCRIPTION(
2292 "Two command buffers each in a separate SubmitInfo sent in a single "
2293 "QueueSubmit call followed by a WaitForFences call.");
2294
2295 m_errorMonitor->ExpectSuccess();
2296
2297 VkFence fence;
2298 VkFenceCreateInfo fence_create_info{};
2299 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2300 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2301
2302 VkSemaphore semaphore;
2303 VkSemaphoreCreateInfo semaphore_create_info{};
2304 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2305 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2306 &semaphore);
2307
2308 VkCommandPool command_pool;
2309 VkCommandPoolCreateInfo pool_create_info{};
2310 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2311 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2312 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2313 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2314 &command_pool);
2315
2316 VkCommandBuffer command_buffer[2];
2317 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2318 command_buffer_allocate_info.sType =
2319 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2320 command_buffer_allocate_info.commandPool = command_pool;
2321 command_buffer_allocate_info.commandBufferCount = 2;
2322 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2323 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2324 command_buffer);
2325
2326 {
2327 VkCommandBufferBeginInfo begin_info{};
2328 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2329 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2330
2331 vkCmdPipelineBarrier(command_buffer[0],
2332 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2333 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2334 0, nullptr, 0, nullptr);
2335
2336 VkViewport viewport{};
2337 viewport.maxDepth = 1.0f;
2338 viewport.minDepth = 0.0f;
2339 viewport.width = 512;
2340 viewport.height = 512;
2341 viewport.x = 0;
2342 viewport.y = 0;
2343 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2344 vkEndCommandBuffer(command_buffer[0]);
2345 }
2346 {
2347 VkCommandBufferBeginInfo begin_info{};
2348 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2349 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2350
2351 VkViewport viewport{};
2352 viewport.maxDepth = 1.0f;
2353 viewport.minDepth = 0.0f;
2354 viewport.width = 512;
2355 viewport.height = 512;
2356 viewport.x = 0;
2357 viewport.y = 0;
2358 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2359 vkEndCommandBuffer(command_buffer[1]);
2360 }
2361 {
2362 VkSubmitInfo submit_info[2];
2363 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2364
2365 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2366 submit_info[0].pNext = NULL;
2367 submit_info[0].commandBufferCount = 1;
2368 submit_info[0].pCommandBuffers = &command_buffer[0];
2369 submit_info[0].signalSemaphoreCount = 1;
2370 submit_info[0].pSignalSemaphores = &semaphore;
2371 submit_info[0].waitSemaphoreCount = 0;
2372 submit_info[0].pWaitSemaphores = NULL;
2373 submit_info[0].pWaitDstStageMask = 0;
2374
2375 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2376 submit_info[1].pNext = NULL;
2377 submit_info[1].commandBufferCount = 1;
2378 submit_info[1].pCommandBuffers = &command_buffer[1];
2379 submit_info[1].waitSemaphoreCount = 1;
2380 submit_info[1].pWaitSemaphores = &semaphore;
2381 submit_info[1].pWaitDstStageMask = flags;
2382 submit_info[1].signalSemaphoreCount = 0;
2383 submit_info[1].pSignalSemaphores = NULL;
2384 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
2385 }
2386
2387 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2388
2389 vkDestroyFence(m_device->device(), fence, nullptr);
2390 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2391 &command_buffer[0]);
2392 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2393
2394 m_errorMonitor->VerifyNotFound();
2395}
2396
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002397TEST_F(VkLayerTest, DynamicStatesNotBound) {
2398 TEST_DESCRIPTION(
2399 "Run a series of simple draw calls to validate all the different "
2400 "failure cases that can occur when dynamic state is required but not "
2401 "correctly bound."
2402 "Here are the different dynamic state cases verified by this test:\n"
2403 "-Line Width\n-Depth Bias\n-Viewport State\n-Scissor State\n-Blend "
2404 "State\n-Depth Bounds\n-Stencil Read Mask\n-Stencil Write "
2405 "Mask\n-Stencil Reference");
2406
2407 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07002408 m_errorMonitor->SetDesiredFailureMsg(
2409 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002410 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002411 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2412 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002413 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002414 // Dynamic depth bias
Karl Schultz6addd812016-02-02 17:17:23 -07002415 m_errorMonitor->SetDesiredFailureMsg(
2416 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002417 "Dynamic depth bias state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002418 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2419 BsoFailDepthBias);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002420 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002421 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07002422 m_errorMonitor->SetDesiredFailureMsg(
2423 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002424 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002425 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2426 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002427 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002428 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07002429 m_errorMonitor->SetDesiredFailureMsg(
2430 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002431 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002432 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2433 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002434 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002435 // Dynamic blend state
Karl Schultz6addd812016-02-02 17:17:23 -07002436 m_errorMonitor->SetDesiredFailureMsg(
2437 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002438 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002439 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2440 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002441 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002442 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07002443 m_errorMonitor->SetDesiredFailureMsg(
2444 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002445 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002446 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2447 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002448 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002449 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07002450 m_errorMonitor->SetDesiredFailureMsg(
2451 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002452 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002453 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2454 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002455 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002456 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07002457 m_errorMonitor->SetDesiredFailureMsg(
2458 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002459 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002460 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2461 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002462 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002463}
2464
Karl Schultz6addd812016-02-02 17:17:23 -07002465TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002466 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002467
Karl Schultz6addd812016-02-02 17:17:23 -07002468 m_errorMonitor->SetDesiredFailureMsg(
2469 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2470 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
2471 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002472
2473 VkFenceCreateInfo fenceInfo = {};
2474 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2475 fenceInfo.pNext = NULL;
2476 fenceInfo.flags = 0;
2477
2478 ASSERT_NO_FATAL_FAILURE(InitState());
2479 ASSERT_NO_FATAL_FAILURE(InitViewport());
2480 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2481
Karl Schultz6addd812016-02-02 17:17:23 -07002482 // We luck out b/c by default the framework creates CB w/ the
2483 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002484 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002485 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2486 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002487 EndCommandBuffer();
2488
2489 testFence.init(*m_device, fenceInfo);
2490
2491 // Bypass framework since it does the waits automatically
2492 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002493 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002494 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2495 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002496 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002497 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002498 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002499 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002500 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002501 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002502 submit_info.pSignalSemaphores = NULL;
2503
Karl Schultz6addd812016-02-02 17:17:23 -07002504 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
2505 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002506
Karl Schultz6addd812016-02-02 17:17:23 -07002507 // Cause validation error by re-submitting cmd buffer that should only be
2508 // submitted once
2509 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002510
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002511 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002512}
2513
Karl Schultz6addd812016-02-02 17:17:23 -07002514TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002515 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07002516 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002517
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002518 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002519 "Unable to allocate 1 descriptors of "
2520 "type "
2521 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002522
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002523 ASSERT_NO_FATAL_FAILURE(InitState());
2524 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002525
Karl Schultz6addd812016-02-02 17:17:23 -07002526 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
2527 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002528 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002529 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2530 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002531
2532 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002533 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2534 ds_pool_ci.pNext = NULL;
2535 ds_pool_ci.flags = 0;
2536 ds_pool_ci.maxSets = 1;
2537 ds_pool_ci.poolSizeCount = 1;
2538 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002539
2540 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002541 err =
2542 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002543 ASSERT_VK_SUCCESS(err);
2544
2545 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002546 dsl_binding.binding = 0;
2547 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2548 dsl_binding.descriptorCount = 1;
2549 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2550 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002551
2552 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002553 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2554 ds_layout_ci.pNext = NULL;
2555 ds_layout_ci.bindingCount = 1;
2556 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002557
2558 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002559 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2560 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002561 ASSERT_VK_SUCCESS(err);
2562
2563 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002564 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002565 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002566 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002567 alloc_info.descriptorPool = ds_pool;
2568 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002569 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2570 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002571
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002572 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002573
Chia-I Wuf7458c52015-10-26 21:10:41 +08002574 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2575 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002576}
2577
Karl Schultz6addd812016-02-02 17:17:23 -07002578TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
2579 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06002580
Karl Schultz6addd812016-02-02 17:17:23 -07002581 m_errorMonitor->SetDesiredFailureMsg(
2582 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2583 "It is invalid to call vkFreeDescriptorSets() with a pool created "
2584 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002585
Tobin Ehlise735c692015-10-08 13:13:50 -06002586 ASSERT_NO_FATAL_FAILURE(InitState());
2587 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06002588
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002589 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002590 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2591 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06002592
2593 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002594 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2595 ds_pool_ci.pNext = NULL;
2596 ds_pool_ci.maxSets = 1;
2597 ds_pool_ci.poolSizeCount = 1;
2598 ds_pool_ci.flags = 0;
2599 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
2600 // app can only call vkResetDescriptorPool on this pool.;
2601 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06002602
2603 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002604 err =
2605 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06002606 ASSERT_VK_SUCCESS(err);
2607
2608 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002609 dsl_binding.binding = 0;
2610 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2611 dsl_binding.descriptorCount = 1;
2612 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2613 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06002614
2615 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002616 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2617 ds_layout_ci.pNext = NULL;
2618 ds_layout_ci.bindingCount = 1;
2619 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06002620
2621 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002622 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2623 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06002624 ASSERT_VK_SUCCESS(err);
2625
2626 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002627 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002628 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002629 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002630 alloc_info.descriptorPool = ds_pool;
2631 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002632 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2633 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06002634 ASSERT_VK_SUCCESS(err);
2635
2636 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002637 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06002638
Chia-I Wuf7458c52015-10-26 21:10:41 +08002639 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2640 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06002641}
2642
Karl Schultz6addd812016-02-02 17:17:23 -07002643TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002644 // Attempt to clear Descriptor Pool with bad object.
2645 // ObjectTracker should catch this.
2646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2647 "Invalid VkDescriptorPool Object 0xbaad6001");
2648 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
2649 vkResetDescriptorPool(device(), badPool, 0);
2650 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002651}
2652
Karl Schultz6addd812016-02-02 17:17:23 -07002653TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002654 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
2655 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002656 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06002657 // call vkCmdBindDescriptorSets w/ false Descriptor Set
2658 VkDescriptorSet badSet = (VkDescriptorSet)0xbaad6001;
2659 VkResult err;
2660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2661 "Invalid VkDescriptorSet Object 0xbaad6001");
2662
2663 ASSERT_NO_FATAL_FAILURE(InitState());
2664
2665 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
2666 layout_bindings[0].binding = 0;
2667 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2668 layout_bindings[0].descriptorCount = 1;
2669 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2670 layout_bindings[0].pImmutableSamplers = NULL;
2671
2672 VkDescriptorSetLayout descriptor_set_layout;
2673 VkDescriptorSetLayoutCreateInfo dslci = {};
2674 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2675 dslci.pNext = NULL;
2676 dslci.bindingCount = 1;
2677 dslci.pBindings = layout_bindings;
2678 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002679 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002680
2681 VkPipelineLayout pipeline_layout;
2682 VkPipelineLayoutCreateInfo plci = {};
2683 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2684 plci.pNext = NULL;
2685 plci.setLayoutCount = 1;
2686 plci.pSetLayouts = &descriptor_set_layout;
2687 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002688 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002689
2690 BeginCommandBuffer();
2691 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2692 pipeline_layout, 0, 1, &badSet, 0, NULL);
2693 m_errorMonitor->VerifyFound();
2694 EndCommandBuffer();
2695 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
2696 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002697}
2698
Karl Schultz6addd812016-02-02 17:17:23 -07002699TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002700 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
2701 // ObjectTracker should catch this.
2702 VkDescriptorSetLayout bad_layout = (VkDescriptorSetLayout)0xbaad6001;
2703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2704 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
2705
2706 VkPipelineLayout pipeline_layout;
2707 VkPipelineLayoutCreateInfo plci = {};
2708 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2709 plci.pNext = NULL;
2710 plci.setLayoutCount = 1;
2711 plci.pSetLayouts = &bad_layout;
2712 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
2713
2714 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002715}
2716
Karl Schultz6addd812016-02-02 17:17:23 -07002717TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002718 // Attempt to bind an invalid Pipeline to a valid Command Buffer
2719 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002720 // Create a valid cmd buffer
2721 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultzbdb75952016-04-19 11:36:49 -06002722 VkPipeline bad_pipeline = (VkPipeline)0xbaad6001;
2723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2724 "Invalid VkPipeline Object 0xbaad6001");
2725 ASSERT_NO_FATAL_FAILURE(InitState());
2726 BeginCommandBuffer();
2727 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2728 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
2729 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06002730
2731 // Now issue a draw call with no pipeline bound
2732 m_errorMonitor->SetDesiredFailureMsg(
2733 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2734 "At Draw/Dispatch time no valid VkPipeline is bound!");
2735 ASSERT_NO_FATAL_FAILURE(InitState());
2736 BeginCommandBuffer();
2737 Draw(1, 0, 0, 0);
2738 m_errorMonitor->VerifyFound();
2739 // Finally same check once more but with Dispatch/Compute
2740 m_errorMonitor->SetDesiredFailureMsg(
2741 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2742 "At Draw/Dispatch time no valid VkPipeline is bound!");
2743 ASSERT_NO_FATAL_FAILURE(InitState());
2744 BeginCommandBuffer();
2745 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
2746 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002747}
2748
Karl Schultz6addd812016-02-02 17:17:23 -07002749TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
2750 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
2751 // CommandBuffer
2752 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002753
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002755 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002756
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002757 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06002758 ASSERT_NO_FATAL_FAILURE(InitViewport());
2759 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002760 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002761 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2762 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06002763
2764 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002765 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2766 ds_pool_ci.pNext = NULL;
2767 ds_pool_ci.maxSets = 1;
2768 ds_pool_ci.poolSizeCount = 1;
2769 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06002770
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002771 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002772 err =
2773 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002774 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002775
Tony Barboureb254902015-07-15 12:50:33 -06002776 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002777 dsl_binding.binding = 0;
2778 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2779 dsl_binding.descriptorCount = 1;
2780 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2781 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002782
Tony Barboureb254902015-07-15 12:50:33 -06002783 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002784 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2785 ds_layout_ci.pNext = NULL;
2786 ds_layout_ci.bindingCount = 1;
2787 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002788 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002789 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2790 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002791 ASSERT_VK_SUCCESS(err);
2792
2793 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002794 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002795 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002796 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002797 alloc_info.descriptorPool = ds_pool;
2798 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002799 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2800 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002801 ASSERT_VK_SUCCESS(err);
2802
Tony Barboureb254902015-07-15 12:50:33 -06002803 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002804 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2805 pipeline_layout_ci.pNext = NULL;
2806 pipeline_layout_ci.setLayoutCount = 1;
2807 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002808
2809 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002810 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2811 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002812 ASSERT_VK_SUCCESS(err);
2813
Karl Schultz6addd812016-02-02 17:17:23 -07002814 VkShaderObj vs(m_device, bindStateVertShaderText,
2815 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06002816 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07002817 // on more devices
2818 VkShaderObj fs(m_device, bindStateFragShaderText,
2819 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002820
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002821 VkPipelineObj pipe(m_device);
2822 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06002823 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06002824 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002825 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06002826
2827 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002828 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2829 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2830 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2831 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2832 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002833
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002834 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002835
Chia-I Wuf7458c52015-10-26 21:10:41 +08002836 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2837 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2838 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002839}
2840
Karl Schultz6addd812016-02-02 17:17:23 -07002841TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002842 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07002843 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002844
Karl Schultz6addd812016-02-02 17:17:23 -07002845 m_errorMonitor->SetDesiredFailureMsg(
2846 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002847 "Attempt to update descriptor with invalid bufferView ");
2848
2849 ASSERT_NO_FATAL_FAILURE(InitState());
2850 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002851 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2852 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002853
2854 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002855 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2856 ds_pool_ci.pNext = NULL;
2857 ds_pool_ci.maxSets = 1;
2858 ds_pool_ci.poolSizeCount = 1;
2859 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002860
2861 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002862 err =
2863 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002864 ASSERT_VK_SUCCESS(err);
2865
2866 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002867 dsl_binding.binding = 0;
2868 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2869 dsl_binding.descriptorCount = 1;
2870 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2871 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002872
2873 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002874 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2875 ds_layout_ci.pNext = NULL;
2876 ds_layout_ci.bindingCount = 1;
2877 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002878 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002879 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2880 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002881 ASSERT_VK_SUCCESS(err);
2882
2883 VkDescriptorSet descriptorSet;
2884 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002885 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002886 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002887 alloc_info.descriptorPool = ds_pool;
2888 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002889 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2890 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002891 ASSERT_VK_SUCCESS(err);
2892
Karl Schultz6addd812016-02-02 17:17:23 -07002893 VkBufferView view =
2894 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002895 VkWriteDescriptorSet descriptor_write;
2896 memset(&descriptor_write, 0, sizeof(descriptor_write));
2897 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2898 descriptor_write.dstSet = descriptorSet;
2899 descriptor_write.dstBinding = 0;
2900 descriptor_write.descriptorCount = 1;
2901 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2902 descriptor_write.pTexelBufferView = &view;
2903
2904 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2905
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002906 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002907
2908 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2909 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2910}
2911
Karl Schultz6addd812016-02-02 17:17:23 -07002912TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
2913 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
2914 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07002915 // 1. No dynamicOffset supplied
2916 // 2. Too many dynamicOffsets supplied
2917 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07002918 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002919 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002920 " requires 1 dynamicOffsets, but only "
2921 "0 dynamicOffsets are left in "
2922 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002923
2924 ASSERT_NO_FATAL_FAILURE(InitState());
2925 ASSERT_NO_FATAL_FAILURE(InitViewport());
2926 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2927
2928 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002929 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2930 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002931
2932 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002933 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2934 ds_pool_ci.pNext = NULL;
2935 ds_pool_ci.maxSets = 1;
2936 ds_pool_ci.poolSizeCount = 1;
2937 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002938
2939 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002940 err =
2941 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002942 ASSERT_VK_SUCCESS(err);
2943
2944 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002945 dsl_binding.binding = 0;
2946 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2947 dsl_binding.descriptorCount = 1;
2948 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2949 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002950
2951 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002952 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2953 ds_layout_ci.pNext = NULL;
2954 ds_layout_ci.bindingCount = 1;
2955 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002956 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002957 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2958 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002959 ASSERT_VK_SUCCESS(err);
2960
2961 VkDescriptorSet descriptorSet;
2962 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002963 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002964 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002965 alloc_info.descriptorPool = ds_pool;
2966 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002967 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2968 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002969 ASSERT_VK_SUCCESS(err);
2970
2971 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002972 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2973 pipeline_layout_ci.pNext = NULL;
2974 pipeline_layout_ci.setLayoutCount = 1;
2975 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002976
2977 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002978 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2979 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002980 ASSERT_VK_SUCCESS(err);
2981
2982 // Create a buffer to update the descriptor with
2983 uint32_t qfi = 0;
2984 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002985 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2986 buffCI.size = 1024;
2987 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2988 buffCI.queueFamilyIndexCount = 1;
2989 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002990
2991 VkBuffer dyub;
2992 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2993 ASSERT_VK_SUCCESS(err);
2994 // Correctly update descriptor to avoid "NOT_UPDATED" error
2995 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002996 buffInfo.buffer = dyub;
2997 buffInfo.offset = 0;
2998 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002999
3000 VkWriteDescriptorSet descriptor_write;
3001 memset(&descriptor_write, 0, sizeof(descriptor_write));
3002 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3003 descriptor_write.dstSet = descriptorSet;
3004 descriptor_write.dstBinding = 0;
3005 descriptor_write.descriptorCount = 1;
3006 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3007 descriptor_write.pBufferInfo = &buffInfo;
3008
3009 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3010
3011 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003012 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3013 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3014 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003015 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003016 uint32_t pDynOff[2] = {512, 756};
3017 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07003018 m_errorMonitor->SetDesiredFailureMsg(
3019 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07003020 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07003021 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3022 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3023 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12003024 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003025 // Finally cause error due to dynamicOffset being too big
Karl Schultz6addd812016-02-02 17:17:23 -07003026 m_errorMonitor->SetDesiredFailureMsg(
3027 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07003028 " from its update, this oversteps its buffer (");
3029 // Create PSO to be used for draw-time errors below
3030 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003031 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003032 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003033 "out gl_PerVertex { \n"
3034 " vec4 gl_Position;\n"
3035 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003036 "void main(){\n"
3037 " gl_Position = vec4(1);\n"
3038 "}\n";
3039 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003040 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003041 "\n"
3042 "layout(location=0) out vec4 x;\n"
3043 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3044 "void main(){\n"
3045 " x = vec4(bar.y);\n"
3046 "}\n";
3047 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3048 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3049 VkPipelineObj pipe(m_device);
3050 pipe.AddShader(&vs);
3051 pipe.AddShader(&fs);
3052 pipe.AddColorAttachment();
3053 pipe.CreateVKPipeline(pipeline_layout, renderPass());
3054
Karl Schultz6addd812016-02-02 17:17:23 -07003055 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3056 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3057 // This update should succeed, but offset size of 512 will overstep buffer
3058 // /w range 1024 & size 1024
3059 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3060 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3061 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07003062 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003063 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003064
3065 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3066 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3067}
3068
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003069TEST_F(VkLayerTest, InvalidPushConstants) {
3070 // Hit push constant error cases:
3071 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
3072 // 2. Incorrectly set push constant size to 0
3073 // 3. Incorrectly set push constant size to non-multiple of 4
3074 // 4. Attempt push constant update that exceeds maxPushConstantSize
3075 VkResult err;
3076 m_errorMonitor->SetDesiredFailureMsg(
3077 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3078 "vkCreatePipelineLayout() call has push constants with offset ");
3079
3080 ASSERT_NO_FATAL_FAILURE(InitState());
3081 ASSERT_NO_FATAL_FAILURE(InitViewport());
3082 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3083
3084 VkPushConstantRange pc_range = {};
3085 pc_range.size = 0xFFFFFFFFu;
3086 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3087 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3088 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3089 pipeline_layout_ci.pushConstantRangeCount = 1;
3090 pipeline_layout_ci.pPushConstantRanges = &pc_range;
3091
3092 VkPipelineLayout pipeline_layout;
3093 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3094 &pipeline_layout);
3095
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003096 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003097 // Now cause errors due to size 0 and non-4 byte aligned size
3098 pc_range.size = 0;
3099 m_errorMonitor->SetDesiredFailureMsg(
3100 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3101 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
3102 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3103 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003104 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003105 pc_range.size = 1;
3106 m_errorMonitor->SetDesiredFailureMsg(
3107 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3108 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
3109 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3110 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003111 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003112 // Cause error due to bad size in vkCmdPushConstants() call
3113 m_errorMonitor->SetDesiredFailureMsg(
3114 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3115 "vkCmdPushConstants() call has push constants with offset ");
3116 pipeline_layout_ci.pushConstantRangeCount = 0;
3117 pipeline_layout_ci.pPushConstantRanges = NULL;
3118 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3119 &pipeline_layout);
3120 ASSERT_VK_SUCCESS(err);
3121 BeginCommandBuffer();
3122 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
3123 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003124 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003125 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3126}
3127
Karl Schultz6addd812016-02-02 17:17:23 -07003128TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003129 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07003130 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003131
3132 ASSERT_NO_FATAL_FAILURE(InitState());
3133 ASSERT_NO_FATAL_FAILURE(InitViewport());
3134 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3135
3136 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
3137 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003138 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3139 ds_type_count[0].descriptorCount = 10;
3140 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3141 ds_type_count[1].descriptorCount = 2;
3142 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3143 ds_type_count[2].descriptorCount = 2;
3144 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
3145 ds_type_count[3].descriptorCount = 5;
3146 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
3147 // type
3148 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
3149 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
3150 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003151
3152 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003153 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3154 ds_pool_ci.pNext = NULL;
3155 ds_pool_ci.maxSets = 5;
3156 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
3157 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003158
3159 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003160 err =
3161 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003162 ASSERT_VK_SUCCESS(err);
3163
3164 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
3165 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003166 dsl_binding[0].binding = 0;
3167 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3168 dsl_binding[0].descriptorCount = 5;
3169 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
3170 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003171
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003172 // Create layout identical to set0 layout but w/ different stageFlags
3173 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003174 dsl_fs_stage_only.binding = 0;
3175 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3176 dsl_fs_stage_only.descriptorCount = 5;
3177 dsl_fs_stage_only.stageFlags =
3178 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
3179 // bind time
3180 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003181 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003182 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3183 ds_layout_ci.pNext = NULL;
3184 ds_layout_ci.bindingCount = 1;
3185 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003186 static const uint32_t NUM_LAYOUTS = 4;
3187 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003188 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003189 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
3190 // layout for error case
3191 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3192 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003193 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003194 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003195 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3196 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003197 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003198 dsl_binding[0].binding = 0;
3199 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003200 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003201 dsl_binding[1].binding = 1;
3202 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3203 dsl_binding[1].descriptorCount = 2;
3204 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
3205 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003206 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003207 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003208 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3209 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003210 ASSERT_VK_SUCCESS(err);
3211 dsl_binding[0].binding = 0;
3212 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003213 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003214 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07003215 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3216 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003217 ASSERT_VK_SUCCESS(err);
3218 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003219 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003220 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3221 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003222 ASSERT_VK_SUCCESS(err);
3223
3224 static const uint32_t NUM_SETS = 4;
3225 VkDescriptorSet descriptorSet[NUM_SETS] = {};
3226 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003227 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003228 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003229 alloc_info.descriptorPool = ds_pool;
3230 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003231 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3232 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003233 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003234 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003235 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003236 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003237 err =
3238 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003239 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003240
3241 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003242 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3243 pipeline_layout_ci.pNext = NULL;
3244 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
3245 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003246
3247 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003248 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3249 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003250 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003251 // Create pipelineLayout with only one setLayout
3252 pipeline_layout_ci.setLayoutCount = 1;
3253 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003254 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3255 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003256 ASSERT_VK_SUCCESS(err);
3257 // Create pipelineLayout with 2 descriptor setLayout at index 0
3258 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
3259 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07003260 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3261 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003262 ASSERT_VK_SUCCESS(err);
3263 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
3264 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
3265 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07003266 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3267 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003268 ASSERT_VK_SUCCESS(err);
3269 // Create pipelineLayout with UB type, but stageFlags for FS only
3270 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
3271 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003272 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3273 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003274 ASSERT_VK_SUCCESS(err);
3275 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
3276 VkDescriptorSetLayout pl_bad_s0[2] = {};
3277 pl_bad_s0[0] = ds_layout_fs_only;
3278 pl_bad_s0[1] = ds_layout[1];
3279 pipeline_layout_ci.setLayoutCount = 2;
3280 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
3281 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07003282 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3283 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003284 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003285
3286 // Create a buffer to update the descriptor with
3287 uint32_t qfi = 0;
3288 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003289 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3290 buffCI.size = 1024;
3291 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3292 buffCI.queueFamilyIndexCount = 1;
3293 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003294
3295 VkBuffer dyub;
3296 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3297 ASSERT_VK_SUCCESS(err);
3298 // Correctly update descriptor to avoid "NOT_UPDATED" error
3299 static const uint32_t NUM_BUFFS = 5;
3300 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003301 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003302 buffInfo[i].buffer = dyub;
3303 buffInfo[i].offset = 0;
3304 buffInfo[i].range = 1024;
3305 }
Karl Schultz6addd812016-02-02 17:17:23 -07003306 VkImage image;
3307 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3308 const int32_t tex_width = 32;
3309 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003310 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003311 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3312 image_create_info.pNext = NULL;
3313 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3314 image_create_info.format = tex_format;
3315 image_create_info.extent.width = tex_width;
3316 image_create_info.extent.height = tex_height;
3317 image_create_info.extent.depth = 1;
3318 image_create_info.mipLevels = 1;
3319 image_create_info.arrayLayers = 1;
3320 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3321 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3322 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3323 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003324 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3325 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003326
Karl Schultz6addd812016-02-02 17:17:23 -07003327 VkMemoryRequirements memReqs;
3328 VkDeviceMemory imageMem;
3329 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003330 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003331 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3332 memAlloc.pNext = NULL;
3333 memAlloc.allocationSize = 0;
3334 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003335 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
3336 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003337 pass =
3338 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003339 ASSERT_TRUE(pass);
3340 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
3341 ASSERT_VK_SUCCESS(err);
3342 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
3343 ASSERT_VK_SUCCESS(err);
3344
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003345 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003346 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3347 image_view_create_info.image = image;
3348 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
3349 image_view_create_info.format = tex_format;
3350 image_view_create_info.subresourceRange.layerCount = 1;
3351 image_view_create_info.subresourceRange.baseMipLevel = 0;
3352 image_view_create_info.subresourceRange.levelCount = 1;
3353 image_view_create_info.subresourceRange.aspectMask =
3354 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003355
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003356 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07003357 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
3358 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003359 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003360 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003361 imageInfo[0].imageView = view;
3362 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3363 imageInfo[1].imageView = view;
3364 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003365 imageInfo[2].imageView = view;
3366 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3367 imageInfo[3].imageView = view;
3368 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003369
3370 static const uint32_t NUM_SET_UPDATES = 3;
3371 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
3372 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3373 descriptor_write[0].dstSet = descriptorSet[0];
3374 descriptor_write[0].dstBinding = 0;
3375 descriptor_write[0].descriptorCount = 5;
3376 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3377 descriptor_write[0].pBufferInfo = buffInfo;
3378 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3379 descriptor_write[1].dstSet = descriptorSet[1];
3380 descriptor_write[1].dstBinding = 0;
3381 descriptor_write[1].descriptorCount = 2;
3382 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3383 descriptor_write[1].pImageInfo = imageInfo;
3384 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3385 descriptor_write[2].dstSet = descriptorSet[1];
3386 descriptor_write[2].dstBinding = 1;
3387 descriptor_write[2].descriptorCount = 2;
3388 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003389 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003390
3391 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003392
Tobin Ehlis88452832015-12-03 09:40:56 -07003393 // Create PSO to be used for draw-time errors below
3394 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003395 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003396 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003397 "out gl_PerVertex {\n"
3398 " vec4 gl_Position;\n"
3399 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003400 "void main(){\n"
3401 " gl_Position = vec4(1);\n"
3402 "}\n";
3403 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003404 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003405 "\n"
3406 "layout(location=0) out vec4 x;\n"
3407 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3408 "void main(){\n"
3409 " x = vec4(bar.y);\n"
3410 "}\n";
3411 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3412 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003413 VkPipelineObj pipe(m_device);
3414 pipe.AddShader(&vs);
3415 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07003416 pipe.AddColorAttachment();
3417 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07003418
3419 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07003420
Karl Schultz6addd812016-02-02 17:17:23 -07003421 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3422 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3423 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
3424 // of PSO
3425 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
3426 // cmd_pipeline.c
3427 // due to the fact that cmd_alloc_dset_data() has not been called in
3428 // cmd_bind_graphics_pipeline()
3429 // TODO : Want to cause various binding incompatibility issues here to test
3430 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07003431 // First cause various verify_layout_compatibility() fails
3432 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003433 // verify_set_layout_compatibility fail cases:
3434 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07003435 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3436 " due to: invalid VkPipelineLayout ");
3437 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3438 VK_PIPELINE_BIND_POINT_GRAPHICS,
3439 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
3440 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003441 m_errorMonitor->VerifyFound();
3442
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003443 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07003444 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3445 " attempting to bind set to index 1");
3446 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3447 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
3448 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003449 m_errorMonitor->VerifyFound();
3450
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003451 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003452 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
3453 // descriptors
3454 m_errorMonitor->SetDesiredFailureMsg(
3455 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003456 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003457 vkCmdBindDescriptorSets(
3458 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3459 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003460 m_errorMonitor->VerifyFound();
3461
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003462 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
3463 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07003464 m_errorMonitor->SetDesiredFailureMsg(
3465 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003466 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07003467 vkCmdBindDescriptorSets(
3468 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3469 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003470 m_errorMonitor->VerifyFound();
3471
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003472 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
3473 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07003474 m_errorMonitor->SetDesiredFailureMsg(
3475 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003476 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003477 vkCmdBindDescriptorSets(
3478 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3479 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003480 m_errorMonitor->VerifyFound();
3481
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003482 // Cause INFO messages due to disturbing previously bound Sets
3483 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07003484 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3485 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3486 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003487 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07003488 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003489 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003490 " previously bound as set #0 was disturbed ");
3491 vkCmdBindDescriptorSets(
3492 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3493 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003494 m_errorMonitor->VerifyFound();
3495
Karl Schultz6addd812016-02-02 17:17:23 -07003496 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3497 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3498 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003499 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003501 " newly bound as set #0 so set #1 and "
3502 "any subsequent sets were disturbed ");
3503 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3504 VK_PIPELINE_BIND_POINT_GRAPHICS,
3505 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003506 m_errorMonitor->VerifyFound();
3507
Tobin Ehlis88452832015-12-03 09:40:56 -07003508 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07003509 // 1. Error due to not binding required set (we actually use same code as
3510 // above to disturb set0)
3511 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3512 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3513 2, &descriptorSet[0], 0, NULL);
3514 vkCmdBindDescriptorSets(
3515 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3516 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
3517 m_errorMonitor->SetDesiredFailureMsg(
3518 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3519 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07003520 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003521 m_errorMonitor->VerifyFound();
3522
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003523 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003524 // 2. Error due to bound set not being compatible with PSO's
3525 // VkPipelineLayout (diff stageFlags in this case)
3526 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3527 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3528 2, &descriptorSet[0], 0, NULL);
3529 m_errorMonitor->SetDesiredFailureMsg(
3530 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3531 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07003532 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003533 m_errorMonitor->VerifyFound();
3534
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003535 // Remaining clean-up
3536 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003537 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003538 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
3539 }
3540 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
3541 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, descriptorSet);
3542 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003543 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3544 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3545}
Tobin Ehlis559c6382015-11-05 09:52:49 -07003546
Karl Schultz6addd812016-02-02 17:17:23 -07003547TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003548
Karl Schultz6addd812016-02-02 17:17:23 -07003549 m_errorMonitor->SetDesiredFailureMsg(
3550 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003551 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003552
3553 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003554 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003555 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003556 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003557
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003558 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003559}
3560
Karl Schultz6addd812016-02-02 17:17:23 -07003561TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
3562 VkResult err;
3563 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003564
Karl Schultz6addd812016-02-02 17:17:23 -07003565 m_errorMonitor->SetDesiredFailureMsg(
3566 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07003567 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003568
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003569 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003570
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003571 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003572 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003573 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003574 cmd.commandPool = m_commandPool;
3575 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003576 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06003577
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003578 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06003579 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003580
3581 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003582 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003583 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003584 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003585 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07003586 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
3587 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003588 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003589
3590 // The error should be caught by validation of the BeginCommandBuffer call
3591 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
3592
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003593 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003594 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003595}
3596
Karl Schultz6addd812016-02-02 17:17:23 -07003597TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003598 // Cause error due to Begin while recording CB
3599 // Then cause 2 errors for attempting to reset CB w/o having
3600 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
3601 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003602 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003603 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003604
3605 ASSERT_NO_FATAL_FAILURE(InitState());
3606
3607 // Calls AllocateCommandBuffers
3608 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
3609
Karl Schultz6addd812016-02-02 17:17:23 -07003610 // Force the failure by setting the Renderpass and Framebuffer fields with
3611 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003612 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003613 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003614 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3615 cmd_buf_info.pNext = NULL;
3616 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003617 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003618
3619 // Begin CB to transition to recording state
3620 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
3621 // Can't re-begin. This should trigger error
3622 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003623 m_errorMonitor->VerifyFound();
3624
Karl Schultz6addd812016-02-02 17:17:23 -07003625 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3626 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003627 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
3628 // Reset attempt will trigger error due to incorrect CommandPool state
3629 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003630 m_errorMonitor->VerifyFound();
3631
Karl Schultz6addd812016-02-02 17:17:23 -07003632 m_errorMonitor->SetDesiredFailureMsg(
3633 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3634 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003635 // Transition CB to RECORDED state
3636 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
3637 // Now attempting to Begin will implicitly reset, which triggers error
3638 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003639 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003640}
3641
Karl Schultz6addd812016-02-02 17:17:23 -07003642TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003643 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003644 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003645
Karl Schultz6addd812016-02-02 17:17:23 -07003646 m_errorMonitor->SetDesiredFailureMsg(
3647 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003648 "Invalid Pipeline CreateInfo State: Vtx Shader required");
3649
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003650 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003651 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003652
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003653 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003654 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3655 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003656
3657 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003658 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3659 ds_pool_ci.pNext = NULL;
3660 ds_pool_ci.maxSets = 1;
3661 ds_pool_ci.poolSizeCount = 1;
3662 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003663
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003664 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003665 err =
3666 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003667 ASSERT_VK_SUCCESS(err);
3668
Tony Barboureb254902015-07-15 12:50:33 -06003669 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003670 dsl_binding.binding = 0;
3671 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3672 dsl_binding.descriptorCount = 1;
3673 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3674 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003675
Tony Barboureb254902015-07-15 12:50:33 -06003676 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003677 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3678 ds_layout_ci.pNext = NULL;
3679 ds_layout_ci.bindingCount = 1;
3680 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003681
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003682 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003683 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3684 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003685 ASSERT_VK_SUCCESS(err);
3686
3687 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003688 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003689 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003690 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003691 alloc_info.descriptorPool = ds_pool;
3692 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003693 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3694 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003695 ASSERT_VK_SUCCESS(err);
3696
Tony Barboureb254902015-07-15 12:50:33 -06003697 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003698 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3699 pipeline_layout_ci.setLayoutCount = 1;
3700 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003701
3702 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003703 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3704 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003705 ASSERT_VK_SUCCESS(err);
3706
Tobin Ehlise68360f2015-10-01 11:15:13 -06003707 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07003708 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06003709
3710 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003711 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3712 vp_state_ci.scissorCount = 1;
3713 vp_state_ci.pScissors = &sc;
3714 vp_state_ci.viewportCount = 1;
3715 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003716
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003717 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3718 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3719 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3720 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3721 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3722 rs_state_ci.depthClampEnable = VK_FALSE;
3723 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3724 rs_state_ci.depthBiasEnable = VK_FALSE;
3725
Tony Barboureb254902015-07-15 12:50:33 -06003726 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003727 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3728 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003729 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003730 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3731 gp_ci.layout = pipeline_layout;
3732 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06003733
3734 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003735 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3736 pc_ci.initialDataSize = 0;
3737 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003738
3739 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003740 VkPipelineCache pipelineCache;
3741
Karl Schultz6addd812016-02-02 17:17:23 -07003742 err =
3743 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06003744 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003745 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3746 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003747
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003748 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003749
Chia-I Wuf7458c52015-10-26 21:10:41 +08003750 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3751 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3752 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3753 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003754}
Tobin Ehlis912df022015-09-17 08:46:18 -06003755/*// TODO : This test should be good, but needs Tess support in compiler to run
3756TEST_F(VkLayerTest, InvalidPatchControlPoints)
3757{
3758 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06003759 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003760
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003761 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003762 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
3763primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003764
Tobin Ehlis912df022015-09-17 08:46:18 -06003765 ASSERT_NO_FATAL_FAILURE(InitState());
3766 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06003767
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003768 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06003769 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003770 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003771
3772 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3773 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3774 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003775 ds_pool_ci.poolSizeCount = 1;
3776 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06003777
3778 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003779 err = vkCreateDescriptorPool(m_device->device(),
3780VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06003781 ASSERT_VK_SUCCESS(err);
3782
3783 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08003784 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06003785 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08003786 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003787 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3788 dsl_binding.pImmutableSamplers = NULL;
3789
3790 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003791 ds_layout_ci.sType =
3792VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003793 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003794 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003795 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06003796
3797 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003798 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3799&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003800 ASSERT_VK_SUCCESS(err);
3801
3802 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07003803 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
3804VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06003805 ASSERT_VK_SUCCESS(err);
3806
3807 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003808 pipeline_layout_ci.sType =
3809VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003810 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003811 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003812 pipeline_layout_ci.pSetLayouts = &ds_layout;
3813
3814 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003815 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3816&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003817 ASSERT_VK_SUCCESS(err);
3818
3819 VkPipelineShaderStageCreateInfo shaderStages[3];
3820 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
3821
Karl Schultz6addd812016-02-02 17:17:23 -07003822 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
3823this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003824 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07003825 VkShaderObj
3826tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
3827this);
3828 VkShaderObj
3829te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
3830this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003831
Karl Schultz6addd812016-02-02 17:17:23 -07003832 shaderStages[0].sType =
3833VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003834 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003835 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003836 shaderStages[1].sType =
3837VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003838 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003839 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003840 shaderStages[2].sType =
3841VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003842 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003843 shaderStages[2].shader = te.handle();
3844
3845 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003846 iaCI.sType =
3847VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08003848 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06003849
3850 VkPipelineTessellationStateCreateInfo tsCI = {};
3851 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
3852 tsCI.patchControlPoints = 0; // This will cause an error
3853
3854 VkGraphicsPipelineCreateInfo gp_ci = {};
3855 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3856 gp_ci.pNext = NULL;
3857 gp_ci.stageCount = 3;
3858 gp_ci.pStages = shaderStages;
3859 gp_ci.pVertexInputState = NULL;
3860 gp_ci.pInputAssemblyState = &iaCI;
3861 gp_ci.pTessellationState = &tsCI;
3862 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003863 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06003864 gp_ci.pMultisampleState = NULL;
3865 gp_ci.pDepthStencilState = NULL;
3866 gp_ci.pColorBlendState = NULL;
3867 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3868 gp_ci.layout = pipeline_layout;
3869 gp_ci.renderPass = renderPass();
3870
3871 VkPipelineCacheCreateInfo pc_ci = {};
3872 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3873 pc_ci.pNext = NULL;
3874 pc_ci.initialSize = 0;
3875 pc_ci.initialData = 0;
3876 pc_ci.maxSize = 0;
3877
3878 VkPipeline pipeline;
3879 VkPipelineCache pipelineCache;
3880
Karl Schultz6addd812016-02-02 17:17:23 -07003881 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
3882&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06003883 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003884 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3885&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06003886
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003887 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003888
Chia-I Wuf7458c52015-10-26 21:10:41 +08003889 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3890 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3891 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3892 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06003893}
3894*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06003895// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07003896TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07003897 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003898
Karl Schultz6addd812016-02-02 17:17:23 -07003899 m_errorMonitor->SetDesiredFailureMsg(
3900 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003901 "Gfx Pipeline viewport count (1) must match scissor count (0).");
3902
Tobin Ehlise68360f2015-10-01 11:15:13 -06003903 ASSERT_NO_FATAL_FAILURE(InitState());
3904 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003905
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003906 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003907 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3908 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003909
3910 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003911 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3912 ds_pool_ci.maxSets = 1;
3913 ds_pool_ci.poolSizeCount = 1;
3914 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003915
3916 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003917 err =
3918 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003919 ASSERT_VK_SUCCESS(err);
3920
3921 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003922 dsl_binding.binding = 0;
3923 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3924 dsl_binding.descriptorCount = 1;
3925 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003926
3927 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003928 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3929 ds_layout_ci.bindingCount = 1;
3930 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003931
3932 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003933 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3934 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003935 ASSERT_VK_SUCCESS(err);
3936
3937 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003938 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003939 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003940 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003941 alloc_info.descriptorPool = ds_pool;
3942 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003943 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3944 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003945 ASSERT_VK_SUCCESS(err);
3946
3947 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003948 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3949 pipeline_layout_ci.setLayoutCount = 1;
3950 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003951
3952 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003953 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3954 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003955 ASSERT_VK_SUCCESS(err);
3956
3957 VkViewport vp = {}; // Just need dummy vp to point to
3958
3959 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003960 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3961 vp_state_ci.scissorCount = 0;
3962 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
3963 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003964
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003965 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3966 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3967 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3968 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3969 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3970 rs_state_ci.depthClampEnable = VK_FALSE;
3971 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3972 rs_state_ci.depthBiasEnable = VK_FALSE;
3973
Cody Northropeb3a6c12015-10-05 14:44:45 -06003974 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003975 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003976
Karl Schultz6addd812016-02-02 17:17:23 -07003977 VkShaderObj vs(m_device, bindStateVertShaderText,
3978 VK_SHADER_STAGE_VERTEX_BIT, this);
3979 VkShaderObj fs(m_device, bindStateFragShaderText,
3980 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003981 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003982 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003983 shaderStages[0] = vs.GetStageCreateInfo();
3984 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003985
3986 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003987 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3988 gp_ci.stageCount = 2;
3989 gp_ci.pStages = shaderStages;
3990 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003991 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003992 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3993 gp_ci.layout = pipeline_layout;
3994 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003995
3996 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003997 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003998
3999 VkPipeline pipeline;
4000 VkPipelineCache pipelineCache;
4001
Karl Schultz6addd812016-02-02 17:17:23 -07004002 err =
4003 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004004 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004005 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4006 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004007
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004008 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004009
Chia-I Wuf7458c52015-10-26 21:10:41 +08004010 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4011 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4012 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4013 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004014}
Karl Schultz6addd812016-02-02 17:17:23 -07004015// Don't set viewport state in PSO. This is an error b/c we always need this
4016// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06004017// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07004018TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06004019 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07004020 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004021
Karl Schultz6addd812016-02-02 17:17:23 -07004022 m_errorMonitor->SetDesiredFailureMsg(
4023 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004024 "Gfx Pipeline pViewportState is null. Even if ");
4025
Tobin Ehlise68360f2015-10-01 11:15:13 -06004026 ASSERT_NO_FATAL_FAILURE(InitState());
4027 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004028
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004029 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004030 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4031 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004032
4033 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004034 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4035 ds_pool_ci.maxSets = 1;
4036 ds_pool_ci.poolSizeCount = 1;
4037 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004038
4039 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004040 err =
4041 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004042 ASSERT_VK_SUCCESS(err);
4043
4044 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004045 dsl_binding.binding = 0;
4046 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4047 dsl_binding.descriptorCount = 1;
4048 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004049
4050 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004051 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4052 ds_layout_ci.bindingCount = 1;
4053 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004054
4055 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004056 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4057 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004058 ASSERT_VK_SUCCESS(err);
4059
4060 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004061 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004062 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004063 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004064 alloc_info.descriptorPool = ds_pool;
4065 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004066 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4067 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004068 ASSERT_VK_SUCCESS(err);
4069
4070 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004071 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4072 pipeline_layout_ci.setLayoutCount = 1;
4073 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004074
4075 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004076 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4077 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004078 ASSERT_VK_SUCCESS(err);
4079
4080 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4081 // Set scissor as dynamic to avoid second error
4082 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004083 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4084 dyn_state_ci.dynamicStateCount = 1;
4085 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004086
Cody Northropeb3a6c12015-10-05 14:44:45 -06004087 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004088 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004089
Karl Schultz6addd812016-02-02 17:17:23 -07004090 VkShaderObj vs(m_device, bindStateVertShaderText,
4091 VK_SHADER_STAGE_VERTEX_BIT, this);
4092 VkShaderObj fs(m_device, bindStateFragShaderText,
4093 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004094 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004095 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004096 shaderStages[0] = vs.GetStageCreateInfo();
4097 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004098
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004099
4100 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4101 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4102 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4103 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4104 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4105 rs_state_ci.depthClampEnable = VK_FALSE;
4106 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4107 rs_state_ci.depthBiasEnable = VK_FALSE;
4108
Tobin Ehlise68360f2015-10-01 11:15:13 -06004109 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004110 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4111 gp_ci.stageCount = 2;
4112 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004113 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004114 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
4115 // should cause validation error
4116 gp_ci.pDynamicState = &dyn_state_ci;
4117 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4118 gp_ci.layout = pipeline_layout;
4119 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004120
4121 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004122 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004123
4124 VkPipeline pipeline;
4125 VkPipelineCache pipelineCache;
4126
Karl Schultz6addd812016-02-02 17:17:23 -07004127 err =
4128 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004129 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004130 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4131 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004132
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004133 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004134
Chia-I Wuf7458c52015-10-26 21:10:41 +08004135 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4136 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4137 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4138 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004139}
4140// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07004141// Then run second test where dynamic scissor count doesn't match PSO scissor
4142// count
4143TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
4144 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004145
Karl Schultz6addd812016-02-02 17:17:23 -07004146 m_errorMonitor->SetDesiredFailureMsg(
4147 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004148 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
4149
Tobin Ehlise68360f2015-10-01 11:15:13 -06004150 ASSERT_NO_FATAL_FAILURE(InitState());
4151 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004152
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004153 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004154 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4155 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004156
4157 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004158 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4159 ds_pool_ci.maxSets = 1;
4160 ds_pool_ci.poolSizeCount = 1;
4161 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004162
4163 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004164 err =
4165 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004166 ASSERT_VK_SUCCESS(err);
4167
4168 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004169 dsl_binding.binding = 0;
4170 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4171 dsl_binding.descriptorCount = 1;
4172 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004173
4174 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004175 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4176 ds_layout_ci.bindingCount = 1;
4177 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004178
4179 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004180 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4181 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004182 ASSERT_VK_SUCCESS(err);
4183
4184 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004185 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004186 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004187 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004188 alloc_info.descriptorPool = ds_pool;
4189 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004190 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4191 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004192 ASSERT_VK_SUCCESS(err);
4193
4194 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004195 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4196 pipeline_layout_ci.setLayoutCount = 1;
4197 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004198
4199 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004200 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4201 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004202 ASSERT_VK_SUCCESS(err);
4203
4204 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004205 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4206 vp_state_ci.viewportCount = 1;
4207 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
4208 vp_state_ci.scissorCount = 1;
4209 vp_state_ci.pScissors =
4210 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06004211
4212 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4213 // Set scissor as dynamic to avoid that error
4214 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004215 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4216 dyn_state_ci.dynamicStateCount = 1;
4217 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004218
Cody Northropeb3a6c12015-10-05 14:44:45 -06004219 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004220 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004221
Karl Schultz6addd812016-02-02 17:17:23 -07004222 VkShaderObj vs(m_device, bindStateVertShaderText,
4223 VK_SHADER_STAGE_VERTEX_BIT, this);
4224 VkShaderObj fs(m_device, bindStateFragShaderText,
4225 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004226 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004227 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004228 shaderStages[0] = vs.GetStageCreateInfo();
4229 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004230
Cody Northropf6622dc2015-10-06 10:33:21 -06004231 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4232 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4233 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004234 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004235 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004236 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004237 vi_ci.pVertexAttributeDescriptions = nullptr;
4238
4239 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4240 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4241 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4242
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004243 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004244 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06004245 rs_ci.pNext = nullptr;
4246
Mark Youngc89c6312016-03-31 16:03:20 -06004247 VkPipelineColorBlendAttachmentState att = {};
4248 att.blendEnable = VK_FALSE;
4249 att.colorWriteMask = 0xf;
4250
Cody Northropf6622dc2015-10-06 10:33:21 -06004251 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4252 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4253 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004254 cb_ci.attachmentCount = 1;
4255 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06004256
Tobin Ehlise68360f2015-10-01 11:15:13 -06004257 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004258 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4259 gp_ci.stageCount = 2;
4260 gp_ci.pStages = shaderStages;
4261 gp_ci.pVertexInputState = &vi_ci;
4262 gp_ci.pInputAssemblyState = &ia_ci;
4263 gp_ci.pViewportState = &vp_state_ci;
4264 gp_ci.pRasterizationState = &rs_ci;
4265 gp_ci.pColorBlendState = &cb_ci;
4266 gp_ci.pDynamicState = &dyn_state_ci;
4267 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4268 gp_ci.layout = pipeline_layout;
4269 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004270
4271 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004272 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004273
4274 VkPipeline pipeline;
4275 VkPipelineCache pipelineCache;
4276
Karl Schultz6addd812016-02-02 17:17:23 -07004277 err =
4278 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004279 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004280 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4281 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004282
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004283 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004284
Tobin Ehlisd332f282015-10-02 11:00:56 -06004285 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07004286 // First need to successfully create the PSO from above by setting
4287 // pViewports
4288 m_errorMonitor->SetDesiredFailureMsg(
4289 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4290 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
4291 "scissorCount is 1. These counts must match.");
4292
4293 VkViewport vp = {}; // Just need dummy vp to point to
4294 vp_state_ci.pViewports = &vp;
4295 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4296 &gp_ci, NULL, &pipeline);
4297 ASSERT_VK_SUCCESS(err);
4298 BeginCommandBuffer();
4299 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4300 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4301 VkRect2D scissors[2] = {}; // don't care about data
4302 // Count of 2 doesn't match PSO count of 1
4303 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
4304 Draw(1, 0, 0, 0);
4305
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004306 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004307
4308 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4309 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4310 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4311 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4312}
4313// Create PSO w/o non-zero scissorCount but no scissor data
4314// Then run second test where dynamic viewportCount doesn't match PSO
4315// viewportCount
4316TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
4317 VkResult err;
4318
4319 m_errorMonitor->SetDesiredFailureMsg(
4320 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4321 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
4322
4323 ASSERT_NO_FATAL_FAILURE(InitState());
4324 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4325
4326 VkDescriptorPoolSize ds_type_count = {};
4327 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4328 ds_type_count.descriptorCount = 1;
4329
4330 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4331 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4332 ds_pool_ci.maxSets = 1;
4333 ds_pool_ci.poolSizeCount = 1;
4334 ds_pool_ci.pPoolSizes = &ds_type_count;
4335
4336 VkDescriptorPool ds_pool;
4337 err =
4338 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4339 ASSERT_VK_SUCCESS(err);
4340
4341 VkDescriptorSetLayoutBinding dsl_binding = {};
4342 dsl_binding.binding = 0;
4343 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4344 dsl_binding.descriptorCount = 1;
4345 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4346
4347 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4348 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4349 ds_layout_ci.bindingCount = 1;
4350 ds_layout_ci.pBindings = &dsl_binding;
4351
4352 VkDescriptorSetLayout ds_layout;
4353 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4354 &ds_layout);
4355 ASSERT_VK_SUCCESS(err);
4356
4357 VkDescriptorSet descriptorSet;
4358 VkDescriptorSetAllocateInfo alloc_info = {};
4359 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4360 alloc_info.descriptorSetCount = 1;
4361 alloc_info.descriptorPool = ds_pool;
4362 alloc_info.pSetLayouts = &ds_layout;
4363 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4364 &descriptorSet);
4365 ASSERT_VK_SUCCESS(err);
4366
4367 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4368 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4369 pipeline_layout_ci.setLayoutCount = 1;
4370 pipeline_layout_ci.pSetLayouts = &ds_layout;
4371
4372 VkPipelineLayout pipeline_layout;
4373 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4374 &pipeline_layout);
4375 ASSERT_VK_SUCCESS(err);
4376
4377 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4378 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4379 vp_state_ci.scissorCount = 1;
4380 vp_state_ci.pScissors =
4381 NULL; // Null scissor w/ count of 1 should cause error
4382 vp_state_ci.viewportCount = 1;
4383 vp_state_ci.pViewports =
4384 NULL; // vp is dynamic (below) so this won't cause error
4385
4386 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
4387 // Set scissor as dynamic to avoid that error
4388 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4389 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4390 dyn_state_ci.dynamicStateCount = 1;
4391 dyn_state_ci.pDynamicStates = &vp_state;
4392
4393 VkPipelineShaderStageCreateInfo shaderStages[2];
4394 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4395
4396 VkShaderObj vs(m_device, bindStateVertShaderText,
4397 VK_SHADER_STAGE_VERTEX_BIT, this);
4398 VkShaderObj fs(m_device, bindStateFragShaderText,
4399 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004400 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004401 // but add it to be able to run on more devices
4402 shaderStages[0] = vs.GetStageCreateInfo();
4403 shaderStages[1] = fs.GetStageCreateInfo();
4404
4405 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4406 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4407 vi_ci.pNext = nullptr;
4408 vi_ci.vertexBindingDescriptionCount = 0;
4409 vi_ci.pVertexBindingDescriptions = nullptr;
4410 vi_ci.vertexAttributeDescriptionCount = 0;
4411 vi_ci.pVertexAttributeDescriptions = nullptr;
4412
4413 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4414 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4415 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4416
4417 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4418 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4419 rs_ci.pNext = nullptr;
4420
Mark Youngc89c6312016-03-31 16:03:20 -06004421 VkPipelineColorBlendAttachmentState att = {};
4422 att.blendEnable = VK_FALSE;
4423 att.colorWriteMask = 0xf;
4424
Karl Schultz6addd812016-02-02 17:17:23 -07004425 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4426 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4427 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004428 cb_ci.attachmentCount = 1;
4429 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07004430
4431 VkGraphicsPipelineCreateInfo gp_ci = {};
4432 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4433 gp_ci.stageCount = 2;
4434 gp_ci.pStages = shaderStages;
4435 gp_ci.pVertexInputState = &vi_ci;
4436 gp_ci.pInputAssemblyState = &ia_ci;
4437 gp_ci.pViewportState = &vp_state_ci;
4438 gp_ci.pRasterizationState = &rs_ci;
4439 gp_ci.pColorBlendState = &cb_ci;
4440 gp_ci.pDynamicState = &dyn_state_ci;
4441 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4442 gp_ci.layout = pipeline_layout;
4443 gp_ci.renderPass = renderPass();
4444
4445 VkPipelineCacheCreateInfo pc_ci = {};
4446 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4447
4448 VkPipeline pipeline;
4449 VkPipelineCache pipelineCache;
4450
4451 err =
4452 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4453 ASSERT_VK_SUCCESS(err);
4454 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4455 &gp_ci, NULL, &pipeline);
4456
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004457 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004458
4459 // Now hit second fail case where we set scissor w/ different count than PSO
4460 // First need to successfully create the PSO from above by setting
4461 // pViewports
4462 m_errorMonitor->SetDesiredFailureMsg(
4463 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4464 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
4465 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004466
Tobin Ehlisd332f282015-10-02 11:00:56 -06004467 VkRect2D sc = {}; // Just need dummy vp to point to
4468 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07004469 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4470 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004471 ASSERT_VK_SUCCESS(err);
4472 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004473 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4474 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004475 VkViewport viewports[2] = {}; // don't care about data
4476 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07004477 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004478 Draw(1, 0, 0, 0);
4479
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004480 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004481
Chia-I Wuf7458c52015-10-26 21:10:41 +08004482 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4483 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4484 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4485 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004486}
4487
Mark Young7394fdd2016-03-31 14:56:43 -06004488TEST_F(VkLayerTest, PSOLineWidthInvalid) {
4489 VkResult err;
4490
4491 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004492 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004493
4494 ASSERT_NO_FATAL_FAILURE(InitState());
4495 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4496
4497 VkDescriptorPoolSize ds_type_count = {};
4498 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4499 ds_type_count.descriptorCount = 1;
4500
4501 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4502 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4503 ds_pool_ci.maxSets = 1;
4504 ds_pool_ci.poolSizeCount = 1;
4505 ds_pool_ci.pPoolSizes = &ds_type_count;
4506
4507 VkDescriptorPool ds_pool;
4508 err =
4509 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4510 ASSERT_VK_SUCCESS(err);
4511
4512 VkDescriptorSetLayoutBinding dsl_binding = {};
4513 dsl_binding.binding = 0;
4514 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4515 dsl_binding.descriptorCount = 1;
4516 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4517
4518 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4519 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4520 ds_layout_ci.bindingCount = 1;
4521 ds_layout_ci.pBindings = &dsl_binding;
4522
4523 VkDescriptorSetLayout ds_layout;
4524 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4525 &ds_layout);
4526 ASSERT_VK_SUCCESS(err);
4527
4528 VkDescriptorSet descriptorSet;
4529 VkDescriptorSetAllocateInfo alloc_info = {};
4530 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4531 alloc_info.descriptorSetCount = 1;
4532 alloc_info.descriptorPool = ds_pool;
4533 alloc_info.pSetLayouts = &ds_layout;
4534 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4535 &descriptorSet);
4536 ASSERT_VK_SUCCESS(err);
4537
4538 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4539 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4540 pipeline_layout_ci.setLayoutCount = 1;
4541 pipeline_layout_ci.pSetLayouts = &ds_layout;
4542
4543 VkPipelineLayout pipeline_layout;
4544 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4545 &pipeline_layout);
4546 ASSERT_VK_SUCCESS(err);
4547
4548 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4549 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4550 vp_state_ci.scissorCount = 1;
4551 vp_state_ci.pScissors = NULL;
4552 vp_state_ci.viewportCount = 1;
4553 vp_state_ci.pViewports = NULL;
4554
4555 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
4556 VK_DYNAMIC_STATE_SCISSOR,
4557 VK_DYNAMIC_STATE_LINE_WIDTH};
4558 // Set scissor as dynamic to avoid that error
4559 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4560 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4561 dyn_state_ci.dynamicStateCount = 2;
4562 dyn_state_ci.pDynamicStates = dynamic_states;
4563
4564 VkPipelineShaderStageCreateInfo shaderStages[2];
4565 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4566
4567 VkShaderObj vs(m_device, bindStateVertShaderText,
4568 VK_SHADER_STAGE_VERTEX_BIT, this);
4569 VkShaderObj fs(m_device, bindStateFragShaderText,
4570 VK_SHADER_STAGE_FRAGMENT_BIT,
4571 this); // TODO - We shouldn't need a fragment shader
4572 // but add it to be able to run on more devices
4573 shaderStages[0] = vs.GetStageCreateInfo();
4574 shaderStages[1] = fs.GetStageCreateInfo();
4575
4576 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4577 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4578 vi_ci.pNext = nullptr;
4579 vi_ci.vertexBindingDescriptionCount = 0;
4580 vi_ci.pVertexBindingDescriptions = nullptr;
4581 vi_ci.vertexAttributeDescriptionCount = 0;
4582 vi_ci.pVertexAttributeDescriptions = nullptr;
4583
4584 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4585 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4586 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4587
4588 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4589 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4590 rs_ci.pNext = nullptr;
4591
Mark Young47107952016-05-02 15:59:55 -06004592 // Check too low (line width of -1.0f).
4593 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06004594
4595 VkPipelineColorBlendAttachmentState att = {};
4596 att.blendEnable = VK_FALSE;
4597 att.colorWriteMask = 0xf;
4598
4599 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4600 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4601 cb_ci.pNext = nullptr;
4602 cb_ci.attachmentCount = 1;
4603 cb_ci.pAttachments = &att;
4604
4605 VkGraphicsPipelineCreateInfo gp_ci = {};
4606 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4607 gp_ci.stageCount = 2;
4608 gp_ci.pStages = shaderStages;
4609 gp_ci.pVertexInputState = &vi_ci;
4610 gp_ci.pInputAssemblyState = &ia_ci;
4611 gp_ci.pViewportState = &vp_state_ci;
4612 gp_ci.pRasterizationState = &rs_ci;
4613 gp_ci.pColorBlendState = &cb_ci;
4614 gp_ci.pDynamicState = &dyn_state_ci;
4615 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4616 gp_ci.layout = pipeline_layout;
4617 gp_ci.renderPass = renderPass();
4618
4619 VkPipelineCacheCreateInfo pc_ci = {};
4620 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4621
4622 VkPipeline pipeline;
4623 VkPipelineCache pipelineCache;
4624
4625 err =
4626 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4627 ASSERT_VK_SUCCESS(err);
4628 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4629 &gp_ci, NULL, &pipeline);
4630
4631 m_errorMonitor->VerifyFound();
4632
4633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4634 "Attempt to set lineWidth to 65536");
4635
4636 // Check too high (line width of 65536.0f).
4637 rs_ci.lineWidth = 65536.0f;
4638
4639 err =
4640 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4641 ASSERT_VK_SUCCESS(err);
4642 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4643 &gp_ci, NULL, &pipeline);
4644
4645 m_errorMonitor->VerifyFound();
4646
4647 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004648 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004649
4650 dyn_state_ci.dynamicStateCount = 3;
4651
4652 rs_ci.lineWidth = 1.0f;
4653
4654 err =
4655 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4656 ASSERT_VK_SUCCESS(err);
4657 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4658 &gp_ci, NULL, &pipeline);
4659 BeginCommandBuffer();
4660 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4661 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4662
4663 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06004664 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06004665 m_errorMonitor->VerifyFound();
4666
4667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4668 "Attempt to set lineWidth to 65536");
4669
4670 // Check too high with dynamic setting.
4671 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
4672 m_errorMonitor->VerifyFound();
4673 EndCommandBuffer();
4674
4675 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4676 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4677 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4678 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4679}
4680
Karl Schultz6addd812016-02-02 17:17:23 -07004681TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004682 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004683 m_errorMonitor->SetDesiredFailureMsg(
4684 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004685 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004686
4687 ASSERT_NO_FATAL_FAILURE(InitState());
4688 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004689
Tony Barbourfe3351b2015-07-28 10:17:20 -06004690 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004691 // Don't care about RenderPass handle b/c error should be flagged before
4692 // that
4693 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
4694 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004695
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004696 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004697}
4698
Karl Schultz6addd812016-02-02 17:17:23 -07004699TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004700 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004701 m_errorMonitor->SetDesiredFailureMsg(
4702 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004703 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004704
4705 ASSERT_NO_FATAL_FAILURE(InitState());
4706 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004707
Tony Barbourfe3351b2015-07-28 10:17:20 -06004708 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004709 // Just create a dummy Renderpass that's non-NULL so we can get to the
4710 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06004711 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004712 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4713 rp_begin.pNext = NULL;
4714 rp_begin.renderPass = renderPass();
4715 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004716
Karl Schultz6addd812016-02-02 17:17:23 -07004717 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
4718 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004719
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004720 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004721}
4722
Karl Schultz6addd812016-02-02 17:17:23 -07004723TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004724 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004725 m_errorMonitor->SetDesiredFailureMsg(
4726 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004727 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004728
4729 ASSERT_NO_FATAL_FAILURE(InitState());
4730 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004731
4732 // Renderpass is started here
4733 BeginCommandBuffer();
4734
4735 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004736 vk_testing::Buffer dstBuffer;
4737 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004738
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004739 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004740
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004741 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004742}
4743
Karl Schultz6addd812016-02-02 17:17:23 -07004744TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004745 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004746 m_errorMonitor->SetDesiredFailureMsg(
4747 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004748 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004749
4750 ASSERT_NO_FATAL_FAILURE(InitState());
4751 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004752
4753 // Renderpass is started here
4754 BeginCommandBuffer();
4755
4756 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004757 vk_testing::Buffer dstBuffer;
4758 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004759
Karl Schultz6addd812016-02-02 17:17:23 -07004760 VkDeviceSize dstOffset = 0;
4761 VkDeviceSize dataSize = 1024;
4762 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004763
Karl Schultz6addd812016-02-02 17:17:23 -07004764 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
4765 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004766
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004767 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004768}
4769
Karl Schultz6addd812016-02-02 17:17:23 -07004770TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004771 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004772 m_errorMonitor->SetDesiredFailureMsg(
4773 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004774 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004775
4776 ASSERT_NO_FATAL_FAILURE(InitState());
4777 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004778
4779 // Renderpass is started here
4780 BeginCommandBuffer();
4781
Michael Lentine0a369f62016-02-03 16:51:46 -06004782 VkClearColorValue clear_color;
4783 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07004784 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
4785 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4786 const int32_t tex_width = 32;
4787 const int32_t tex_height = 32;
4788 VkImageCreateInfo image_create_info = {};
4789 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4790 image_create_info.pNext = NULL;
4791 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4792 image_create_info.format = tex_format;
4793 image_create_info.extent.width = tex_width;
4794 image_create_info.extent.height = tex_height;
4795 image_create_info.extent.depth = 1;
4796 image_create_info.mipLevels = 1;
4797 image_create_info.arrayLayers = 1;
4798 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4799 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4800 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004801
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004802 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004803 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4804 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004805
Karl Schultz6addd812016-02-02 17:17:23 -07004806 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4807 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004808
Karl Schultz6addd812016-02-02 17:17:23 -07004809 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4810 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004811
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004812 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004813}
4814
Karl Schultz6addd812016-02-02 17:17:23 -07004815TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004816 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004817 m_errorMonitor->SetDesiredFailureMsg(
4818 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004819 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004820
4821 ASSERT_NO_FATAL_FAILURE(InitState());
4822 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004823
4824 // Renderpass is started here
4825 BeginCommandBuffer();
4826
4827 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07004828 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004829 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
4830 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4831 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
4832 image_create_info.extent.width = 64;
4833 image_create_info.extent.height = 64;
4834 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4835 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004836
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004837 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004838 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4839 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004840
Karl Schultz6addd812016-02-02 17:17:23 -07004841 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4842 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004843
Karl Schultz6addd812016-02-02 17:17:23 -07004844 vkCmdClearDepthStencilImage(
4845 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4846 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
4847 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004848
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004849 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004850}
4851
Karl Schultz6addd812016-02-02 17:17:23 -07004852TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004853 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004854 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004855
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004857 "vkCmdClearAttachments: This call "
4858 "must be issued inside an active "
4859 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004860
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004861 ASSERT_NO_FATAL_FAILURE(InitState());
4862 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004863
4864 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004865 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004866 ASSERT_VK_SUCCESS(err);
4867
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004868 VkClearAttachment color_attachment;
4869 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4870 color_attachment.clearValue.color.float32[0] = 0;
4871 color_attachment.clearValue.color.float32[1] = 0;
4872 color_attachment.clearValue.color.float32[2] = 0;
4873 color_attachment.clearValue.color.float32[3] = 0;
4874 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004875 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
4876 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
4877 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004878
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004879 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004880}
4881
Karl Schultz9e66a292016-04-21 15:57:51 -06004882TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
4883 // Try to add a buffer memory barrier with no buffer.
4884 m_errorMonitor->SetDesiredFailureMsg(
4885 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4886 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
4887
4888 ASSERT_NO_FATAL_FAILURE(InitState());
4889 BeginCommandBuffer();
4890
4891 VkBufferMemoryBarrier buf_barrier = {};
4892 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
4893 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4894 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4895 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4896 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4897 buf_barrier.buffer = VK_NULL_HANDLE;
4898 buf_barrier.offset = 0;
4899 buf_barrier.size = VK_WHOLE_SIZE;
4900 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4901 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
4902 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
4903
4904 m_errorMonitor->VerifyFound();
4905}
4906
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06004907TEST_F(VkLayerTest, InvalidBarriers) {
4908 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
4909
4910 m_errorMonitor->SetDesiredFailureMsg(
4911 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
4912
4913 ASSERT_NO_FATAL_FAILURE(InitState());
4914 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4915
4916 VkMemoryBarrier mem_barrier = {};
4917 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
4918 mem_barrier.pNext = NULL;
4919 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4920 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4921 BeginCommandBuffer();
4922 // BeginCommandBuffer() starts a render pass
4923 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4924 VK_PIPELINE_STAGE_HOST_BIT,
4925 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
4926 &mem_barrier, 0, nullptr, 0, nullptr);
4927 m_errorMonitor->VerifyFound();
4928
4929 m_errorMonitor->SetDesiredFailureMsg(
4930 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4931 "Image Layout cannot be transitioned to UNDEFINED");
4932 VkImageObj image(m_device);
4933 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
4934 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4935 ASSERT_TRUE(image.initialized());
4936 VkImageMemoryBarrier img_barrier = {};
4937 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4938 img_barrier.pNext = NULL;
4939 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4940 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4941 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
4942 // New layout can't be UNDEFINED
4943 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4944 img_barrier.image = image.handle();
4945 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4946 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4947 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4948 img_barrier.subresourceRange.baseArrayLayer = 0;
4949 img_barrier.subresourceRange.baseMipLevel = 0;
4950 img_barrier.subresourceRange.layerCount = 1;
4951 img_barrier.subresourceRange.levelCount = 1;
4952 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4953 VK_PIPELINE_STAGE_HOST_BIT,
4954 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
4955 nullptr, 1, &img_barrier);
4956 m_errorMonitor->VerifyFound();
4957 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
4958
4959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4960 "Subresource must have the sum of the "
4961 "baseArrayLayer");
4962 // baseArrayLayer + layerCount must be <= image's arrayLayers
4963 img_barrier.subresourceRange.baseArrayLayer = 1;
4964 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4965 VK_PIPELINE_STAGE_HOST_BIT,
4966 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
4967 nullptr, 1, &img_barrier);
4968 m_errorMonitor->VerifyFound();
4969 img_barrier.subresourceRange.baseArrayLayer = 0;
4970
4971 m_errorMonitor->SetDesiredFailureMsg(
4972 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4973 "Subresource must have the sum of the baseMipLevel");
4974 // baseMipLevel + levelCount must be <= image's mipLevels
4975 img_barrier.subresourceRange.baseMipLevel = 1;
4976 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4977 VK_PIPELINE_STAGE_HOST_BIT,
4978 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
4979 nullptr, 1, &img_barrier);
4980 m_errorMonitor->VerifyFound();
4981 img_barrier.subresourceRange.baseMipLevel = 0;
4982
4983 m_errorMonitor->SetDesiredFailureMsg(
4984 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4985 "Buffer Barriers cannot be used during a render pass");
4986 vk_testing::Buffer buffer;
4987 buffer.init(*m_device, 256);
4988 VkBufferMemoryBarrier buf_barrier = {};
4989 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
4990 buf_barrier.pNext = NULL;
4991 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4992 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4993 buf_barrier.buffer = buffer.handle();
4994 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4995 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4996 buf_barrier.offset = 0;
4997 buf_barrier.size = VK_WHOLE_SIZE;
4998 // Can't send buffer barrier during a render pass
4999 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5000 VK_PIPELINE_STAGE_HOST_BIT,
5001 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5002 &buf_barrier, 0, nullptr);
5003 m_errorMonitor->VerifyFound();
5004 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
5005
5006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5007 "which is not less than total size");
5008 buf_barrier.offset = 257;
5009 // Offset greater than total size
5010 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5011 VK_PIPELINE_STAGE_HOST_BIT,
5012 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5013 &buf_barrier, 0, nullptr);
5014 m_errorMonitor->VerifyFound();
5015 buf_barrier.offset = 0;
5016
5017 m_errorMonitor->SetDesiredFailureMsg(
5018 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
5019 buf_barrier.size = 257;
5020 // Size greater than total size
5021 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5022 VK_PIPELINE_STAGE_HOST_BIT,
5023 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5024 &buf_barrier, 0, nullptr);
5025 m_errorMonitor->VerifyFound();
5026 buf_barrier.size = VK_WHOLE_SIZE;
5027
5028 m_errorMonitor->SetDesiredFailureMsg(
5029 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5030 "Image is a depth and stencil format and thus must "
5031 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
5032 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
5033 VkDepthStencilObj ds_image(m_device);
5034 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
5035 ASSERT_TRUE(ds_image.initialized());
5036 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5037 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
5038 img_barrier.image = ds_image.handle();
5039 // Leave aspectMask at COLOR on purpose
5040 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5041 VK_PIPELINE_STAGE_HOST_BIT,
5042 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5043 nullptr, 1, &img_barrier);
5044 m_errorMonitor->VerifyFound();
5045}
5046
Karl Schultz6addd812016-02-02 17:17:23 -07005047TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005048 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005049 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005050
Karl Schultz6addd812016-02-02 17:17:23 -07005051 m_errorMonitor->SetDesiredFailureMsg(
5052 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005053 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
5054
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005055 ASSERT_NO_FATAL_FAILURE(InitState());
5056 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005057 uint32_t qfi = 0;
5058 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005059 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5060 buffCI.size = 1024;
5061 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5062 buffCI.queueFamilyIndexCount = 1;
5063 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005064
5065 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005066 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005067 ASSERT_VK_SUCCESS(err);
5068
5069 BeginCommandBuffer();
5070 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005071 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5072 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005073 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07005074 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
5075 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005076
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005077 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005078
Chia-I Wuf7458c52015-10-26 21:10:41 +08005079 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005080}
5081
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005082TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
5083 // Create an out-of-range queueFamilyIndex
5084 m_errorMonitor->SetDesiredFailureMsg(
5085 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06005086 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005087
5088 ASSERT_NO_FATAL_FAILURE(InitState());
5089 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5090 VkBufferCreateInfo buffCI = {};
5091 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5092 buffCI.size = 1024;
5093 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5094 buffCI.queueFamilyIndexCount = 1;
5095 // Introduce failure by specifying invalid queue_family_index
5096 uint32_t qfi = 777;
5097 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06005098 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005099
5100 VkBuffer ib;
5101 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
5102
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005103 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005104}
5105
Karl Schultz6addd812016-02-02 17:17:23 -07005106TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
5107 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
5108 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005109
Karl Schultz6addd812016-02-02 17:17:23 -07005110 m_errorMonitor->SetDesiredFailureMsg(
5111 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005112 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005113
5114 ASSERT_NO_FATAL_FAILURE(InitState());
5115 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005116
5117 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005118 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005119 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
5120 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005121
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005122 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005123}
5124
Karl Schultz6addd812016-02-02 17:17:23 -07005125TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005126 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07005127 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005128
Karl Schultz6addd812016-02-02 17:17:23 -07005129 m_errorMonitor->SetDesiredFailureMsg(
5130 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Write descriptor update has descriptor "
5131 "type VK_DESCRIPTOR_TYPE_SAMPLER that "
5132 "does not match ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005133
Tobin Ehlis3b780662015-05-28 12:11:26 -06005134 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005135 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005136 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005137 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5138 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005139
5140 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005141 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5142 ds_pool_ci.pNext = NULL;
5143 ds_pool_ci.maxSets = 1;
5144 ds_pool_ci.poolSizeCount = 1;
5145 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005146
Tobin Ehlis3b780662015-05-28 12:11:26 -06005147 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005148 err =
5149 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005150 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005151 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005152 dsl_binding.binding = 0;
5153 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5154 dsl_binding.descriptorCount = 1;
5155 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5156 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005157
Tony Barboureb254902015-07-15 12:50:33 -06005158 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005159 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5160 ds_layout_ci.pNext = NULL;
5161 ds_layout_ci.bindingCount = 1;
5162 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005163
Tobin Ehlis3b780662015-05-28 12:11:26 -06005164 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005165 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5166 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005167 ASSERT_VK_SUCCESS(err);
5168
5169 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005170 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005171 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005172 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005173 alloc_info.descriptorPool = ds_pool;
5174 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005175 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5176 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005177 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005178
Tony Barboureb254902015-07-15 12:50:33 -06005179 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005180 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5181 sampler_ci.pNext = NULL;
5182 sampler_ci.magFilter = VK_FILTER_NEAREST;
5183 sampler_ci.minFilter = VK_FILTER_NEAREST;
5184 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5185 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5186 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5187 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5188 sampler_ci.mipLodBias = 1.0;
5189 sampler_ci.anisotropyEnable = VK_FALSE;
5190 sampler_ci.maxAnisotropy = 1;
5191 sampler_ci.compareEnable = VK_FALSE;
5192 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5193 sampler_ci.minLod = 1.0;
5194 sampler_ci.maxLod = 1.0;
5195 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5196 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Mark Lobodzinski52ac6582015-09-01 15:42:56 -06005197
Tobin Ehlis3b780662015-05-28 12:11:26 -06005198 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005199 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005200 ASSERT_VK_SUCCESS(err);
5201
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005202 VkDescriptorImageInfo info = {};
5203 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005204
5205 VkWriteDescriptorSet descriptor_write;
5206 memset(&descriptor_write, 0, sizeof(descriptor_write));
5207 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005208 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005209 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005210 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005211 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005212 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005213
5214 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5215
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005216 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005217
Chia-I Wuf7458c52015-10-26 21:10:41 +08005218 vkDestroySampler(m_device->device(), sampler, NULL);
5219 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5220 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005221}
5222
Karl Schultz6addd812016-02-02 17:17:23 -07005223TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005224 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07005225 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005226
Karl Schultz6addd812016-02-02 17:17:23 -07005227 m_errorMonitor->SetDesiredFailureMsg(
5228 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Descriptor update type of "
5229 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET "
5230 "is out of bounds for matching binding");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005231
Tobin Ehlis3b780662015-05-28 12:11:26 -06005232 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005233 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005234 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005235 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5236 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005237
5238 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005239 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5240 ds_pool_ci.pNext = NULL;
5241 ds_pool_ci.maxSets = 1;
5242 ds_pool_ci.poolSizeCount = 1;
5243 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005244
Tobin Ehlis3b780662015-05-28 12:11:26 -06005245 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005246 err =
5247 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005248 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005249
Tony Barboureb254902015-07-15 12:50:33 -06005250 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005251 dsl_binding.binding = 0;
5252 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5253 dsl_binding.descriptorCount = 1;
5254 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5255 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005256
5257 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005258 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5259 ds_layout_ci.pNext = NULL;
5260 ds_layout_ci.bindingCount = 1;
5261 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005262
Tobin Ehlis3b780662015-05-28 12:11:26 -06005263 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005264 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5265 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005266 ASSERT_VK_SUCCESS(err);
5267
5268 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005269 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005270 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005271 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005272 alloc_info.descriptorPool = ds_pool;
5273 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005274 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5275 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005276 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005277
Tony Barboureb254902015-07-15 12:50:33 -06005278 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005279 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5280 sampler_ci.pNext = NULL;
5281 sampler_ci.magFilter = VK_FILTER_NEAREST;
5282 sampler_ci.minFilter = VK_FILTER_NEAREST;
5283 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5284 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5285 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5286 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5287 sampler_ci.mipLodBias = 1.0;
5288 sampler_ci.anisotropyEnable = VK_FALSE;
5289 sampler_ci.maxAnisotropy = 1;
5290 sampler_ci.compareEnable = VK_FALSE;
5291 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5292 sampler_ci.minLod = 1.0;
5293 sampler_ci.maxLod = 1.0;
5294 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5295 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005296
Tobin Ehlis3b780662015-05-28 12:11:26 -06005297 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005298 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005299 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005300
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005301 VkDescriptorImageInfo info = {};
5302 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005303
5304 VkWriteDescriptorSet descriptor_write;
5305 memset(&descriptor_write, 0, sizeof(descriptor_write));
5306 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005307 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005308 descriptor_write.dstArrayElement =
5309 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08005310 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005311 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005312 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005313 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005314
5315 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5316
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005317 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005318
Chia-I Wuf7458c52015-10-26 21:10:41 +08005319 vkDestroySampler(m_device->device(), sampler, NULL);
5320 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5321 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005322}
5323
Karl Schultz6addd812016-02-02 17:17:23 -07005324TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
5325 // Create layout w/ count of 1 and attempt update to that layout w/ binding
5326 // index 2
5327 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005328
Karl Schultz6addd812016-02-02 17:17:23 -07005329 m_errorMonitor->SetDesiredFailureMsg(
5330 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005331 " does not have binding to match update binding ");
5332
Tobin Ehlis3b780662015-05-28 12:11:26 -06005333 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005334 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005335 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005336 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5337 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005338
5339 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005340 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5341 ds_pool_ci.pNext = NULL;
5342 ds_pool_ci.maxSets = 1;
5343 ds_pool_ci.poolSizeCount = 1;
5344 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005345
Tobin Ehlis3b780662015-05-28 12:11:26 -06005346 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005347 err =
5348 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005349 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005350
Tony Barboureb254902015-07-15 12:50:33 -06005351 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005352 dsl_binding.binding = 0;
5353 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5354 dsl_binding.descriptorCount = 1;
5355 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5356 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005357
5358 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005359 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5360 ds_layout_ci.pNext = NULL;
5361 ds_layout_ci.bindingCount = 1;
5362 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005363 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005364 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5365 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005366 ASSERT_VK_SUCCESS(err);
5367
5368 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005369 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005370 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005371 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005372 alloc_info.descriptorPool = ds_pool;
5373 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005374 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5375 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005376 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005377
Tony Barboureb254902015-07-15 12:50:33 -06005378 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005379 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5380 sampler_ci.pNext = NULL;
5381 sampler_ci.magFilter = VK_FILTER_NEAREST;
5382 sampler_ci.minFilter = VK_FILTER_NEAREST;
5383 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5384 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5385 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5386 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5387 sampler_ci.mipLodBias = 1.0;
5388 sampler_ci.anisotropyEnable = VK_FALSE;
5389 sampler_ci.maxAnisotropy = 1;
5390 sampler_ci.compareEnable = VK_FALSE;
5391 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5392 sampler_ci.minLod = 1.0;
5393 sampler_ci.maxLod = 1.0;
5394 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5395 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005396
Tobin Ehlis3b780662015-05-28 12:11:26 -06005397 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005398 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005399 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005400
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005401 VkDescriptorImageInfo info = {};
5402 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005403
5404 VkWriteDescriptorSet descriptor_write;
5405 memset(&descriptor_write, 0, sizeof(descriptor_write));
5406 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005407 descriptor_write.dstSet = descriptorSet;
5408 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005409 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005410 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005411 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005412 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005413
5414 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5415
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005416 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005417
Chia-I Wuf7458c52015-10-26 21:10:41 +08005418 vkDestroySampler(m_device->device(), sampler, NULL);
5419 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5420 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005421}
5422
Karl Schultz6addd812016-02-02 17:17:23 -07005423TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
5424 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
5425 // types
5426 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005427
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005428 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005429 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005430
Tobin Ehlis3b780662015-05-28 12:11:26 -06005431 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005432
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005433 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005434 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5435 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005436
5437 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005438 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5439 ds_pool_ci.pNext = NULL;
5440 ds_pool_ci.maxSets = 1;
5441 ds_pool_ci.poolSizeCount = 1;
5442 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005443
Tobin Ehlis3b780662015-05-28 12:11:26 -06005444 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005445 err =
5446 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005447 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005448 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005449 dsl_binding.binding = 0;
5450 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5451 dsl_binding.descriptorCount = 1;
5452 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5453 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005454
Tony Barboureb254902015-07-15 12:50:33 -06005455 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005456 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5457 ds_layout_ci.pNext = NULL;
5458 ds_layout_ci.bindingCount = 1;
5459 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005460
Tobin Ehlis3b780662015-05-28 12:11:26 -06005461 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005462 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5463 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005464 ASSERT_VK_SUCCESS(err);
5465
5466 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005467 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005468 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005469 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005470 alloc_info.descriptorPool = ds_pool;
5471 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005472 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5473 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005474 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005475
Tony Barboureb254902015-07-15 12:50:33 -06005476 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005477 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5478 sampler_ci.pNext = NULL;
5479 sampler_ci.magFilter = VK_FILTER_NEAREST;
5480 sampler_ci.minFilter = VK_FILTER_NEAREST;
5481 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5482 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5483 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5484 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5485 sampler_ci.mipLodBias = 1.0;
5486 sampler_ci.anisotropyEnable = VK_FALSE;
5487 sampler_ci.maxAnisotropy = 1;
5488 sampler_ci.compareEnable = VK_FALSE;
5489 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5490 sampler_ci.minLod = 1.0;
5491 sampler_ci.maxLod = 1.0;
5492 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5493 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005494 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005495 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005496 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005497
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005498 VkDescriptorImageInfo info = {};
5499 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005500
5501 VkWriteDescriptorSet descriptor_write;
5502 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07005503 descriptor_write.sType =
5504 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005505 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005506 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005507 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005508 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005509 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005510
5511 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5512
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005513 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005514
Chia-I Wuf7458c52015-10-26 21:10:41 +08005515 vkDestroySampler(m_device->device(), sampler, NULL);
5516 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5517 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005518}
5519
Karl Schultz6addd812016-02-02 17:17:23 -07005520TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005521 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07005522 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005523
Karl Schultz6addd812016-02-02 17:17:23 -07005524 m_errorMonitor->SetDesiredFailureMsg(
5525 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005526 "Attempt to update descriptor with invalid sampler 0xbaadbeef");
5527
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005528 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005529 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
5530 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005531 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005532 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
5533 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005534
5535 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005536 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5537 ds_pool_ci.pNext = NULL;
5538 ds_pool_ci.maxSets = 1;
5539 ds_pool_ci.poolSizeCount = 1;
5540 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005541
5542 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005543 err =
5544 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005545 ASSERT_VK_SUCCESS(err);
5546
5547 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005548 dsl_binding.binding = 0;
5549 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5550 dsl_binding.descriptorCount = 1;
5551 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5552 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005553
5554 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005555 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5556 ds_layout_ci.pNext = NULL;
5557 ds_layout_ci.bindingCount = 1;
5558 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005559 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005560 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5561 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005562 ASSERT_VK_SUCCESS(err);
5563
5564 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005565 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005566 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005567 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005568 alloc_info.descriptorPool = ds_pool;
5569 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005570 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5571 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005572 ASSERT_VK_SUCCESS(err);
5573
Karl Schultz6addd812016-02-02 17:17:23 -07005574 VkSampler sampler =
5575 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005576
5577 VkDescriptorImageInfo descriptor_info;
5578 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5579 descriptor_info.sampler = sampler;
5580
5581 VkWriteDescriptorSet descriptor_write;
5582 memset(&descriptor_write, 0, sizeof(descriptor_write));
5583 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005584 descriptor_write.dstSet = descriptorSet;
5585 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005586 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005587 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5588 descriptor_write.pImageInfo = &descriptor_info;
5589
5590 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5591
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005592 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005593
Chia-I Wuf7458c52015-10-26 21:10:41 +08005594 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5595 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005596}
5597
Karl Schultz6addd812016-02-02 17:17:23 -07005598TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
5599 // Create a single combined Image/Sampler descriptor and send it an invalid
5600 // imageView
5601 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005602
Karl Schultz6addd812016-02-02 17:17:23 -07005603 m_errorMonitor->SetDesiredFailureMsg(
5604 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005605 "Attempt to update descriptor with invalid imageView 0xbaadbeef");
5606
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005607 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005608 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005609 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5610 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005611
5612 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005613 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5614 ds_pool_ci.pNext = NULL;
5615 ds_pool_ci.maxSets = 1;
5616 ds_pool_ci.poolSizeCount = 1;
5617 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005618
5619 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005620 err =
5621 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005622 ASSERT_VK_SUCCESS(err);
5623
5624 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005625 dsl_binding.binding = 0;
5626 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5627 dsl_binding.descriptorCount = 1;
5628 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5629 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005630
5631 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005632 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5633 ds_layout_ci.pNext = NULL;
5634 ds_layout_ci.bindingCount = 1;
5635 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005636 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005637 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5638 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005639 ASSERT_VK_SUCCESS(err);
5640
5641 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005642 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005643 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005644 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005645 alloc_info.descriptorPool = ds_pool;
5646 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005647 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5648 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005649 ASSERT_VK_SUCCESS(err);
5650
5651 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005652 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5653 sampler_ci.pNext = NULL;
5654 sampler_ci.magFilter = VK_FILTER_NEAREST;
5655 sampler_ci.minFilter = VK_FILTER_NEAREST;
5656 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5657 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5658 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5659 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5660 sampler_ci.mipLodBias = 1.0;
5661 sampler_ci.anisotropyEnable = VK_FALSE;
5662 sampler_ci.maxAnisotropy = 1;
5663 sampler_ci.compareEnable = VK_FALSE;
5664 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5665 sampler_ci.minLod = 1.0;
5666 sampler_ci.maxLod = 1.0;
5667 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5668 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005669
5670 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005671 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005672 ASSERT_VK_SUCCESS(err);
5673
Karl Schultz6addd812016-02-02 17:17:23 -07005674 VkImageView view =
5675 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005676
5677 VkDescriptorImageInfo descriptor_info;
5678 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5679 descriptor_info.sampler = sampler;
5680 descriptor_info.imageView = view;
5681
5682 VkWriteDescriptorSet descriptor_write;
5683 memset(&descriptor_write, 0, sizeof(descriptor_write));
5684 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005685 descriptor_write.dstSet = descriptorSet;
5686 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005687 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005688 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5689 descriptor_write.pImageInfo = &descriptor_info;
5690
5691 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5692
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005693 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005694
Chia-I Wuf7458c52015-10-26 21:10:41 +08005695 vkDestroySampler(m_device->device(), sampler, NULL);
5696 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5697 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005698}
5699
Karl Schultz6addd812016-02-02 17:17:23 -07005700TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
5701 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
5702 // into the other
5703 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005704
Karl Schultz6addd812016-02-02 17:17:23 -07005705 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06005706 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5707 "Copy descriptor update index 0, has src update descriptor "
5708 "type VK_DESCRIPTOR_TYPE_SAMPLER that does not match overlapping "
5709 "dest ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005710
Tobin Ehlis04356f92015-10-27 16:35:27 -06005711 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005712 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005713 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005714 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5715 ds_type_count[0].descriptorCount = 1;
5716 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
5717 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005718
5719 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005720 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5721 ds_pool_ci.pNext = NULL;
5722 ds_pool_ci.maxSets = 1;
5723 ds_pool_ci.poolSizeCount = 2;
5724 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005725
5726 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005727 err =
5728 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005729 ASSERT_VK_SUCCESS(err);
5730 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005731 dsl_binding[0].binding = 0;
5732 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5733 dsl_binding[0].descriptorCount = 1;
5734 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
5735 dsl_binding[0].pImmutableSamplers = NULL;
5736 dsl_binding[1].binding = 1;
5737 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5738 dsl_binding[1].descriptorCount = 1;
5739 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
5740 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005741
5742 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005743 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5744 ds_layout_ci.pNext = NULL;
5745 ds_layout_ci.bindingCount = 2;
5746 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005747
5748 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005749 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5750 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005751 ASSERT_VK_SUCCESS(err);
5752
5753 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005754 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005755 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005756 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005757 alloc_info.descriptorPool = ds_pool;
5758 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005759 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5760 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005761 ASSERT_VK_SUCCESS(err);
5762
5763 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005764 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5765 sampler_ci.pNext = NULL;
5766 sampler_ci.magFilter = VK_FILTER_NEAREST;
5767 sampler_ci.minFilter = VK_FILTER_NEAREST;
5768 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5769 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5770 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5771 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5772 sampler_ci.mipLodBias = 1.0;
5773 sampler_ci.anisotropyEnable = VK_FALSE;
5774 sampler_ci.maxAnisotropy = 1;
5775 sampler_ci.compareEnable = VK_FALSE;
5776 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5777 sampler_ci.minLod = 1.0;
5778 sampler_ci.maxLod = 1.0;
5779 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5780 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005781
5782 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005783 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005784 ASSERT_VK_SUCCESS(err);
5785
5786 VkDescriptorImageInfo info = {};
5787 info.sampler = sampler;
5788
5789 VkWriteDescriptorSet descriptor_write;
5790 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
5791 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005792 descriptor_write.dstSet = descriptorSet;
5793 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08005794 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005795 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5796 descriptor_write.pImageInfo = &info;
5797 // This write update should succeed
5798 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5799 // Now perform a copy update that fails due to type mismatch
5800 VkCopyDescriptorSet copy_ds_update;
5801 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5802 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5803 copy_ds_update.srcSet = descriptorSet;
5804 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005805 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005806 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08005807 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005808 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5809
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005810 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005811 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005812 m_errorMonitor->SetDesiredFailureMsg(
5813 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005814 "Copy descriptor update 0 has srcBinding 3 which is out of bounds ");
Tobin Ehlis04356f92015-10-27 16:35:27 -06005815 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5816 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5817 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005818 copy_ds_update.srcBinding =
5819 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005820 copy_ds_update.dstSet = descriptorSet;
5821 copy_ds_update.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005822 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005823 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5824
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005825 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005826
Tobin Ehlis04356f92015-10-27 16:35:27 -06005827 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005828 m_errorMonitor->SetDesiredFailureMsg(
5829 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005830 "Copy descriptor src update is out of bounds for matching binding 1 ");
5831
Tobin Ehlis04356f92015-10-27 16:35:27 -06005832 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5833 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5834 copy_ds_update.srcSet = descriptorSet;
5835 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005836 copy_ds_update.dstSet = descriptorSet;
5837 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005838 copy_ds_update.descriptorCount =
5839 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06005840 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5841
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005842 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005843
Chia-I Wuf7458c52015-10-26 21:10:41 +08005844 vkDestroySampler(m_device->device(), sampler, NULL);
5845 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5846 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005847}
5848
Karl Schultz6addd812016-02-02 17:17:23 -07005849TEST_F(VkLayerTest, NumSamplesMismatch) {
5850 // Create CommandBuffer where MSAA samples doesn't match RenderPass
5851 // sampleCount
5852 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005853
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005855 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005856
Tobin Ehlis3b780662015-05-28 12:11:26 -06005857 ASSERT_NO_FATAL_FAILURE(InitState());
5858 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005859 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06005860 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005861 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005862
5863 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005864 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5865 ds_pool_ci.pNext = NULL;
5866 ds_pool_ci.maxSets = 1;
5867 ds_pool_ci.poolSizeCount = 1;
5868 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005869
Tobin Ehlis3b780662015-05-28 12:11:26 -06005870 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005871 err =
5872 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005873 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005874
Tony Barboureb254902015-07-15 12:50:33 -06005875 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08005876 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06005877 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08005878 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005879 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5880 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005881
Tony Barboureb254902015-07-15 12:50:33 -06005882 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5883 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5884 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005885 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07005886 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005887
Tobin Ehlis3b780662015-05-28 12:11:26 -06005888 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005889 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5890 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005891 ASSERT_VK_SUCCESS(err);
5892
5893 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005894 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005895 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005896 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005897 alloc_info.descriptorPool = ds_pool;
5898 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005899 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5900 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005901 ASSERT_VK_SUCCESS(err);
5902
Tony Barboureb254902015-07-15 12:50:33 -06005903 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005904 pipe_ms_state_ci.sType =
5905 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5906 pipe_ms_state_ci.pNext = NULL;
5907 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5908 pipe_ms_state_ci.sampleShadingEnable = 0;
5909 pipe_ms_state_ci.minSampleShading = 1.0;
5910 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005911
Tony Barboureb254902015-07-15 12:50:33 -06005912 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005913 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5914 pipeline_layout_ci.pNext = NULL;
5915 pipeline_layout_ci.setLayoutCount = 1;
5916 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005917
5918 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005919 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5920 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005921 ASSERT_VK_SUCCESS(err);
5922
Karl Schultz6addd812016-02-02 17:17:23 -07005923 VkShaderObj vs(m_device, bindStateVertShaderText,
5924 VK_SHADER_STAGE_VERTEX_BIT, this);
5925 VkShaderObj fs(m_device, bindStateFragShaderText,
5926 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005927 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005928 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005929 VkPipelineObj pipe(m_device);
5930 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005931 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005932 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005933 pipe.SetMSAA(&pipe_ms_state_ci);
5934 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005935
Tony Barbourfe3351b2015-07-28 10:17:20 -06005936 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005937 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5938 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005939
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005940 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005941
Chia-I Wuf7458c52015-10-26 21:10:41 +08005942 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5943 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5944 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005945}
Tobin Ehlis0f10db52016-04-04 10:00:21 -06005946#ifdef ADD_BACK_IN_WHEN_CHECK_IS_BACK // TODO : Re-enable when GH256 fixed
Mark Youngc89c6312016-03-31 16:03:20 -06005947TEST_F(VkLayerTest, NumBlendAttachMismatch) {
5948 // Create Pipeline where the number of blend attachments doesn't match the
5949 // number of color attachments. In this case, we don't add any color
5950 // blend attachments even though we have a color attachment.
5951 VkResult err;
5952
5953 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5954 "Mismatch between blend state attachment");
5955
5956 ASSERT_NO_FATAL_FAILURE(InitState());
5957 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5958 VkDescriptorPoolSize ds_type_count = {};
5959 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5960 ds_type_count.descriptorCount = 1;
5961
5962 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5963 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5964 ds_pool_ci.pNext = NULL;
5965 ds_pool_ci.maxSets = 1;
5966 ds_pool_ci.poolSizeCount = 1;
5967 ds_pool_ci.pPoolSizes = &ds_type_count;
5968
5969 VkDescriptorPool ds_pool;
5970 err =
5971 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5972 ASSERT_VK_SUCCESS(err);
5973
5974 VkDescriptorSetLayoutBinding dsl_binding = {};
5975 dsl_binding.binding = 0;
5976 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5977 dsl_binding.descriptorCount = 1;
5978 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5979 dsl_binding.pImmutableSamplers = NULL;
5980
5981 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5982 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5983 ds_layout_ci.pNext = NULL;
5984 ds_layout_ci.bindingCount = 1;
5985 ds_layout_ci.pBindings = &dsl_binding;
5986
5987 VkDescriptorSetLayout ds_layout;
5988 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5989 &ds_layout);
5990 ASSERT_VK_SUCCESS(err);
5991
5992 VkDescriptorSet descriptorSet;
5993 VkDescriptorSetAllocateInfo alloc_info = {};
5994 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5995 alloc_info.descriptorSetCount = 1;
5996 alloc_info.descriptorPool = ds_pool;
5997 alloc_info.pSetLayouts = &ds_layout;
5998 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5999 &descriptorSet);
6000 ASSERT_VK_SUCCESS(err);
6001
6002 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
6003 pipe_ms_state_ci.sType =
6004 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6005 pipe_ms_state_ci.pNext = NULL;
6006 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6007 pipe_ms_state_ci.sampleShadingEnable = 0;
6008 pipe_ms_state_ci.minSampleShading = 1.0;
6009 pipe_ms_state_ci.pSampleMask = NULL;
6010
6011 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6012 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6013 pipeline_layout_ci.pNext = NULL;
6014 pipeline_layout_ci.setLayoutCount = 1;
6015 pipeline_layout_ci.pSetLayouts = &ds_layout;
6016
6017 VkPipelineLayout pipeline_layout;
6018 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6019 &pipeline_layout);
6020 ASSERT_VK_SUCCESS(err);
6021
6022 VkShaderObj vs(m_device, bindStateVertShaderText,
6023 VK_SHADER_STAGE_VERTEX_BIT, this);
6024 VkShaderObj fs(m_device, bindStateFragShaderText,
6025 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006026 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06006027 // but add it to be able to run on more devices
6028 VkPipelineObj pipe(m_device);
6029 pipe.AddShader(&vs);
6030 pipe.AddShader(&fs);
6031 pipe.SetMSAA(&pipe_ms_state_ci);
6032 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6033
6034 BeginCommandBuffer();
6035 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6036 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6037
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006038 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06006039
6040 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6041 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6042 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6043}
Tony Barbour4e81a202016-04-04 11:09:40 -06006044#endif //ADD_BACK_IN_WHEN_CHECK_IS_BACK
Karl Schultz6addd812016-02-02 17:17:23 -07006045TEST_F(VkLayerTest, ClearCmdNoDraw) {
6046 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
6047 // to issuing a Draw
6048 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006049
Karl Schultz6addd812016-02-02 17:17:23 -07006050 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07006051 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006052 "vkCmdClearAttachments() issued on CB object ");
6053
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006054 ASSERT_NO_FATAL_FAILURE(InitState());
6055 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006056
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006057 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006058 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6059 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006060
6061 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006062 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6063 ds_pool_ci.pNext = NULL;
6064 ds_pool_ci.maxSets = 1;
6065 ds_pool_ci.poolSizeCount = 1;
6066 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006067
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006068 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006069 err =
6070 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006071 ASSERT_VK_SUCCESS(err);
6072
Tony Barboureb254902015-07-15 12:50:33 -06006073 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006074 dsl_binding.binding = 0;
6075 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6076 dsl_binding.descriptorCount = 1;
6077 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6078 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006079
Tony Barboureb254902015-07-15 12:50:33 -06006080 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006081 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6082 ds_layout_ci.pNext = NULL;
6083 ds_layout_ci.bindingCount = 1;
6084 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006085
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006086 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006087 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6088 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006089 ASSERT_VK_SUCCESS(err);
6090
6091 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006092 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006093 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006094 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006095 alloc_info.descriptorPool = ds_pool;
6096 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006097 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6098 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006099 ASSERT_VK_SUCCESS(err);
6100
Tony Barboureb254902015-07-15 12:50:33 -06006101 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006102 pipe_ms_state_ci.sType =
6103 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6104 pipe_ms_state_ci.pNext = NULL;
6105 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6106 pipe_ms_state_ci.sampleShadingEnable = 0;
6107 pipe_ms_state_ci.minSampleShading = 1.0;
6108 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006109
Tony Barboureb254902015-07-15 12:50:33 -06006110 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006111 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6112 pipeline_layout_ci.pNext = NULL;
6113 pipeline_layout_ci.setLayoutCount = 1;
6114 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006115
6116 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006117 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6118 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006119 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006120
Karl Schultz6addd812016-02-02 17:17:23 -07006121 VkShaderObj vs(m_device, bindStateVertShaderText,
6122 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006123 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006124 // on more devices
6125 VkShaderObj fs(m_device, bindStateFragShaderText,
6126 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006127
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006128 VkPipelineObj pipe(m_device);
6129 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006130 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006131 pipe.SetMSAA(&pipe_ms_state_ci);
6132 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006133
6134 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006135
Karl Schultz6addd812016-02-02 17:17:23 -07006136 // Main thing we care about for this test is that the VkImage obj we're
6137 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006138 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06006139 VkClearAttachment color_attachment;
6140 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6141 color_attachment.clearValue.color.float32[0] = 1.0;
6142 color_attachment.clearValue.color.float32[1] = 1.0;
6143 color_attachment.clearValue.color.float32[2] = 1.0;
6144 color_attachment.clearValue.color.float32[3] = 1.0;
6145 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006146 VkClearRect clear_rect = {
6147 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006148
Karl Schultz6addd812016-02-02 17:17:23 -07006149 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
6150 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006151
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006152 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006153
Chia-I Wuf7458c52015-10-26 21:10:41 +08006154 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6155 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6156 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006157}
6158
Karl Schultz6addd812016-02-02 17:17:23 -07006159TEST_F(VkLayerTest, VtxBufferBadIndex) {
6160 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006161
Karl Schultz6addd812016-02-02 17:17:23 -07006162 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006163 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07006164 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006165
Tobin Ehlis502480b2015-06-24 15:53:07 -06006166 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06006167 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06006168 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006169
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006170 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006171 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6172 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006173
6174 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006175 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6176 ds_pool_ci.pNext = NULL;
6177 ds_pool_ci.maxSets = 1;
6178 ds_pool_ci.poolSizeCount = 1;
6179 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006180
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006181 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006182 err =
6183 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006184 ASSERT_VK_SUCCESS(err);
6185
Tony Barboureb254902015-07-15 12:50:33 -06006186 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006187 dsl_binding.binding = 0;
6188 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6189 dsl_binding.descriptorCount = 1;
6190 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6191 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006192
Tony Barboureb254902015-07-15 12:50:33 -06006193 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006194 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6195 ds_layout_ci.pNext = NULL;
6196 ds_layout_ci.bindingCount = 1;
6197 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006198
Tobin Ehlis502480b2015-06-24 15:53:07 -06006199 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006200 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6201 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006202 ASSERT_VK_SUCCESS(err);
6203
6204 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006205 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006206 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006207 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006208 alloc_info.descriptorPool = ds_pool;
6209 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006210 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6211 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006212 ASSERT_VK_SUCCESS(err);
6213
Tony Barboureb254902015-07-15 12:50:33 -06006214 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006215 pipe_ms_state_ci.sType =
6216 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6217 pipe_ms_state_ci.pNext = NULL;
6218 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6219 pipe_ms_state_ci.sampleShadingEnable = 0;
6220 pipe_ms_state_ci.minSampleShading = 1.0;
6221 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006222
Tony Barboureb254902015-07-15 12:50:33 -06006223 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006224 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6225 pipeline_layout_ci.pNext = NULL;
6226 pipeline_layout_ci.setLayoutCount = 1;
6227 pipeline_layout_ci.pSetLayouts = &ds_layout;
6228 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006229
Karl Schultz6addd812016-02-02 17:17:23 -07006230 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6231 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006232 ASSERT_VK_SUCCESS(err);
6233
Karl Schultz6addd812016-02-02 17:17:23 -07006234 VkShaderObj vs(m_device, bindStateVertShaderText,
6235 VK_SHADER_STAGE_VERTEX_BIT, this);
6236 VkShaderObj fs(m_device, bindStateFragShaderText,
6237 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006238 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006239 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006240 VkPipelineObj pipe(m_device);
6241 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006242 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006243 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006244 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006245 pipe.SetViewport(m_viewports);
6246 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006247 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006248
6249 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006250 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6251 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006252 // Don't care about actual data, just need to get to draw to flag error
6253 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07006254 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
6255 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006256 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06006257 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006258
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006259 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006260
Chia-I Wuf7458c52015-10-26 21:10:41 +08006261 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6262 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6263 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006264}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006265#endif // DRAW_STATE_TESTS
6266
Tobin Ehlis0788f522015-05-26 16:11:58 -06006267#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06006268#if GTEST_IS_THREADSAFE
6269struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006270 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006271 VkEvent event;
6272 bool bailout;
6273};
6274
Karl Schultz6addd812016-02-02 17:17:23 -07006275extern "C" void *AddToCommandBuffer(void *arg) {
6276 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006277
Karl Schultz6addd812016-02-02 17:17:23 -07006278 for (int i = 0; i < 10000; i++) {
6279 vkCmdSetEvent(data->commandBuffer, data->event,
6280 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006281 if (data->bailout) {
6282 break;
6283 }
6284 }
6285 return NULL;
6286}
6287
Karl Schultz6addd812016-02-02 17:17:23 -07006288TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006289 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006290
Karl Schultz6addd812016-02-02 17:17:23 -07006291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6292 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006293
Mike Stroyanaccf7692015-05-12 16:00:45 -06006294 ASSERT_NO_FATAL_FAILURE(InitState());
6295 ASSERT_NO_FATAL_FAILURE(InitViewport());
6296 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6297
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006298 // Calls AllocateCommandBuffers
6299 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006300
6301 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006302 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006303
6304 VkEventCreateInfo event_info;
6305 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006306 VkResult err;
6307
6308 memset(&event_info, 0, sizeof(event_info));
6309 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
6310
Chia-I Wuf7458c52015-10-26 21:10:41 +08006311 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006312 ASSERT_VK_SUCCESS(err);
6313
Mike Stroyanaccf7692015-05-12 16:00:45 -06006314 err = vkResetEvent(device(), event);
6315 ASSERT_VK_SUCCESS(err);
6316
6317 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006318 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006319 data.event = event;
6320 data.bailout = false;
6321 m_errorMonitor->SetBailout(&data.bailout);
6322 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006323 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006324 // Add many entries to command buffer from this thread at the same time.
6325 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006326
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006327 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006328 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006329
Mike Stroyan10b8cb72016-01-22 15:22:03 -07006330 m_errorMonitor->SetBailout(NULL);
6331
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006332 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006333
Chia-I Wuf7458c52015-10-26 21:10:41 +08006334 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006335}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006336#endif // GTEST_IS_THREADSAFE
6337#endif // THREADING_TESTS
6338
Chris Forbes9f7ff632015-05-25 11:13:08 +12006339#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006340TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006342 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006343
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006344 ASSERT_NO_FATAL_FAILURE(InitState());
6345 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6346
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006347 VkShaderModule module;
6348 VkShaderModuleCreateInfo moduleCreateInfo;
6349 struct icd_spv_header spv;
6350
6351 spv.magic = ICD_SPV_MAGIC;
6352 spv.version = ICD_SPV_VERSION;
6353 spv.gen_magic = 0;
6354
6355 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6356 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006357 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006358 moduleCreateInfo.codeSize = 4;
6359 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006360 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006361
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006362 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006363}
6364
Karl Schultz6addd812016-02-02 17:17:23 -07006365TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006367 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006368
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006369 ASSERT_NO_FATAL_FAILURE(InitState());
6370 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6371
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006372 VkShaderModule module;
6373 VkShaderModuleCreateInfo moduleCreateInfo;
6374 struct icd_spv_header spv;
6375
6376 spv.magic = ~ICD_SPV_MAGIC;
6377 spv.version = ICD_SPV_VERSION;
6378 spv.gen_magic = 0;
6379
6380 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6381 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006382 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006383 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6384 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006385 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006386
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006387 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006388}
6389
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006390#if 0
6391// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07006392TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006393 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006394 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006395
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006396 ASSERT_NO_FATAL_FAILURE(InitState());
6397 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6398
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006399 VkShaderModule module;
6400 VkShaderModuleCreateInfo moduleCreateInfo;
6401 struct icd_spv_header spv;
6402
6403 spv.magic = ICD_SPV_MAGIC;
6404 spv.version = ~ICD_SPV_VERSION;
6405 spv.gen_magic = 0;
6406
6407 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6408 moduleCreateInfo.pNext = NULL;
6409
Karl Schultz6addd812016-02-02 17:17:23 -07006410 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006411 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6412 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006413 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006414
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006415 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006416}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006417#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006418
Karl Schultz6addd812016-02-02 17:17:23 -07006419TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006420 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006421 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006422
Chris Forbes9f7ff632015-05-25 11:13:08 +12006423 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006424 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006425
6426 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006427 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006428 "\n"
6429 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006430 "out gl_PerVertex {\n"
6431 " vec4 gl_Position;\n"
6432 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006433 "void main(){\n"
6434 " gl_Position = vec4(1);\n"
6435 " x = 0;\n"
6436 "}\n";
6437 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006438 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006439 "\n"
6440 "layout(location=0) out vec4 color;\n"
6441 "void main(){\n"
6442 " color = vec4(1);\n"
6443 "}\n";
6444
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006445 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6446 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006447
6448 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006449 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006450 pipe.AddShader(&vs);
6451 pipe.AddShader(&fs);
6452
Chris Forbes9f7ff632015-05-25 11:13:08 +12006453 VkDescriptorSetObj descriptorSet(m_device);
6454 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006455 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006456
Tony Barbour5781e8f2015-08-04 16:23:11 -06006457 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006458
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006459 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006460}
Chris Forbes9f7ff632015-05-25 11:13:08 +12006461
Karl Schultz6addd812016-02-02 17:17:23 -07006462TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006464 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006465
Chris Forbes59cb88d2015-05-25 11:13:13 +12006466 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006467 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006468
6469 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006470 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006471 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006472 "out gl_PerVertex {\n"
6473 " vec4 gl_Position;\n"
6474 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006475 "void main(){\n"
6476 " gl_Position = vec4(1);\n"
6477 "}\n";
6478 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006479 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006480 "\n"
6481 "layout(location=0) in float x;\n"
6482 "layout(location=0) out vec4 color;\n"
6483 "void main(){\n"
6484 " color = vec4(x);\n"
6485 "}\n";
6486
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006487 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6488 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006489
6490 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006491 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006492 pipe.AddShader(&vs);
6493 pipe.AddShader(&fs);
6494
Chris Forbes59cb88d2015-05-25 11:13:13 +12006495 VkDescriptorSetObj descriptorSet(m_device);
6496 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006497 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006498
Tony Barbour5781e8f2015-08-04 16:23:11 -06006499 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006500
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006501 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006502}
6503
Karl Schultz6addd812016-02-02 17:17:23 -07006504TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006505 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006506 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006507
6508 ASSERT_NO_FATAL_FAILURE(InitState());
6509 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6510
6511 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006512 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006513 "\n"
6514 "out gl_PerVertex {\n"
6515 " vec4 gl_Position;\n"
6516 "};\n"
6517 "void main(){\n"
6518 " gl_Position = vec4(1);\n"
6519 "}\n";
6520 char const *fsSource =
6521 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006522 "\n"
6523 "in block { layout(location=0) float x; } ins;\n"
6524 "layout(location=0) out vec4 color;\n"
6525 "void main(){\n"
6526 " color = vec4(ins.x);\n"
6527 "}\n";
6528
6529 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6530 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6531
6532 VkPipelineObj pipe(m_device);
6533 pipe.AddColorAttachment();
6534 pipe.AddShader(&vs);
6535 pipe.AddShader(&fs);
6536
6537 VkDescriptorSetObj descriptorSet(m_device);
6538 descriptorSet.AppendDummy();
6539 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6540
6541 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6542
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006543 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006544}
6545
Karl Schultz6addd812016-02-02 17:17:23 -07006546TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13006547 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13006548 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07006549 "output arr[2] of float32' vs 'ptr to "
6550 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13006551
6552 ASSERT_NO_FATAL_FAILURE(InitState());
6553 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6554
6555 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006556 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006557 "\n"
6558 "layout(location=0) out float x[2];\n"
6559 "out gl_PerVertex {\n"
6560 " vec4 gl_Position;\n"
6561 "};\n"
6562 "void main(){\n"
6563 " x[0] = 0; x[1] = 0;\n"
6564 " gl_Position = vec4(1);\n"
6565 "}\n";
6566 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006567 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006568 "\n"
6569 "layout(location=0) in float x[3];\n"
6570 "layout(location=0) out vec4 color;\n"
6571 "void main(){\n"
6572 " color = vec4(x[0] + x[1] + x[2]);\n"
6573 "}\n";
6574
6575 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6576 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6577
6578 VkPipelineObj pipe(m_device);
6579 pipe.AddColorAttachment();
6580 pipe.AddShader(&vs);
6581 pipe.AddShader(&fs);
6582
6583 VkDescriptorSetObj descriptorSet(m_device);
6584 descriptorSet.AppendDummy();
6585 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6586
6587 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6588
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006589 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13006590}
6591
Karl Schultz6addd812016-02-02 17:17:23 -07006592TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006594 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006595
Chris Forbesb56af562015-05-25 11:13:17 +12006596 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006597 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12006598
6599 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006600 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006601 "\n"
6602 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006603 "out gl_PerVertex {\n"
6604 " vec4 gl_Position;\n"
6605 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006606 "void main(){\n"
6607 " x = 0;\n"
6608 " gl_Position = vec4(1);\n"
6609 "}\n";
6610 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006611 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006612 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006613 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12006614 "layout(location=0) out vec4 color;\n"
6615 "void main(){\n"
6616 " color = vec4(x);\n"
6617 "}\n";
6618
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006619 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6620 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12006621
6622 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006623 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12006624 pipe.AddShader(&vs);
6625 pipe.AddShader(&fs);
6626
Chris Forbesb56af562015-05-25 11:13:17 +12006627 VkDescriptorSetObj descriptorSet(m_device);
6628 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006629 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12006630
Tony Barbour5781e8f2015-08-04 16:23:11 -06006631 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12006632
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006633 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12006634}
6635
Karl Schultz6addd812016-02-02 17:17:23 -07006636TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006637 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006638 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006639
6640 ASSERT_NO_FATAL_FAILURE(InitState());
6641 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6642
6643 char const *vsSource =
6644 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006645 "\n"
6646 "out block { layout(location=0) int x; } outs;\n"
6647 "out gl_PerVertex {\n"
6648 " vec4 gl_Position;\n"
6649 "};\n"
6650 "void main(){\n"
6651 " outs.x = 0;\n"
6652 " gl_Position = vec4(1);\n"
6653 "}\n";
6654 char const *fsSource =
6655 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006656 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006657 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13006658 "layout(location=0) out vec4 color;\n"
6659 "void main(){\n"
6660 " color = vec4(ins.x);\n"
6661 "}\n";
6662
6663 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6664 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6665
6666 VkPipelineObj pipe(m_device);
6667 pipe.AddColorAttachment();
6668 pipe.AddShader(&vs);
6669 pipe.AddShader(&fs);
6670
6671 VkDescriptorSetObj descriptorSet(m_device);
6672 descriptorSet.AppendDummy();
6673 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6674
6675 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6676
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006677 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006678}
6679
6680TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
6681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6682 "location 0.0 which is not written by vertex shader");
6683
6684 ASSERT_NO_FATAL_FAILURE(InitState());
6685 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6686
6687 char const *vsSource =
6688 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006689 "\n"
6690 "out block { layout(location=1) float x; } outs;\n"
6691 "out gl_PerVertex {\n"
6692 " vec4 gl_Position;\n"
6693 "};\n"
6694 "void main(){\n"
6695 " outs.x = 0;\n"
6696 " gl_Position = vec4(1);\n"
6697 "}\n";
6698 char const *fsSource =
6699 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006700 "\n"
6701 "in block { layout(location=0) float x; } ins;\n"
6702 "layout(location=0) out vec4 color;\n"
6703 "void main(){\n"
6704 " color = vec4(ins.x);\n"
6705 "}\n";
6706
6707 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6708 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6709
6710 VkPipelineObj pipe(m_device);
6711 pipe.AddColorAttachment();
6712 pipe.AddShader(&vs);
6713 pipe.AddShader(&fs);
6714
6715 VkDescriptorSetObj descriptorSet(m_device);
6716 descriptorSet.AppendDummy();
6717 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6718
6719 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6720
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006721 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006722}
6723
6724TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
6725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6726 "location 0.1 which is not written by vertex shader");
6727
6728 ASSERT_NO_FATAL_FAILURE(InitState());
6729 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6730
6731 char const *vsSource =
6732 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006733 "\n"
6734 "out block { layout(location=0, component=0) float x; } outs;\n"
6735 "out gl_PerVertex {\n"
6736 " vec4 gl_Position;\n"
6737 "};\n"
6738 "void main(){\n"
6739 " outs.x = 0;\n"
6740 " gl_Position = vec4(1);\n"
6741 "}\n";
6742 char const *fsSource =
6743 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006744 "\n"
6745 "in block { layout(location=0, component=1) float x; } ins;\n"
6746 "layout(location=0) out vec4 color;\n"
6747 "void main(){\n"
6748 " color = vec4(ins.x);\n"
6749 "}\n";
6750
6751 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6752 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6753
6754 VkPipelineObj pipe(m_device);
6755 pipe.AddColorAttachment();
6756 pipe.AddShader(&vs);
6757 pipe.AddShader(&fs);
6758
6759 VkDescriptorSetObj descriptorSet(m_device);
6760 descriptorSet.AppendDummy();
6761 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6762
6763 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6764
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006765 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006766}
6767
Karl Schultz6addd812016-02-02 17:17:23 -07006768TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006769 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006770 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006771
Chris Forbesde136e02015-05-25 11:13:28 +12006772 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006773 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12006774
6775 VkVertexInputBindingDescription input_binding;
6776 memset(&input_binding, 0, sizeof(input_binding));
6777
6778 VkVertexInputAttributeDescription input_attrib;
6779 memset(&input_attrib, 0, sizeof(input_attrib));
6780 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6781
6782 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006783 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006784 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006785 "out gl_PerVertex {\n"
6786 " vec4 gl_Position;\n"
6787 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006788 "void main(){\n"
6789 " gl_Position = vec4(1);\n"
6790 "}\n";
6791 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006792 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006793 "\n"
6794 "layout(location=0) out vec4 color;\n"
6795 "void main(){\n"
6796 " color = vec4(1);\n"
6797 "}\n";
6798
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006799 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6800 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12006801
6802 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006803 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12006804 pipe.AddShader(&vs);
6805 pipe.AddShader(&fs);
6806
6807 pipe.AddVertexInputBindings(&input_binding, 1);
6808 pipe.AddVertexInputAttribs(&input_attrib, 1);
6809
Chris Forbesde136e02015-05-25 11:13:28 +12006810 VkDescriptorSetObj descriptorSet(m_device);
6811 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006812 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12006813
Tony Barbour5781e8f2015-08-04 16:23:11 -06006814 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12006815
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006816 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12006817}
6818
Karl Schultz6addd812016-02-02 17:17:23 -07006819TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006820 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006821 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13006822
6823 ASSERT_NO_FATAL_FAILURE(InitState());
6824 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6825
6826 VkVertexInputBindingDescription input_binding;
6827 memset(&input_binding, 0, sizeof(input_binding));
6828
6829 VkVertexInputAttributeDescription input_attrib;
6830 memset(&input_attrib, 0, sizeof(input_attrib));
6831 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6832
6833 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006834 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006835 "\n"
6836 "layout(location=1) in float x;\n"
6837 "out gl_PerVertex {\n"
6838 " vec4 gl_Position;\n"
6839 "};\n"
6840 "void main(){\n"
6841 " gl_Position = vec4(x);\n"
6842 "}\n";
6843 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006844 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006845 "\n"
6846 "layout(location=0) out vec4 color;\n"
6847 "void main(){\n"
6848 " color = vec4(1);\n"
6849 "}\n";
6850
6851 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6852 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6853
6854 VkPipelineObj pipe(m_device);
6855 pipe.AddColorAttachment();
6856 pipe.AddShader(&vs);
6857 pipe.AddShader(&fs);
6858
6859 pipe.AddVertexInputBindings(&input_binding, 1);
6860 pipe.AddVertexInputAttribs(&input_attrib, 1);
6861
6862 VkDescriptorSetObj descriptorSet(m_device);
6863 descriptorSet.AppendDummy();
6864 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6865
6866 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6867
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006868 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13006869}
6870
Karl Schultz6addd812016-02-02 17:17:23 -07006871TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
6872 m_errorMonitor->SetDesiredFailureMsg(
6873 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006874 "VS consumes input at location 0 but not provided");
6875
Chris Forbes62e8e502015-05-25 11:13:29 +12006876 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006877 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12006878
6879 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006880 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006881 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006882 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07006883 "out gl_PerVertex {\n"
6884 " vec4 gl_Position;\n"
6885 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006886 "void main(){\n"
6887 " gl_Position = x;\n"
6888 "}\n";
6889 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006890 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006891 "\n"
6892 "layout(location=0) out vec4 color;\n"
6893 "void main(){\n"
6894 " color = vec4(1);\n"
6895 "}\n";
6896
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006897 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6898 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12006899
6900 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006901 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12006902 pipe.AddShader(&vs);
6903 pipe.AddShader(&fs);
6904
Chris Forbes62e8e502015-05-25 11:13:29 +12006905 VkDescriptorSetObj descriptorSet(m_device);
6906 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006907 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12006908
Tony Barbour5781e8f2015-08-04 16:23:11 -06006909 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12006910
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006911 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12006912}
6913
Karl Schultz6addd812016-02-02 17:17:23 -07006914TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
6915 m_errorMonitor->SetDesiredFailureMsg(
6916 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006917 "location 0 does not match VS input type");
6918
Chris Forbesc97d98e2015-05-25 11:13:31 +12006919 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006920 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006921
6922 VkVertexInputBindingDescription input_binding;
6923 memset(&input_binding, 0, sizeof(input_binding));
6924
6925 VkVertexInputAttributeDescription input_attrib;
6926 memset(&input_attrib, 0, sizeof(input_attrib));
6927 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6928
6929 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006930 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006931 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006932 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07006933 "out gl_PerVertex {\n"
6934 " vec4 gl_Position;\n"
6935 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006936 "void main(){\n"
6937 " gl_Position = vec4(x);\n"
6938 "}\n";
6939 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006940 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006941 "\n"
6942 "layout(location=0) out vec4 color;\n"
6943 "void main(){\n"
6944 " color = vec4(1);\n"
6945 "}\n";
6946
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006947 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6948 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006949
6950 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006951 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006952 pipe.AddShader(&vs);
6953 pipe.AddShader(&fs);
6954
6955 pipe.AddVertexInputBindings(&input_binding, 1);
6956 pipe.AddVertexInputAttribs(&input_attrib, 1);
6957
Chris Forbesc97d98e2015-05-25 11:13:31 +12006958 VkDescriptorSetObj descriptorSet(m_device);
6959 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006960 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006961
Tony Barbour5781e8f2015-08-04 16:23:11 -06006962 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006963
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006964 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006965}
6966
Chris Forbesc68b43c2016-04-06 11:18:47 +12006967TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
6968 m_errorMonitor->SetDesiredFailureMsg(
6969 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6970 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
6971
6972 ASSERT_NO_FATAL_FAILURE(InitState());
6973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6974
6975 char const *vsSource =
6976 "#version 450\n"
6977 "\n"
6978 "out gl_PerVertex {\n"
6979 " vec4 gl_Position;\n"
6980 "};\n"
6981 "void main(){\n"
6982 " gl_Position = vec4(1);\n"
6983 "}\n";
6984 char const *fsSource =
6985 "#version 450\n"
6986 "\n"
6987 "layout(location=0) out vec4 color;\n"
6988 "void main(){\n"
6989 " color = vec4(1);\n"
6990 "}\n";
6991
6992 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6993 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6994
6995 VkPipelineObj pipe(m_device);
6996 pipe.AddColorAttachment();
6997 pipe.AddShader(&vs);
6998 pipe.AddShader(&vs);
6999 pipe.AddShader(&fs);
7000
7001 VkDescriptorSetObj descriptorSet(m_device);
7002 descriptorSet.AppendDummy();
7003 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7004
7005 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7006
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007007 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12007008}
7009
Karl Schultz6addd812016-02-02 17:17:23 -07007010TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007011 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007012
7013 ASSERT_NO_FATAL_FAILURE(InitState());
7014 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7015
7016 VkVertexInputBindingDescription input_binding;
7017 memset(&input_binding, 0, sizeof(input_binding));
7018
7019 VkVertexInputAttributeDescription input_attribs[2];
7020 memset(input_attribs, 0, sizeof(input_attribs));
7021
7022 for (int i = 0; i < 2; i++) {
7023 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7024 input_attribs[i].location = i;
7025 }
7026
7027 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007028 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007029 "\n"
7030 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007031 "out gl_PerVertex {\n"
7032 " vec4 gl_Position;\n"
7033 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007034 "void main(){\n"
7035 " gl_Position = x[0] + x[1];\n"
7036 "}\n";
7037 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007038 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007039 "\n"
7040 "layout(location=0) out vec4 color;\n"
7041 "void main(){\n"
7042 " color = vec4(1);\n"
7043 "}\n";
7044
7045 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7046 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7047
7048 VkPipelineObj pipe(m_device);
7049 pipe.AddColorAttachment();
7050 pipe.AddShader(&vs);
7051 pipe.AddShader(&fs);
7052
7053 pipe.AddVertexInputBindings(&input_binding, 1);
7054 pipe.AddVertexInputAttribs(input_attribs, 2);
7055
7056 VkDescriptorSetObj descriptorSet(m_device);
7057 descriptorSet.AppendDummy();
7058 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7059
7060 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7061
7062 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007063 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007064}
7065
Chris Forbes2682b242015-11-24 11:13:14 +13007066TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
7067{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007068 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007069
7070 ASSERT_NO_FATAL_FAILURE(InitState());
7071 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7072
7073 VkVertexInputBindingDescription input_binding;
7074 memset(&input_binding, 0, sizeof(input_binding));
7075
7076 VkVertexInputAttributeDescription input_attribs[2];
7077 memset(input_attribs, 0, sizeof(input_attribs));
7078
7079 for (int i = 0; i < 2; i++) {
7080 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7081 input_attribs[i].location = i;
7082 }
7083
7084 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007085 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007086 "\n"
7087 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07007088 "out gl_PerVertex {\n"
7089 " vec4 gl_Position;\n"
7090 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007091 "void main(){\n"
7092 " gl_Position = x[0] + x[1];\n"
7093 "}\n";
7094 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007095 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007096 "\n"
7097 "layout(location=0) out vec4 color;\n"
7098 "void main(){\n"
7099 " color = vec4(1);\n"
7100 "}\n";
7101
7102 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7103 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7104
7105 VkPipelineObj pipe(m_device);
7106 pipe.AddColorAttachment();
7107 pipe.AddShader(&vs);
7108 pipe.AddShader(&fs);
7109
7110 pipe.AddVertexInputBindings(&input_binding, 1);
7111 pipe.AddVertexInputAttribs(input_attribs, 2);
7112
7113 VkDescriptorSetObj descriptorSet(m_device);
7114 descriptorSet.AppendDummy();
7115 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7116
7117 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7118
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007119 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007120}
Chris Forbes2682b242015-11-24 11:13:14 +13007121
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007122TEST_F(VkLayerTest, CreatePipelineSimplePositive)
7123{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007124 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007125
7126 ASSERT_NO_FATAL_FAILURE(InitState());
7127 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7128
7129 char const *vsSource =
7130 "#version 450\n"
7131 "out gl_PerVertex {\n"
7132 " vec4 gl_Position;\n"
7133 "};\n"
7134 "void main(){\n"
7135 " gl_Position = vec4(0);\n"
7136 "}\n";
7137 char const *fsSource =
7138 "#version 450\n"
7139 "\n"
7140 "layout(location=0) out vec4 color;\n"
7141 "void main(){\n"
7142 " color = vec4(1);\n"
7143 "}\n";
7144
7145 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7146 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7147
7148 VkPipelineObj pipe(m_device);
7149 pipe.AddColorAttachment();
7150 pipe.AddShader(&vs);
7151 pipe.AddShader(&fs);
7152
7153 VkDescriptorSetObj descriptorSet(m_device);
7154 descriptorSet.AppendDummy();
7155 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7156
7157 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7158
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007159 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007160}
7161
Chris Forbes912c9192016-04-05 17:50:35 +12007162TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
7163{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007164 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12007165
7166 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
7167
7168 ASSERT_NO_FATAL_FAILURE(InitState());
7169 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7170
7171 char const *vsSource =
7172 "#version 450\n"
7173 "out gl_PerVertex {\n"
7174 " vec4 gl_Position;\n"
7175 "};\n"
7176 "layout(location=0) out vec3 x;\n"
7177 "layout(location=1) out ivec3 y;\n"
7178 "layout(location=2) out vec3 z;\n"
7179 "void main(){\n"
7180 " gl_Position = vec4(0);\n"
7181 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
7182 "}\n";
7183 char const *fsSource =
7184 "#version 450\n"
7185 "\n"
7186 "layout(location=0) out vec4 color;\n"
7187 "layout(location=0) in float x;\n"
7188 "layout(location=1) flat in int y;\n"
7189 "layout(location=2) in vec2 z;\n"
7190 "void main(){\n"
7191 " color = vec4(1 + x + y + z.x);\n"
7192 "}\n";
7193
7194 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7195 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7196
7197 VkPipelineObj pipe(m_device);
7198 pipe.AddColorAttachment();
7199 pipe.AddShader(&vs);
7200 pipe.AddShader(&fs);
7201
7202 VkDescriptorSetObj descriptorSet(m_device);
7203 descriptorSet.AppendDummy();
7204 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7205
7206 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7207
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007208 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12007209}
7210
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007211TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
7212{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007213 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007214
7215 ASSERT_NO_FATAL_FAILURE(InitState());
7216 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7217
Chris Forbesc1e852d2016-04-04 19:26:42 +12007218 if (!m_device->phy().features().tessellationShader) {
7219 printf("Device does not support tessellation shaders; skipped.\n");
7220 return;
7221 }
7222
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007223 char const *vsSource =
7224 "#version 450\n"
7225 "void main(){}\n";
7226 char const *tcsSource =
7227 "#version 450\n"
7228 "layout(location=0) out int x[];\n"
7229 "layout(vertices=3) out;\n"
7230 "void main(){\n"
7231 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7232 " gl_TessLevelInner[0] = 1;\n"
7233 " x[gl_InvocationID] = gl_InvocationID;\n"
7234 "}\n";
7235 char const *tesSource =
7236 "#version 450\n"
7237 "layout(triangles, equal_spacing, cw) in;\n"
7238 "layout(location=0) in int x[];\n"
7239 "out gl_PerVertex { vec4 gl_Position; };\n"
7240 "void main(){\n"
7241 " gl_Position.xyz = gl_TessCoord;\n"
7242 " gl_Position.w = x[0] + x[1] + x[2];\n"
7243 "}\n";
7244 char const *fsSource =
7245 "#version 450\n"
7246 "layout(location=0) out vec4 color;\n"
7247 "void main(){\n"
7248 " color = vec4(1);\n"
7249 "}\n";
7250
7251 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7252 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7253 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7254 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7255
7256 VkPipelineInputAssemblyStateCreateInfo iasci{
7257 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7258 nullptr,
7259 0,
7260 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7261 VK_FALSE};
7262
Chris Forbesb4cacb62016-04-04 19:15:00 +12007263 VkPipelineTessellationStateCreateInfo tsci{
7264 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7265 nullptr,
7266 0,
7267 3};
7268
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007269 VkPipelineObj pipe(m_device);
7270 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12007271 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007272 pipe.AddColorAttachment();
7273 pipe.AddShader(&vs);
7274 pipe.AddShader(&tcs);
7275 pipe.AddShader(&tes);
7276 pipe.AddShader(&fs);
7277
7278 VkDescriptorSetObj descriptorSet(m_device);
7279 descriptorSet.AppendDummy();
7280 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7281
7282 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7283
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007284 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007285}
7286
Chris Forbesa0ab8152016-04-20 13:34:27 +12007287TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
7288{
7289 m_errorMonitor->ExpectSuccess();
7290
7291 ASSERT_NO_FATAL_FAILURE(InitState());
7292 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7293
7294 if (!m_device->phy().features().geometryShader) {
7295 printf("Device does not support geometry shaders; skipped.\n");
7296 return;
7297 }
7298
7299 char const *vsSource =
7300 "#version 450\n"
7301 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
7302 "void main(){\n"
7303 " vs_out.x = vec4(1);\n"
7304 "}\n";
7305 char const *gsSource =
7306 "#version 450\n"
7307 "layout(triangles) in;\n"
7308 "layout(triangle_strip, max_vertices=3) out;\n"
7309 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
7310 "out gl_PerVertex { vec4 gl_Position; };\n"
7311 "void main() {\n"
7312 " gl_Position = gs_in[0].x;\n"
7313 " EmitVertex();\n"
7314 "}\n";
7315 char const *fsSource =
7316 "#version 450\n"
7317 "layout(location=0) out vec4 color;\n"
7318 "void main(){\n"
7319 " color = vec4(1);\n"
7320 "}\n";
7321
7322 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7323 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
7324 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7325
7326 VkPipelineObj pipe(m_device);
7327 pipe.AddColorAttachment();
7328 pipe.AddShader(&vs);
7329 pipe.AddShader(&gs);
7330 pipe.AddShader(&fs);
7331
7332 VkDescriptorSetObj descriptorSet(m_device);
7333 descriptorSet.AppendDummy();
7334 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7335
7336 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7337
7338 m_errorMonitor->VerifyNotFound();
7339}
7340
Chris Forbesa0193bc2016-04-04 19:19:47 +12007341TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
7342{
7343 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7344 "is per-vertex in tessellation control shader stage "
7345 "but per-patch in tessellation evaluation shader stage");
7346
7347 ASSERT_NO_FATAL_FAILURE(InitState());
7348 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7349
Chris Forbesc1e852d2016-04-04 19:26:42 +12007350 if (!m_device->phy().features().tessellationShader) {
7351 printf("Device does not support tessellation shaders; skipped.\n");
7352 return;
7353 }
7354
Chris Forbesa0193bc2016-04-04 19:19:47 +12007355 char const *vsSource =
7356 "#version 450\n"
7357 "void main(){}\n";
7358 char const *tcsSource =
7359 "#version 450\n"
7360 "layout(location=0) out int x[];\n"
7361 "layout(vertices=3) out;\n"
7362 "void main(){\n"
7363 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7364 " gl_TessLevelInner[0] = 1;\n"
7365 " x[gl_InvocationID] = gl_InvocationID;\n"
7366 "}\n";
7367 char const *tesSource =
7368 "#version 450\n"
7369 "layout(triangles, equal_spacing, cw) in;\n"
7370 "layout(location=0) patch in int x;\n"
7371 "out gl_PerVertex { vec4 gl_Position; };\n"
7372 "void main(){\n"
7373 " gl_Position.xyz = gl_TessCoord;\n"
7374 " gl_Position.w = x;\n"
7375 "}\n";
7376 char const *fsSource =
7377 "#version 450\n"
7378 "layout(location=0) out vec4 color;\n"
7379 "void main(){\n"
7380 " color = vec4(1);\n"
7381 "}\n";
7382
7383 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7384 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7385 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7386 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7387
7388 VkPipelineInputAssemblyStateCreateInfo iasci{
7389 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7390 nullptr,
7391 0,
7392 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7393 VK_FALSE};
7394
7395 VkPipelineTessellationStateCreateInfo tsci{
7396 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7397 nullptr,
7398 0,
7399 3};
7400
7401 VkPipelineObj pipe(m_device);
7402 pipe.SetInputAssembly(&iasci);
7403 pipe.SetTessellation(&tsci);
7404 pipe.AddColorAttachment();
7405 pipe.AddShader(&vs);
7406 pipe.AddShader(&tcs);
7407 pipe.AddShader(&tes);
7408 pipe.AddShader(&fs);
7409
7410 VkDescriptorSetObj descriptorSet(m_device);
7411 descriptorSet.AppendDummy();
7412 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7413
7414 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7415
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007416 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12007417}
7418
Karl Schultz6addd812016-02-02 17:17:23 -07007419TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
7420 m_errorMonitor->SetDesiredFailureMsg(
7421 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007422 "Duplicate vertex input binding descriptions for binding 0");
7423
Chris Forbes280ba2c2015-06-12 11:16:41 +12007424 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007425 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007426
7427 /* Two binding descriptions for binding 0 */
7428 VkVertexInputBindingDescription input_bindings[2];
7429 memset(input_bindings, 0, sizeof(input_bindings));
7430
7431 VkVertexInputAttributeDescription input_attrib;
7432 memset(&input_attrib, 0, sizeof(input_attrib));
7433 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7434
7435 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007436 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007437 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007438 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007439 "out gl_PerVertex {\n"
7440 " vec4 gl_Position;\n"
7441 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007442 "void main(){\n"
7443 " gl_Position = vec4(x);\n"
7444 "}\n";
7445 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007446 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007447 "\n"
7448 "layout(location=0) out vec4 color;\n"
7449 "void main(){\n"
7450 " color = vec4(1);\n"
7451 "}\n";
7452
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007453 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7454 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007455
7456 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007457 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007458 pipe.AddShader(&vs);
7459 pipe.AddShader(&fs);
7460
7461 pipe.AddVertexInputBindings(input_bindings, 2);
7462 pipe.AddVertexInputAttribs(&input_attrib, 1);
7463
Chris Forbes280ba2c2015-06-12 11:16:41 +12007464 VkDescriptorSetObj descriptorSet(m_device);
7465 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007466 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007467
Tony Barbour5781e8f2015-08-04 16:23:11 -06007468 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007469
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007470 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007471}
Chris Forbes8f68b562015-05-25 11:13:32 +12007472
Chris Forbes35efec72016-04-21 14:32:08 +12007473TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
7474 m_errorMonitor->ExpectSuccess();
7475
7476 ASSERT_NO_FATAL_FAILURE(InitState());
7477 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7478
7479 if (!m_device->phy().features().tessellationShader) {
7480 printf("Device does not support 64bit vertex attributes; skipped.\n");
7481 return;
7482 }
7483
7484 VkVertexInputBindingDescription input_bindings[1];
7485 memset(input_bindings, 0, sizeof(input_bindings));
7486
7487 VkVertexInputAttributeDescription input_attribs[4];
7488 memset(input_attribs, 0, sizeof(input_attribs));
7489 input_attribs[0].location = 0;
7490 input_attribs[0].offset = 0;
7491 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7492 input_attribs[1].location = 2;
7493 input_attribs[1].offset = 32;
7494 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7495 input_attribs[2].location = 4;
7496 input_attribs[2].offset = 64;
7497 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7498 input_attribs[3].location = 6;
7499 input_attribs[3].offset = 96;
7500 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7501
7502 char const *vsSource =
7503 "#version 450\n"
7504 "\n"
7505 "layout(location=0) in dmat4 x;\n"
7506 "out gl_PerVertex {\n"
7507 " vec4 gl_Position;\n"
7508 "};\n"
7509 "void main(){\n"
7510 " gl_Position = vec4(x[0][0]);\n"
7511 "}\n";
7512 char const *fsSource =
7513 "#version 450\n"
7514 "\n"
7515 "layout(location=0) out vec4 color;\n"
7516 "void main(){\n"
7517 " color = vec4(1);\n"
7518 "}\n";
7519
7520 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7521 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7522
7523 VkPipelineObj pipe(m_device);
7524 pipe.AddColorAttachment();
7525 pipe.AddShader(&vs);
7526 pipe.AddShader(&fs);
7527
7528 pipe.AddVertexInputBindings(input_bindings, 1);
7529 pipe.AddVertexInputAttribs(input_attribs, 4);
7530
7531 VkDescriptorSetObj descriptorSet(m_device);
7532 descriptorSet.AppendDummy();
7533 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7534
7535 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7536
7537 m_errorMonitor->VerifyNotFound();
7538}
7539
Karl Schultz6addd812016-02-02 17:17:23 -07007540TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007541 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007542 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007543
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007544 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007545
7546 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007547 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007548 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007549 "out gl_PerVertex {\n"
7550 " vec4 gl_Position;\n"
7551 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007552 "void main(){\n"
7553 " gl_Position = vec4(1);\n"
7554 "}\n";
7555 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007556 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007557 "\n"
7558 "void main(){\n"
7559 "}\n";
7560
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007561 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7562 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007563
7564 VkPipelineObj pipe(m_device);
7565 pipe.AddShader(&vs);
7566 pipe.AddShader(&fs);
7567
Chia-I Wu08accc62015-07-07 11:50:03 +08007568 /* set up CB 0, not written */
7569 pipe.AddColorAttachment();
7570 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007571
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007572 VkDescriptorSetObj descriptorSet(m_device);
7573 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007574 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007575
Tony Barbour5781e8f2015-08-04 16:23:11 -06007576 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007577
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007578 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007579}
7580
Karl Schultz6addd812016-02-02 17:17:23 -07007581TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07007582 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007583 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007584 "FS writes to output location 1 with no matching attachment");
7585
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007586 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007587
7588 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007589 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007590 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007591 "out gl_PerVertex {\n"
7592 " vec4 gl_Position;\n"
7593 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007594 "void main(){\n"
7595 " gl_Position = vec4(1);\n"
7596 "}\n";
7597 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007598 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007599 "\n"
7600 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007601 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007602 "void main(){\n"
7603 " x = vec4(1);\n"
7604 " y = vec4(1);\n"
7605 "}\n";
7606
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007607 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7608 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007609
7610 VkPipelineObj pipe(m_device);
7611 pipe.AddShader(&vs);
7612 pipe.AddShader(&fs);
7613
Chia-I Wu08accc62015-07-07 11:50:03 +08007614 /* set up CB 0, not written */
7615 pipe.AddColorAttachment();
7616 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007617 /* FS writes CB 1, but we don't configure it */
7618
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007619 VkDescriptorSetObj descriptorSet(m_device);
7620 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007621 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007622
Tony Barbour5781e8f2015-08-04 16:23:11 -06007623 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007624
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007625 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007626}
7627
Karl Schultz6addd812016-02-02 17:17:23 -07007628TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007629 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007630 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007631
Chris Forbesa36d69e2015-05-25 11:13:44 +12007632 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007633
7634 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007635 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007636 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007637 "out gl_PerVertex {\n"
7638 " vec4 gl_Position;\n"
7639 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007640 "void main(){\n"
7641 " gl_Position = vec4(1);\n"
7642 "}\n";
7643 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007644 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007645 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007646 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12007647 "void main(){\n"
7648 " x = ivec4(1);\n"
7649 "}\n";
7650
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007651 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7652 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007653
7654 VkPipelineObj pipe(m_device);
7655 pipe.AddShader(&vs);
7656 pipe.AddShader(&fs);
7657
Chia-I Wu08accc62015-07-07 11:50:03 +08007658 /* set up CB 0; type is UNORM by default */
7659 pipe.AddColorAttachment();
7660 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007661
Chris Forbesa36d69e2015-05-25 11:13:44 +12007662 VkDescriptorSetObj descriptorSet(m_device);
7663 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007664 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007665
Tony Barbour5781e8f2015-08-04 16:23:11 -06007666 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007667
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007668 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12007669}
Chris Forbes7b1b8932015-06-05 14:43:36 +12007670
Karl Schultz6addd812016-02-02 17:17:23 -07007671TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007673 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007674
Chris Forbes556c76c2015-08-14 12:04:59 +12007675 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12007676
7677 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007678 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007679 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007680 "out gl_PerVertex {\n"
7681 " vec4 gl_Position;\n"
7682 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007683 "void main(){\n"
7684 " gl_Position = vec4(1);\n"
7685 "}\n";
7686 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007687 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007688 "\n"
7689 "layout(location=0) out vec4 x;\n"
7690 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7691 "void main(){\n"
7692 " x = vec4(bar.y);\n"
7693 "}\n";
7694
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007695 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7696 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12007697
Chris Forbes556c76c2015-08-14 12:04:59 +12007698 VkPipelineObj pipe(m_device);
7699 pipe.AddShader(&vs);
7700 pipe.AddShader(&fs);
7701
7702 /* set up CB 0; type is UNORM by default */
7703 pipe.AddColorAttachment();
7704 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7705
7706 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007707 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12007708
7709 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7710
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007711 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12007712}
7713
Chris Forbes5c59e902016-02-26 16:56:09 +13007714TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
7715 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7716 "not declared in layout");
7717
7718 ASSERT_NO_FATAL_FAILURE(InitState());
7719
7720 char const *vsSource =
7721 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007722 "\n"
7723 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
7724 "out gl_PerVertex {\n"
7725 " vec4 gl_Position;\n"
7726 "};\n"
7727 "void main(){\n"
7728 " gl_Position = vec4(consts.x);\n"
7729 "}\n";
7730 char const *fsSource =
7731 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007732 "\n"
7733 "layout(location=0) out vec4 x;\n"
7734 "void main(){\n"
7735 " x = vec4(1);\n"
7736 "}\n";
7737
7738 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7739 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7740
7741 VkPipelineObj pipe(m_device);
7742 pipe.AddShader(&vs);
7743 pipe.AddShader(&fs);
7744
7745 /* set up CB 0; type is UNORM by default */
7746 pipe.AddColorAttachment();
7747 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7748
7749 VkDescriptorSetObj descriptorSet(m_device);
7750 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7751
7752 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7753
7754 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007755 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13007756}
7757
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007758#endif // SHADER_CHECKER_TESTS
7759
7760#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06007761TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07007762 m_errorMonitor->SetDesiredFailureMsg(
7763 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007764 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007765
7766 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007767
7768 // Create an image
7769 VkImage image;
7770
Karl Schultz6addd812016-02-02 17:17:23 -07007771 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7772 const int32_t tex_width = 32;
7773 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007774
7775 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007776 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7777 image_create_info.pNext = NULL;
7778 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7779 image_create_info.format = tex_format;
7780 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007781 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07007782 image_create_info.extent.depth = 1;
7783 image_create_info.mipLevels = 1;
7784 image_create_info.arrayLayers = 1;
7785 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7786 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7787 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7788 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007789
7790 // Introduce error by sending down a bogus width extent
7791 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007792 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007793
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007794 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007795}
7796
Mark Youngc48c4c12016-04-11 14:26:49 -06007797TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
7798 m_errorMonitor->SetDesiredFailureMsg(
7799 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7800 "CreateImage extents is 0 for at least one required dimension");
7801
7802 ASSERT_NO_FATAL_FAILURE(InitState());
7803
7804 // Create an image
7805 VkImage image;
7806
7807 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7808 const int32_t tex_width = 32;
7809 const int32_t tex_height = 32;
7810
7811 VkImageCreateInfo image_create_info = {};
7812 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7813 image_create_info.pNext = NULL;
7814 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7815 image_create_info.format = tex_format;
7816 image_create_info.extent.width = tex_width;
7817 image_create_info.extent.height = tex_height;
7818 image_create_info.extent.depth = 1;
7819 image_create_info.mipLevels = 1;
7820 image_create_info.arrayLayers = 1;
7821 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7822 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7823 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7824 image_create_info.flags = 0;
7825
7826 // Introduce error by sending down a bogus width extent
7827 image_create_info.extent.width = 0;
7828 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7829
7830 m_errorMonitor->VerifyFound();
7831}
7832
Karl Schultz6addd812016-02-02 17:17:23 -07007833TEST_F(VkLayerTest, UpdateBufferAlignment) {
7834 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06007835
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007837 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007838
Mike Stroyana3082432015-09-25 13:39:21 -06007839 ASSERT_NO_FATAL_FAILURE(InitState());
7840
7841 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7842 vk_testing::Buffer buffer;
7843 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7844
7845 BeginCommandBuffer();
7846 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007847 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007848 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007849
Mike Stroyana3082432015-09-25 13:39:21 -06007850 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007852 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007853
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007854 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007855 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007856 EndCommandBuffer();
7857}
7858
Karl Schultz6addd812016-02-02 17:17:23 -07007859TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007861 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06007862
7863 ASSERT_NO_FATAL_FAILURE(InitState());
7864
7865 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7866 vk_testing::Buffer buffer;
7867 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7868
7869 BeginCommandBuffer();
7870 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007871 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007872 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007873
Mike Stroyana3082432015-09-25 13:39:21 -06007874 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007875 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007876 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007877
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007878 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007879
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007880 m_errorMonitor->VerifyFound();
7881
Mike Stroyana3082432015-09-25 13:39:21 -06007882 EndCommandBuffer();
7883}
7884
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007885#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12007886
Tobin Ehliscde08892015-09-22 10:11:37 -06007887#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07007888TEST_F(VkLayerTest, InvalidImageView) {
7889 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06007890
Karl Schultz6addd812016-02-02 17:17:23 -07007891 m_errorMonitor->SetDesiredFailureMsg(
7892 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007893 "vkCreateImageView called with baseMipLevel 10 ");
7894
Tobin Ehliscde08892015-09-22 10:11:37 -06007895 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06007896
Mike Stroyana3082432015-09-25 13:39:21 -06007897 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07007898 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06007899
Karl Schultz6addd812016-02-02 17:17:23 -07007900 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7901 const int32_t tex_width = 32;
7902 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06007903
7904 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007905 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7906 image_create_info.pNext = NULL;
7907 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7908 image_create_info.format = tex_format;
7909 image_create_info.extent.width = tex_width;
7910 image_create_info.extent.height = tex_height;
7911 image_create_info.extent.depth = 1;
7912 image_create_info.mipLevels = 1;
7913 image_create_info.arrayLayers = 1;
7914 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7915 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7916 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7917 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06007918
Chia-I Wuf7458c52015-10-26 21:10:41 +08007919 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06007920 ASSERT_VK_SUCCESS(err);
7921
7922 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007923 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7924 image_view_create_info.image = image;
7925 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7926 image_view_create_info.format = tex_format;
7927 image_view_create_info.subresourceRange.layerCount = 1;
7928 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
7929 image_view_create_info.subresourceRange.levelCount = 1;
7930 image_view_create_info.subresourceRange.aspectMask =
7931 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06007932
7933 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007934 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7935 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06007936
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007937 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06007938}
Mike Stroyana3082432015-09-25 13:39:21 -06007939
Karl Schultz6addd812016-02-02 17:17:23 -07007940TEST_F(VkLayerTest, InvalidImageViewAspect) {
7941 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007942
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007944 "vkCreateImageView: Color image "
7945 "formats must have ONLY the "
7946 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007947
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007948 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007949
7950 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07007951 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007952
Karl Schultz6addd812016-02-02 17:17:23 -07007953 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7954 const int32_t tex_width = 32;
7955 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007956
7957 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007958 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7959 image_create_info.pNext = NULL;
7960 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7961 image_create_info.format = tex_format;
7962 image_create_info.extent.width = tex_width;
7963 image_create_info.extent.height = tex_height;
7964 image_create_info.extent.depth = 1;
7965 image_create_info.mipLevels = 1;
7966 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7967 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7968 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7969 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007970
Chia-I Wuf7458c52015-10-26 21:10:41 +08007971 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007972 ASSERT_VK_SUCCESS(err);
7973
7974 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007975 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7976 image_view_create_info.image = image;
7977 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7978 image_view_create_info.format = tex_format;
7979 image_view_create_info.subresourceRange.baseMipLevel = 0;
7980 image_view_create_info.subresourceRange.levelCount = 1;
7981 // Cause an error by setting an invalid image aspect
7982 image_view_create_info.subresourceRange.aspectMask =
7983 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007984
7985 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007986 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7987 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007988
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007989 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007990}
7991
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007992TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07007993 VkResult err;
7994 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007995
Karl Schultz6addd812016-02-02 17:17:23 -07007996 m_errorMonitor->SetDesiredFailureMsg(
7997 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007998 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007999
Mike Stroyana3082432015-09-25 13:39:21 -06008000 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008001
8002 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008003 VkImage srcImage;
8004 VkImage dstImage;
8005 VkDeviceMemory srcMem;
8006 VkDeviceMemory destMem;
8007 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008008
8009 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008010 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8011 image_create_info.pNext = NULL;
8012 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8013 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8014 image_create_info.extent.width = 32;
8015 image_create_info.extent.height = 32;
8016 image_create_info.extent.depth = 1;
8017 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008018 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07008019 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8020 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8021 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8022 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008023
Karl Schultz6addd812016-02-02 17:17:23 -07008024 err =
8025 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008026 ASSERT_VK_SUCCESS(err);
8027
Karl Schultz6addd812016-02-02 17:17:23 -07008028 err =
8029 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008030 ASSERT_VK_SUCCESS(err);
8031
8032 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008033 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008034 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8035 memAlloc.pNext = NULL;
8036 memAlloc.allocationSize = 0;
8037 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008038
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008039 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008040 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008041 pass =
8042 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008043 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008044 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008045 ASSERT_VK_SUCCESS(err);
8046
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008047 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008048 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008049 pass =
8050 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008051 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008052 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008053 ASSERT_VK_SUCCESS(err);
8054
8055 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8056 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008057 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008058 ASSERT_VK_SUCCESS(err);
8059
8060 BeginCommandBuffer();
8061 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008062 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008063 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008064 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008065 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06008066 copyRegion.srcOffset.x = 0;
8067 copyRegion.srcOffset.y = 0;
8068 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008069 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008070 copyRegion.dstSubresource.mipLevel = 0;
8071 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008072 // Introduce failure by forcing the dst layerCount to differ from src
8073 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008074 copyRegion.dstOffset.x = 0;
8075 copyRegion.dstOffset.y = 0;
8076 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008077 copyRegion.extent.width = 1;
8078 copyRegion.extent.height = 1;
8079 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008080 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8081 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008082 EndCommandBuffer();
8083
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008084 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008085
Chia-I Wuf7458c52015-10-26 21:10:41 +08008086 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008087 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008088 vkFreeMemory(m_device->device(), srcMem, NULL);
8089 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008090}
8091
Karl Schultz6addd812016-02-02 17:17:23 -07008092TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06008093 VkResult err;
8094 bool pass;
8095
8096 // Create color images with different format sizes and try to copy between them
8097 m_errorMonitor->SetDesiredFailureMsg(
8098 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8099 "vkCmdCopyImage called with unmatched source and dest image format sizes");
8100
8101 ASSERT_NO_FATAL_FAILURE(InitState());
8102
8103 // Create two images of different types and try to copy between them
8104 VkImage srcImage;
8105 VkImage dstImage;
8106 VkDeviceMemory srcMem;
8107 VkDeviceMemory destMem;
8108 VkMemoryRequirements memReqs;
8109
8110 VkImageCreateInfo image_create_info = {};
8111 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8112 image_create_info.pNext = NULL;
8113 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8114 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8115 image_create_info.extent.width = 32;
8116 image_create_info.extent.height = 32;
8117 image_create_info.extent.depth = 1;
8118 image_create_info.mipLevels = 1;
8119 image_create_info.arrayLayers = 1;
8120 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8121 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8122 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8123 image_create_info.flags = 0;
8124
8125 err =
8126 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
8127 ASSERT_VK_SUCCESS(err);
8128
8129 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
8130 // Introduce failure by creating second image with a different-sized format.
8131 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
8132
8133 err =
8134 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
8135 ASSERT_VK_SUCCESS(err);
8136
8137 // Allocate memory
8138 VkMemoryAllocateInfo memAlloc = {};
8139 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8140 memAlloc.pNext = NULL;
8141 memAlloc.allocationSize = 0;
8142 memAlloc.memoryTypeIndex = 0;
8143
8144 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
8145 memAlloc.allocationSize = memReqs.size;
8146 pass =
8147 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
8148 ASSERT_TRUE(pass);
8149 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
8150 ASSERT_VK_SUCCESS(err);
8151
8152 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
8153 memAlloc.allocationSize = memReqs.size;
8154 pass =
8155 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
8156 ASSERT_TRUE(pass);
8157 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
8158 ASSERT_VK_SUCCESS(err);
8159
8160 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8161 ASSERT_VK_SUCCESS(err);
8162 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
8163 ASSERT_VK_SUCCESS(err);
8164
8165 BeginCommandBuffer();
8166 VkImageCopy copyRegion;
8167 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8168 copyRegion.srcSubresource.mipLevel = 0;
8169 copyRegion.srcSubresource.baseArrayLayer = 0;
8170 copyRegion.srcSubresource.layerCount = 0;
8171 copyRegion.srcOffset.x = 0;
8172 copyRegion.srcOffset.y = 0;
8173 copyRegion.srcOffset.z = 0;
8174 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8175 copyRegion.dstSubresource.mipLevel = 0;
8176 copyRegion.dstSubresource.baseArrayLayer = 0;
8177 copyRegion.dstSubresource.layerCount = 0;
8178 copyRegion.dstOffset.x = 0;
8179 copyRegion.dstOffset.y = 0;
8180 copyRegion.dstOffset.z = 0;
8181 copyRegion.extent.width = 1;
8182 copyRegion.extent.height = 1;
8183 copyRegion.extent.depth = 1;
8184 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8185 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
8186 EndCommandBuffer();
8187
8188 m_errorMonitor->VerifyFound();
8189
8190 vkDestroyImage(m_device->device(), srcImage, NULL);
8191 vkDestroyImage(m_device->device(), dstImage, NULL);
8192 vkFreeMemory(m_device->device(), srcMem, NULL);
8193 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008194}
8195
Karl Schultz6addd812016-02-02 17:17:23 -07008196TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
8197 VkResult err;
8198 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008199
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008200 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008201 m_errorMonitor->SetDesiredFailureMsg(
8202 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008203 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008204
Mike Stroyana3082432015-09-25 13:39:21 -06008205 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008206
8207 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008208 VkImage srcImage;
8209 VkImage dstImage;
8210 VkDeviceMemory srcMem;
8211 VkDeviceMemory destMem;
8212 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008213
8214 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008215 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8216 image_create_info.pNext = NULL;
8217 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8218 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8219 image_create_info.extent.width = 32;
8220 image_create_info.extent.height = 32;
8221 image_create_info.extent.depth = 1;
8222 image_create_info.mipLevels = 1;
8223 image_create_info.arrayLayers = 1;
8224 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8225 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8226 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8227 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008228
Karl Schultz6addd812016-02-02 17:17:23 -07008229 err =
8230 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008231 ASSERT_VK_SUCCESS(err);
8232
Karl Schultzbdb75952016-04-19 11:36:49 -06008233 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
8234
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008235 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07008236 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008237 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
8238 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_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 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008274 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008275 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008276 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008277 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008278 copyRegion.srcOffset.x = 0;
8279 copyRegion.srcOffset.y = 0;
8280 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008281 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008282 copyRegion.dstSubresource.mipLevel = 0;
8283 copyRegion.dstSubresource.baseArrayLayer = 0;
8284 copyRegion.dstSubresource.layerCount = 0;
8285 copyRegion.dstOffset.x = 0;
8286 copyRegion.dstOffset.y = 0;
8287 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008288 copyRegion.extent.width = 1;
8289 copyRegion.extent.height = 1;
8290 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008291 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8292 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008293 EndCommandBuffer();
8294
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008295 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008296
Chia-I Wuf7458c52015-10-26 21:10:41 +08008297 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008298 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008299 vkFreeMemory(m_device->device(), srcMem, NULL);
8300 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008301}
8302
Karl Schultz6addd812016-02-02 17:17:23 -07008303TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
8304 VkResult err;
8305 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008306
Karl Schultz6addd812016-02-02 17:17:23 -07008307 m_errorMonitor->SetDesiredFailureMsg(
8308 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008309 "vkCmdResolveImage called with source sample count less than 2.");
8310
Mike Stroyana3082432015-09-25 13:39:21 -06008311 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008312
8313 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008314 VkImage srcImage;
8315 VkImage dstImage;
8316 VkDeviceMemory srcMem;
8317 VkDeviceMemory destMem;
8318 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008319
8320 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008321 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8322 image_create_info.pNext = NULL;
8323 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8324 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8325 image_create_info.extent.width = 32;
8326 image_create_info.extent.height = 1;
8327 image_create_info.extent.depth = 1;
8328 image_create_info.mipLevels = 1;
8329 image_create_info.arrayLayers = 1;
8330 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8331 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8332 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8333 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008334
Karl Schultz6addd812016-02-02 17:17:23 -07008335 err =
8336 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008337 ASSERT_VK_SUCCESS(err);
8338
Karl Schultz6addd812016-02-02 17:17:23 -07008339 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8340 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008341
Karl Schultz6addd812016-02-02 17:17:23 -07008342 err =
8343 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008344 ASSERT_VK_SUCCESS(err);
8345
8346 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008347 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008348 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8349 memAlloc.pNext = NULL;
8350 memAlloc.allocationSize = 0;
8351 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008352
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008353 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008354 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008355 pass =
8356 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008357 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008358 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008359 ASSERT_VK_SUCCESS(err);
8360
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008361 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008362 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008363 pass =
8364 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008365 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008366 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008367 ASSERT_VK_SUCCESS(err);
8368
8369 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8370 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008371 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008372 ASSERT_VK_SUCCESS(err);
8373
8374 BeginCommandBuffer();
8375 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008376 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8377 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008378 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008379 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008380 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008381 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008382 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008383 resolveRegion.srcOffset.x = 0;
8384 resolveRegion.srcOffset.y = 0;
8385 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008386 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008387 resolveRegion.dstSubresource.mipLevel = 0;
8388 resolveRegion.dstSubresource.baseArrayLayer = 0;
8389 resolveRegion.dstSubresource.layerCount = 0;
8390 resolveRegion.dstOffset.x = 0;
8391 resolveRegion.dstOffset.y = 0;
8392 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008393 resolveRegion.extent.width = 1;
8394 resolveRegion.extent.height = 1;
8395 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008396 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8397 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008398 EndCommandBuffer();
8399
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008400 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008401
Chia-I Wuf7458c52015-10-26 21:10:41 +08008402 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008403 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008404 vkFreeMemory(m_device->device(), srcMem, NULL);
8405 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008406}
8407
Karl Schultz6addd812016-02-02 17:17:23 -07008408TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
8409 VkResult err;
8410 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008411
Karl Schultz6addd812016-02-02 17:17:23 -07008412 m_errorMonitor->SetDesiredFailureMsg(
8413 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008414 "vkCmdResolveImage called with dest sample count greater than 1.");
8415
Mike Stroyana3082432015-09-25 13:39:21 -06008416 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008417
8418 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008419 VkImage srcImage;
8420 VkImage dstImage;
8421 VkDeviceMemory srcMem;
8422 VkDeviceMemory destMem;
8423 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008424
8425 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008426 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8427 image_create_info.pNext = NULL;
8428 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8429 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8430 image_create_info.extent.width = 32;
8431 image_create_info.extent.height = 1;
8432 image_create_info.extent.depth = 1;
8433 image_create_info.mipLevels = 1;
8434 image_create_info.arrayLayers = 1;
8435 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8436 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8437 // Note: Some implementations expect color attachment usage for any
8438 // multisample surface
8439 image_create_info.usage =
8440 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8441 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008442
Karl Schultz6addd812016-02-02 17:17:23 -07008443 err =
8444 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008445 ASSERT_VK_SUCCESS(err);
8446
Karl Schultz6addd812016-02-02 17:17:23 -07008447 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8448 // Note: Some implementations expect color attachment usage for any
8449 // multisample surface
8450 image_create_info.usage =
8451 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008452
Karl Schultz6addd812016-02-02 17:17:23 -07008453 err =
8454 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008455 ASSERT_VK_SUCCESS(err);
8456
8457 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008458 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008459 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8460 memAlloc.pNext = NULL;
8461 memAlloc.allocationSize = 0;
8462 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008463
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008464 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008465 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008466 pass =
8467 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008468 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008469 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008470 ASSERT_VK_SUCCESS(err);
8471
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008472 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008473 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008474 pass =
8475 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008476 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008477 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008478 ASSERT_VK_SUCCESS(err);
8479
8480 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8481 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008482 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008483 ASSERT_VK_SUCCESS(err);
8484
8485 BeginCommandBuffer();
8486 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008487 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8488 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008489 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008490 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008491 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008492 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008493 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008494 resolveRegion.srcOffset.x = 0;
8495 resolveRegion.srcOffset.y = 0;
8496 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008497 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008498 resolveRegion.dstSubresource.mipLevel = 0;
8499 resolveRegion.dstSubresource.baseArrayLayer = 0;
8500 resolveRegion.dstSubresource.layerCount = 0;
8501 resolveRegion.dstOffset.x = 0;
8502 resolveRegion.dstOffset.y = 0;
8503 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008504 resolveRegion.extent.width = 1;
8505 resolveRegion.extent.height = 1;
8506 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008507 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8508 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008509 EndCommandBuffer();
8510
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008511 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008512
Chia-I Wuf7458c52015-10-26 21:10:41 +08008513 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008514 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008515 vkFreeMemory(m_device->device(), srcMem, NULL);
8516 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008517}
8518
Karl Schultz6addd812016-02-02 17:17:23 -07008519TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
8520 VkResult err;
8521 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008522
Karl Schultz6addd812016-02-02 17:17:23 -07008523 m_errorMonitor->SetDesiredFailureMsg(
8524 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008525 "vkCmdResolveImage called with unmatched source and dest formats.");
8526
Mike Stroyana3082432015-09-25 13:39:21 -06008527 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008528
8529 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008530 VkImage srcImage;
8531 VkImage dstImage;
8532 VkDeviceMemory srcMem;
8533 VkDeviceMemory destMem;
8534 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008535
8536 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008537 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8538 image_create_info.pNext = NULL;
8539 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8540 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8541 image_create_info.extent.width = 32;
8542 image_create_info.extent.height = 1;
8543 image_create_info.extent.depth = 1;
8544 image_create_info.mipLevels = 1;
8545 image_create_info.arrayLayers = 1;
8546 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8547 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8548 // Note: Some implementations expect color attachment usage for any
8549 // multisample surface
8550 image_create_info.usage =
8551 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8552 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008553
Karl Schultz6addd812016-02-02 17:17:23 -07008554 err =
8555 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008556 ASSERT_VK_SUCCESS(err);
8557
Karl Schultz6addd812016-02-02 17:17:23 -07008558 // Set format to something other than source image
8559 image_create_info.format = VK_FORMAT_R32_SFLOAT;
8560 // Note: Some implementations expect color attachment usage for any
8561 // multisample surface
8562 image_create_info.usage =
8563 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8564 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008565
Karl Schultz6addd812016-02-02 17:17:23 -07008566 err =
8567 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008568 ASSERT_VK_SUCCESS(err);
8569
8570 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008571 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008572 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8573 memAlloc.pNext = NULL;
8574 memAlloc.allocationSize = 0;
8575 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008576
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008577 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008578 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008579 pass =
8580 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008581 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008582 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008583 ASSERT_VK_SUCCESS(err);
8584
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008585 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008586 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008587 pass =
8588 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008589 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008590 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008591 ASSERT_VK_SUCCESS(err);
8592
8593 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8594 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008595 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008596 ASSERT_VK_SUCCESS(err);
8597
8598 BeginCommandBuffer();
8599 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008600 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8601 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008602 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008603 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008604 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008605 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008606 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008607 resolveRegion.srcOffset.x = 0;
8608 resolveRegion.srcOffset.y = 0;
8609 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008610 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008611 resolveRegion.dstSubresource.mipLevel = 0;
8612 resolveRegion.dstSubresource.baseArrayLayer = 0;
8613 resolveRegion.dstSubresource.layerCount = 0;
8614 resolveRegion.dstOffset.x = 0;
8615 resolveRegion.dstOffset.y = 0;
8616 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008617 resolveRegion.extent.width = 1;
8618 resolveRegion.extent.height = 1;
8619 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008620 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8621 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008622 EndCommandBuffer();
8623
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008624 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008625
Chia-I Wuf7458c52015-10-26 21:10:41 +08008626 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008627 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008628 vkFreeMemory(m_device->device(), srcMem, NULL);
8629 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008630}
8631
Karl Schultz6addd812016-02-02 17:17:23 -07008632TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
8633 VkResult err;
8634 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008635
Karl Schultz6addd812016-02-02 17:17:23 -07008636 m_errorMonitor->SetDesiredFailureMsg(
8637 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008638 "vkCmdResolveImage called with unmatched source and dest image types.");
8639
Mike Stroyana3082432015-09-25 13:39:21 -06008640 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008641
8642 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008643 VkImage srcImage;
8644 VkImage dstImage;
8645 VkDeviceMemory srcMem;
8646 VkDeviceMemory destMem;
8647 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008648
8649 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008650 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8651 image_create_info.pNext = NULL;
8652 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8653 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8654 image_create_info.extent.width = 32;
8655 image_create_info.extent.height = 1;
8656 image_create_info.extent.depth = 1;
8657 image_create_info.mipLevels = 1;
8658 image_create_info.arrayLayers = 1;
8659 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8660 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8661 // Note: Some implementations expect color attachment usage for any
8662 // multisample surface
8663 image_create_info.usage =
8664 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8665 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008666
Karl Schultz6addd812016-02-02 17:17:23 -07008667 err =
8668 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008669 ASSERT_VK_SUCCESS(err);
8670
Karl Schultz6addd812016-02-02 17:17:23 -07008671 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8672 // Note: Some implementations expect color attachment usage for any
8673 // multisample surface
8674 image_create_info.usage =
8675 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8676 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008677
Karl Schultz6addd812016-02-02 17:17:23 -07008678 err =
8679 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008680 ASSERT_VK_SUCCESS(err);
8681
8682 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008683 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008684 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8685 memAlloc.pNext = NULL;
8686 memAlloc.allocationSize = 0;
8687 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008688
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008689 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008690 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008691 pass =
8692 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008693 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008694 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008695 ASSERT_VK_SUCCESS(err);
8696
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008697 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008698 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008699 pass =
8700 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008701 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008702 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008703 ASSERT_VK_SUCCESS(err);
8704
8705 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8706 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008707 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008708 ASSERT_VK_SUCCESS(err);
8709
8710 BeginCommandBuffer();
8711 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008712 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8713 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008714 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008715 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008716 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008717 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008718 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008719 resolveRegion.srcOffset.x = 0;
8720 resolveRegion.srcOffset.y = 0;
8721 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008722 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008723 resolveRegion.dstSubresource.mipLevel = 0;
8724 resolveRegion.dstSubresource.baseArrayLayer = 0;
8725 resolveRegion.dstSubresource.layerCount = 0;
8726 resolveRegion.dstOffset.x = 0;
8727 resolveRegion.dstOffset.y = 0;
8728 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008729 resolveRegion.extent.width = 1;
8730 resolveRegion.extent.height = 1;
8731 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008732 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8733 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008734 EndCommandBuffer();
8735
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008736 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008737
Chia-I Wuf7458c52015-10-26 21:10:41 +08008738 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008739 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008740 vkFreeMemory(m_device->device(), srcMem, NULL);
8741 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008742}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008743
Karl Schultz6addd812016-02-02 17:17:23 -07008744TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008745 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07008746 // to using a DS format, then cause it to hit error due to COLOR_BIT not
8747 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008748 // The image format check comes 2nd in validation so we trigger it first,
8749 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07008750 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008751
Karl Schultz6addd812016-02-02 17:17:23 -07008752 m_errorMonitor->SetDesiredFailureMsg(
8753 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008754 "Combination depth/stencil image formats can have only the ");
8755
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008756 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008757
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008758 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008759 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8760 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008761
8762 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008763 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8764 ds_pool_ci.pNext = NULL;
8765 ds_pool_ci.maxSets = 1;
8766 ds_pool_ci.poolSizeCount = 1;
8767 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008768
8769 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008770 err =
8771 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008772 ASSERT_VK_SUCCESS(err);
8773
8774 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008775 dsl_binding.binding = 0;
8776 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8777 dsl_binding.descriptorCount = 1;
8778 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8779 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008780
8781 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008782 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8783 ds_layout_ci.pNext = NULL;
8784 ds_layout_ci.bindingCount = 1;
8785 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008786 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008787 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8788 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008789 ASSERT_VK_SUCCESS(err);
8790
8791 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008792 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008793 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008794 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008795 alloc_info.descriptorPool = ds_pool;
8796 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008797 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8798 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008799 ASSERT_VK_SUCCESS(err);
8800
Karl Schultz6addd812016-02-02 17:17:23 -07008801 VkImage image_bad;
8802 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008803 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07008804 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008805 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07008806 const int32_t tex_width = 32;
8807 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008808
8809 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008810 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8811 image_create_info.pNext = NULL;
8812 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8813 image_create_info.format = tex_format_bad;
8814 image_create_info.extent.width = tex_width;
8815 image_create_info.extent.height = tex_height;
8816 image_create_info.extent.depth = 1;
8817 image_create_info.mipLevels = 1;
8818 image_create_info.arrayLayers = 1;
8819 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8820 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8821 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
8822 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
8823 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008824
Karl Schultz6addd812016-02-02 17:17:23 -07008825 err =
8826 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008827 ASSERT_VK_SUCCESS(err);
8828 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07008829 image_create_info.usage =
8830 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8831 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
8832 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008833 ASSERT_VK_SUCCESS(err);
8834
8835 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008836 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8837 image_view_create_info.image = image_bad;
8838 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8839 image_view_create_info.format = tex_format_bad;
8840 image_view_create_info.subresourceRange.baseArrayLayer = 0;
8841 image_view_create_info.subresourceRange.baseMipLevel = 0;
8842 image_view_create_info.subresourceRange.layerCount = 1;
8843 image_view_create_info.subresourceRange.levelCount = 1;
8844 image_view_create_info.subresourceRange.aspectMask =
8845 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008846
8847 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008848 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8849 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008850
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008851 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008852
Chia-I Wuf7458c52015-10-26 21:10:41 +08008853 vkDestroyImage(m_device->device(), image_bad, NULL);
8854 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008855 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8856 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008857}
Tobin Ehliscde08892015-09-22 10:11:37 -06008858#endif // IMAGE_TESTS
8859
Tony Barbour300a6082015-04-07 13:44:53 -06008860int main(int argc, char **argv) {
8861 int result;
8862
Cody Northrop8e54a402016-03-08 22:25:52 -07008863#ifdef ANDROID
8864 int vulkanSupport = InitVulkan();
8865 if (vulkanSupport == 0)
8866 return 1;
8867#endif
8868
Tony Barbour300a6082015-04-07 13:44:53 -06008869 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06008870 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06008871
8872 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
8873
8874 result = RUN_ALL_TESTS();
8875
Tony Barbour6918cd52015-04-09 12:58:51 -06008876 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06008877 return result;
8878}