blob: 14207cca711e167b9f1156a4d414ae447338a31a [file] [log] [blame]
Karl Schultz99e9d1d2016-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 Lentine584ccab2016-02-03 16:51:46 -06005 * Copyright (c) 2015-2016 Google, Inc.
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006 *
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and/or associated documentation files (the "Materials"), to
9 * deal in the Materials without restriction, including without limitation the
10 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
11 * sell copies of the Materials, and to permit persons to whom the Materials are
12 * furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice(s) and this permission notice shall be included in
15 * all copies or substantial portions of the Materials.
16 *
Karl Schultz99e9d1d2016-02-02 17:17:23 -070017 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 *
21 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
22 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
24 * USE OR OTHER DEALINGS IN THE MATERIALS.
25 *
26 * Author: Chia-I Wu <olvaffe@gmail.com>
27 * Author: Chris Forbes <chrisf@ijw.co.nz>
28 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
29 * Author: Mark Lobodzinski <mark@lunarg.com>
30 * Author: Mike Stroyan <mike@LunarG.com>
31 * Author: Tobin Ehlis <tobine@google.com>
32 * Author: Tony Barbour <tony@LunarG.com>
33 */
Tony Barbourd04e8df2015-11-17 10:02:56 -070034
Cody Northrop50537d02016-03-08 22:25:52 -070035#ifdef ANDROID
36#include "vulkan_wrapper.h"
37#else
David Pinedo329ca9e2015-11-06 12:54:48 -070038#include <vulkan/vulkan.h>
Cody Northrop50537d02016-03-08 22:25:52 -070039#endif
Courtney Goeltzenleuchter0abdb662015-10-07 13:28:58 -060040#include "test_common.h"
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060041#include "vkrenderframework.h"
Tobin Ehlis56d204a2015-07-03 10:15:26 -060042#include "vk_layer_config.h"
Jon Ashburn3510b192016-02-02 12:08:10 -070043#include "icd-spv.h"
Tony Barbour30486ea2015-04-07 13:44:53 -060044
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050045#define GLM_FORCE_RADIANS
46#include "glm/glm.hpp"
47#include <glm/gtc/matrix_transform.hpp>
48
Tobin Ehlis57e6a612015-05-26 16:11:58 -060049#define MEM_TRACKER_TESTS 1
50#define OBJ_TRACKER_TESTS 1
51#define DRAW_STATE_TESTS 1
52#define THREADING_TESTS 1
Chris Forbes5af3bf22015-05-25 11:13:08 +120053#define SHADER_CHECKER_TESTS 1
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -060054#define DEVICE_LIMITS_TESTS 1
Tobin Ehlis342b9bf2015-09-22 10:11:37 -060055#define IMAGE_TESTS 1
Tobin Ehlis57e6a612015-05-26 16:11:58 -060056
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050057//--------------------------------------------------------------------------------------
58// Mesh and VertexFormat Data
59//--------------------------------------------------------------------------------------
Karl Schultz99e9d1d2016-02-02 17:17:23 -070060struct Vertex {
61 float posX, posY, posZ, posW; // Position data
62 float r, g, b, a; // Color
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050063};
64
Karl Schultz99e9d1d2016-02-02 17:17:23 -070065#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050066
67typedef enum _BsoFailSelect {
Karl Schultz99e9d1d2016-02-02 17:17:23 -070068 BsoFailNone = 0x00000000,
69 BsoFailLineWidth = 0x00000001,
70 BsoFailDepthBias = 0x00000002,
71 BsoFailViewport = 0x00000004,
72 BsoFailScissor = 0x00000008,
73 BsoFailBlend = 0x00000010,
74 BsoFailDepthBounds = 0x00000020,
75 BsoFailStencilReadMask = 0x00000040,
76 BsoFailStencilWriteMask = 0x00000080,
77 BsoFailStencilReference = 0x00000100,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050078} BsoFailSelect;
79
80struct vktriangle_vs_uniform {
81 // Must start with MVP
Karl Schultz99e9d1d2016-02-02 17:17:23 -070082 float mvp[4][4];
83 float position[3][4];
84 float color[3][4];
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050085};
86
Mark Lobodzinski6bbdff12015-06-02 09:41:30 -050087static const char bindStateVertShaderText[] =
Chris Forbes9ce0fb32016-04-07 13:20:10 +120088 "#version 450\n"
Karl Schultz99e9d1d2016-02-02 17:17:23 -070089 "vec2 vertices[3];\n"
90 "out gl_PerVertex {\n"
91 " vec4 gl_Position;\n"
92 "};\n"
93 "void main() {\n"
94 " vertices[0] = vec2(-1.0, -1.0);\n"
95 " vertices[1] = vec2( 1.0, -1.0);\n"
96 " vertices[2] = vec2( 0.0, 1.0);\n"
97 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
98 "}\n";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050099
Mark Lobodzinski6bbdff12015-06-02 09:41:30 -0500100static const char bindStateFragShaderText[] =
Chris Forbes9ce0fb32016-04-07 13:20:10 +1200101 "#version 450\n"
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700102 "\n"
103 "layout(location = 0) out vec4 uFragColor;\n"
104 "void main(){\n"
105 " uFragColor = vec4(0,1,0,1);\n"
106 "}\n";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500107
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700108static VKAPI_ATTR VkBool32 VKAPI_CALL
109myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
110 uint64_t srcObject, size_t location, int32_t msgCode,
111 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour30486ea2015-04-07 13:44:53 -0600112
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600113// ********************************************************
114// ErrorMonitor Usage:
115//
116// Call SetDesiredFailureMsg with a string to be compared against all
117// encountered log messages. Passing NULL will match all log messages.
118// logMsg will return true for skipCall only if msg is matched or NULL.
119//
120// Call DesiredMsgFound to determine if the desired failure message
121// was encountered.
122
Tony Barbour30486ea2015-04-07 13:44:53 -0600123class ErrorMonitor {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700124 public:
125 ErrorMonitor() {
Mike Stroyan7016f4f2015-07-13 14:45:35 -0600126 test_platform_thread_create_mutex(&m_mutex);
127 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski5c13d4d2016-02-11 09:26:16 -0700128 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700129 m_bailout = NULL;
Mike Stroyan7016f4f2015-07-13 14:45:35 -0600130 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour30486ea2015-04-07 13:44:53 -0600131 }
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600132
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700133 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes34d775f2016-04-07 13:21:07 +1200134 // also discard all collected messages to this point
Mike Stroyan7016f4f2015-07-13 14:45:35 -0600135 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600136 m_failureMsg.clear();
137 m_otherMsgs.clear();
138 m_desiredMsg = msgString;
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700139 m_msgFound = VK_FALSE;
140 m_msgFlags = msgFlags;
Mike Stroyan7016f4f2015-07-13 14:45:35 -0600141 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour30486ea2015-04-07 13:44:53 -0600142 }
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600143
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700144 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600145 VkBool32 result = VK_FALSE;
Mike Stroyan7016f4f2015-07-13 14:45:35 -0600146 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyan09aae812015-05-12 16:00:45 -0600147 if (m_bailout != NULL) {
148 *m_bailout = true;
149 }
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600150 string errorString(msgString);
151 if (msgFlags & m_msgFlags) {
152 if (errorString.find(m_desiredMsg) != string::npos) {
Chris Forbese8aa35e2016-04-04 18:50:38 +1200153 if (m_msgFound) { /* if multiple matches, don't lose all but the last! */
154 m_otherMsgs.push_back(m_failureMsg);
155 }
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600156 m_failureMsg = errorString;
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700157 m_msgFound = VK_TRUE;
158 result = VK_TRUE;
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600159 } else {
160 m_otherMsgs.push_back(errorString);
161 }
162 }
Mike Stroyan7016f4f2015-07-13 14:45:35 -0600163 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600164 return result;
Mike Stroyan09aae812015-05-12 16:00:45 -0600165 }
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600166
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700167 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600168
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700169 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600170
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700171 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600172
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700173 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour30486ea2015-04-07 13:44:53 -0600174
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700175 void DumpFailureMsgs(void) {
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600176 vector<string> otherMsgs = GetOtherFailureMsgs();
177 cout << "Other error messages logged for this test were:" << endl;
178 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
179 cout << " " << *iter << endl;
180 }
181 }
182
Chris Forbes34d775f2016-04-07 13:21:07 +1200183 /* helpers */
184
185 void ExpectSuccess() {
186 // match anything
187 SetDesiredFailureMsg(~0u, "");
188 }
189
190 void VerifyFound() {
191 // Not seeing the desired message is a failure. /Before/ throwing, dump
192 // any other messages.
193 if (!DesiredMsgFound()) {
194 DumpFailureMsgs();
195 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
196 }
197 }
198
199 void VerifyNotFound() {
200 // ExpectSuccess() configured us to match anything. Any error is a
201 // failure.
202 if (DesiredMsgFound()) {
203 DumpFailureMsgs();
204 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
205 }
206 }
207
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700208 private:
209 VkFlags m_msgFlags;
210 string m_desiredMsg;
211 string m_failureMsg;
212 vector<string> m_otherMsgs;
Mike Stroyan7016f4f2015-07-13 14:45:35 -0600213 test_platform_thread_mutex m_mutex;
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700214 bool *m_bailout;
215 VkBool32 m_msgFound;
Tony Barbour30486ea2015-04-07 13:44:53 -0600216};
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500217
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700218static VKAPI_ATTR VkBool32 VKAPI_CALL
219myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
220 uint64_t srcObject, size_t location, int32_t msgCode,
221 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
222 if (msgFlags &
Mark Lobodzinski5c13d4d2016-02-11 09:26:16 -0700223 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700224 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour8508b8e2015-04-09 10:48:04 -0600225 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600226 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour8508b8e2015-04-09 10:48:04 -0600227 }
Courtney Goeltzenleuchter0d6857f2015-09-04 13:52:24 -0600228 return false;
Tony Barbour30486ea2015-04-07 13:44:53 -0600229}
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500230
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700231class VkLayerTest : public VkRenderFramework {
232 public:
Chia-I Wu1f851912015-10-27 18:04:07 +0800233 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
234 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700235 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
236 BsoFailSelect failMask);
237 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
238 VkPipelineObj &pipelineobj,
239 VkDescriptorSetObj &descriptorSet,
240 BsoFailSelect failMask);
241 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
242 VkDescriptorSetObj &descriptorSet,
243 BsoFailSelect failMask) {
244 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
245 failMask);
246 }
Tony Barbour30486ea2015-04-07 13:44:53 -0600247
Tony Barbour1490c912015-07-28 10:17:20 -0600248 /* Convenience functions that use built-in command buffer */
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700249 VkResult BeginCommandBuffer() {
250 return BeginCommandBuffer(*m_commandBuffer);
251 }
Chia-I Wu1f851912015-10-27 18:04:07 +0800252 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700253 void Draw(uint32_t vertexCount, uint32_t instanceCount,
254 uint32_t firstVertex, uint32_t firstInstance) {
255 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
256 firstInstance);
257 }
258 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
259 uint32_t firstIndex, int32_t vertexOffset,
260 uint32_t firstInstance) {
261 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
262 vertexOffset, firstInstance);
263 }
Chia-I Wu1f851912015-10-27 18:04:07 +0800264 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); }
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700265 void QueueCommandBuffer(const VkFence &fence) {
266 m_commandBuffer->QueueCommandBuffer(fence);
267 }
268 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
269 VkDeviceSize offset, uint32_t binding) {
270 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
271 }
272 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
273 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
274 }
275
276 protected:
277 ErrorMonitor *m_errorMonitor;
Tony Barbour30486ea2015-04-07 13:44:53 -0600278
279 virtual void SetUp() {
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600280 std::vector<const char *> instance_layer_names;
281 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600282 std::vector<const char *> instance_extension_names;
283 std::vector<const char *> device_extension_names;
Tony Barbour950ebc02015-04-23 12:55:36 -0600284
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -0700285 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterde53c5b2015-06-16 15:59:11 -0600286 /*
287 * Since CreateDbgMsgCallback is an instance level extension call
288 * any extension / layer that utilizes that feature also needs
289 * to be enabled at create instance time.
290 */
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700291 // Use Threading layer first to protect others from
292 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchterc6c611a2016-02-06 17:11:22 -0700293 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis3e093952016-03-24 10:54:18 -0600294 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine5d96e522015-12-11 10:49:51 -0800295 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlis5b5e7bc2016-03-09 16:12:48 -0700296 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine5d96e522015-12-11 10:49:51 -0800297 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
298 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Dustin Graves73cfdff2016-01-26 16:30:22 -0700299 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600300
Courtney Goeltzenleuchterc6c611a2016-02-06 17:11:22 -0700301 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis3e093952016-03-24 10:54:18 -0600302 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine5d96e522015-12-11 10:49:51 -0800303 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlis5b5e7bc2016-03-09 16:12:48 -0700304 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine5d96e522015-12-11 10:49:51 -0800305 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
306 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Dustin Graves73cfdff2016-01-26 16:30:22 -0700307 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour30486ea2015-04-07 13:44:53 -0600308
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600309 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour30486ea2015-04-07 13:44:53 -0600310 this->app_info.pNext = NULL;
Chia-I Wu1f851912015-10-27 18:04:07 +0800311 this->app_info.pApplicationName = "layer_tests";
312 this->app_info.applicationVersion = 1;
Tony Barbour30486ea2015-04-07 13:44:53 -0600313 this->app_info.pEngineName = "unittest";
314 this->app_info.engineVersion = 1;
Jon Ashburnd3995c92016-03-22 13:57:46 -0600315 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour30486ea2015-04-07 13:44:53 -0600316
Tony Barbour0c1bdc62015-04-29 17:34:29 -0600317 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600318 InitFramework(instance_layer_names, device_layer_names,
319 instance_extension_names, device_extension_names,
320 myDbgFunc, m_errorMonitor);
Tony Barbour30486ea2015-04-07 13:44:53 -0600321 }
322
323 virtual void TearDown() {
324 // Clean up resources before we reset
Tony Barbour30486ea2015-04-07 13:44:53 -0600325 ShutdownFramework();
Tony Barbour8508b8e2015-04-09 10:48:04 -0600326 delete m_errorMonitor;
Tony Barbour30486ea2015-04-07 13:44:53 -0600327 }
328};
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500329
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700330VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600331 VkResult result;
Tony Barbour30486ea2015-04-07 13:44:53 -0600332
Chia-I Wu1f851912015-10-27 18:04:07 +0800333 result = commandBuffer.BeginCommandBuffer();
Tony Barbour30486ea2015-04-07 13:44:53 -0600334
335 /*
336 * For render test all drawing happens in a single render pass
337 * on a single command buffer.
338 */
Chris Forbesfe133ef2015-06-16 14:05:59 +1200339 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu1f851912015-10-27 18:04:07 +0800340 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour30486ea2015-04-07 13:44:53 -0600341 }
342
343 return result;
344}
345
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700346VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600347 VkResult result;
Tony Barbour30486ea2015-04-07 13:44:53 -0600348
Chris Forbesfe133ef2015-06-16 14:05:59 +1200349 if (renderPass()) {
Chia-I Wu1f851912015-10-27 18:04:07 +0800350 commandBuffer.EndRenderPass();
Chris Forbesfe133ef2015-06-16 14:05:59 +1200351 }
Tony Barbour30486ea2015-04-07 13:44:53 -0600352
Chia-I Wu1f851912015-10-27 18:04:07 +0800353 result = commandBuffer.EndCommandBuffer();
Tony Barbour30486ea2015-04-07 13:44:53 -0600354
355 return result;
356}
357
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700358void VkLayerTest::VKTriangleTest(const char *vertShaderText,
359 const char *fragShaderText,
360 BsoFailSelect failMask) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500361 // Create identity matrix
362 int i;
363 struct vktriangle_vs_uniform data;
364
365 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700366 glm::mat4 View = glm::mat4(1.0f);
367 glm::mat4 Model = glm::mat4(1.0f);
368 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500369 const int matrixSize = sizeof(MVP);
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700370 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500371
372 memcpy(&data.mvp, &MVP[0][0], matrixSize);
373
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700374 static const Vertex tri_data[] = {
375 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
376 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
377 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500378 };
379
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700380 for (i = 0; i < 3; i++) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500381 data.position[i][0] = tri_data[i].posX;
382 data.position[i][1] = tri_data[i].posY;
383 data.position[i][2] = tri_data[i].posZ;
384 data.position[i][3] = tri_data[i].posW;
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700385 data.color[i][0] = tri_data[i].r;
386 data.color[i][1] = tri_data[i].g;
387 data.color[i][2] = tri_data[i].b;
388 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500389 }
390
391 ASSERT_NO_FATAL_FAILURE(InitState());
392 ASSERT_NO_FATAL_FAILURE(InitViewport());
393
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700394 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
395 (const void *)&data);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500396
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700397 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
398 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
399 this);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500400
401 VkPipelineObj pipelineobj(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +0800402 pipelineobj.AddColorAttachment();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500403 pipelineobj.AddShader(&vs);
404 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter2f5deb52015-09-30 16:16:57 -0600405 if (failMask & BsoFailLineWidth) {
406 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis3d3e06b2016-03-28 11:18:19 -0600407 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
408 ia_state.sType =
409 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
410 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
411 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter2f5deb52015-09-30 16:16:57 -0600412 }
413 if (failMask & BsoFailDepthBias) {
414 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis3d3e06b2016-03-28 11:18:19 -0600415 VkPipelineRasterizationStateCreateInfo rs_state = {};
416 rs_state.sType =
417 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
418 rs_state.depthBiasEnable = VK_TRUE;
419 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter2f5deb52015-09-30 16:16:57 -0600420 }
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700421 // Viewport and scissors must stay in synch or other errors will occur than
422 // the ones we want
Courtney Goeltzenleuchter2f5deb52015-09-30 16:16:57 -0600423 if (failMask & BsoFailViewport) {
424 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisa88e2f52015-10-02 11:00:56 -0600425 m_viewports.clear();
426 m_scissors.clear();
Courtney Goeltzenleuchter2f5deb52015-09-30 16:16:57 -0600427 }
428 if (failMask & BsoFailScissor) {
429 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisa88e2f52015-10-02 11:00:56 -0600430 m_scissors.clear();
431 m_viewports.clear();
Courtney Goeltzenleuchter2f5deb52015-09-30 16:16:57 -0600432 }
433 if (failMask & BsoFailBlend) {
434 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis3d3e06b2016-03-28 11:18:19 -0600435 VkPipelineColorBlendAttachmentState att_state = {};
436 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
437 att_state.blendEnable = VK_TRUE;
438 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter2f5deb52015-09-30 16:16:57 -0600439 }
440 if (failMask & BsoFailDepthBounds) {
441 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
442 }
443 if (failMask & BsoFailStencilReadMask) {
444 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
445 }
446 if (failMask & BsoFailStencilWriteMask) {
447 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
448 }
449 if (failMask & BsoFailStencilReference) {
450 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
451 }
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500452
453 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700454 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
455 constantBuffer);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500456
457 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour1490c912015-07-28 10:17:20 -0600458 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500459
Tony Barbour1490c912015-07-28 10:17:20 -0600460 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500461
462 // render triangle
Courtney Goeltzenleuchter4ff11cc2015-09-23 12:31:50 -0600463 Draw(3, 1, 0, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500464
465 // finalize recording of the command buffer
Tony Barbour1490c912015-07-28 10:17:20 -0600466 EndCommandBuffer();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500467
Tony Barbour1490c912015-07-28 10:17:20 -0600468 QueueCommandBuffer();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500469}
470
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700471void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
472 VkPipelineObj &pipelineobj,
473 VkDescriptorSetObj &descriptorSet,
474 BsoFailSelect failMask) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500475 if (m_depthStencil->Initialized()) {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700476 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
477 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500478 } else {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700479 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
480 m_stencil_clear_color, NULL);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500481 }
482
Chia-I Wu1f851912015-10-27 18:04:07 +0800483 commandBuffer->PrepareAttachments();
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700484 // Make sure depthWriteEnable is set so that Depth fail test will work
485 // correctly
486 // Make sure stencilTestEnable is set so that Stencil fail test will work
487 // correctly
Tony Barbourefbe9ca2015-07-15 12:50:33 -0600488 VkStencilOpState stencil = {};
Chia-I Wuc51b1212015-10-27 19:25:11 +0800489 stencil.failOp = VK_STENCIL_OP_KEEP;
490 stencil.passOp = VK_STENCIL_OP_KEEP;
491 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
492 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barbourefbe9ca2015-07-15 12:50:33 -0600493
494 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
495 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter2f5deb52015-09-30 16:16:57 -0600496 ds_ci.pNext = NULL;
497 ds_ci.depthTestEnable = VK_FALSE;
498 ds_ci.depthWriteEnable = VK_TRUE;
499 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
500 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis3d3e06b2016-03-28 11:18:19 -0600501 if (failMask & BsoFailDepthBounds) {
502 ds_ci.depthBoundsTestEnable = VK_TRUE;
503 }
Courtney Goeltzenleuchter2f5deb52015-09-30 16:16:57 -0600504 ds_ci.stencilTestEnable = VK_TRUE;
505 ds_ci.front = stencil;
506 ds_ci.back = stencil;
Tony Barbourefbe9ca2015-07-15 12:50:33 -0600507
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600508 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisa88e2f52015-10-02 11:00:56 -0600509 pipelineobj.SetViewport(m_viewports);
510 pipelineobj.SetScissor(m_scissors);
Chia-I Wu1f851912015-10-27 18:04:07 +0800511 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700512 VkResult err = pipelineobj.CreateVKPipeline(
513 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northropccfa96d2015-08-27 10:20:35 -0600514 ASSERT_VK_SUCCESS(err);
Chia-I Wu1f851912015-10-27 18:04:07 +0800515 commandBuffer->BindPipeline(pipelineobj);
516 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500517}
518
519// ********************************************************************************************************************
520// ********************************************************************************************************************
521// ********************************************************************************************************************
522// ********************************************************************************************************************
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600523#if MEM_TRACKER_TESTS
Tobin Ehliscb085292015-12-01 09:57:09 -0700524#if 0
Chia-I Wu1f851912015-10-27 18:04:07 +0800525TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinski81078192015-05-19 10:28:29 -0500526{
527 vk_testing::Fence testFence;
Mark Lobodzinski81078192015-05-19 10:28:29 -0500528 VkFenceCreateInfo fenceInfo = {};
529 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
530 fenceInfo.pNext = NULL;
531 fenceInfo.flags = 0;
532
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -0700533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600534
Mark Lobodzinski81078192015-05-19 10:28:29 -0500535 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barboure389b882015-07-20 13:00:10 -0600536
537 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
538 vk_testing::Buffer buffer;
539 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinski81078192015-05-19 10:28:29 -0500540
Tony Barbour1490c912015-07-28 10:17:20 -0600541 BeginCommandBuffer();
Chia-I Wu1f851912015-10-27 18:04:07 +0800542 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbour1490c912015-07-28 10:17:20 -0600543 EndCommandBuffer();
Mark Lobodzinski81078192015-05-19 10:28:29 -0500544
545 testFence.init(*m_device, fenceInfo);
546
547 // Bypass framework since it does the waits automatically
548 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter1a748e92015-10-27 11:22:14 -0600549 VkSubmitInfo submit_info;
Chia-I Wu6ec33a02015-10-26 20:37:06 +0800550 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
551 submit_info.pNext = NULL;
Chia-I Wu763a7492015-10-26 20:48:51 +0800552 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter1a748e92015-10-27 11:22:14 -0600553 submit_info.pWaitSemaphores = NULL;
Jon Ashburn98ce7e02015-12-30 16:42:50 -0700554 submit_info.pWaitDstStageMask = NULL;
Chia-I Wu763a7492015-10-26 20:48:51 +0800555 submit_info.commandBufferCount = 1;
Chia-I Wu1f851912015-10-27 18:04:07 +0800556 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wu763a7492015-10-26 20:48:51 +0800557 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter1a748e92015-10-27 11:22:14 -0600558 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter3ec31622015-10-20 18:04:07 -0600559
560 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinski81078192015-05-19 10:28:29 -0500561 ASSERT_VK_SUCCESS( err );
562
Mark Lobodzinski81078192015-05-19 10:28:29 -0500563 // Introduce failure by calling begin again before checking fence
Chia-I Wu1f851912015-10-27 18:04:07 +0800564 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinski81078192015-05-19 10:28:29 -0500565
Chris Forbes34d775f2016-04-07 13:21:07 +1200566 m_errorMonitor->VerifyFound();
Mark Lobodzinski81078192015-05-19 10:28:29 -0500567}
568
Chia-I Wu1f851912015-10-27 18:04:07 +0800569TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinski81078192015-05-19 10:28:29 -0500570{
571 vk_testing::Fence testFence;
Mark Lobodzinski81078192015-05-19 10:28:29 -0500572 VkFenceCreateInfo fenceInfo = {};
573 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
574 fenceInfo.pNext = NULL;
575 fenceInfo.flags = 0;
576
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -0700577 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600578
Mark Lobodzinski81078192015-05-19 10:28:29 -0500579 ASSERT_NO_FATAL_FAILURE(InitState());
580 ASSERT_NO_FATAL_FAILURE(InitViewport());
581 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
582
Tony Barbour1490c912015-07-28 10:17:20 -0600583 BeginCommandBuffer();
Chia-I Wu1f851912015-10-27 18:04:07 +0800584 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour1490c912015-07-28 10:17:20 -0600585 EndCommandBuffer();
Mark Lobodzinski81078192015-05-19 10:28:29 -0500586
587 testFence.init(*m_device, fenceInfo);
588
589 // Bypass framework since it does the waits automatically
590 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter1a748e92015-10-27 11:22:14 -0600591 VkSubmitInfo submit_info;
Chia-I Wu6ec33a02015-10-26 20:37:06 +0800592 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
593 submit_info.pNext = NULL;
Chia-I Wu763a7492015-10-26 20:48:51 +0800594 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter1a748e92015-10-27 11:22:14 -0600595 submit_info.pWaitSemaphores = NULL;
Jon Ashburn98ce7e02015-12-30 16:42:50 -0700596 submit_info.pWaitDstStageMask = NULL;
Chia-I Wu763a7492015-10-26 20:48:51 +0800597 submit_info.commandBufferCount = 1;
Chia-I Wu1f851912015-10-27 18:04:07 +0800598 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wu763a7492015-10-26 20:48:51 +0800599 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter1a748e92015-10-27 11:22:14 -0600600 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter3ec31622015-10-20 18:04:07 -0600601
602 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinski81078192015-05-19 10:28:29 -0500603 ASSERT_VK_SUCCESS( err );
604
Jon Ashburna4ae48b2016-01-11 13:12:43 -0700605 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu1f851912015-10-27 18:04:07 +0800606 VkCommandBufferBeginInfo info = {};
607 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
608 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski87db5012015-09-14 17:43:42 -0600609 info.renderPass = VK_NULL_HANDLE;
610 info.subpass = 0;
611 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wufdc1cd02015-11-11 10:18:12 +0800612 info.occlusionQueryEnable = VK_FALSE;
613 info.queryFlags = 0;
614 info.pipelineStatistics = 0;
Mark Lobodzinski87db5012015-09-14 17:43:42 -0600615
616 // Introduce failure by calling BCB again before checking fence
Chia-I Wu1f851912015-10-27 18:04:07 +0800617 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinski81078192015-05-19 10:28:29 -0500618
Chris Forbes34d775f2016-04-07 13:21:07 +1200619 m_errorMonitor->VerifyFound();
Mark Lobodzinski81078192015-05-19 10:28:29 -0500620}
Tobin Ehliscb085292015-12-01 09:57:09 -0700621#endif
Chris Forbes34d775f2016-04-07 13:21:07 +1200622
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700623TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
624 VkResult err;
625 bool pass;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500626
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700627 m_errorMonitor->SetDesiredFailureMsg(
628 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600629 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
630
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500631 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500632
633 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700634 VkImage image;
635 VkDeviceMemory mem;
636 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500637
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700638 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
639 const int32_t tex_width = 32;
640 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500641
Tony Barbourefbe9ca2015-07-15 12:50:33 -0600642 VkImageCreateInfo image_create_info = {};
643 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700644 image_create_info.pNext = NULL;
645 image_create_info.imageType = VK_IMAGE_TYPE_2D;
646 image_create_info.format = tex_format;
647 image_create_info.extent.width = tex_width;
648 image_create_info.extent.height = tex_height;
649 image_create_info.extent.depth = 1;
650 image_create_info.mipLevels = 1;
651 image_create_info.arrayLayers = 1;
652 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
653 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
654 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
655 image_create_info.flags = 0;
Mark Lobodzinski87db5012015-09-14 17:43:42 -0600656
Chia-I Wu1f851912015-10-27 18:04:07 +0800657 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +0800658 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700659 mem_alloc.pNext = NULL;
660 mem_alloc.allocationSize = 0;
661 // Introduce failure, do NOT set memProps to
662 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
663 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500664
Chia-I Wu69f40122015-10-26 21:10:41 +0800665 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500666 ASSERT_VK_SUCCESS(err);
667
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700668 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500669
Mark Lobodzinski23182612015-05-29 09:32:35 -0500670 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500671
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700672 pass =
673 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
674 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
675 if (!pass) { // If we can't find any unmappable memory this test doesn't
676 // make sense
Chia-I Wu69f40122015-10-26 21:10:41 +0800677 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour49a3b652015-08-04 16:13:01 -0600678 return;
Mike Stroyan2237f522015-08-18 14:40:24 -0600679 }
Mike Stroyand72da752015-08-04 10:49:29 -0600680
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500681 // allocate memory
Chia-I Wu1f851912015-10-27 18:04:07 +0800682 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500683 ASSERT_VK_SUCCESS(err);
684
685 // Try to bind free memory that has been freed
Tony Barboure84a8d62015-07-10 14:10:27 -0600686 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500687 ASSERT_VK_SUCCESS(err);
688
689 // Map memory as if to initialize the image
690 void *mappedAddress = NULL;
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700691 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
692 &mappedAddress);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500693
Chris Forbes34d775f2016-04-07 13:21:07 +1200694 m_errorMonitor->VerifyFound();
Mike Stroyan2237f522015-08-18 14:40:24 -0600695
Chia-I Wu69f40122015-10-26 21:10:41 +0800696 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500697}
698
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700699TEST_F(VkLayerTest, RebindMemory) {
700 VkResult err;
701 bool pass;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500702
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700703 m_errorMonitor->SetDesiredFailureMsg(
704 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600705 "which has already been bound to mem object");
706
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500707 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500708
709 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700710 VkImage image;
711 VkDeviceMemory mem1;
712 VkDeviceMemory mem2;
713 VkMemoryRequirements mem_reqs;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500714
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700715 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
716 const int32_t tex_width = 32;
717 const int32_t tex_height = 32;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500718
Tony Barbourefbe9ca2015-07-15 12:50:33 -0600719 VkImageCreateInfo image_create_info = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700720 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
721 image_create_info.pNext = NULL;
722 image_create_info.imageType = VK_IMAGE_TYPE_2D;
723 image_create_info.format = tex_format;
724 image_create_info.extent.width = tex_width;
725 image_create_info.extent.height = tex_height;
726 image_create_info.extent.depth = 1;
727 image_create_info.mipLevels = 1;
728 image_create_info.arrayLayers = 1;
729 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
730 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
731 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
732 image_create_info.flags = 0;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500733
Chia-I Wu1f851912015-10-27 18:04:07 +0800734 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700735 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
736 mem_alloc.pNext = NULL;
737 mem_alloc.allocationSize = 0;
738 mem_alloc.memoryTypeIndex = 0;
Tony Barbourefbe9ca2015-07-15 12:50:33 -0600739
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700740 // Introduce failure, do NOT set memProps to
741 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barbourefbe9ca2015-07-15 12:50:33 -0600742 mem_alloc.memoryTypeIndex = 1;
Chia-I Wu69f40122015-10-26 21:10:41 +0800743 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500744 ASSERT_VK_SUCCESS(err);
745
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700746 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500747
748 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700749 pass =
750 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -0600751 ASSERT_TRUE(pass);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500752
753 // allocate 2 memory objects
Chia-I Wu1f851912015-10-27 18:04:07 +0800754 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500755 ASSERT_VK_SUCCESS(err);
Chia-I Wu1f851912015-10-27 18:04:07 +0800756 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500757 ASSERT_VK_SUCCESS(err);
758
759 // Bind first memory object to Image object
Tony Barboure84a8d62015-07-10 14:10:27 -0600760 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500761 ASSERT_VK_SUCCESS(err);
762
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700763 // Introduce validation failure, try to bind a different memory object to
764 // the same image object
Tony Barboure84a8d62015-07-10 14:10:27 -0600765 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500766
Chris Forbes34d775f2016-04-07 13:21:07 +1200767 m_errorMonitor->VerifyFound();
Mike Stroyan2237f522015-08-18 14:40:24 -0600768
Chia-I Wu69f40122015-10-26 21:10:41 +0800769 vkDestroyImage(m_device->device(), image, NULL);
770 vkFreeMemory(m_device->device(), mem1, NULL);
771 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500772}
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500773
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700774TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600775 vk_testing::Fence testFence;
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600776
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700777 m_errorMonitor->SetDesiredFailureMsg(
778 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
779 "must be reset before being submitted");
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600780
781 VkFenceCreateInfo fenceInfo = {};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600782 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
783 fenceInfo.pNext = NULL;
784 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour30486ea2015-04-07 13:44:53 -0600785
Tony Barbour30486ea2015-04-07 13:44:53 -0600786 ASSERT_NO_FATAL_FAILURE(InitState());
787 ASSERT_NO_FATAL_FAILURE(InitViewport());
788 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
789
Tony Barbour1490c912015-07-28 10:17:20 -0600790 BeginCommandBuffer();
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700791 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
792 m_stencil_clear_color, NULL);
Tony Barbour1490c912015-07-28 10:17:20 -0600793 EndCommandBuffer();
Tony Barbour30486ea2015-04-07 13:44:53 -0600794
795 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski87db5012015-09-14 17:43:42 -0600796
Courtney Goeltzenleuchter1a748e92015-10-27 11:22:14 -0600797 VkSubmitInfo submit_info;
Chia-I Wu6ec33a02015-10-26 20:37:06 +0800798 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
799 submit_info.pNext = NULL;
Chia-I Wu763a7492015-10-26 20:48:51 +0800800 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter1a748e92015-10-27 11:22:14 -0600801 submit_info.pWaitSemaphores = NULL;
Jon Ashburn98ce7e02015-12-30 16:42:50 -0700802 submit_info.pWaitDstStageMask = NULL;
Chia-I Wu763a7492015-10-26 20:48:51 +0800803 submit_info.commandBufferCount = 1;
Chia-I Wu1f851912015-10-27 18:04:07 +0800804 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wu763a7492015-10-26 20:48:51 +0800805 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter1a748e92015-10-27 11:22:14 -0600806 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter3ec31622015-10-20 18:04:07 -0600807
808 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700809 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski87db5012015-09-14 17:43:42 -0600810
Chris Forbes34d775f2016-04-07 13:21:07 +1200811 m_errorMonitor->VerifyFound();
Tony Barbour8508b8e2015-04-09 10:48:04 -0600812}
813
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700814TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tony Barbour8508b8e2015-04-09 10:48:04 -0600815 vk_testing::Fence testFence;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600816 VkFenceCreateInfo fenceInfo = {};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600817 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
818 fenceInfo.pNext = NULL;
819
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700820 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski5c13d4d2016-02-11 09:26:16 -0700821 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600822 "submitted to VkResetFences in UNSIGNALED STATE");
823
Tony Barbour8508b8e2015-04-09 10:48:04 -0600824 ASSERT_NO_FATAL_FAILURE(InitState());
825 testFence.init(*m_device, fenceInfo);
Chia-I Wua4992342015-07-03 11:45:55 +0800826 VkFence fences[1] = {testFence.handle()};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600827 vkResetFences(m_device->device(), 1, fences);
Tony Barbour30486ea2015-04-07 13:44:53 -0600828
Chris Forbes34d775f2016-04-07 13:21:07 +1200829 m_errorMonitor->VerifyFound();
Tony Barbour30486ea2015-04-07 13:44:53 -0600830}
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600831
Chia-I Wuc278df82015-07-07 11:50:03 +0800832/* TODO: Update for changes due to bug-14075 tiling across render passes */
833#if 0
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600834TEST_F(VkLayerTest, InvalidUsageBits)
835{
836 // Initiate Draw w/o a PSO bound
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600837
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -0700838 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600839 "Invalid usage flag for image ");
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600840
841 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1f851912015-10-27 18:04:07 +0800842 VkCommandBufferObj commandBuffer(m_device);
Tony Barbour1490c912015-07-28 10:17:20 -0600843 BeginCommandBuffer();
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600844
845 const VkExtent3D e3d = {
846 .width = 128,
847 .height = 128,
848 .depth = 1,
849 };
850 const VkImageCreateInfo ici = {
851 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
852 .pNext = NULL,
853 .imageType = VK_IMAGE_TYPE_2D,
854 .format = VK_FORMAT_D32_SFLOAT_S8_UINT,
855 .extent = e3d,
856 .mipLevels = 1,
857 .arraySize = 1,
Chia-I Wu3138d6a2015-10-31 00:31:16 +0800858 .samples = VK_SAMPLE_COUNT_1_BIT,
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600859 .tiling = VK_IMAGE_TILING_LINEAR,
Courtney Goeltzenleuchterc3b8eea2015-09-10 14:14:11 -0600860 .usage = 0, // Not setting VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600861 .flags = 0,
862 };
863
864 VkImage dsi;
Chia-I Wu69f40122015-10-26 21:10:41 +0800865 vkCreateImage(m_device->device(), &ici, NULL, &dsi);
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600866 VkDepthStencilView dsv;
867 const VkDepthStencilViewCreateInfo dsvci = {
868 .sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO,
869 .pNext = NULL,
870 .image = dsi,
871 .mipLevel = 0,
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600872 .baseArrayLayer = 0,
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600873 .arraySize = 1,
874 .flags = 0,
875 };
Chia-I Wu69f40122015-10-26 21:10:41 +0800876 vkCreateDepthStencilView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600877
Chris Forbes34d775f2016-04-07 13:21:07 +1200878 m_errorMonitor->VerifyFound();
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600879}
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -0600880#endif // 0
881#endif // MEM_TRACKER_TESTS
882
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600883#if OBJ_TRACKER_TESTS
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700884TEST_F(VkLayerTest, PipelineNotBound) {
885 VkResult err;
Tobin Ehlisf2f97402015-09-11 12:57:55 -0600886
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -0700887 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700888 "Invalid VkPipeline Object ");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600889
Tobin Ehlisf2f97402015-09-11 12:57:55 -0600890 ASSERT_NO_FATAL_FAILURE(InitState());
891 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf2f97402015-09-11 12:57:55 -0600892
Chia-I Wuc51b1212015-10-27 19:25:11 +0800893 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700894 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
895 ds_type_count.descriptorCount = 1;
Tobin Ehlisf2f97402015-09-11 12:57:55 -0600896
897 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700898 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
899 ds_pool_ci.pNext = NULL;
900 ds_pool_ci.maxSets = 1;
901 ds_pool_ci.poolSizeCount = 1;
902 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf2f97402015-09-11 12:57:55 -0600903
904 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700905 err =
906 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf2f97402015-09-11 12:57:55 -0600907 ASSERT_VK_SUCCESS(err);
908
909 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700910 dsl_binding.binding = 0;
911 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
912 dsl_binding.descriptorCount = 1;
913 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
914 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf2f97402015-09-11 12:57:55 -0600915
916 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700917 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
918 ds_layout_ci.pNext = NULL;
919 ds_layout_ci.bindingCount = 1;
920 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf2f97402015-09-11 12:57:55 -0600921
922 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700923 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
924 &ds_layout);
Tobin Ehlisf2f97402015-09-11 12:57:55 -0600925 ASSERT_VK_SUCCESS(err);
926
927 VkDescriptorSet descriptorSet;
Chia-I Wu1f851912015-10-27 18:04:07 +0800928 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +0800929 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -0700930 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -0600931 alloc_info.descriptorPool = ds_pool;
932 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700933 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
934 &descriptorSet);
Tobin Ehlisf2f97402015-09-11 12:57:55 -0600935 ASSERT_VK_SUCCESS(err);
936
937 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700938 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
939 pipeline_layout_ci.pNext = NULL;
940 pipeline_layout_ci.setLayoutCount = 1;
941 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisf2f97402015-09-11 12:57:55 -0600942
943 VkPipelineLayout pipeline_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700944 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
945 &pipeline_layout);
Tobin Ehlisf2f97402015-09-11 12:57:55 -0600946 ASSERT_VK_SUCCESS(err);
947
Mark Youngcbd7c6b2016-01-06 14:26:04 -0700948 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisf2f97402015-09-11 12:57:55 -0600949
950 BeginCommandBuffer();
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700951 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
952 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisf2f97402015-09-11 12:57:55 -0600953
Chris Forbes34d775f2016-04-07 13:21:07 +1200954 m_errorMonitor->VerifyFound();
Mike Stroyan2237f522015-08-18 14:40:24 -0600955
Chia-I Wu69f40122015-10-26 21:10:41 +0800956 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
957 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
958 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis87f115c2015-09-15 15:02:17 -0600959}
960
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700961TEST_F(VkLayerTest, BindInvalidMemory) {
962 VkResult err;
963 bool pass;
Tobin Ehlis87f115c2015-09-15 15:02:17 -0600964
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -0700965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700966 "Invalid VkDeviceMemory Object ");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -0600967
Tobin Ehlis87f115c2015-09-15 15:02:17 -0600968 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis87f115c2015-09-15 15:02:17 -0600969
970 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700971 VkImage image;
972 VkDeviceMemory mem;
973 VkMemoryRequirements mem_reqs;
Tobin Ehlis87f115c2015-09-15 15:02:17 -0600974
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700975 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
976 const int32_t tex_width = 32;
977 const int32_t tex_height = 32;
Tobin Ehlis87f115c2015-09-15 15:02:17 -0600978
979 VkImageCreateInfo image_create_info = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700980 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
981 image_create_info.pNext = NULL;
982 image_create_info.imageType = VK_IMAGE_TYPE_2D;
983 image_create_info.format = tex_format;
984 image_create_info.extent.width = tex_width;
985 image_create_info.extent.height = tex_height;
986 image_create_info.extent.depth = 1;
987 image_create_info.mipLevels = 1;
988 image_create_info.arrayLayers = 1;
989 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
990 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
991 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
992 image_create_info.flags = 0;
Tobin Ehlis87f115c2015-09-15 15:02:17 -0600993
Chia-I Wu1f851912015-10-27 18:04:07 +0800994 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700995 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
996 mem_alloc.pNext = NULL;
997 mem_alloc.allocationSize = 0;
998 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlis87f115c2015-09-15 15:02:17 -0600999
Chia-I Wu69f40122015-10-26 21:10:41 +08001000 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001001 ASSERT_VK_SUCCESS(err);
1002
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001003 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001004
1005 mem_alloc.allocationSize = mem_reqs.size;
1006
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001007 pass =
1008 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06001009 ASSERT_TRUE(pass);
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001010
1011 // allocate memory
Chia-I Wu1f851912015-10-27 18:04:07 +08001012 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001013 ASSERT_VK_SUCCESS(err);
1014
1015 // Introduce validation failure, free memory before binding
Chia-I Wu69f40122015-10-26 21:10:41 +08001016 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001017
1018 // Try to bind free memory that has been freed
1019 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1020 // This may very well return an error.
1021 (void)err;
1022
Chris Forbes34d775f2016-04-07 13:21:07 +12001023 m_errorMonitor->VerifyFound();
Mike Stroyan2237f522015-08-18 14:40:24 -06001024
Chia-I Wu69f40122015-10-26 21:10:41 +08001025 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001026}
1027
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001028TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1029 VkResult err;
1030 bool pass;
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001031
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1033 "Invalid VkImage Object ");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06001034
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001035 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001036
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001037 // Create an image object, allocate memory, destroy the object and then try
1038 // to bind it
1039 VkImage image;
1040 VkDeviceMemory mem;
1041 VkMemoryRequirements mem_reqs;
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001042
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001043 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1044 const int32_t tex_width = 32;
1045 const int32_t tex_height = 32;
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001046
1047 VkImageCreateInfo image_create_info = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001048 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1049 image_create_info.pNext = NULL;
1050 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1051 image_create_info.format = tex_format;
1052 image_create_info.extent.width = tex_width;
1053 image_create_info.extent.height = tex_height;
1054 image_create_info.extent.depth = 1;
1055 image_create_info.mipLevels = 1;
1056 image_create_info.arrayLayers = 1;
1057 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1058 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1059 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1060 image_create_info.flags = 0;
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001061
Chia-I Wu1f851912015-10-27 18:04:07 +08001062 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001063 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1064 mem_alloc.pNext = NULL;
1065 mem_alloc.allocationSize = 0;
1066 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001067
Chia-I Wu69f40122015-10-26 21:10:41 +08001068 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001069 ASSERT_VK_SUCCESS(err);
1070
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001071 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001072
1073 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001074 pass =
1075 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06001076 ASSERT_TRUE(pass);
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001077
1078 // Allocate memory
Chia-I Wu1f851912015-10-27 18:04:07 +08001079 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001080 ASSERT_VK_SUCCESS(err);
1081
1082 // Introduce validation failure, destroy Image object before binding
Chia-I Wu69f40122015-10-26 21:10:41 +08001083 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001084 ASSERT_VK_SUCCESS(err);
1085
1086 // Now Try to bind memory to this destroyed object
1087 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1088 // This may very well return an error.
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001089 (void)err;
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001090
Chris Forbes34d775f2016-04-07 13:21:07 +12001091 m_errorMonitor->VerifyFound();
Mike Stroyan2237f522015-08-18 14:40:24 -06001092
Chia-I Wu69f40122015-10-26 21:10:41 +08001093 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisf2f97402015-09-11 12:57:55 -06001094}
Tobin Ehlisb46be812015-10-23 16:00:08 -06001095
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06001096#endif // OBJ_TRACKER_TESTS
1097
Tobin Ehlis57e6a612015-05-26 16:11:58 -06001098#if DRAW_STATE_TESTS
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001099TEST_F(VkLayerTest, LineWidthStateNotBound) {
1100 m_errorMonitor->SetDesiredFailureMsg(
1101 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06001102 "Dynamic line width state not set for this command buffer");
1103
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001104 TEST_DESCRIPTION("Simple Draw Call that validates failure when a line "
1105 "width state object is not bound beforehand");
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001106
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001107 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1108 BsoFailLineWidth);
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001109
Chris Forbes34d775f2016-04-07 13:21:07 +12001110 m_errorMonitor->VerifyFound();
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001111}
1112
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001113TEST_F(VkLayerTest, DepthBiasStateNotBound) {
1114 m_errorMonitor->SetDesiredFailureMsg(
1115 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06001116 "Dynamic depth bias state not set for this command buffer");
1117
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001118 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
1119 "bias state object is not bound beforehand");
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001120
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001121 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1122 BsoFailDepthBias);
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001123
Chris Forbes34d775f2016-04-07 13:21:07 +12001124 m_errorMonitor->VerifyFound();
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001125}
1126
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001127// Disable these two tests until we can sort out how to track multiple layer
1128// errors
1129TEST_F(VkLayerTest, ViewportStateNotBound) {
1130 m_errorMonitor->SetDesiredFailureMsg(
1131 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06001132 "Dynamic viewport state not set for this command buffer");
1133
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001134 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
1135 "state object is not bound beforehand");
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001136
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001137 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1138 BsoFailViewport);
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001139
Chris Forbes34d775f2016-04-07 13:21:07 +12001140 m_errorMonitor->VerifyFound();
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001141}
1142
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001143TEST_F(VkLayerTest, ScissorStateNotBound) {
1144 m_errorMonitor->SetDesiredFailureMsg(
1145 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06001146 "Dynamic scissor state not set for this command buffer");
1147
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001148 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
1149 "state object is not bound beforehand");
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001150
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001151 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1152 BsoFailScissor);
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001153
Chris Forbes34d775f2016-04-07 13:21:07 +12001154 m_errorMonitor->VerifyFound();
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001155}
1156
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001157TEST_F(VkLayerTest, BlendStateNotBound) {
1158 m_errorMonitor->SetDesiredFailureMsg(
1159 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis3d3e06b2016-03-28 11:18:19 -06001160 "Dynamic blend constants state not set for this command buffer");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06001161
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001162 TEST_DESCRIPTION("Simple Draw Call that validates failure when a blend "
1163 "state object is not bound beforehand");
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001164
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001165 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1166 BsoFailBlend);
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001167
Chris Forbes34d775f2016-04-07 13:21:07 +12001168 m_errorMonitor->VerifyFound();
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001169}
1170
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001171TEST_F(VkLayerTest, DepthBoundsStateNotBound) {
1172 m_errorMonitor->SetDesiredFailureMsg(
1173 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06001174 "Dynamic depth bounds state not set for this command buffer");
1175
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001176 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
1177 "bounds state object is not bound beforehand");
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001178
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001179 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1180 BsoFailDepthBounds);
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001181
Chris Forbes34d775f2016-04-07 13:21:07 +12001182 m_errorMonitor->VerifyFound();
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001183}
1184
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001185TEST_F(VkLayerTest, StencilReadMaskNotSet) {
1186 m_errorMonitor->SetDesiredFailureMsg(
1187 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06001188 "Dynamic stencil read mask state not set for this command buffer");
1189
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001190 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06001191
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001192 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
1193 "read mask is not set beforehand");
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001194
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001195 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1196 BsoFailStencilReadMask);
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001197
Chris Forbes34d775f2016-04-07 13:21:07 +12001198 m_errorMonitor->VerifyFound();
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001199}
1200
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001201TEST_F(VkLayerTest, StencilWriteMaskNotSet) {
1202 m_errorMonitor->SetDesiredFailureMsg(
1203 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06001204 "Dynamic stencil write mask state not set for this command buffer");
1205
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001206 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06001207
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001208 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
1209 "write mask is not set beforehand");
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001210
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001211 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1212 BsoFailStencilWriteMask);
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001213
Chris Forbes34d775f2016-04-07 13:21:07 +12001214 m_errorMonitor->VerifyFound();
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001215}
1216
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001217TEST_F(VkLayerTest, StencilReferenceNotSet) {
1218 m_errorMonitor->SetDesiredFailureMsg(
1219 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06001220 "Dynamic stencil reference state not set for this command buffer");
1221
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001222 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
1223 "reference is not set beforehand");
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001224
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001225 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1226 BsoFailStencilReference);
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001227
Chris Forbes34d775f2016-04-07 13:21:07 +12001228 m_errorMonitor->VerifyFound();
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001229}
1230
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001231TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis0cea4082015-08-18 07:10:58 -06001232 vk_testing::Fence testFence;
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06001233
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001234 m_errorMonitor->SetDesiredFailureMsg(
1235 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1236 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
1237 "been submitted");
Tobin Ehlis0cea4082015-08-18 07:10:58 -06001238
1239 VkFenceCreateInfo fenceInfo = {};
1240 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1241 fenceInfo.pNext = NULL;
1242 fenceInfo.flags = 0;
1243
1244 ASSERT_NO_FATAL_FAILURE(InitState());
1245 ASSERT_NO_FATAL_FAILURE(InitViewport());
1246 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1247
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001248 // We luck out b/c by default the framework creates CB w/ the
1249 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis0cea4082015-08-18 07:10:58 -06001250 BeginCommandBuffer();
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001251 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
1252 m_stencil_clear_color, NULL);
Tobin Ehlis0cea4082015-08-18 07:10:58 -06001253 EndCommandBuffer();
1254
1255 testFence.init(*m_device, fenceInfo);
1256
1257 // Bypass framework since it does the waits automatically
1258 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter1a748e92015-10-27 11:22:14 -06001259 VkSubmitInfo submit_info;
Chia-I Wu6ec33a02015-10-26 20:37:06 +08001260 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1261 submit_info.pNext = NULL;
Chia-I Wu763a7492015-10-26 20:48:51 +08001262 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter1a748e92015-10-27 11:22:14 -06001263 submit_info.pWaitSemaphores = NULL;
Jon Ashburn98ce7e02015-12-30 16:42:50 -07001264 submit_info.pWaitDstStageMask = NULL;
Chia-I Wu763a7492015-10-26 20:48:51 +08001265 submit_info.commandBufferCount = 1;
Chia-I Wu1f851912015-10-27 18:04:07 +08001266 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wu763a7492015-10-26 20:48:51 +08001267 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter1a748e92015-10-27 11:22:14 -06001268 submit_info.pSignalSemaphores = NULL;
1269
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001270 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
1271 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0cea4082015-08-18 07:10:58 -06001272
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001273 // Cause validation error by re-submitting cmd buffer that should only be
1274 // submitted once
1275 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis0cea4082015-08-18 07:10:58 -06001276
Chris Forbes34d775f2016-04-07 13:21:07 +12001277 m_errorMonitor->VerifyFound();
Tobin Ehlis0cea4082015-08-18 07:10:58 -06001278}
1279
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001280TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisc6457d22015-10-20 16:16:04 -06001281 // Initiate Draw w/o a PSO bound
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001282 VkResult err;
Tobin Ehlisc6457d22015-10-20 16:16:04 -06001283
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -07001284 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001285 "Unable to allocate 1 descriptors of "
1286 "type "
1287 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06001288
Tobin Ehlisc6457d22015-10-20 16:16:04 -06001289 ASSERT_NO_FATAL_FAILURE(InitState());
1290 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc6457d22015-10-20 16:16:04 -06001291
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001292 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
1293 // descriptor from it
Chia-I Wuc51b1212015-10-27 19:25:11 +08001294 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001295 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
1296 ds_type_count.descriptorCount = 1;
Tobin Ehlisc6457d22015-10-20 16:16:04 -06001297
1298 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001299 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1300 ds_pool_ci.pNext = NULL;
1301 ds_pool_ci.flags = 0;
1302 ds_pool_ci.maxSets = 1;
1303 ds_pool_ci.poolSizeCount = 1;
1304 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc6457d22015-10-20 16:16:04 -06001305
1306 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001307 err =
1308 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc6457d22015-10-20 16:16:04 -06001309 ASSERT_VK_SUCCESS(err);
1310
1311 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001312 dsl_binding.binding = 0;
1313 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1314 dsl_binding.descriptorCount = 1;
1315 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1316 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc6457d22015-10-20 16:16:04 -06001317
1318 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001319 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1320 ds_layout_ci.pNext = NULL;
1321 ds_layout_ci.bindingCount = 1;
1322 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc6457d22015-10-20 16:16:04 -06001323
1324 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001325 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1326 &ds_layout);
Tobin Ehlisc6457d22015-10-20 16:16:04 -06001327 ASSERT_VK_SUCCESS(err);
1328
1329 VkDescriptorSet descriptorSet;
Chia-I Wu1f851912015-10-27 18:04:07 +08001330 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +08001331 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07001332 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06001333 alloc_info.descriptorPool = ds_pool;
1334 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001335 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1336 &descriptorSet);
Tobin Ehlisc6457d22015-10-20 16:16:04 -06001337
Chris Forbes34d775f2016-04-07 13:21:07 +12001338 m_errorMonitor->VerifyFound();
Tobin Ehlisc6457d22015-10-20 16:16:04 -06001339
Chia-I Wu69f40122015-10-26 21:10:41 +08001340 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1341 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisc6457d22015-10-20 16:16:04 -06001342}
1343
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001344TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
1345 VkResult err;
Tobin Ehlis3c543112015-10-08 13:13:50 -06001346
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001347 m_errorMonitor->SetDesiredFailureMsg(
1348 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1349 "It is invalid to call vkFreeDescriptorSets() with a pool created "
1350 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06001351
Tobin Ehlis3c543112015-10-08 13:13:50 -06001352 ASSERT_NO_FATAL_FAILURE(InitState());
1353 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis3c543112015-10-08 13:13:50 -06001354
Chia-I Wuc51b1212015-10-27 19:25:11 +08001355 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001356 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1357 ds_type_count.descriptorCount = 1;
Tobin Ehlis3c543112015-10-08 13:13:50 -06001358
1359 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001360 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1361 ds_pool_ci.pNext = NULL;
1362 ds_pool_ci.maxSets = 1;
1363 ds_pool_ci.poolSizeCount = 1;
1364 ds_pool_ci.flags = 0;
1365 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
1366 // app can only call vkResetDescriptorPool on this pool.;
1367 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis3c543112015-10-08 13:13:50 -06001368
1369 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001370 err =
1371 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3c543112015-10-08 13:13:50 -06001372 ASSERT_VK_SUCCESS(err);
1373
1374 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001375 dsl_binding.binding = 0;
1376 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1377 dsl_binding.descriptorCount = 1;
1378 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1379 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3c543112015-10-08 13:13:50 -06001380
1381 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001382 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1383 ds_layout_ci.pNext = NULL;
1384 ds_layout_ci.bindingCount = 1;
1385 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3c543112015-10-08 13:13:50 -06001386
1387 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001388 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1389 &ds_layout);
Tobin Ehlis3c543112015-10-08 13:13:50 -06001390 ASSERT_VK_SUCCESS(err);
1391
1392 VkDescriptorSet descriptorSet;
Chia-I Wu1f851912015-10-27 18:04:07 +08001393 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +08001394 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07001395 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06001396 alloc_info.descriptorPool = ds_pool;
1397 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001398 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1399 &descriptorSet);
Tobin Ehlis3c543112015-10-08 13:13:50 -06001400 ASSERT_VK_SUCCESS(err);
1401
1402 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes34d775f2016-04-07 13:21:07 +12001403 m_errorMonitor->VerifyFound();
Tobin Ehlis3c543112015-10-08 13:13:50 -06001404
Chia-I Wu69f40122015-10-26 21:10:41 +08001405 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1406 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis3c543112015-10-08 13:13:50 -06001407}
1408
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001409TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultz772fcd12016-04-19 11:36:49 -06001410 // Attempt to clear Descriptor Pool with bad object.
1411 // ObjectTracker should catch this.
1412 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1413 "Invalid VkDescriptorPool Object 0xbaad6001");
1414 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
1415 vkResetDescriptorPool(device(), badPool, 0);
1416 m_errorMonitor->VerifyFound();
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001417}
1418
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001419TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultz772fcd12016-04-19 11:36:49 -06001420 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
1421 // ObjectTracker should catch this.
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001422 // Create a valid cmd buffer
Karl Schultz772fcd12016-04-19 11:36:49 -06001423 // call vkCmdBindDescriptorSets w/ false Descriptor Set
1424 VkDescriptorSet badSet = (VkDescriptorSet)0xbaad6001;
1425 VkResult err;
1426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1427 "Invalid VkDescriptorSet Object 0xbaad6001");
1428
1429 ASSERT_NO_FATAL_FAILURE(InitState());
1430
1431 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
1432 layout_bindings[0].binding = 0;
1433 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1434 layout_bindings[0].descriptorCount = 1;
1435 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
1436 layout_bindings[0].pImmutableSamplers = NULL;
1437
1438 VkDescriptorSetLayout descriptor_set_layout;
1439 VkDescriptorSetLayoutCreateInfo dslci = {};
1440 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1441 dslci.pNext = NULL;
1442 dslci.bindingCount = 1;
1443 dslci.pBindings = layout_bindings;
1444 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
1445 assert(!err);
1446
1447 VkPipelineLayout pipeline_layout;
1448 VkPipelineLayoutCreateInfo plci = {};
1449 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1450 plci.pNext = NULL;
1451 plci.setLayoutCount = 1;
1452 plci.pSetLayouts = &descriptor_set_layout;
1453 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
1454 assert(!err);
1455
1456 BeginCommandBuffer();
1457 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
1458 pipeline_layout, 0, 1, &badSet, 0, NULL);
1459 m_errorMonitor->VerifyFound();
1460 EndCommandBuffer();
1461 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
1462 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001463}
1464
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001465TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultz772fcd12016-04-19 11:36:49 -06001466 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
1467 // ObjectTracker should catch this.
1468 VkDescriptorSetLayout bad_layout = (VkDescriptorSetLayout)0xbaad6001;
1469 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1470 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
1471
1472 VkPipelineLayout pipeline_layout;
1473 VkPipelineLayoutCreateInfo plci = {};
1474 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1475 plci.pNext = NULL;
1476 plci.setLayoutCount = 1;
1477 plci.pSetLayouts = &bad_layout;
1478 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
1479
1480 m_errorMonitor->VerifyFound();
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001481}
1482
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001483TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultz772fcd12016-04-19 11:36:49 -06001484 // Attempt to bind an invalid Pipeline to a valid Command Buffer
1485 // ObjectTracker should catch this.
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001486 // Create a valid cmd buffer
1487 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultz772fcd12016-04-19 11:36:49 -06001488 VkPipeline bad_pipeline = (VkPipeline)0xbaad6001;
1489 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1490 "Invalid VkPipeline Object 0xbaad6001");
1491 ASSERT_NO_FATAL_FAILURE(InitState());
1492 BeginCommandBuffer();
1493 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1494 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
1495 m_errorMonitor->VerifyFound();
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001496}
1497
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001498TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
1499 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
1500 // CommandBuffer
1501 VkResult err;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001502
Mark Lobodzinski5c13d4d2016-02-11 09:26:16 -07001503 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001504 " bound but it was never updated. ");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06001505
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001506 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyand72da752015-08-04 10:49:29 -06001507 ASSERT_NO_FATAL_FAILURE(InitViewport());
1508 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wuc51b1212015-10-27 19:25:11 +08001509 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001510 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1511 ds_type_count.descriptorCount = 1;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06001512
1513 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001514 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1515 ds_pool_ci.pNext = NULL;
1516 ds_pool_ci.maxSets = 1;
1517 ds_pool_ci.poolSizeCount = 1;
1518 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyand72da752015-08-04 10:49:29 -06001519
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001520 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001521 err =
1522 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001523 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001524
Tony Barbourefbe9ca2015-07-15 12:50:33 -06001525 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001526 dsl_binding.binding = 0;
1527 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1528 dsl_binding.descriptorCount = 1;
1529 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1530 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001531
Tony Barbourefbe9ca2015-07-15 12:50:33 -06001532 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001533 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1534 ds_layout_ci.pNext = NULL;
1535 ds_layout_ci.bindingCount = 1;
1536 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001537 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001538 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1539 &ds_layout);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001540 ASSERT_VK_SUCCESS(err);
1541
1542 VkDescriptorSet descriptorSet;
Chia-I Wu1f851912015-10-27 18:04:07 +08001543 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +08001544 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07001545 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06001546 alloc_info.descriptorPool = ds_pool;
1547 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001548 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1549 &descriptorSet);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001550 ASSERT_VK_SUCCESS(err);
1551
Tony Barbourefbe9ca2015-07-15 12:50:33 -06001552 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001553 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1554 pipeline_layout_ci.pNext = NULL;
1555 pipeline_layout_ci.setLayoutCount = 1;
1556 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001557
1558 VkPipelineLayout pipeline_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001559 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1560 &pipeline_layout);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001561 ASSERT_VK_SUCCESS(err);
1562
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001563 VkShaderObj vs(m_device, bindStateVertShaderText,
1564 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultz772fcd12016-04-19 11:36:49 -06001565 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001566 // on more devices
1567 VkShaderObj fs(m_device, bindStateFragShaderText,
1568 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001569
Tony Barbour4e8d1b12015-08-04 17:05:26 -06001570 VkPipelineObj pipe(m_device);
1571 pipe.AddShader(&vs);
Tony Barbour3c9e3b12015-08-06 11:21:08 -06001572 pipe.AddShader(&fs);
Mark Young0292df52016-03-31 16:03:20 -06001573 pipe.AddColorAttachment();
Tony Barbour4e8d1b12015-08-04 17:05:26 -06001574 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbour1490c912015-07-28 10:17:20 -06001575
1576 BeginCommandBuffer();
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001577 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1578 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
1579 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1580 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1581 1, &descriptorSet, 0, NULL);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001582
Chris Forbes34d775f2016-04-07 13:21:07 +12001583 m_errorMonitor->VerifyFound();
Mike Stroyan2237f522015-08-18 14:40:24 -06001584
Chia-I Wu69f40122015-10-26 21:10:41 +08001585 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1586 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1587 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis254eca02015-06-25 15:46:59 -06001588}
1589
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001590TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlis093ef922015-11-02 15:24:32 -07001591 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001592 VkResult err;
Tobin Ehlis093ef922015-11-02 15:24:32 -07001593
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001594 m_errorMonitor->SetDesiredFailureMsg(
1595 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis093ef922015-11-02 15:24:32 -07001596 "Attempt to update descriptor with invalid bufferView ");
1597
1598 ASSERT_NO_FATAL_FAILURE(InitState());
1599 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001600 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1601 ds_type_count.descriptorCount = 1;
Tobin Ehlis093ef922015-11-02 15:24:32 -07001602
1603 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001604 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1605 ds_pool_ci.pNext = NULL;
1606 ds_pool_ci.maxSets = 1;
1607 ds_pool_ci.poolSizeCount = 1;
1608 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis093ef922015-11-02 15:24:32 -07001609
1610 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001611 err =
1612 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis093ef922015-11-02 15:24:32 -07001613 ASSERT_VK_SUCCESS(err);
1614
1615 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001616 dsl_binding.binding = 0;
1617 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1618 dsl_binding.descriptorCount = 1;
1619 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1620 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis093ef922015-11-02 15:24:32 -07001621
1622 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001623 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1624 ds_layout_ci.pNext = NULL;
1625 ds_layout_ci.bindingCount = 1;
1626 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis093ef922015-11-02 15:24:32 -07001627 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001628 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1629 &ds_layout);
Tobin Ehlis093ef922015-11-02 15:24:32 -07001630 ASSERT_VK_SUCCESS(err);
1631
1632 VkDescriptorSet descriptorSet;
1633 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +08001634 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07001635 alloc_info.descriptorSetCount = 1;
Tobin Ehlis093ef922015-11-02 15:24:32 -07001636 alloc_info.descriptorPool = ds_pool;
1637 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001638 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1639 &descriptorSet);
Tobin Ehlis093ef922015-11-02 15:24:32 -07001640 ASSERT_VK_SUCCESS(err);
1641
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001642 VkBufferView view =
1643 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlis093ef922015-11-02 15:24:32 -07001644 VkWriteDescriptorSet descriptor_write;
1645 memset(&descriptor_write, 0, sizeof(descriptor_write));
1646 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1647 descriptor_write.dstSet = descriptorSet;
1648 descriptor_write.dstBinding = 0;
1649 descriptor_write.descriptorCount = 1;
1650 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1651 descriptor_write.pTexelBufferView = &view;
1652
1653 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1654
Chris Forbes34d775f2016-04-07 13:21:07 +12001655 m_errorMonitor->VerifyFound();
Tobin Ehlis093ef922015-11-02 15:24:32 -07001656
1657 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1658 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1659}
1660
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001661TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
1662 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
1663 // cases:
Tobin Ehlisea975962015-12-17 11:48:42 -07001664 // 1. No dynamicOffset supplied
1665 // 2. Too many dynamicOffsets supplied
1666 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001667 VkResult err;
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -07001668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001669 " requires 1 dynamicOffsets, but only "
1670 "0 dynamicOffsets are left in "
1671 "pDynamicOffsets ");
Tobin Ehlise2194862015-11-04 13:30:34 -07001672
1673 ASSERT_NO_FATAL_FAILURE(InitState());
1674 ASSERT_NO_FATAL_FAILURE(InitViewport());
1675 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1676
1677 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001678 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
1679 ds_type_count.descriptorCount = 1;
Tobin Ehlise2194862015-11-04 13:30:34 -07001680
1681 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001682 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1683 ds_pool_ci.pNext = NULL;
1684 ds_pool_ci.maxSets = 1;
1685 ds_pool_ci.poolSizeCount = 1;
1686 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise2194862015-11-04 13:30:34 -07001687
1688 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001689 err =
1690 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise2194862015-11-04 13:30:34 -07001691 ASSERT_VK_SUCCESS(err);
1692
1693 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001694 dsl_binding.binding = 0;
1695 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
1696 dsl_binding.descriptorCount = 1;
1697 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1698 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise2194862015-11-04 13:30:34 -07001699
1700 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001701 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1702 ds_layout_ci.pNext = NULL;
1703 ds_layout_ci.bindingCount = 1;
1704 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise2194862015-11-04 13:30:34 -07001705 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001706 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1707 &ds_layout);
Tobin Ehlise2194862015-11-04 13:30:34 -07001708 ASSERT_VK_SUCCESS(err);
1709
1710 VkDescriptorSet descriptorSet;
1711 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +08001712 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07001713 alloc_info.descriptorSetCount = 1;
Tobin Ehlise2194862015-11-04 13:30:34 -07001714 alloc_info.descriptorPool = ds_pool;
1715 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001716 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1717 &descriptorSet);
Tobin Ehlise2194862015-11-04 13:30:34 -07001718 ASSERT_VK_SUCCESS(err);
1719
1720 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001721 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1722 pipeline_layout_ci.pNext = NULL;
1723 pipeline_layout_ci.setLayoutCount = 1;
1724 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise2194862015-11-04 13:30:34 -07001725
1726 VkPipelineLayout pipeline_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001727 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1728 &pipeline_layout);
Tobin Ehlise2194862015-11-04 13:30:34 -07001729 ASSERT_VK_SUCCESS(err);
1730
1731 // Create a buffer to update the descriptor with
1732 uint32_t qfi = 0;
1733 VkBufferCreateInfo buffCI = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001734 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1735 buffCI.size = 1024;
1736 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1737 buffCI.queueFamilyIndexCount = 1;
1738 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlise2194862015-11-04 13:30:34 -07001739
1740 VkBuffer dyub;
1741 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
1742 ASSERT_VK_SUCCESS(err);
1743 // Correctly update descriptor to avoid "NOT_UPDATED" error
1744 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001745 buffInfo.buffer = dyub;
1746 buffInfo.offset = 0;
1747 buffInfo.range = 1024;
Tobin Ehlise2194862015-11-04 13:30:34 -07001748
1749 VkWriteDescriptorSet descriptor_write;
1750 memset(&descriptor_write, 0, sizeof(descriptor_write));
1751 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1752 descriptor_write.dstSet = descriptorSet;
1753 descriptor_write.dstBinding = 0;
1754 descriptor_write.descriptorCount = 1;
1755 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
1756 descriptor_write.pBufferInfo = &buffInfo;
1757
1758 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1759
1760 BeginCommandBuffer();
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001761 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1762 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1763 1, &descriptorSet, 0, NULL);
Chris Forbes34d775f2016-04-07 13:21:07 +12001764 m_errorMonitor->VerifyFound();
Tobin Ehlisea975962015-12-17 11:48:42 -07001765 uint32_t pDynOff[2] = {512, 756};
1766 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001767 m_errorMonitor->SetDesiredFailureMsg(
1768 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisea975962015-12-17 11:48:42 -07001769 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001770 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1771 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1772 1, &descriptorSet, 2, pDynOff);
Chris Forbes9ce0fb32016-04-07 13:20:10 +12001773 m_errorMonitor->VerifyFound();
Tobin Ehlisea975962015-12-17 11:48:42 -07001774 // Finally cause error due to dynamicOffset being too big
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001775 m_errorMonitor->SetDesiredFailureMsg(
1776 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisea975962015-12-17 11:48:42 -07001777 " from its update, this oversteps its buffer (");
1778 // Create PSO to be used for draw-time errors below
1779 char const *vsSource =
Chris Forbes9ce0fb32016-04-07 13:20:10 +12001780 "#version 450\n"
Tobin Ehlisea975962015-12-17 11:48:42 -07001781 "\n"
Tony Barbour19b5f922016-01-05 13:37:45 -07001782 "out gl_PerVertex { \n"
1783 " vec4 gl_Position;\n"
1784 "};\n"
Tobin Ehlisea975962015-12-17 11:48:42 -07001785 "void main(){\n"
1786 " gl_Position = vec4(1);\n"
1787 "}\n";
1788 char const *fsSource =
Chris Forbes9ce0fb32016-04-07 13:20:10 +12001789 "#version 450\n"
Tobin Ehlisea975962015-12-17 11:48:42 -07001790 "\n"
1791 "layout(location=0) out vec4 x;\n"
1792 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
1793 "void main(){\n"
1794 " x = vec4(bar.y);\n"
1795 "}\n";
1796 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
1797 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1798 VkPipelineObj pipe(m_device);
1799 pipe.AddShader(&vs);
1800 pipe.AddShader(&fs);
1801 pipe.AddColorAttachment();
1802 pipe.CreateVKPipeline(pipeline_layout, renderPass());
1803
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001804 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1805 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
1806 // This update should succeed, but offset size of 512 will overstep buffer
1807 // /w range 1024 & size 1024
1808 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1809 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1810 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisea975962015-12-17 11:48:42 -07001811 Draw(1, 0, 0, 0);
Chris Forbes34d775f2016-04-07 13:21:07 +12001812 m_errorMonitor->VerifyFound();
Tobin Ehlise2194862015-11-04 13:30:34 -07001813
1814 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1815 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1816}
1817
Tobin Ehlisb3302332016-02-17 10:35:18 -07001818TEST_F(VkLayerTest, InvalidPushConstants) {
1819 // Hit push constant error cases:
1820 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
1821 // 2. Incorrectly set push constant size to 0
1822 // 3. Incorrectly set push constant size to non-multiple of 4
1823 // 4. Attempt push constant update that exceeds maxPushConstantSize
1824 VkResult err;
1825 m_errorMonitor->SetDesiredFailureMsg(
1826 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1827 "vkCreatePipelineLayout() call has push constants with offset ");
1828
1829 ASSERT_NO_FATAL_FAILURE(InitState());
1830 ASSERT_NO_FATAL_FAILURE(InitViewport());
1831 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1832
1833 VkPushConstantRange pc_range = {};
1834 pc_range.size = 0xFFFFFFFFu;
1835 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
1836 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1837 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1838 pipeline_layout_ci.pushConstantRangeCount = 1;
1839 pipeline_layout_ci.pPushConstantRanges = &pc_range;
1840
1841 VkPipelineLayout pipeline_layout;
1842 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1843 &pipeline_layout);
1844
Chris Forbes34d775f2016-04-07 13:21:07 +12001845 m_errorMonitor->VerifyFound();
Tobin Ehlisb3302332016-02-17 10:35:18 -07001846 // Now cause errors due to size 0 and non-4 byte aligned size
1847 pc_range.size = 0;
1848 m_errorMonitor->SetDesiredFailureMsg(
1849 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1850 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
1851 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1852 &pipeline_layout);
Chris Forbes34d775f2016-04-07 13:21:07 +12001853 m_errorMonitor->VerifyFound();
Tobin Ehlisb3302332016-02-17 10:35:18 -07001854 pc_range.size = 1;
1855 m_errorMonitor->SetDesiredFailureMsg(
1856 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1857 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
1858 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1859 &pipeline_layout);
Chris Forbes34d775f2016-04-07 13:21:07 +12001860 m_errorMonitor->VerifyFound();
Tobin Ehlisb3302332016-02-17 10:35:18 -07001861 // Cause error due to bad size in vkCmdPushConstants() call
1862 m_errorMonitor->SetDesiredFailureMsg(
1863 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1864 "vkCmdPushConstants() call has push constants with offset ");
1865 pipeline_layout_ci.pushConstantRangeCount = 0;
1866 pipeline_layout_ci.pPushConstantRanges = NULL;
1867 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1868 &pipeline_layout);
1869 ASSERT_VK_SUCCESS(err);
1870 BeginCommandBuffer();
1871 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
1872 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes34d775f2016-04-07 13:21:07 +12001873 m_errorMonitor->VerifyFound();
Tobin Ehlisb3302332016-02-17 10:35:18 -07001874 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1875}
1876
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001877TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis982099b2015-11-05 09:52:49 -07001878 // Test various desriptorSet errors with bad binding combinations
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001879 VkResult err;
Tobin Ehlis982099b2015-11-05 09:52:49 -07001880
1881 ASSERT_NO_FATAL_FAILURE(InitState());
1882 ASSERT_NO_FATAL_FAILURE(InitViewport());
1883 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1884
1885 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
1886 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001887 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1888 ds_type_count[0].descriptorCount = 10;
1889 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1890 ds_type_count[1].descriptorCount = 2;
1891 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
1892 ds_type_count[2].descriptorCount = 2;
1893 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
1894 ds_type_count[3].descriptorCount = 5;
1895 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
1896 // type
1897 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
1898 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1899 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis982099b2015-11-05 09:52:49 -07001900
1901 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001902 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1903 ds_pool_ci.pNext = NULL;
1904 ds_pool_ci.maxSets = 5;
1905 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
1906 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis982099b2015-11-05 09:52:49 -07001907
1908 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001909 err =
1910 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis982099b2015-11-05 09:52:49 -07001911 ASSERT_VK_SUCCESS(err);
1912
1913 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
1914 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001915 dsl_binding[0].binding = 0;
1916 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1917 dsl_binding[0].descriptorCount = 5;
1918 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
1919 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis982099b2015-11-05 09:52:49 -07001920
Tobin Ehliscb085292015-12-01 09:57:09 -07001921 // Create layout identical to set0 layout but w/ different stageFlags
1922 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001923 dsl_fs_stage_only.binding = 0;
1924 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1925 dsl_fs_stage_only.descriptorCount = 5;
1926 dsl_fs_stage_only.stageFlags =
1927 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
1928 // bind time
1929 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis982099b2015-11-05 09:52:49 -07001930 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001931 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1932 ds_layout_ci.pNext = NULL;
1933 ds_layout_ci.bindingCount = 1;
1934 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis982099b2015-11-05 09:52:49 -07001935 static const uint32_t NUM_LAYOUTS = 4;
1936 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehliscb085292015-12-01 09:57:09 -07001937 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001938 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
1939 // layout for error case
1940 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1941 &ds_layout[0]);
Tobin Ehlis982099b2015-11-05 09:52:49 -07001942 ASSERT_VK_SUCCESS(err);
Jon Ashburnadb61352015-12-30 18:01:16 -07001943 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001944 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1945 &ds_layout_fs_only);
Tobin Ehliscb085292015-12-01 09:57:09 -07001946 ASSERT_VK_SUCCESS(err);
Tobin Ehlis982099b2015-11-05 09:52:49 -07001947 dsl_binding[0].binding = 0;
1948 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehliscb085292015-12-01 09:57:09 -07001949 dsl_binding[0].descriptorCount = 2;
Mike Stroyand87d28b2016-01-06 14:14:17 -07001950 dsl_binding[1].binding = 1;
1951 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
1952 dsl_binding[1].descriptorCount = 2;
1953 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
1954 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburnadb61352015-12-30 18:01:16 -07001955 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis982099b2015-11-05 09:52:49 -07001956 ds_layout_ci.bindingCount = 2;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001957 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1958 &ds_layout[1]);
Tobin Ehlis982099b2015-11-05 09:52:49 -07001959 ASSERT_VK_SUCCESS(err);
1960 dsl_binding[0].binding = 0;
1961 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehliscb085292015-12-01 09:57:09 -07001962 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis982099b2015-11-05 09:52:49 -07001963 ds_layout_ci.bindingCount = 1;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001964 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1965 &ds_layout[2]);
Tobin Ehlis982099b2015-11-05 09:52:49 -07001966 ASSERT_VK_SUCCESS(err);
1967 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehliscb085292015-12-01 09:57:09 -07001968 dsl_binding[0].descriptorCount = 2;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001969 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1970 &ds_layout[3]);
Tobin Ehlis982099b2015-11-05 09:52:49 -07001971 ASSERT_VK_SUCCESS(err);
1972
1973 static const uint32_t NUM_SETS = 4;
1974 VkDescriptorSet descriptorSet[NUM_SETS] = {};
1975 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehliscb085292015-12-01 09:57:09 -07001976 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07001977 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis982099b2015-11-05 09:52:49 -07001978 alloc_info.descriptorPool = ds_pool;
1979 alloc_info.pSetLayouts = ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001980 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1981 descriptorSet);
Tobin Ehlis982099b2015-11-05 09:52:49 -07001982 ASSERT_VK_SUCCESS(err);
Tobin Ehliscb085292015-12-01 09:57:09 -07001983 VkDescriptorSet ds0_fs_only = {};
Jon Ashburna4ae48b2016-01-11 13:12:43 -07001984 alloc_info.descriptorSetCount = 1;
Tobin Ehliscb085292015-12-01 09:57:09 -07001985 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001986 err =
1987 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehliscb085292015-12-01 09:57:09 -07001988 ASSERT_VK_SUCCESS(err);
Tobin Ehlis982099b2015-11-05 09:52:49 -07001989
1990 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001991 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1992 pipeline_layout_ci.pNext = NULL;
1993 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
1994 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis982099b2015-11-05 09:52:49 -07001995
1996 VkPipelineLayout pipeline_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001997 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1998 &pipeline_layout);
Tobin Ehlis982099b2015-11-05 09:52:49 -07001999 ASSERT_VK_SUCCESS(err);
Tobin Ehliscb085292015-12-01 09:57:09 -07002000 // Create pipelineLayout with only one setLayout
2001 pipeline_layout_ci.setLayoutCount = 1;
2002 VkPipelineLayout single_pipe_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002003 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2004 &single_pipe_layout);
Tobin Ehliscb085292015-12-01 09:57:09 -07002005 ASSERT_VK_SUCCESS(err);
2006 // Create pipelineLayout with 2 descriptor setLayout at index 0
2007 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
2008 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002009 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2010 &pipe_layout_one_desc);
Tobin Ehliscb085292015-12-01 09:57:09 -07002011 ASSERT_VK_SUCCESS(err);
2012 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
2013 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
2014 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002015 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2016 &pipe_layout_five_samp);
Tobin Ehliscb085292015-12-01 09:57:09 -07002017 ASSERT_VK_SUCCESS(err);
2018 // Create pipelineLayout with UB type, but stageFlags for FS only
2019 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
2020 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002021 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2022 &pipe_layout_fs_only);
Tobin Ehliscb085292015-12-01 09:57:09 -07002023 ASSERT_VK_SUCCESS(err);
2024 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
2025 VkDescriptorSetLayout pl_bad_s0[2] = {};
2026 pl_bad_s0[0] = ds_layout_fs_only;
2027 pl_bad_s0[1] = ds_layout[1];
2028 pipeline_layout_ci.setLayoutCount = 2;
2029 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
2030 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002031 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2032 &pipe_layout_bad_set0);
Tobin Ehliscb085292015-12-01 09:57:09 -07002033 ASSERT_VK_SUCCESS(err);
Tobin Ehlis982099b2015-11-05 09:52:49 -07002034
2035 // Create a buffer to update the descriptor with
2036 uint32_t qfi = 0;
2037 VkBufferCreateInfo buffCI = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002038 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2039 buffCI.size = 1024;
2040 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2041 buffCI.queueFamilyIndexCount = 1;
2042 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis982099b2015-11-05 09:52:49 -07002043
2044 VkBuffer dyub;
2045 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2046 ASSERT_VK_SUCCESS(err);
2047 // Correctly update descriptor to avoid "NOT_UPDATED" error
2048 static const uint32_t NUM_BUFFS = 5;
2049 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002050 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis982099b2015-11-05 09:52:49 -07002051 buffInfo[i].buffer = dyub;
2052 buffInfo[i].offset = 0;
2053 buffInfo[i].range = 1024;
2054 }
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002055 VkImage image;
2056 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2057 const int32_t tex_width = 32;
2058 const int32_t tex_height = 32;
Tobin Ehliscb085292015-12-01 09:57:09 -07002059 VkImageCreateInfo image_create_info = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002060 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2061 image_create_info.pNext = NULL;
2062 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2063 image_create_info.format = tex_format;
2064 image_create_info.extent.width = tex_width;
2065 image_create_info.extent.height = tex_height;
2066 image_create_info.extent.depth = 1;
2067 image_create_info.mipLevels = 1;
2068 image_create_info.arrayLayers = 1;
2069 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2070 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2071 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2072 image_create_info.flags = 0;
Tobin Ehliscb085292015-12-01 09:57:09 -07002073 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2074 ASSERT_VK_SUCCESS(err);
Tobin Ehlis982099b2015-11-05 09:52:49 -07002075
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002076 VkMemoryRequirements memReqs;
2077 VkDeviceMemory imageMem;
2078 bool pass;
Mike Stroyand87d28b2016-01-06 14:14:17 -07002079 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002080 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2081 memAlloc.pNext = NULL;
2082 memAlloc.allocationSize = 0;
2083 memAlloc.memoryTypeIndex = 0;
Mike Stroyand87d28b2016-01-06 14:14:17 -07002084 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
2085 memAlloc.allocationSize = memReqs.size;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002086 pass =
2087 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyand87d28b2016-01-06 14:14:17 -07002088 ASSERT_TRUE(pass);
2089 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
2090 ASSERT_VK_SUCCESS(err);
2091 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
2092 ASSERT_VK_SUCCESS(err);
2093
Tobin Ehliscb085292015-12-01 09:57:09 -07002094 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002095 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2096 image_view_create_info.image = image;
2097 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
2098 image_view_create_info.format = tex_format;
2099 image_view_create_info.subresourceRange.layerCount = 1;
2100 image_view_create_info.subresourceRange.baseMipLevel = 0;
2101 image_view_create_info.subresourceRange.levelCount = 1;
2102 image_view_create_info.subresourceRange.aspectMask =
2103 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis982099b2015-11-05 09:52:49 -07002104
Tobin Ehliscb085292015-12-01 09:57:09 -07002105 VkImageView view;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002106 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
2107 &view);
Tobin Ehliscb085292015-12-01 09:57:09 -07002108 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2280f522016-01-06 08:48:41 -07002109 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehliscb085292015-12-01 09:57:09 -07002110 imageInfo[0].imageView = view;
2111 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2112 imageInfo[1].imageView = view;
2113 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis2280f522016-01-06 08:48:41 -07002114 imageInfo[2].imageView = view;
2115 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2116 imageInfo[3].imageView = view;
2117 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehliscb085292015-12-01 09:57:09 -07002118
2119 static const uint32_t NUM_SET_UPDATES = 3;
2120 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
2121 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2122 descriptor_write[0].dstSet = descriptorSet[0];
2123 descriptor_write[0].dstBinding = 0;
2124 descriptor_write[0].descriptorCount = 5;
2125 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2126 descriptor_write[0].pBufferInfo = buffInfo;
2127 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2128 descriptor_write[1].dstSet = descriptorSet[1];
2129 descriptor_write[1].dstBinding = 0;
2130 descriptor_write[1].descriptorCount = 2;
2131 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
2132 descriptor_write[1].pImageInfo = imageInfo;
2133 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2134 descriptor_write[2].dstSet = descriptorSet[1];
2135 descriptor_write[2].dstBinding = 1;
2136 descriptor_write[2].descriptorCount = 2;
2137 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis2280f522016-01-06 08:48:41 -07002138 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehliscb085292015-12-01 09:57:09 -07002139
2140 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis982099b2015-11-05 09:52:49 -07002141
Tobin Ehlisd17c28c2015-12-03 09:40:56 -07002142 // Create PSO to be used for draw-time errors below
2143 char const *vsSource =
Chris Forbes9ce0fb32016-04-07 13:20:10 +12002144 "#version 450\n"
Tobin Ehlisd17c28c2015-12-03 09:40:56 -07002145 "\n"
Tony Barbour19b5f922016-01-05 13:37:45 -07002146 "out gl_PerVertex {\n"
2147 " vec4 gl_Position;\n"
2148 "};\n"
Tobin Ehlisd17c28c2015-12-03 09:40:56 -07002149 "void main(){\n"
2150 " gl_Position = vec4(1);\n"
2151 "}\n";
2152 char const *fsSource =
Chris Forbes9ce0fb32016-04-07 13:20:10 +12002153 "#version 450\n"
Tobin Ehlisd17c28c2015-12-03 09:40:56 -07002154 "\n"
2155 "layout(location=0) out vec4 x;\n"
2156 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2157 "void main(){\n"
2158 " x = vec4(bar.y);\n"
2159 "}\n";
2160 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2161 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis982099b2015-11-05 09:52:49 -07002162 VkPipelineObj pipe(m_device);
2163 pipe.AddShader(&vs);
2164 pipe.AddShader(&fs);
Tobin Ehlisd17c28c2015-12-03 09:40:56 -07002165 pipe.AddColorAttachment();
2166 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis982099b2015-11-05 09:52:49 -07002167
2168 BeginCommandBuffer();
Tobin Ehlisd17c28c2015-12-03 09:40:56 -07002169
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002170 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2171 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2172 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
2173 // of PSO
2174 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
2175 // cmd_pipeline.c
2176 // due to the fact that cmd_alloc_dset_data() has not been called in
2177 // cmd_bind_graphics_pipeline()
2178 // TODO : Want to cause various binding incompatibility issues here to test
2179 // DrawState
Tobin Ehlis982099b2015-11-05 09:52:49 -07002180 // First cause various verify_layout_compatibility() fails
2181 // Second disturb early and late sets and verify INFO msgs
Tobin Ehliscb085292015-12-01 09:57:09 -07002182 // verify_set_layout_compatibility fail cases:
2183 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002184 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2185 " due to: invalid VkPipelineLayout ");
2186 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2187 VK_PIPELINE_BIND_POINT_GRAPHICS,
2188 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
2189 &descriptorSet[0], 0, NULL);
Chris Forbes34d775f2016-04-07 13:21:07 +12002190 m_errorMonitor->VerifyFound();
2191
Tobin Ehliscb085292015-12-01 09:57:09 -07002192 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2194 " attempting to bind set to index 1");
2195 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2196 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
2197 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes34d775f2016-04-07 13:21:07 +12002198 m_errorMonitor->VerifyFound();
2199
Tobin Ehliscb085292015-12-01 09:57:09 -07002200 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002201 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
2202 // descriptors
2203 m_errorMonitor->SetDesiredFailureMsg(
2204 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2205 ", but corresponding set being bound has 5 descriptors.");
2206 vkCmdBindDescriptorSets(
2207 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2208 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes34d775f2016-04-07 13:21:07 +12002209 m_errorMonitor->VerifyFound();
2210
Tobin Ehliscb085292015-12-01 09:57:09 -07002211 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
2212 // 4. same # of descriptors but mismatch in type
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002213 m_errorMonitor->SetDesiredFailureMsg(
2214 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2215 " descriptor from pipelineLayout is type 'VK_DESCRIPTOR_TYPE_SAMPLER'");
2216 vkCmdBindDescriptorSets(
2217 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2218 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes34d775f2016-04-07 13:21:07 +12002219 m_errorMonitor->VerifyFound();
2220
Tobin Ehliscb085292015-12-01 09:57:09 -07002221 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
2222 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002223 m_errorMonitor->SetDesiredFailureMsg(
2224 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2225 " descriptor from pipelineLayout has stageFlags ");
2226 vkCmdBindDescriptorSets(
2227 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2228 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes34d775f2016-04-07 13:21:07 +12002229 m_errorMonitor->VerifyFound();
2230
Tobin Ehliscb085292015-12-01 09:57:09 -07002231 // Cause INFO messages due to disturbing previously bound Sets
2232 // First bind sets 0 & 1
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002233 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2234 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2235 2, &descriptorSet[0], 0, NULL);
Tobin Ehliscb085292015-12-01 09:57:09 -07002236 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002237 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski5c13d4d2016-02-11 09:26:16 -07002238 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002239 " previously bound as set #0 was disturbed ");
2240 vkCmdBindDescriptorSets(
2241 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2242 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes34d775f2016-04-07 13:21:07 +12002243 m_errorMonitor->VerifyFound();
2244
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002245 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2246 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2247 2, &descriptorSet[0], 0, NULL);
Tobin Ehliscb085292015-12-01 09:57:09 -07002248 // 2. Disturb set after last bound set
Mark Lobodzinski5c13d4d2016-02-11 09:26:16 -07002249 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002250 " newly bound as set #0 so set #1 and "
2251 "any subsequent sets were disturbed ");
2252 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2253 VK_PIPELINE_BIND_POINT_GRAPHICS,
2254 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes34d775f2016-04-07 13:21:07 +12002255 m_errorMonitor->VerifyFound();
2256
Tobin Ehlisd17c28c2015-12-03 09:40:56 -07002257 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002258 // 1. Error due to not binding required set (we actually use same code as
2259 // above to disturb set0)
2260 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2261 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2262 2, &descriptorSet[0], 0, NULL);
2263 vkCmdBindDescriptorSets(
2264 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2265 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
2266 m_errorMonitor->SetDesiredFailureMsg(
2267 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2268 " uses set #0 but that set is not bound.");
Tobin Ehlisd17c28c2015-12-03 09:40:56 -07002269 Draw(1, 0, 0, 0);
Chris Forbes34d775f2016-04-07 13:21:07 +12002270 m_errorMonitor->VerifyFound();
2271
Tobin Ehlis2280f522016-01-06 08:48:41 -07002272 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002273 // 2. Error due to bound set not being compatible with PSO's
2274 // VkPipelineLayout (diff stageFlags in this case)
2275 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2276 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2277 2, &descriptorSet[0], 0, NULL);
2278 m_errorMonitor->SetDesiredFailureMsg(
2279 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2280 " bound as set #0 is not compatible with ");
Tobin Ehlisd17c28c2015-12-03 09:40:56 -07002281 Draw(1, 0, 0, 0);
Chris Forbes34d775f2016-04-07 13:21:07 +12002282 m_errorMonitor->VerifyFound();
2283
Tobin Ehliscb085292015-12-01 09:57:09 -07002284 // Remaining clean-up
2285 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002286 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehliscb085292015-12-01 09:57:09 -07002287 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
2288 }
2289 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
2290 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, descriptorSet);
2291 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis982099b2015-11-05 09:52:49 -07002292 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2293 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2294}
Tobin Ehlis982099b2015-11-05 09:52:49 -07002295
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002296TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06002297
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002298 m_errorMonitor->SetDesiredFailureMsg(
2299 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06002300 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlis254eca02015-06-25 15:46:59 -06002301
2302 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1f851912015-10-27 18:04:07 +08002303 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlis254eca02015-06-25 15:46:59 -06002304 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu1f851912015-10-27 18:04:07 +08002305 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06002306
Chris Forbes34d775f2016-04-07 13:21:07 +12002307 m_errorMonitor->VerifyFound();
Tobin Ehlis254eca02015-06-25 15:46:59 -06002308}
2309
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002310TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
2311 VkResult err;
2312 VkCommandBuffer draw_cmd;
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06002313
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002314 m_errorMonitor->SetDesiredFailureMsg(
2315 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisb51cb782015-12-16 08:19:42 -07002316 " must specify a valid renderpass parameter.");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06002317
Mark Lobodzinski90bf5b02015-08-04 16:24:20 -06002318 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski90bf5b02015-08-04 16:24:20 -06002319
Chia-I Wu1f851912015-10-27 18:04:07 +08002320 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +08002321 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northrop10d8f982015-08-04 17:35:57 -06002322 cmd.pNext = NULL;
Chia-I Wu1f851912015-10-27 18:04:07 +08002323 cmd.commandPool = m_commandPool;
2324 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07002325 cmd.commandBufferCount = 1;
Cody Northrop10d8f982015-08-04 17:35:57 -06002326
Chia-I Wu1f851912015-10-27 18:04:07 +08002327 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyan2237f522015-08-18 14:40:24 -06002328 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski90bf5b02015-08-04 16:24:20 -06002329
2330 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu1f851912015-10-27 18:04:07 +08002331 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburna4ae48b2016-01-11 13:12:43 -07002332 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu1f851912015-10-27 18:04:07 +08002333 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northrop10d8f982015-08-04 17:35:57 -06002334 cmd_buf_info.pNext = NULL;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002335 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
2336 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07002337 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinski90bf5b02015-08-04 16:24:20 -06002338
2339 // The error should be caught by validation of the BeginCommandBuffer call
2340 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
2341
Chris Forbes34d775f2016-04-07 13:21:07 +12002342 m_errorMonitor->VerifyFound();
Chia-I Wu1f851912015-10-27 18:04:07 +08002343 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinski90bf5b02015-08-04 16:24:20 -06002344}
2345
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002346TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlis4c8381e2015-12-14 13:46:38 -07002347 // Cause error due to Begin while recording CB
2348 // Then cause 2 errors for attempting to reset CB w/o having
2349 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
2350 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -07002351 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002352 "Cannot call Begin on CB");
Tobin Ehlis4c8381e2015-12-14 13:46:38 -07002353
2354 ASSERT_NO_FATAL_FAILURE(InitState());
2355
2356 // Calls AllocateCommandBuffers
2357 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
2358
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002359 // Force the failure by setting the Renderpass and Framebuffer fields with
2360 // (fake) data
Tobin Ehlis4c8381e2015-12-14 13:46:38 -07002361 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburna4ae48b2016-01-11 13:12:43 -07002362 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis4c8381e2015-12-14 13:46:38 -07002363 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2364 cmd_buf_info.pNext = NULL;
2365 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07002366 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlis4c8381e2015-12-14 13:46:38 -07002367
2368 // Begin CB to transition to recording state
2369 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
2370 // Can't re-begin. This should trigger error
2371 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes34d775f2016-04-07 13:21:07 +12002372 m_errorMonitor->VerifyFound();
2373
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2375 "Attempt to reset command buffer ");
Tobin Ehlis4c8381e2015-12-14 13:46:38 -07002376 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
2377 // Reset attempt will trigger error due to incorrect CommandPool state
2378 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes34d775f2016-04-07 13:21:07 +12002379 m_errorMonitor->VerifyFound();
2380
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002381 m_errorMonitor->SetDesiredFailureMsg(
2382 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2383 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlis4c8381e2015-12-14 13:46:38 -07002384 // Transition CB to RECORDED state
2385 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
2386 // Now attempting to Begin will implicitly reset, which triggers error
2387 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes34d775f2016-04-07 13:21:07 +12002388 m_errorMonitor->VerifyFound();
Tobin Ehlis4c8381e2015-12-14 13:46:38 -07002389}
2390
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002391TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlis254eca02015-06-25 15:46:59 -06002392 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002393 VkResult err;
Tobin Ehlis254eca02015-06-25 15:46:59 -06002394
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002395 m_errorMonitor->SetDesiredFailureMsg(
2396 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06002397 "Invalid Pipeline CreateInfo State: Vtx Shader required");
2398
Tobin Ehlis254eca02015-06-25 15:46:59 -06002399 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisf2f97402015-09-11 12:57:55 -06002400 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06002401
Chia-I Wuc51b1212015-10-27 19:25:11 +08002402 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002403 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2404 ds_type_count.descriptorCount = 1;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06002405
2406 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002407 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2408 ds_pool_ci.pNext = NULL;
2409 ds_pool_ci.maxSets = 1;
2410 ds_pool_ci.poolSizeCount = 1;
2411 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06002412
Tobin Ehlis254eca02015-06-25 15:46:59 -06002413 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002414 err =
2415 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis254eca02015-06-25 15:46:59 -06002416 ASSERT_VK_SUCCESS(err);
2417
Tony Barbourefbe9ca2015-07-15 12:50:33 -06002418 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002419 dsl_binding.binding = 0;
2420 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2421 dsl_binding.descriptorCount = 1;
2422 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2423 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis254eca02015-06-25 15:46:59 -06002424
Tony Barbourefbe9ca2015-07-15 12:50:33 -06002425 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002426 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2427 ds_layout_ci.pNext = NULL;
2428 ds_layout_ci.bindingCount = 1;
2429 ds_layout_ci.pBindings = &dsl_binding;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06002430
Tobin Ehlis254eca02015-06-25 15:46:59 -06002431 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002432 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2433 &ds_layout);
Tobin Ehlis254eca02015-06-25 15:46:59 -06002434 ASSERT_VK_SUCCESS(err);
2435
2436 VkDescriptorSet descriptorSet;
Chia-I Wu1f851912015-10-27 18:04:07 +08002437 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +08002438 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07002439 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06002440 alloc_info.descriptorPool = ds_pool;
2441 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002442 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2443 &descriptorSet);
Tobin Ehlis254eca02015-06-25 15:46:59 -06002444 ASSERT_VK_SUCCESS(err);
2445
Tony Barbourefbe9ca2015-07-15 12:50:33 -06002446 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002447 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2448 pipeline_layout_ci.setLayoutCount = 1;
2449 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis254eca02015-06-25 15:46:59 -06002450
2451 VkPipelineLayout pipeline_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002452 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2453 &pipeline_layout);
Tobin Ehlis254eca02015-06-25 15:46:59 -06002454 ASSERT_VK_SUCCESS(err);
2455
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002456 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002457 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002458
2459 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002460 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
2461 vp_state_ci.scissorCount = 1;
2462 vp_state_ci.pScissors = &sc;
2463 vp_state_ci.viewportCount = 1;
2464 vp_state_ci.pViewports = &vp;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002465
Karl Schultzfc86ab72016-03-08 10:30:21 -07002466 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
2467 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
2468 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
2469 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
2470 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
2471 rs_state_ci.depthClampEnable = VK_FALSE;
2472 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
2473 rs_state_ci.depthBiasEnable = VK_FALSE;
2474
Tony Barbourefbe9ca2015-07-15 12:50:33 -06002475 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002476 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2477 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzfc86ab72016-03-08 10:30:21 -07002478 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002479 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2480 gp_ci.layout = pipeline_layout;
2481 gp_ci.renderPass = renderPass();
Tony Barbourefbe9ca2015-07-15 12:50:33 -06002482
2483 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002484 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2485 pc_ci.initialDataSize = 0;
2486 pc_ci.pInitialData = 0;
Tobin Ehlis254eca02015-06-25 15:46:59 -06002487
2488 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06002489 VkPipelineCache pipelineCache;
2490
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002491 err =
2492 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburn0d60d272015-07-09 15:02:25 -06002493 ASSERT_VK_SUCCESS(err);
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002494 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2495 &gp_ci, NULL, &pipeline);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06002496
Chris Forbes34d775f2016-04-07 13:21:07 +12002497 m_errorMonitor->VerifyFound();
Mike Stroyan2237f522015-08-18 14:40:24 -06002498
Chia-I Wu69f40122015-10-26 21:10:41 +08002499 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2500 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2501 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2502 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis254eca02015-06-25 15:46:59 -06002503}
Tobin Ehlis20693172015-09-17 08:46:18 -06002504/*// TODO : This test should be good, but needs Tess support in compiler to run
2505TEST_F(VkLayerTest, InvalidPatchControlPoints)
2506{
2507 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis20693172015-09-17 08:46:18 -06002508 VkResult err;
Tobin Ehlis254eca02015-06-25 15:46:59 -06002509
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -07002510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002511 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
2512primitive ");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06002513
Tobin Ehlis20693172015-09-17 08:46:18 -06002514 ASSERT_NO_FATAL_FAILURE(InitState());
2515 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis20693172015-09-17 08:46:18 -06002516
Chia-I Wuc51b1212015-10-27 19:25:11 +08002517 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis20693172015-09-17 08:46:18 -06002518 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu763a7492015-10-26 20:48:51 +08002519 ds_type_count.descriptorCount = 1;
Tobin Ehlis20693172015-09-17 08:46:18 -06002520
2521 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2522 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2523 ds_pool_ci.pNext = NULL;
Chia-I Wuc51b1212015-10-27 19:25:11 +08002524 ds_pool_ci.poolSizeCount = 1;
2525 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis20693172015-09-17 08:46:18 -06002526
2527 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002528 err = vkCreateDescriptorPool(m_device->device(),
2529VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis20693172015-09-17 08:46:18 -06002530 ASSERT_VK_SUCCESS(err);
2531
2532 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wub5689ee2015-10-31 00:31:16 +08002533 dsl_binding.binding = 0;
Tobin Ehlis20693172015-09-17 08:46:18 -06002534 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu045654f2015-11-06 06:42:02 +08002535 dsl_binding.descriptorCount = 1;
Tobin Ehlis20693172015-09-17 08:46:18 -06002536 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2537 dsl_binding.pImmutableSamplers = NULL;
2538
2539 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002540 ds_layout_ci.sType =
2541VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis20693172015-09-17 08:46:18 -06002542 ds_layout_ci.pNext = NULL;
Chia-I Wu763a7492015-10-26 20:48:51 +08002543 ds_layout_ci.bindingCount = 1;
Jon Ashburnadb61352015-12-30 18:01:16 -07002544 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis20693172015-09-17 08:46:18 -06002545
2546 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002547 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2548&ds_layout);
Tobin Ehlis20693172015-09-17 08:46:18 -06002549 ASSERT_VK_SUCCESS(err);
2550
2551 VkDescriptorSet descriptorSet;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002552 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
2553VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis20693172015-09-17 08:46:18 -06002554 ASSERT_VK_SUCCESS(err);
2555
2556 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002557 pipeline_layout_ci.sType =
2558VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis20693172015-09-17 08:46:18 -06002559 pipeline_layout_ci.pNext = NULL;
Chia-I Wu763a7492015-10-26 20:48:51 +08002560 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis20693172015-09-17 08:46:18 -06002561 pipeline_layout_ci.pSetLayouts = &ds_layout;
2562
2563 VkPipelineLayout pipeline_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002564 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2565&pipeline_layout);
Tobin Ehlis20693172015-09-17 08:46:18 -06002566 ASSERT_VK_SUCCESS(err);
2567
2568 VkPipelineShaderStageCreateInfo shaderStages[3];
2569 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
2570
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002571 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
2572this);
Tobin Ehlis20693172015-09-17 08:46:18 -06002573 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002574 VkShaderObj
2575tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
2576this);
2577 VkShaderObj
2578te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
2579this);
Tobin Ehlis20693172015-09-17 08:46:18 -06002580
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002581 shaderStages[0].sType =
2582VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06002583 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis20693172015-09-17 08:46:18 -06002584 shaderStages[0].shader = vs.handle();
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002585 shaderStages[1].sType =
2586VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06002587 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis20693172015-09-17 08:46:18 -06002588 shaderStages[1].shader = tc.handle();
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002589 shaderStages[2].sType =
2590VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06002591 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis20693172015-09-17 08:46:18 -06002592 shaderStages[2].shader = te.handle();
2593
2594 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002595 iaCI.sType =
2596VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu99ba2bb2015-10-31 00:31:16 +08002597 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis20693172015-09-17 08:46:18 -06002598
2599 VkPipelineTessellationStateCreateInfo tsCI = {};
2600 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
2601 tsCI.patchControlPoints = 0; // This will cause an error
2602
2603 VkGraphicsPipelineCreateInfo gp_ci = {};
2604 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2605 gp_ci.pNext = NULL;
2606 gp_ci.stageCount = 3;
2607 gp_ci.pStages = shaderStages;
2608 gp_ci.pVertexInputState = NULL;
2609 gp_ci.pInputAssemblyState = &iaCI;
2610 gp_ci.pTessellationState = &tsCI;
2611 gp_ci.pViewportState = NULL;
Chia-I Wu1f851912015-10-27 18:04:07 +08002612 gp_ci.pRasterizationState = NULL;
Tobin Ehlis20693172015-09-17 08:46:18 -06002613 gp_ci.pMultisampleState = NULL;
2614 gp_ci.pDepthStencilState = NULL;
2615 gp_ci.pColorBlendState = NULL;
2616 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2617 gp_ci.layout = pipeline_layout;
2618 gp_ci.renderPass = renderPass();
2619
2620 VkPipelineCacheCreateInfo pc_ci = {};
2621 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2622 pc_ci.pNext = NULL;
2623 pc_ci.initialSize = 0;
2624 pc_ci.initialData = 0;
2625 pc_ci.maxSize = 0;
2626
2627 VkPipeline pipeline;
2628 VkPipelineCache pipelineCache;
2629
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002630 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
2631&pipelineCache);
Tobin Ehlis20693172015-09-17 08:46:18 -06002632 ASSERT_VK_SUCCESS(err);
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002633 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2634&gp_ci, NULL, &pipeline);
Tobin Ehlis20693172015-09-17 08:46:18 -06002635
Chris Forbes34d775f2016-04-07 13:21:07 +12002636 m_errorMonitor->VerifyFound();
Mike Stroyan2237f522015-08-18 14:40:24 -06002637
Chia-I Wu69f40122015-10-26 21:10:41 +08002638 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2639 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2640 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2641 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis20693172015-09-17 08:46:18 -06002642}
2643*/
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002644// Set scissor and viewport counts to different numbers
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002645TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002646 VkResult err;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002647
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002648 m_errorMonitor->SetDesiredFailureMsg(
2649 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06002650 "Gfx Pipeline viewport count (1) must match scissor count (0).");
2651
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002652 ASSERT_NO_FATAL_FAILURE(InitState());
2653 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002654
Chia-I Wuc51b1212015-10-27 19:25:11 +08002655 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002656 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2657 ds_type_count.descriptorCount = 1;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002658
2659 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002660 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2661 ds_pool_ci.maxSets = 1;
2662 ds_pool_ci.poolSizeCount = 1;
2663 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002664
2665 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002666 err =
2667 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002668 ASSERT_VK_SUCCESS(err);
2669
2670 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002671 dsl_binding.binding = 0;
2672 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2673 dsl_binding.descriptorCount = 1;
2674 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002675
2676 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002677 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2678 ds_layout_ci.bindingCount = 1;
2679 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002680
2681 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002682 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2683 &ds_layout);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002684 ASSERT_VK_SUCCESS(err);
2685
2686 VkDescriptorSet descriptorSet;
Chia-I Wu1f851912015-10-27 18:04:07 +08002687 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +08002688 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07002689 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06002690 alloc_info.descriptorPool = ds_pool;
2691 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002692 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2693 &descriptorSet);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002694 ASSERT_VK_SUCCESS(err);
2695
2696 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002697 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2698 pipeline_layout_ci.setLayoutCount = 1;
2699 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002700
2701 VkPipelineLayout pipeline_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002702 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2703 &pipeline_layout);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002704 ASSERT_VK_SUCCESS(err);
2705
2706 VkViewport vp = {}; // Just need dummy vp to point to
2707
2708 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002709 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
2710 vp_state_ci.scissorCount = 0;
2711 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
2712 vp_state_ci.pViewports = &vp;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002713
Karl Schultzfc86ab72016-03-08 10:30:21 -07002714 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
2715 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
2716 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
2717 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
2718 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
2719 rs_state_ci.depthClampEnable = VK_FALSE;
2720 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
2721 rs_state_ci.depthBiasEnable = VK_FALSE;
2722
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002723 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002724 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002725
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002726 VkShaderObj vs(m_device, bindStateVertShaderText,
2727 VK_SHADER_STAGE_VERTEX_BIT, this);
2728 VkShaderObj fs(m_device, bindStateFragShaderText,
2729 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultz772fcd12016-04-19 11:36:49 -06002730 this); // We shouldn't need a fragment shader
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002731 // but add it to be able to run on more devices
Chia-I Wu062ad152015-10-31 00:31:16 +08002732 shaderStages[0] = vs.GetStageCreateInfo();
2733 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002734
2735 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002736 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2737 gp_ci.stageCount = 2;
2738 gp_ci.pStages = shaderStages;
2739 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzfc86ab72016-03-08 10:30:21 -07002740 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002741 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2742 gp_ci.layout = pipeline_layout;
2743 gp_ci.renderPass = renderPass();
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002744
2745 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002746 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002747
2748 VkPipeline pipeline;
2749 VkPipelineCache pipelineCache;
2750
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002751 err =
2752 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002753 ASSERT_VK_SUCCESS(err);
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002754 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2755 &gp_ci, NULL, &pipeline);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002756
Chris Forbes34d775f2016-04-07 13:21:07 +12002757 m_errorMonitor->VerifyFound();
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002758
Chia-I Wu69f40122015-10-26 21:10:41 +08002759 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2760 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2761 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2762 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002763}
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002764// Don't set viewport state in PSO. This is an error b/c we always need this
2765// state
Tobin Ehlisa88e2f52015-10-02 11:00:56 -06002766// for the counts even if the data is going to be set dynamically.
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002767TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002768 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002769 VkResult err;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002770
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002771 m_errorMonitor->SetDesiredFailureMsg(
2772 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06002773 "Gfx Pipeline pViewportState is null. Even if ");
2774
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002775 ASSERT_NO_FATAL_FAILURE(InitState());
2776 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002777
Chia-I Wuc51b1212015-10-27 19:25:11 +08002778 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002779 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2780 ds_type_count.descriptorCount = 1;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002781
2782 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002783 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2784 ds_pool_ci.maxSets = 1;
2785 ds_pool_ci.poolSizeCount = 1;
2786 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002787
2788 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002789 err =
2790 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002791 ASSERT_VK_SUCCESS(err);
2792
2793 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002794 dsl_binding.binding = 0;
2795 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2796 dsl_binding.descriptorCount = 1;
2797 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002798
2799 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002800 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2801 ds_layout_ci.bindingCount = 1;
2802 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002803
2804 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002805 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2806 &ds_layout);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002807 ASSERT_VK_SUCCESS(err);
2808
2809 VkDescriptorSet descriptorSet;
Chia-I Wu1f851912015-10-27 18:04:07 +08002810 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +08002811 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07002812 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06002813 alloc_info.descriptorPool = ds_pool;
2814 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002815 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2816 &descriptorSet);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002817 ASSERT_VK_SUCCESS(err);
2818
2819 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002820 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2821 pipeline_layout_ci.setLayoutCount = 1;
2822 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002823
2824 VkPipelineLayout pipeline_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002825 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2826 &pipeline_layout);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002827 ASSERT_VK_SUCCESS(err);
2828
2829 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
2830 // Set scissor as dynamic to avoid second error
2831 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002832 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
2833 dyn_state_ci.dynamicStateCount = 1;
2834 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002835
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002836 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002837 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002838
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002839 VkShaderObj vs(m_device, bindStateVertShaderText,
2840 VK_SHADER_STAGE_VERTEX_BIT, this);
2841 VkShaderObj fs(m_device, bindStateFragShaderText,
2842 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultz772fcd12016-04-19 11:36:49 -06002843 this); // We shouldn't need a fragment shader
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002844 // but add it to be able to run on more devices
Chia-I Wu062ad152015-10-31 00:31:16 +08002845 shaderStages[0] = vs.GetStageCreateInfo();
2846 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002847
Karl Schultzfc86ab72016-03-08 10:30:21 -07002848
2849 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
2850 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
2851 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
2852 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
2853 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
2854 rs_state_ci.depthClampEnable = VK_FALSE;
2855 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
2856 rs_state_ci.depthBiasEnable = VK_FALSE;
2857
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002858 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002859 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2860 gp_ci.stageCount = 2;
2861 gp_ci.pStages = shaderStages;
Karl Schultzfc86ab72016-03-08 10:30:21 -07002862 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002863 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
2864 // should cause validation error
2865 gp_ci.pDynamicState = &dyn_state_ci;
2866 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2867 gp_ci.layout = pipeline_layout;
2868 gp_ci.renderPass = renderPass();
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002869
2870 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002871 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002872
2873 VkPipeline pipeline;
2874 VkPipelineCache pipelineCache;
2875
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002876 err =
2877 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002878 ASSERT_VK_SUCCESS(err);
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002879 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2880 &gp_ci, NULL, &pipeline);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002881
Chris Forbes34d775f2016-04-07 13:21:07 +12002882 m_errorMonitor->VerifyFound();
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002883
Chia-I Wu69f40122015-10-26 21:10:41 +08002884 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2885 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2886 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2887 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002888}
2889// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002890// Then run second test where dynamic scissor count doesn't match PSO scissor
2891// count
2892TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
2893 VkResult err;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002894
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002895 m_errorMonitor->SetDesiredFailureMsg(
2896 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06002897 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
2898
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002899 ASSERT_NO_FATAL_FAILURE(InitState());
2900 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002901
Chia-I Wuc51b1212015-10-27 19:25:11 +08002902 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002903 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2904 ds_type_count.descriptorCount = 1;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002905
2906 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002907 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2908 ds_pool_ci.maxSets = 1;
2909 ds_pool_ci.poolSizeCount = 1;
2910 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002911
2912 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002913 err =
2914 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002915 ASSERT_VK_SUCCESS(err);
2916
2917 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002918 dsl_binding.binding = 0;
2919 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2920 dsl_binding.descriptorCount = 1;
2921 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002922
2923 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002924 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2925 ds_layout_ci.bindingCount = 1;
2926 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002927
2928 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002929 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2930 &ds_layout);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002931 ASSERT_VK_SUCCESS(err);
2932
2933 VkDescriptorSet descriptorSet;
Chia-I Wu1f851912015-10-27 18:04:07 +08002934 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +08002935 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07002936 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06002937 alloc_info.descriptorPool = ds_pool;
2938 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002939 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2940 &descriptorSet);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002941 ASSERT_VK_SUCCESS(err);
2942
2943 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002944 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2945 pipeline_layout_ci.setLayoutCount = 1;
2946 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002947
2948 VkPipelineLayout pipeline_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002949 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2950 &pipeline_layout);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002951 ASSERT_VK_SUCCESS(err);
2952
2953 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002954 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
2955 vp_state_ci.viewportCount = 1;
2956 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
2957 vp_state_ci.scissorCount = 1;
2958 vp_state_ci.pScissors =
2959 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002960
2961 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
2962 // Set scissor as dynamic to avoid that error
2963 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002964 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
2965 dyn_state_ci.dynamicStateCount = 1;
2966 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002967
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002968 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002969 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002970
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002971 VkShaderObj vs(m_device, bindStateVertShaderText,
2972 VK_SHADER_STAGE_VERTEX_BIT, this);
2973 VkShaderObj fs(m_device, bindStateFragShaderText,
2974 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultz772fcd12016-04-19 11:36:49 -06002975 this); // We shouldn't need a fragment shader
Karl Schultz99e9d1d2016-02-02 17:17:23 -07002976 // but add it to be able to run on more devices
Chia-I Wu062ad152015-10-31 00:31:16 +08002977 shaderStages[0] = vs.GetStageCreateInfo();
2978 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002979
Cody Northrop42cbe3b2015-10-06 10:33:21 -06002980 VkPipelineVertexInputStateCreateInfo vi_ci = {};
2981 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
2982 vi_ci.pNext = nullptr;
Chia-I Wu763a7492015-10-26 20:48:51 +08002983 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northrop42cbe3b2015-10-06 10:33:21 -06002984 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wu763a7492015-10-26 20:48:51 +08002985 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northrop42cbe3b2015-10-06 10:33:21 -06002986 vi_ci.pVertexAttributeDescriptions = nullptr;
2987
2988 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
2989 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
2990 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
2991
Chia-I Wu1f851912015-10-27 18:04:07 +08002992 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wuc51b1212015-10-27 19:25:11 +08002993 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northrop42cbe3b2015-10-06 10:33:21 -06002994 rs_ci.pNext = nullptr;
2995
Mark Young0292df52016-03-31 16:03:20 -06002996 VkPipelineColorBlendAttachmentState att = {};
2997 att.blendEnable = VK_FALSE;
2998 att.colorWriteMask = 0xf;
2999
Cody Northrop42cbe3b2015-10-06 10:33:21 -06003000 VkPipelineColorBlendStateCreateInfo cb_ci = {};
3001 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
3002 cb_ci.pNext = nullptr;
Mark Young0292df52016-03-31 16:03:20 -06003003 cb_ci.attachmentCount = 1;
3004 cb_ci.pAttachments = &att;
Cody Northrop42cbe3b2015-10-06 10:33:21 -06003005
Tobin Ehlis9e839e52015-10-01 11:15:13 -06003006 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003007 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3008 gp_ci.stageCount = 2;
3009 gp_ci.pStages = shaderStages;
3010 gp_ci.pVertexInputState = &vi_ci;
3011 gp_ci.pInputAssemblyState = &ia_ci;
3012 gp_ci.pViewportState = &vp_state_ci;
3013 gp_ci.pRasterizationState = &rs_ci;
3014 gp_ci.pColorBlendState = &cb_ci;
3015 gp_ci.pDynamicState = &dyn_state_ci;
3016 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3017 gp_ci.layout = pipeline_layout;
3018 gp_ci.renderPass = renderPass();
Tobin Ehlis9e839e52015-10-01 11:15:13 -06003019
3020 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003021 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06003022
3023 VkPipeline pipeline;
3024 VkPipelineCache pipelineCache;
3025
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003026 err =
3027 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06003028 ASSERT_VK_SUCCESS(err);
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003029 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3030 &gp_ci, NULL, &pipeline);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06003031
Chris Forbes34d775f2016-04-07 13:21:07 +12003032 m_errorMonitor->VerifyFound();
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06003033
Tobin Ehlisa88e2f52015-10-02 11:00:56 -06003034 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003035 // First need to successfully create the PSO from above by setting
3036 // pViewports
3037 m_errorMonitor->SetDesiredFailureMsg(
3038 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3039 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
3040 "scissorCount is 1. These counts must match.");
3041
3042 VkViewport vp = {}; // Just need dummy vp to point to
3043 vp_state_ci.pViewports = &vp;
3044 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3045 &gp_ci, NULL, &pipeline);
3046 ASSERT_VK_SUCCESS(err);
3047 BeginCommandBuffer();
3048 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3049 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
3050 VkRect2D scissors[2] = {}; // don't care about data
3051 // Count of 2 doesn't match PSO count of 1
3052 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
3053 Draw(1, 0, 0, 0);
3054
Chris Forbes34d775f2016-04-07 13:21:07 +12003055 m_errorMonitor->VerifyFound();
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003056
3057 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3058 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3059 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3060 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3061}
3062// Create PSO w/o non-zero scissorCount but no scissor data
3063// Then run second test where dynamic viewportCount doesn't match PSO
3064// viewportCount
3065TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
3066 VkResult err;
3067
3068 m_errorMonitor->SetDesiredFailureMsg(
3069 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3070 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
3071
3072 ASSERT_NO_FATAL_FAILURE(InitState());
3073 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3074
3075 VkDescriptorPoolSize ds_type_count = {};
3076 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3077 ds_type_count.descriptorCount = 1;
3078
3079 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3080 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3081 ds_pool_ci.maxSets = 1;
3082 ds_pool_ci.poolSizeCount = 1;
3083 ds_pool_ci.pPoolSizes = &ds_type_count;
3084
3085 VkDescriptorPool ds_pool;
3086 err =
3087 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
3088 ASSERT_VK_SUCCESS(err);
3089
3090 VkDescriptorSetLayoutBinding dsl_binding = {};
3091 dsl_binding.binding = 0;
3092 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3093 dsl_binding.descriptorCount = 1;
3094 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3095
3096 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3097 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3098 ds_layout_ci.bindingCount = 1;
3099 ds_layout_ci.pBindings = &dsl_binding;
3100
3101 VkDescriptorSetLayout ds_layout;
3102 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3103 &ds_layout);
3104 ASSERT_VK_SUCCESS(err);
3105
3106 VkDescriptorSet descriptorSet;
3107 VkDescriptorSetAllocateInfo alloc_info = {};
3108 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3109 alloc_info.descriptorSetCount = 1;
3110 alloc_info.descriptorPool = ds_pool;
3111 alloc_info.pSetLayouts = &ds_layout;
3112 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3113 &descriptorSet);
3114 ASSERT_VK_SUCCESS(err);
3115
3116 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3117 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3118 pipeline_layout_ci.setLayoutCount = 1;
3119 pipeline_layout_ci.pSetLayouts = &ds_layout;
3120
3121 VkPipelineLayout pipeline_layout;
3122 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3123 &pipeline_layout);
3124 ASSERT_VK_SUCCESS(err);
3125
3126 VkPipelineViewportStateCreateInfo vp_state_ci = {};
3127 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3128 vp_state_ci.scissorCount = 1;
3129 vp_state_ci.pScissors =
3130 NULL; // Null scissor w/ count of 1 should cause error
3131 vp_state_ci.viewportCount = 1;
3132 vp_state_ci.pViewports =
3133 NULL; // vp is dynamic (below) so this won't cause error
3134
3135 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
3136 // Set scissor as dynamic to avoid that error
3137 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
3138 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3139 dyn_state_ci.dynamicStateCount = 1;
3140 dyn_state_ci.pDynamicStates = &vp_state;
3141
3142 VkPipelineShaderStageCreateInfo shaderStages[2];
3143 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
3144
3145 VkShaderObj vs(m_device, bindStateVertShaderText,
3146 VK_SHADER_STAGE_VERTEX_BIT, this);
3147 VkShaderObj fs(m_device, bindStateFragShaderText,
3148 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultz772fcd12016-04-19 11:36:49 -06003149 this); // We shouldn't need a fragment shader
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003150 // but add it to be able to run on more devices
3151 shaderStages[0] = vs.GetStageCreateInfo();
3152 shaderStages[1] = fs.GetStageCreateInfo();
3153
3154 VkPipelineVertexInputStateCreateInfo vi_ci = {};
3155 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
3156 vi_ci.pNext = nullptr;
3157 vi_ci.vertexBindingDescriptionCount = 0;
3158 vi_ci.pVertexBindingDescriptions = nullptr;
3159 vi_ci.vertexAttributeDescriptionCount = 0;
3160 vi_ci.pVertexAttributeDescriptions = nullptr;
3161
3162 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
3163 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
3164 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
3165
3166 VkPipelineRasterizationStateCreateInfo rs_ci = {};
3167 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3168 rs_ci.pNext = nullptr;
3169
Mark Young0292df52016-03-31 16:03:20 -06003170 VkPipelineColorBlendAttachmentState att = {};
3171 att.blendEnable = VK_FALSE;
3172 att.colorWriteMask = 0xf;
3173
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003174 VkPipelineColorBlendStateCreateInfo cb_ci = {};
3175 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
3176 cb_ci.pNext = nullptr;
Mark Young0292df52016-03-31 16:03:20 -06003177 cb_ci.attachmentCount = 1;
3178 cb_ci.pAttachments = &att;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003179
3180 VkGraphicsPipelineCreateInfo gp_ci = {};
3181 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3182 gp_ci.stageCount = 2;
3183 gp_ci.pStages = shaderStages;
3184 gp_ci.pVertexInputState = &vi_ci;
3185 gp_ci.pInputAssemblyState = &ia_ci;
3186 gp_ci.pViewportState = &vp_state_ci;
3187 gp_ci.pRasterizationState = &rs_ci;
3188 gp_ci.pColorBlendState = &cb_ci;
3189 gp_ci.pDynamicState = &dyn_state_ci;
3190 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3191 gp_ci.layout = pipeline_layout;
3192 gp_ci.renderPass = renderPass();
3193
3194 VkPipelineCacheCreateInfo pc_ci = {};
3195 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3196
3197 VkPipeline pipeline;
3198 VkPipelineCache pipelineCache;
3199
3200 err =
3201 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
3202 ASSERT_VK_SUCCESS(err);
3203 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3204 &gp_ci, NULL, &pipeline);
3205
Chris Forbes34d775f2016-04-07 13:21:07 +12003206 m_errorMonitor->VerifyFound();
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003207
3208 // Now hit second fail case where we set scissor w/ different count than PSO
3209 // First need to successfully create the PSO from above by setting
3210 // pViewports
3211 m_errorMonitor->SetDesiredFailureMsg(
3212 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3213 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
3214 "viewportCount is 1. These counts must match.");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06003215
Tobin Ehlisa88e2f52015-10-02 11:00:56 -06003216 VkRect2D sc = {}; // Just need dummy vp to point to
3217 vp_state_ci.pScissors = &sc;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003218 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3219 &gp_ci, NULL, &pipeline);
Tobin Ehlisa88e2f52015-10-02 11:00:56 -06003220 ASSERT_VK_SUCCESS(err);
3221 BeginCommandBuffer();
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003222 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3223 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisa88e2f52015-10-02 11:00:56 -06003224 VkViewport viewports[2] = {}; // don't care about data
3225 // Count of 2 doesn't match PSO count of 1
Jon Ashburnf2516522015-12-30 14:06:55 -07003226 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisa88e2f52015-10-02 11:00:56 -06003227 Draw(1, 0, 0, 0);
3228
Chris Forbes34d775f2016-04-07 13:21:07 +12003229 m_errorMonitor->VerifyFound();
Tobin Ehlis9e839e52015-10-01 11:15:13 -06003230
Chia-I Wu69f40122015-10-26 21:10:41 +08003231 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3232 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3233 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3234 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06003235}
3236
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003237TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06003238 // Bind a NULL RenderPass
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003239 m_errorMonitor->SetDesiredFailureMsg(
3240 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06003241 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06003242
3243 ASSERT_NO_FATAL_FAILURE(InitState());
3244 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06003245
Tony Barbour1490c912015-07-28 10:17:20 -06003246 BeginCommandBuffer();
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003247 // Don't care about RenderPass handle b/c error should be flagged before
3248 // that
3249 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
3250 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06003251
Chris Forbes34d775f2016-04-07 13:21:07 +12003252 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06003253}
3254
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003255TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlis254eca02015-06-25 15:46:59 -06003256 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003257 m_errorMonitor->SetDesiredFailureMsg(
3258 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06003259 "It is invalid to issue this call inside an active render pass");
Tobin Ehlis254eca02015-06-25 15:46:59 -06003260
3261 ASSERT_NO_FATAL_FAILURE(InitState());
3262 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis254eca02015-06-25 15:46:59 -06003263
Tony Barbour1490c912015-07-28 10:17:20 -06003264 BeginCommandBuffer();
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003265 // Just create a dummy Renderpass that's non-NULL so we can get to the
3266 // proper error
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003267 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003268 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
3269 rp_begin.pNext = NULL;
3270 rp_begin.renderPass = renderPass();
3271 rp_begin.framebuffer = framebuffer();
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06003272
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003273 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
3274 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis254eca02015-06-25 15:46:59 -06003275
Chris Forbes34d775f2016-04-07 13:21:07 +12003276 m_errorMonitor->VerifyFound();
Tobin Ehlis138b7f12015-05-22 12:38:55 -06003277}
3278
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003279TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003280 // Call CmdFillBuffer within an active renderpass
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003281 m_errorMonitor->SetDesiredFailureMsg(
3282 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06003283 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003284
3285 ASSERT_NO_FATAL_FAILURE(InitState());
3286 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003287
3288 // Renderpass is started here
3289 BeginCommandBuffer();
3290
3291 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu1f851912015-10-27 18:04:07 +08003292 vk_testing::Buffer dstBuffer;
3293 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003294
Chia-I Wu1f851912015-10-27 18:04:07 +08003295 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003296
Chris Forbes34d775f2016-04-07 13:21:07 +12003297 m_errorMonitor->VerifyFound();
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003298}
3299
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003300TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003301 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003302 m_errorMonitor->SetDesiredFailureMsg(
3303 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06003304 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003305
3306 ASSERT_NO_FATAL_FAILURE(InitState());
3307 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003308
3309 // Renderpass is started here
3310 BeginCommandBuffer();
3311
3312 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu1f851912015-10-27 18:04:07 +08003313 vk_testing::Buffer dstBuffer;
3314 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003315
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003316 VkDeviceSize dstOffset = 0;
3317 VkDeviceSize dataSize = 1024;
3318 const uint32_t *pData = NULL;
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003319
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003320 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
3321 dstOffset, dataSize, pData);
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003322
Chris Forbes34d775f2016-04-07 13:21:07 +12003323 m_errorMonitor->VerifyFound();
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003324}
3325
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003326TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003327 // Call CmdClearColorImage within an active RenderPass
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003328 m_errorMonitor->SetDesiredFailureMsg(
3329 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06003330 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003331
3332 ASSERT_NO_FATAL_FAILURE(InitState());
3333 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003334
3335 // Renderpass is started here
3336 BeginCommandBuffer();
3337
Michael Lentine584ccab2016-02-03 16:51:46 -06003338 VkClearColorValue clear_color;
3339 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003340 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
3341 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3342 const int32_t tex_width = 32;
3343 const int32_t tex_height = 32;
3344 VkImageCreateInfo image_create_info = {};
3345 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3346 image_create_info.pNext = NULL;
3347 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3348 image_create_info.format = tex_format;
3349 image_create_info.extent.width = tex_width;
3350 image_create_info.extent.height = tex_height;
3351 image_create_info.extent.depth = 1;
3352 image_create_info.mipLevels = 1;
3353 image_create_info.arrayLayers = 1;
3354 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3355 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3356 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003357
Chia-I Wu1f851912015-10-27 18:04:07 +08003358 vk_testing::Image dstImage;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003359 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
3360 reqs);
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003361
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003362 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
3363 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003364
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003365 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
3366 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003367
Chris Forbes34d775f2016-04-07 13:21:07 +12003368 m_errorMonitor->VerifyFound();
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003369}
3370
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003371TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003372 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003373 m_errorMonitor->SetDesiredFailureMsg(
3374 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06003375 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003376
3377 ASSERT_NO_FATAL_FAILURE(InitState());
3378 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003379
3380 // Renderpass is started here
3381 BeginCommandBuffer();
3382
3383 VkClearDepthStencilValue clear_value = {0};
Dustin Graves4bf3f202016-02-11 18:28:06 -07003384 VkMemoryPropertyFlags reqs = 0;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003385 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
3386 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3387 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
3388 image_create_info.extent.width = 64;
3389 image_create_info.extent.height = 64;
3390 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3391 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003392
Chia-I Wu1f851912015-10-27 18:04:07 +08003393 vk_testing::Image dstImage;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003394 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
3395 reqs);
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003396
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003397 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
3398 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003399
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003400 vkCmdClearDepthStencilImage(
3401 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
3402 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
3403 &range);
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003404
Chris Forbes34d775f2016-04-07 13:21:07 +12003405 m_errorMonitor->VerifyFound();
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003406}
3407
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003408TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchter9feb0732015-10-15 16:51:05 -06003409 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003410 VkResult err;
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003411
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -07003412 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003413 "vkCmdClearAttachments: This call "
3414 "must be issued inside an active "
3415 "render pass");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06003416
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003417 ASSERT_NO_FATAL_FAILURE(InitState());
3418 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003419
3420 // Start no RenderPass
Chia-I Wu1f851912015-10-27 18:04:07 +08003421 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003422 ASSERT_VK_SUCCESS(err);
3423
Courtney Goeltzenleuchter9feb0732015-10-15 16:51:05 -06003424 VkClearAttachment color_attachment;
3425 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3426 color_attachment.clearValue.color.float32[0] = 0;
3427 color_attachment.clearValue.color.float32[1] = 0;
3428 color_attachment.clearValue.color.float32[2] = 0;
3429 color_attachment.clearValue.color.float32[3] = 0;
3430 color_attachment.colorAttachment = 0;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003431 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
3432 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
3433 &color_attachment, 1, &clear_rect);
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003434
Chris Forbes34d775f2016-04-07 13:21:07 +12003435 m_errorMonitor->VerifyFound();
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06003436}
3437
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003438TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlis8d199e52015-09-17 12:24:13 -06003439 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003440 VkResult err;
Tobin Ehlis8d199e52015-09-17 12:24:13 -06003441
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003442 m_errorMonitor->SetDesiredFailureMsg(
3443 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06003444 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
3445
Tobin Ehlis8d199e52015-09-17 12:24:13 -06003446 ASSERT_NO_FATAL_FAILURE(InitState());
3447 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis8d199e52015-09-17 12:24:13 -06003448 uint32_t qfi = 0;
3449 VkBufferCreateInfo buffCI = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003450 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3451 buffCI.size = 1024;
3452 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
3453 buffCI.queueFamilyIndexCount = 1;
3454 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis8d199e52015-09-17 12:24:13 -06003455
3456 VkBuffer ib;
Chia-I Wu69f40122015-10-26 21:10:41 +08003457 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlis8d199e52015-09-17 12:24:13 -06003458 ASSERT_VK_SUCCESS(err);
3459
3460 BeginCommandBuffer();
3461 ASSERT_VK_SUCCESS(err);
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003462 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3463 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis8d199e52015-09-17 12:24:13 -06003464 // Should error before calling to driver so don't care about actual data
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003465 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
3466 VK_INDEX_TYPE_UINT16);
Tobin Ehlis8d199e52015-09-17 12:24:13 -06003467
Chris Forbes34d775f2016-04-07 13:21:07 +12003468 m_errorMonitor->VerifyFound();
Mike Stroyan2237f522015-08-18 14:40:24 -06003469
Chia-I Wu69f40122015-10-26 21:10:41 +08003470 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlis8d199e52015-09-17 12:24:13 -06003471}
3472
Mark Lobodzinskie25c7542016-02-25 15:09:52 -07003473TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
3474 // Create an out-of-range queueFamilyIndex
3475 m_errorMonitor->SetDesiredFailureMsg(
3476 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis3e093952016-03-24 10:54:18 -06003477 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinskie25c7542016-02-25 15:09:52 -07003478
3479 ASSERT_NO_FATAL_FAILURE(InitState());
3480 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3481 VkBufferCreateInfo buffCI = {};
3482 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3483 buffCI.size = 1024;
3484 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
3485 buffCI.queueFamilyIndexCount = 1;
3486 // Introduce failure by specifying invalid queue_family_index
3487 uint32_t qfi = 777;
3488 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis3e093952016-03-24 10:54:18 -06003489 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinskie25c7542016-02-25 15:09:52 -07003490
3491 VkBuffer ib;
3492 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
3493
Chris Forbes34d775f2016-04-07 13:21:07 +12003494 m_errorMonitor->VerifyFound();
Mark Lobodzinskie25c7542016-02-25 15:09:52 -07003495}
3496
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003497TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
3498 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
3499 // secondary)
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06003500
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003501 m_errorMonitor->SetDesiredFailureMsg(
3502 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06003503 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis5f728d32015-09-17 14:18:16 -06003504
3505 ASSERT_NO_FATAL_FAILURE(InitState());
3506 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis5f728d32015-09-17 14:18:16 -06003507
3508 BeginCommandBuffer();
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003509 // ASSERT_VK_SUCCESS(err);
Chia-I Wu1f851912015-10-27 18:04:07 +08003510 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
3511 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis5f728d32015-09-17 14:18:16 -06003512
Chris Forbes34d775f2016-04-07 13:21:07 +12003513 m_errorMonitor->VerifyFound();
Tobin Ehlis5f728d32015-09-17 14:18:16 -06003514}
3515
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003516TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis138b7f12015-05-22 12:38:55 -06003517 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003518 VkResult err;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003519
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003520 m_errorMonitor->SetDesiredFailureMsg(
3521 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Write descriptor update has descriptor "
3522 "type VK_DESCRIPTOR_TYPE_SAMPLER that "
3523 "does not match ");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06003524
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003525 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003526 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wuc51b1212015-10-27 19:25:11 +08003527 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003528 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3529 ds_type_count.descriptorCount = 1;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003530
3531 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003532 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3533 ds_pool_ci.pNext = NULL;
3534 ds_pool_ci.maxSets = 1;
3535 ds_pool_ci.poolSizeCount = 1;
3536 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003537
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003538 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003539 err =
3540 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003541 ASSERT_VK_SUCCESS(err);
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003542 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003543 dsl_binding.binding = 0;
3544 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3545 dsl_binding.descriptorCount = 1;
3546 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3547 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003548
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003549 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003550 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3551 ds_layout_ci.pNext = NULL;
3552 ds_layout_ci.bindingCount = 1;
3553 ds_layout_ci.pBindings = &dsl_binding;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003554
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003555 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003556 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3557 &ds_layout);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003558 ASSERT_VK_SUCCESS(err);
3559
3560 VkDescriptorSet descriptorSet;
Chia-I Wu1f851912015-10-27 18:04:07 +08003561 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +08003562 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07003563 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06003564 alloc_info.descriptorPool = ds_pool;
3565 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003566 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3567 &descriptorSet);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003568 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003569
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003570 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003571 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3572 sampler_ci.pNext = NULL;
3573 sampler_ci.magFilter = VK_FILTER_NEAREST;
3574 sampler_ci.minFilter = VK_FILTER_NEAREST;
3575 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3576 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3577 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3578 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3579 sampler_ci.mipLodBias = 1.0;
3580 sampler_ci.anisotropyEnable = VK_FALSE;
3581 sampler_ci.maxAnisotropy = 1;
3582 sampler_ci.compareEnable = VK_FALSE;
3583 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3584 sampler_ci.minLod = 1.0;
3585 sampler_ci.maxLod = 1.0;
3586 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3587 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Mark Lobodzinski513acdf2015-09-01 15:42:56 -06003588
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003589 VkSampler sampler;
Chia-I Wu69f40122015-10-26 21:10:41 +08003590 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003591 ASSERT_VK_SUCCESS(err);
3592
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -06003593 VkDescriptorImageInfo info = {};
3594 info.sampler = sampler;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003595
3596 VkWriteDescriptorSet descriptor_write;
3597 memset(&descriptor_write, 0, sizeof(descriptor_write));
3598 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu1f851912015-10-27 18:04:07 +08003599 descriptor_write.dstSet = descriptorSet;
Chia-I Wu763a7492015-10-26 20:48:51 +08003600 descriptor_write.descriptorCount = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003601 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003602 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -06003603 descriptor_write.pImageInfo = &info;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003604
3605 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3606
Chris Forbes34d775f2016-04-07 13:21:07 +12003607 m_errorMonitor->VerifyFound();
Mike Stroyan2237f522015-08-18 14:40:24 -06003608
Chia-I Wu69f40122015-10-26 21:10:41 +08003609 vkDestroySampler(m_device->device(), sampler, NULL);
3610 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3611 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis138b7f12015-05-22 12:38:55 -06003612}
3613
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003614TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis138b7f12015-05-22 12:38:55 -06003615 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003616 VkResult err;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003617
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003618 m_errorMonitor->SetDesiredFailureMsg(
3619 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Descriptor update type of "
3620 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET "
3621 "is out of bounds for matching binding");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06003622
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003623 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003624 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wuc51b1212015-10-27 19:25:11 +08003625 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003626 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3627 ds_type_count.descriptorCount = 1;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003628
3629 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003630 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3631 ds_pool_ci.pNext = NULL;
3632 ds_pool_ci.maxSets = 1;
3633 ds_pool_ci.poolSizeCount = 1;
3634 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003635
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003636 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003637 err =
3638 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003639 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003640
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003641 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003642 dsl_binding.binding = 0;
3643 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3644 dsl_binding.descriptorCount = 1;
3645 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3646 dsl_binding.pImmutableSamplers = NULL;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003647
3648 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003649 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3650 ds_layout_ci.pNext = NULL;
3651 ds_layout_ci.bindingCount = 1;
3652 ds_layout_ci.pBindings = &dsl_binding;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003653
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003654 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003655 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3656 &ds_layout);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003657 ASSERT_VK_SUCCESS(err);
3658
3659 VkDescriptorSet descriptorSet;
Chia-I Wu1f851912015-10-27 18:04:07 +08003660 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +08003661 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07003662 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06003663 alloc_info.descriptorPool = ds_pool;
3664 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003665 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3666 &descriptorSet);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003667 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003668
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003669 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003670 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3671 sampler_ci.pNext = NULL;
3672 sampler_ci.magFilter = VK_FILTER_NEAREST;
3673 sampler_ci.minFilter = VK_FILTER_NEAREST;
3674 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3675 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3676 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3677 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3678 sampler_ci.mipLodBias = 1.0;
3679 sampler_ci.anisotropyEnable = VK_FALSE;
3680 sampler_ci.maxAnisotropy = 1;
3681 sampler_ci.compareEnable = VK_FALSE;
3682 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3683 sampler_ci.minLod = 1.0;
3684 sampler_ci.maxLod = 1.0;
3685 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3686 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003687
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003688 VkSampler sampler;
Chia-I Wu69f40122015-10-26 21:10:41 +08003689 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003690 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003691
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -06003692 VkDescriptorImageInfo info = {};
3693 info.sampler = sampler;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003694
3695 VkWriteDescriptorSet descriptor_write;
3696 memset(&descriptor_write, 0, sizeof(descriptor_write));
3697 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu1f851912015-10-27 18:04:07 +08003698 descriptor_write.dstSet = descriptorSet;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003699 descriptor_write.dstArrayElement =
3700 1; /* This index out of bounds for the update */
Chia-I Wu763a7492015-10-26 20:48:51 +08003701 descriptor_write.descriptorCount = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003702 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003703 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -06003704 descriptor_write.pImageInfo = &info;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003705
3706 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3707
Chris Forbes34d775f2016-04-07 13:21:07 +12003708 m_errorMonitor->VerifyFound();
Mike Stroyan2237f522015-08-18 14:40:24 -06003709
Chia-I Wu69f40122015-10-26 21:10:41 +08003710 vkDestroySampler(m_device->device(), sampler, NULL);
3711 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3712 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis138b7f12015-05-22 12:38:55 -06003713}
3714
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003715TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
3716 // Create layout w/ count of 1 and attempt update to that layout w/ binding
3717 // index 2
3718 VkResult err;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003719
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003720 m_errorMonitor->SetDesiredFailureMsg(
3721 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06003722 " does not have binding to match update binding ");
3723
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003724 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003725 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wuc51b1212015-10-27 19:25:11 +08003726 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003727 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3728 ds_type_count.descriptorCount = 1;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003729
3730 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003731 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3732 ds_pool_ci.pNext = NULL;
3733 ds_pool_ci.maxSets = 1;
3734 ds_pool_ci.poolSizeCount = 1;
3735 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06003736
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003737 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003738 err =
3739 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003740 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003741
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003742 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003743 dsl_binding.binding = 0;
3744 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3745 dsl_binding.descriptorCount = 1;
3746 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3747 dsl_binding.pImmutableSamplers = NULL;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003748
3749 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003750 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3751 ds_layout_ci.pNext = NULL;
3752 ds_layout_ci.bindingCount = 1;
3753 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003754 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003755 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3756 &ds_layout);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003757 ASSERT_VK_SUCCESS(err);
3758
3759 VkDescriptorSet descriptorSet;
Chia-I Wu1f851912015-10-27 18:04:07 +08003760 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +08003761 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07003762 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06003763 alloc_info.descriptorPool = ds_pool;
3764 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003765 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3766 &descriptorSet);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003767 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003768
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003769 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003770 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3771 sampler_ci.pNext = NULL;
3772 sampler_ci.magFilter = VK_FILTER_NEAREST;
3773 sampler_ci.minFilter = VK_FILTER_NEAREST;
3774 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3775 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3776 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3777 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3778 sampler_ci.mipLodBias = 1.0;
3779 sampler_ci.anisotropyEnable = VK_FALSE;
3780 sampler_ci.maxAnisotropy = 1;
3781 sampler_ci.compareEnable = VK_FALSE;
3782 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3783 sampler_ci.minLod = 1.0;
3784 sampler_ci.maxLod = 1.0;
3785 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3786 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003787
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003788 VkSampler sampler;
Chia-I Wu69f40122015-10-26 21:10:41 +08003789 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003790 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003791
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -06003792 VkDescriptorImageInfo info = {};
3793 info.sampler = sampler;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003794
3795 VkWriteDescriptorSet descriptor_write;
3796 memset(&descriptor_write, 0, sizeof(descriptor_write));
3797 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu1f851912015-10-27 18:04:07 +08003798 descriptor_write.dstSet = descriptorSet;
3799 descriptor_write.dstBinding = 2;
Chia-I Wu763a7492015-10-26 20:48:51 +08003800 descriptor_write.descriptorCount = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003801 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003802 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -06003803 descriptor_write.pImageInfo = &info;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003804
3805 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3806
Chris Forbes34d775f2016-04-07 13:21:07 +12003807 m_errorMonitor->VerifyFound();
Mike Stroyan2237f522015-08-18 14:40:24 -06003808
Chia-I Wu69f40122015-10-26 21:10:41 +08003809 vkDestroySampler(m_device->device(), sampler, NULL);
3810 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3811 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis138b7f12015-05-22 12:38:55 -06003812}
3813
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003814TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
3815 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
3816 // types
3817 VkResult err;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003818
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -07003819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003820 "Unexpected UPDATE struct of type ");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06003821
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003822 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06003823
Chia-I Wuc51b1212015-10-27 19:25:11 +08003824 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003825 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3826 ds_type_count.descriptorCount = 1;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003827
3828 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003829 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3830 ds_pool_ci.pNext = NULL;
3831 ds_pool_ci.maxSets = 1;
3832 ds_pool_ci.poolSizeCount = 1;
3833 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06003834
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003835 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003836 err =
3837 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003838 ASSERT_VK_SUCCESS(err);
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003839 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003840 dsl_binding.binding = 0;
3841 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3842 dsl_binding.descriptorCount = 1;
3843 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3844 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003845
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003846 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003847 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3848 ds_layout_ci.pNext = NULL;
3849 ds_layout_ci.bindingCount = 1;
3850 ds_layout_ci.pBindings = &dsl_binding;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003851
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003852 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003853 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3854 &ds_layout);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003855 ASSERT_VK_SUCCESS(err);
3856
3857 VkDescriptorSet descriptorSet;
Chia-I Wu1f851912015-10-27 18:04:07 +08003858 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +08003859 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07003860 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06003861 alloc_info.descriptorPool = ds_pool;
3862 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003863 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3864 &descriptorSet);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003865 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003866
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003867 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003868 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3869 sampler_ci.pNext = NULL;
3870 sampler_ci.magFilter = VK_FILTER_NEAREST;
3871 sampler_ci.minFilter = VK_FILTER_NEAREST;
3872 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3873 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3874 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3875 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3876 sampler_ci.mipLodBias = 1.0;
3877 sampler_ci.anisotropyEnable = VK_FALSE;
3878 sampler_ci.maxAnisotropy = 1;
3879 sampler_ci.compareEnable = VK_FALSE;
3880 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3881 sampler_ci.minLod = 1.0;
3882 sampler_ci.maxLod = 1.0;
3883 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3884 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003885 VkSampler sampler;
Chia-I Wu69f40122015-10-26 21:10:41 +08003886 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003887 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003888
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -06003889 VkDescriptorImageInfo info = {};
3890 info.sampler = sampler;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003891
3892 VkWriteDescriptorSet descriptor_write;
3893 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003894 descriptor_write.sType =
3895 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu1f851912015-10-27 18:04:07 +08003896 descriptor_write.dstSet = descriptorSet;
Chia-I Wu763a7492015-10-26 20:48:51 +08003897 descriptor_write.descriptorCount = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003898 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003899 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -06003900 descriptor_write.pImageInfo = &info;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003901
3902 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3903
Chris Forbes34d775f2016-04-07 13:21:07 +12003904 m_errorMonitor->VerifyFound();
Mike Stroyan2237f522015-08-18 14:40:24 -06003905
Chia-I Wu69f40122015-10-26 21:10:41 +08003906 vkDestroySampler(m_device->device(), sampler, NULL);
3907 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3908 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis138b7f12015-05-22 12:38:55 -06003909}
3910
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003911TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisb46be812015-10-23 16:00:08 -06003912 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003913 VkResult err;
Tobin Ehlisb46be812015-10-23 16:00:08 -06003914
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003915 m_errorMonitor->SetDesiredFailureMsg(
3916 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06003917 "Attempt to update descriptor with invalid sampler 0xbaadbeef");
3918
Tobin Ehlisb46be812015-10-23 16:00:08 -06003919 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003920 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
3921 // code
Chia-I Wuc51b1212015-10-27 19:25:11 +08003922 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003923 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3924 ds_type_count.descriptorCount = 1;
Tobin Ehlisb46be812015-10-23 16:00:08 -06003925
3926 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003927 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3928 ds_pool_ci.pNext = NULL;
3929 ds_pool_ci.maxSets = 1;
3930 ds_pool_ci.poolSizeCount = 1;
3931 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisb46be812015-10-23 16:00:08 -06003932
3933 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003934 err =
3935 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisb46be812015-10-23 16:00:08 -06003936 ASSERT_VK_SUCCESS(err);
3937
3938 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003939 dsl_binding.binding = 0;
3940 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3941 dsl_binding.descriptorCount = 1;
3942 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3943 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisb46be812015-10-23 16:00:08 -06003944
3945 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003946 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3947 ds_layout_ci.pNext = NULL;
3948 ds_layout_ci.bindingCount = 1;
3949 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisb46be812015-10-23 16:00:08 -06003950 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003951 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3952 &ds_layout);
Tobin Ehlisb46be812015-10-23 16:00:08 -06003953 ASSERT_VK_SUCCESS(err);
3954
3955 VkDescriptorSet descriptorSet;
Chia-I Wu1f851912015-10-27 18:04:07 +08003956 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +08003957 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07003958 alloc_info.descriptorSetCount = 1;
Tobin Ehlisb46be812015-10-23 16:00:08 -06003959 alloc_info.descriptorPool = ds_pool;
3960 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003961 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3962 &descriptorSet);
Tobin Ehlisb46be812015-10-23 16:00:08 -06003963 ASSERT_VK_SUCCESS(err);
3964
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003965 VkSampler sampler =
3966 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisb46be812015-10-23 16:00:08 -06003967
3968 VkDescriptorImageInfo descriptor_info;
3969 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
3970 descriptor_info.sampler = sampler;
3971
3972 VkWriteDescriptorSet descriptor_write;
3973 memset(&descriptor_write, 0, sizeof(descriptor_write));
3974 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu1f851912015-10-27 18:04:07 +08003975 descriptor_write.dstSet = descriptorSet;
3976 descriptor_write.dstBinding = 0;
Chia-I Wu763a7492015-10-26 20:48:51 +08003977 descriptor_write.descriptorCount = 1;
Tobin Ehlisb46be812015-10-23 16:00:08 -06003978 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3979 descriptor_write.pImageInfo = &descriptor_info;
3980
3981 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3982
Chris Forbes34d775f2016-04-07 13:21:07 +12003983 m_errorMonitor->VerifyFound();
Tobin Ehlisb46be812015-10-23 16:00:08 -06003984
Chia-I Wu69f40122015-10-26 21:10:41 +08003985 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3986 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisb46be812015-10-23 16:00:08 -06003987}
3988
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003989TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
3990 // Create a single combined Image/Sampler descriptor and send it an invalid
3991 // imageView
3992 VkResult err;
Tobin Ehlisb46be812015-10-23 16:00:08 -06003993
Karl Schultz99e9d1d2016-02-02 17:17:23 -07003994 m_errorMonitor->SetDesiredFailureMsg(
3995 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06003996 "Attempt to update descriptor with invalid imageView 0xbaadbeef");
3997
Tobin Ehlisb46be812015-10-23 16:00:08 -06003998 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wuc51b1212015-10-27 19:25:11 +08003999 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004000 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4001 ds_type_count.descriptorCount = 1;
Tobin Ehlisb46be812015-10-23 16:00:08 -06004002
4003 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004004 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4005 ds_pool_ci.pNext = NULL;
4006 ds_pool_ci.maxSets = 1;
4007 ds_pool_ci.poolSizeCount = 1;
4008 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisb46be812015-10-23 16:00:08 -06004009
4010 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004011 err =
4012 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisb46be812015-10-23 16:00:08 -06004013 ASSERT_VK_SUCCESS(err);
4014
4015 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004016 dsl_binding.binding = 0;
4017 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4018 dsl_binding.descriptorCount = 1;
4019 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4020 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisb46be812015-10-23 16:00:08 -06004021
4022 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004023 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4024 ds_layout_ci.pNext = NULL;
4025 ds_layout_ci.bindingCount = 1;
4026 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisb46be812015-10-23 16:00:08 -06004027 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004028 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4029 &ds_layout);
Tobin Ehlisb46be812015-10-23 16:00:08 -06004030 ASSERT_VK_SUCCESS(err);
4031
4032 VkDescriptorSet descriptorSet;
Chia-I Wu1f851912015-10-27 18:04:07 +08004033 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +08004034 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07004035 alloc_info.descriptorSetCount = 1;
Tobin Ehlisb46be812015-10-23 16:00:08 -06004036 alloc_info.descriptorPool = ds_pool;
4037 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004038 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4039 &descriptorSet);
Tobin Ehlisb46be812015-10-23 16:00:08 -06004040 ASSERT_VK_SUCCESS(err);
4041
4042 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004043 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4044 sampler_ci.pNext = NULL;
4045 sampler_ci.magFilter = VK_FILTER_NEAREST;
4046 sampler_ci.minFilter = VK_FILTER_NEAREST;
4047 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4048 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4049 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4050 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4051 sampler_ci.mipLodBias = 1.0;
4052 sampler_ci.anisotropyEnable = VK_FALSE;
4053 sampler_ci.maxAnisotropy = 1;
4054 sampler_ci.compareEnable = VK_FALSE;
4055 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4056 sampler_ci.minLod = 1.0;
4057 sampler_ci.maxLod = 1.0;
4058 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4059 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisb46be812015-10-23 16:00:08 -06004060
4061 VkSampler sampler;
Chia-I Wu69f40122015-10-26 21:10:41 +08004062 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisb46be812015-10-23 16:00:08 -06004063 ASSERT_VK_SUCCESS(err);
4064
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004065 VkImageView view =
4066 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisb46be812015-10-23 16:00:08 -06004067
4068 VkDescriptorImageInfo descriptor_info;
4069 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
4070 descriptor_info.sampler = sampler;
4071 descriptor_info.imageView = view;
4072
4073 VkWriteDescriptorSet descriptor_write;
4074 memset(&descriptor_write, 0, sizeof(descriptor_write));
4075 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu1f851912015-10-27 18:04:07 +08004076 descriptor_write.dstSet = descriptorSet;
4077 descriptor_write.dstBinding = 0;
Chia-I Wu763a7492015-10-26 20:48:51 +08004078 descriptor_write.descriptorCount = 1;
Tobin Ehlisb46be812015-10-23 16:00:08 -06004079 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4080 descriptor_write.pImageInfo = &descriptor_info;
4081
4082 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4083
Chris Forbes34d775f2016-04-07 13:21:07 +12004084 m_errorMonitor->VerifyFound();
Tobin Ehlisb46be812015-10-23 16:00:08 -06004085
Chia-I Wu69f40122015-10-26 21:10:41 +08004086 vkDestroySampler(m_device->device(), sampler, NULL);
4087 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4088 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisb46be812015-10-23 16:00:08 -06004089}
4090
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004091TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
4092 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
4093 // into the other
4094 VkResult err;
Tobin Ehlis3e676262015-10-27 16:35:27 -06004095
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004096 m_errorMonitor->SetDesiredFailureMsg(
4097 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Copy descriptor update index 0, update "
4098 "count #1, has src update descriptor "
4099 "type VK_DESCRIPTOR_TYPE_SAMPLER ");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06004100
Tobin Ehlis3e676262015-10-27 16:35:27 -06004101 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004102 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wuc51b1212015-10-27 19:25:11 +08004103 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004104 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4105 ds_type_count[0].descriptorCount = 1;
4106 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
4107 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis3e676262015-10-27 16:35:27 -06004108
4109 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004110 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4111 ds_pool_ci.pNext = NULL;
4112 ds_pool_ci.maxSets = 1;
4113 ds_pool_ci.poolSizeCount = 2;
4114 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis3e676262015-10-27 16:35:27 -06004115
4116 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004117 err =
4118 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3e676262015-10-27 16:35:27 -06004119 ASSERT_VK_SUCCESS(err);
4120 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004121 dsl_binding[0].binding = 0;
4122 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4123 dsl_binding[0].descriptorCount = 1;
4124 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4125 dsl_binding[0].pImmutableSamplers = NULL;
4126 dsl_binding[1].binding = 1;
4127 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4128 dsl_binding[1].descriptorCount = 1;
4129 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
4130 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis3e676262015-10-27 16:35:27 -06004131
4132 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004133 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4134 ds_layout_ci.pNext = NULL;
4135 ds_layout_ci.bindingCount = 2;
4136 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis3e676262015-10-27 16:35:27 -06004137
4138 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004139 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4140 &ds_layout);
Tobin Ehlis3e676262015-10-27 16:35:27 -06004141 ASSERT_VK_SUCCESS(err);
4142
4143 VkDescriptorSet descriptorSet;
Chia-I Wu1f851912015-10-27 18:04:07 +08004144 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +08004145 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07004146 alloc_info.descriptorSetCount = 1;
Tobin Ehlis3e676262015-10-27 16:35:27 -06004147 alloc_info.descriptorPool = ds_pool;
4148 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004149 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4150 &descriptorSet);
Tobin Ehlis3e676262015-10-27 16:35:27 -06004151 ASSERT_VK_SUCCESS(err);
4152
4153 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004154 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4155 sampler_ci.pNext = NULL;
4156 sampler_ci.magFilter = VK_FILTER_NEAREST;
4157 sampler_ci.minFilter = VK_FILTER_NEAREST;
4158 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4159 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4160 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4161 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4162 sampler_ci.mipLodBias = 1.0;
4163 sampler_ci.anisotropyEnable = VK_FALSE;
4164 sampler_ci.maxAnisotropy = 1;
4165 sampler_ci.compareEnable = VK_FALSE;
4166 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4167 sampler_ci.minLod = 1.0;
4168 sampler_ci.maxLod = 1.0;
4169 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4170 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3e676262015-10-27 16:35:27 -06004171
4172 VkSampler sampler;
Chia-I Wu69f40122015-10-26 21:10:41 +08004173 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3e676262015-10-27 16:35:27 -06004174 ASSERT_VK_SUCCESS(err);
4175
4176 VkDescriptorImageInfo info = {};
4177 info.sampler = sampler;
4178
4179 VkWriteDescriptorSet descriptor_write;
4180 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
4181 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu1f851912015-10-27 18:04:07 +08004182 descriptor_write.dstSet = descriptorSet;
4183 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wu763a7492015-10-26 20:48:51 +08004184 descriptor_write.descriptorCount = 1;
Tobin Ehlis3e676262015-10-27 16:35:27 -06004185 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4186 descriptor_write.pImageInfo = &info;
4187 // This write update should succeed
4188 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4189 // Now perform a copy update that fails due to type mismatch
4190 VkCopyDescriptorSet copy_ds_update;
4191 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
4192 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
4193 copy_ds_update.srcSet = descriptorSet;
4194 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding
Chia-I Wu1f851912015-10-27 18:04:07 +08004195 copy_ds_update.dstSet = descriptorSet;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004196 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wu763a7492015-10-26 20:48:51 +08004197 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis3e676262015-10-27 16:35:27 -06004198 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
4199
Chris Forbes34d775f2016-04-07 13:21:07 +12004200 m_errorMonitor->VerifyFound();
Tobin Ehlis3e676262015-10-27 16:35:27 -06004201 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004202 m_errorMonitor->SetDesiredFailureMsg(
4203 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06004204 "Copy descriptor update 0 has srcBinding 3 which is out of bounds ");
Tobin Ehlis3e676262015-10-27 16:35:27 -06004205 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
4206 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
4207 copy_ds_update.srcSet = descriptorSet;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004208 copy_ds_update.srcBinding =
4209 3; // ERROR : Invalid binding for matching layout
Chia-I Wu1f851912015-10-27 18:04:07 +08004210 copy_ds_update.dstSet = descriptorSet;
4211 copy_ds_update.dstBinding = 0;
Chia-I Wu763a7492015-10-26 20:48:51 +08004212 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis3e676262015-10-27 16:35:27 -06004213 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
4214
Chris Forbes34d775f2016-04-07 13:21:07 +12004215 m_errorMonitor->VerifyFound();
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06004216
Tobin Ehlis3e676262015-10-27 16:35:27 -06004217 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004218 m_errorMonitor->SetDesiredFailureMsg(
4219 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06004220 "Copy descriptor src update is out of bounds for matching binding 1 ");
4221
Tobin Ehlis3e676262015-10-27 16:35:27 -06004222 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
4223 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
4224 copy_ds_update.srcSet = descriptorSet;
4225 copy_ds_update.srcBinding = 1;
Chia-I Wu1f851912015-10-27 18:04:07 +08004226 copy_ds_update.dstSet = descriptorSet;
4227 copy_ds_update.dstBinding = 0;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004228 copy_ds_update.descriptorCount =
4229 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis3e676262015-10-27 16:35:27 -06004230 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
4231
Chris Forbes34d775f2016-04-07 13:21:07 +12004232 m_errorMonitor->VerifyFound();
Tobin Ehlis3e676262015-10-27 16:35:27 -06004233
Chia-I Wu69f40122015-10-26 21:10:41 +08004234 vkDestroySampler(m_device->device(), sampler, NULL);
4235 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4236 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis3e676262015-10-27 16:35:27 -06004237}
4238
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004239TEST_F(VkLayerTest, NumSamplesMismatch) {
4240 // Create CommandBuffer where MSAA samples doesn't match RenderPass
4241 // sampleCount
4242 VkResult err;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06004243
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -07004244 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004245 "Num samples mismatch! ");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06004246
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06004247 ASSERT_NO_FATAL_FAILURE(InitState());
4248 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wuc51b1212015-10-27 19:25:11 +08004249 VkDescriptorPoolSize ds_type_count = {};
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004250 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu763a7492015-10-26 20:48:51 +08004251 ds_type_count.descriptorCount = 1;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004252
4253 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004254 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4255 ds_pool_ci.pNext = NULL;
4256 ds_pool_ci.maxSets = 1;
4257 ds_pool_ci.poolSizeCount = 1;
4258 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06004259
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06004260 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004261 err =
4262 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06004263 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06004264
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004265 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wub5689ee2015-10-31 00:31:16 +08004266 dsl_binding.binding = 0;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004267 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu045654f2015-11-06 06:42:02 +08004268 dsl_binding.descriptorCount = 1;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004269 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4270 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06004271
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004272 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4273 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4274 ds_layout_ci.pNext = NULL;
Chia-I Wu763a7492015-10-26 20:48:51 +08004275 ds_layout_ci.bindingCount = 1;
Jon Ashburnadb61352015-12-30 18:01:16 -07004276 ds_layout_ci.pBindings = &dsl_binding;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004277
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06004278 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004279 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4280 &ds_layout);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06004281 ASSERT_VK_SUCCESS(err);
4282
4283 VkDescriptorSet descriptorSet;
Chia-I Wu1f851912015-10-27 18:04:07 +08004284 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +08004285 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07004286 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06004287 alloc_info.descriptorPool = ds_pool;
4288 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004289 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4290 &descriptorSet);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06004291 ASSERT_VK_SUCCESS(err);
4292
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004293 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004294 pipe_ms_state_ci.sType =
4295 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4296 pipe_ms_state_ci.pNext = NULL;
4297 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
4298 pipe_ms_state_ci.sampleShadingEnable = 0;
4299 pipe_ms_state_ci.minSampleShading = 1.0;
4300 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06004301
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004302 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004303 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4304 pipeline_layout_ci.pNext = NULL;
4305 pipeline_layout_ci.setLayoutCount = 1;
4306 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06004307
4308 VkPipelineLayout pipeline_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004309 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4310 &pipeline_layout);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06004311 ASSERT_VK_SUCCESS(err);
4312
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004313 VkShaderObj vs(m_device, bindStateVertShaderText,
4314 VK_SHADER_STAGE_VERTEX_BIT, this);
4315 VkShaderObj fs(m_device, bindStateFragShaderText,
4316 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultz772fcd12016-04-19 11:36:49 -06004317 this); // We shouldn't need a fragment shader
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004318 // but add it to be able to run on more devices
Tony Barbourd7d828b2015-08-06 10:16:07 -06004319 VkPipelineObj pipe(m_device);
4320 pipe.AddShader(&vs);
Tony Barbour3c9e3b12015-08-06 11:21:08 -06004321 pipe.AddShader(&fs);
Mark Young0292df52016-03-31 16:03:20 -06004322 pipe.AddColorAttachment();
Tony Barbourd7d828b2015-08-06 10:16:07 -06004323 pipe.SetMSAA(&pipe_ms_state_ci);
4324 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06004325
Tony Barbour1490c912015-07-28 10:17:20 -06004326 BeginCommandBuffer();
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004327 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4328 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06004329
Chris Forbes34d775f2016-04-07 13:21:07 +12004330 m_errorMonitor->VerifyFound();
Mike Stroyan2237f522015-08-18 14:40:24 -06004331
Chia-I Wu69f40122015-10-26 21:10:41 +08004332 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4333 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4334 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis138b7f12015-05-22 12:38:55 -06004335}
Tobin Ehlis70f17c52016-04-04 10:00:21 -06004336#ifdef ADD_BACK_IN_WHEN_CHECK_IS_BACK // TODO : Re-enable when GH256 fixed
Mark Young0292df52016-03-31 16:03:20 -06004337TEST_F(VkLayerTest, NumBlendAttachMismatch) {
4338 // Create Pipeline where the number of blend attachments doesn't match the
4339 // number of color attachments. In this case, we don't add any color
4340 // blend attachments even though we have a color attachment.
4341 VkResult err;
4342
4343 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4344 "Mismatch between blend state attachment");
4345
4346 ASSERT_NO_FATAL_FAILURE(InitState());
4347 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4348 VkDescriptorPoolSize ds_type_count = {};
4349 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4350 ds_type_count.descriptorCount = 1;
4351
4352 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4353 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4354 ds_pool_ci.pNext = NULL;
4355 ds_pool_ci.maxSets = 1;
4356 ds_pool_ci.poolSizeCount = 1;
4357 ds_pool_ci.pPoolSizes = &ds_type_count;
4358
4359 VkDescriptorPool ds_pool;
4360 err =
4361 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4362 ASSERT_VK_SUCCESS(err);
4363
4364 VkDescriptorSetLayoutBinding dsl_binding = {};
4365 dsl_binding.binding = 0;
4366 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4367 dsl_binding.descriptorCount = 1;
4368 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4369 dsl_binding.pImmutableSamplers = NULL;
4370
4371 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4372 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4373 ds_layout_ci.pNext = NULL;
4374 ds_layout_ci.bindingCount = 1;
4375 ds_layout_ci.pBindings = &dsl_binding;
4376
4377 VkDescriptorSetLayout ds_layout;
4378 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4379 &ds_layout);
4380 ASSERT_VK_SUCCESS(err);
4381
4382 VkDescriptorSet descriptorSet;
4383 VkDescriptorSetAllocateInfo alloc_info = {};
4384 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4385 alloc_info.descriptorSetCount = 1;
4386 alloc_info.descriptorPool = ds_pool;
4387 alloc_info.pSetLayouts = &ds_layout;
4388 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4389 &descriptorSet);
4390 ASSERT_VK_SUCCESS(err);
4391
4392 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
4393 pipe_ms_state_ci.sType =
4394 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4395 pipe_ms_state_ci.pNext = NULL;
4396 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
4397 pipe_ms_state_ci.sampleShadingEnable = 0;
4398 pipe_ms_state_ci.minSampleShading = 1.0;
4399 pipe_ms_state_ci.pSampleMask = NULL;
4400
4401 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4402 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4403 pipeline_layout_ci.pNext = NULL;
4404 pipeline_layout_ci.setLayoutCount = 1;
4405 pipeline_layout_ci.pSetLayouts = &ds_layout;
4406
4407 VkPipelineLayout pipeline_layout;
4408 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4409 &pipeline_layout);
4410 ASSERT_VK_SUCCESS(err);
4411
4412 VkShaderObj vs(m_device, bindStateVertShaderText,
4413 VK_SHADER_STAGE_VERTEX_BIT, this);
4414 VkShaderObj fs(m_device, bindStateFragShaderText,
4415 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultz772fcd12016-04-19 11:36:49 -06004416 this); // We shouldn't need a fragment shader
Mark Young0292df52016-03-31 16:03:20 -06004417 // but add it to be able to run on more devices
4418 VkPipelineObj pipe(m_device);
4419 pipe.AddShader(&vs);
4420 pipe.AddShader(&fs);
4421 pipe.SetMSAA(&pipe_ms_state_ci);
4422 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4423
4424 BeginCommandBuffer();
4425 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4426 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4427
Chris Forbes34d775f2016-04-07 13:21:07 +12004428 m_errorMonitor->VerifyFound();
Mark Young0292df52016-03-31 16:03:20 -06004429
4430 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4431 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4432 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4433}
Tony Barbouref146362016-04-04 11:09:40 -06004434#endif //ADD_BACK_IN_WHEN_CHECK_IS_BACK
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004435TEST_F(VkLayerTest, ClearCmdNoDraw) {
4436 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
4437 // to issuing a Draw
4438 VkResult err;
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06004439
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004440 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbourc7dea5e2016-03-02 15:12:01 -07004441 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06004442 "vkCmdClearAttachments() issued on CB object ");
4443
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06004444 ASSERT_NO_FATAL_FAILURE(InitState());
4445 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004446
Chia-I Wuc51b1212015-10-27 19:25:11 +08004447 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004448 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4449 ds_type_count.descriptorCount = 1;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004450
4451 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004452 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4453 ds_pool_ci.pNext = NULL;
4454 ds_pool_ci.maxSets = 1;
4455 ds_pool_ci.poolSizeCount = 1;
4456 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004457
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06004458 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004459 err =
4460 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06004461 ASSERT_VK_SUCCESS(err);
4462
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004463 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004464 dsl_binding.binding = 0;
4465 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4466 dsl_binding.descriptorCount = 1;
4467 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4468 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06004469
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004470 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004471 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4472 ds_layout_ci.pNext = NULL;
4473 ds_layout_ci.bindingCount = 1;
4474 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06004475
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06004476 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004477 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4478 &ds_layout);
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06004479 ASSERT_VK_SUCCESS(err);
4480
4481 VkDescriptorSet descriptorSet;
Chia-I Wu1f851912015-10-27 18:04:07 +08004482 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +08004483 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07004484 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06004485 alloc_info.descriptorPool = ds_pool;
4486 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004487 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4488 &descriptorSet);
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06004489 ASSERT_VK_SUCCESS(err);
4490
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004491 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004492 pipe_ms_state_ci.sType =
4493 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4494 pipe_ms_state_ci.pNext = NULL;
4495 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
4496 pipe_ms_state_ci.sampleShadingEnable = 0;
4497 pipe_ms_state_ci.minSampleShading = 1.0;
4498 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06004499
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004500 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004501 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4502 pipeline_layout_ci.pNext = NULL;
4503 pipeline_layout_ci.setLayoutCount = 1;
4504 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06004505
4506 VkPipelineLayout pipeline_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004507 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4508 &pipeline_layout);
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06004509 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06004510
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004511 VkShaderObj vs(m_device, bindStateVertShaderText,
4512 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultz772fcd12016-04-19 11:36:49 -06004513 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004514 // on more devices
4515 VkShaderObj fs(m_device, bindStateFragShaderText,
4516 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06004517
Tony Barbourd7d828b2015-08-06 10:16:07 -06004518 VkPipelineObj pipe(m_device);
4519 pipe.AddShader(&vs);
Tony Barbour3c9e3b12015-08-06 11:21:08 -06004520 pipe.AddShader(&fs);
Tony Barbourd7d828b2015-08-06 10:16:07 -06004521 pipe.SetMSAA(&pipe_ms_state_ci);
4522 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbour1490c912015-07-28 10:17:20 -06004523
4524 BeginCommandBuffer();
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06004525
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004526 // Main thing we care about for this test is that the VkImage obj we're
4527 // clearing matches Color Attachment of FB
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06004528 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchter9feb0732015-10-15 16:51:05 -06004529 VkClearAttachment color_attachment;
4530 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4531 color_attachment.clearValue.color.float32[0] = 1.0;
4532 color_attachment.clearValue.color.float32[1] = 1.0;
4533 color_attachment.clearValue.color.float32[2] = 1.0;
4534 color_attachment.clearValue.color.float32[3] = 1.0;
4535 color_attachment.colorAttachment = 0;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004536 VkClearRect clear_rect = {
4537 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06004538
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004539 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
4540 &color_attachment, 1, &clear_rect);
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06004541
Chris Forbes34d775f2016-04-07 13:21:07 +12004542 m_errorMonitor->VerifyFound();
Mike Stroyan2237f522015-08-18 14:40:24 -06004543
Chia-I Wu69f40122015-10-26 21:10:41 +08004544 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4545 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4546 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06004547}
4548
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004549TEST_F(VkLayerTest, VtxBufferBadIndex) {
4550 VkResult err;
Tobin Ehlise4076782015-06-24 15:53:07 -06004551
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004552 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski5c13d4d2016-02-11 09:26:16 -07004553 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski74e84692015-12-14 15:14:10 -07004554 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06004555
Tobin Ehlise4076782015-06-24 15:53:07 -06004556 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa88e2f52015-10-02 11:00:56 -06004557 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlise4076782015-06-24 15:53:07 -06004558 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004559
Chia-I Wuc51b1212015-10-27 19:25:11 +08004560 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004561 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4562 ds_type_count.descriptorCount = 1;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004563
4564 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004565 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4566 ds_pool_ci.pNext = NULL;
4567 ds_pool_ci.maxSets = 1;
4568 ds_pool_ci.poolSizeCount = 1;
4569 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004570
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06004571 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004572 err =
4573 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise4076782015-06-24 15:53:07 -06004574 ASSERT_VK_SUCCESS(err);
4575
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004576 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004577 dsl_binding.binding = 0;
4578 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4579 dsl_binding.descriptorCount = 1;
4580 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4581 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise4076782015-06-24 15:53:07 -06004582
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004583 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004584 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4585 ds_layout_ci.pNext = NULL;
4586 ds_layout_ci.bindingCount = 1;
4587 ds_layout_ci.pBindings = &dsl_binding;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004588
Tobin Ehlise4076782015-06-24 15:53:07 -06004589 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004590 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4591 &ds_layout);
Tobin Ehlise4076782015-06-24 15:53:07 -06004592 ASSERT_VK_SUCCESS(err);
4593
4594 VkDescriptorSet descriptorSet;
Chia-I Wu1f851912015-10-27 18:04:07 +08004595 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +08004596 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07004597 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06004598 alloc_info.descriptorPool = ds_pool;
4599 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004600 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4601 &descriptorSet);
Tobin Ehlise4076782015-06-24 15:53:07 -06004602 ASSERT_VK_SUCCESS(err);
4603
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004604 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004605 pipe_ms_state_ci.sType =
4606 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4607 pipe_ms_state_ci.pNext = NULL;
4608 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
4609 pipe_ms_state_ci.sampleShadingEnable = 0;
4610 pipe_ms_state_ci.minSampleShading = 1.0;
4611 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlise4076782015-06-24 15:53:07 -06004612
Tony Barbourefbe9ca2015-07-15 12:50:33 -06004613 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004614 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4615 pipeline_layout_ci.pNext = NULL;
4616 pipeline_layout_ci.setLayoutCount = 1;
4617 pipeline_layout_ci.pSetLayouts = &ds_layout;
4618 VkPipelineLayout pipeline_layout;
Tobin Ehlise4076782015-06-24 15:53:07 -06004619
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004620 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4621 &pipeline_layout);
Tobin Ehlise4076782015-06-24 15:53:07 -06004622 ASSERT_VK_SUCCESS(err);
4623
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004624 VkShaderObj vs(m_device, bindStateVertShaderText,
4625 VK_SHADER_STAGE_VERTEX_BIT, this);
4626 VkShaderObj fs(m_device, bindStateFragShaderText,
4627 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultz772fcd12016-04-19 11:36:49 -06004628 this); // We shouldn't need a fragment shader
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004629 // but add it to be able to run on more devices
Tony Barbourd7d828b2015-08-06 10:16:07 -06004630 VkPipelineObj pipe(m_device);
4631 pipe.AddShader(&vs);
Tony Barbour3c9e3b12015-08-06 11:21:08 -06004632 pipe.AddShader(&fs);
Mark Young0292df52016-03-31 16:03:20 -06004633 pipe.AddColorAttachment();
Tony Barbourd7d828b2015-08-06 10:16:07 -06004634 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisa88e2f52015-10-02 11:00:56 -06004635 pipe.SetViewport(m_viewports);
4636 pipe.SetScissor(m_scissors);
Tony Barbourd7d828b2015-08-06 10:16:07 -06004637 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbour1490c912015-07-28 10:17:20 -06004638
4639 BeginCommandBuffer();
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004640 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4641 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisd28acef2015-09-09 15:12:35 -06004642 // Don't care about actual data, just need to get to draw to flag error
4643 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004644 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
4645 (const void *)&vbo_data);
Tobin Ehlisd28acef2015-09-09 15:12:35 -06004646 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter4ff11cc2015-09-23 12:31:50 -06004647 Draw(1, 0, 0, 0);
Tobin Ehlise4076782015-06-24 15:53:07 -06004648
Chris Forbes34d775f2016-04-07 13:21:07 +12004649 m_errorMonitor->VerifyFound();
Mike Stroyan2237f522015-08-18 14:40:24 -06004650
Chia-I Wu69f40122015-10-26 21:10:41 +08004651 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4652 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4653 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise4076782015-06-24 15:53:07 -06004654}
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06004655#endif // DRAW_STATE_TESTS
4656
Tobin Ehlis57e6a612015-05-26 16:11:58 -06004657#if THREADING_TESTS
Mike Stroyan09aae812015-05-12 16:00:45 -06004658#if GTEST_IS_THREADSAFE
4659struct thread_data_struct {
Chia-I Wu1f851912015-10-27 18:04:07 +08004660 VkCommandBuffer commandBuffer;
Mike Stroyan09aae812015-05-12 16:00:45 -06004661 VkEvent event;
4662 bool bailout;
4663};
4664
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004665extern "C" void *AddToCommandBuffer(void *arg) {
4666 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyan09aae812015-05-12 16:00:45 -06004667
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004668 for (int i = 0; i < 10000; i++) {
4669 vkCmdSetEvent(data->commandBuffer, data->event,
4670 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyan09aae812015-05-12 16:00:45 -06004671 if (data->bailout) {
4672 break;
4673 }
4674 }
4675 return NULL;
4676}
4677
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004678TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan7016f4f2015-07-13 14:45:35 -06004679 test_platform_thread thread;
Mike Stroyan09aae812015-05-12 16:00:45 -06004680
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4682 "THREADING ERROR");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06004683
Mike Stroyan09aae812015-05-12 16:00:45 -06004684 ASSERT_NO_FATAL_FAILURE(InitState());
4685 ASSERT_NO_FATAL_FAILURE(InitViewport());
4686 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4687
Chia-I Wu1f851912015-10-27 18:04:07 +08004688 // Calls AllocateCommandBuffers
4689 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinskia0f061c2015-09-30 16:19:16 -06004690
4691 // Avoid creating RenderPass
Chia-I Wu1f851912015-10-27 18:04:07 +08004692 commandBuffer.BeginCommandBuffer();
Mike Stroyan09aae812015-05-12 16:00:45 -06004693
4694 VkEventCreateInfo event_info;
4695 VkEvent event;
Mike Stroyan09aae812015-05-12 16:00:45 -06004696 VkResult err;
4697
4698 memset(&event_info, 0, sizeof(event_info));
4699 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4700
Chia-I Wu69f40122015-10-26 21:10:41 +08004701 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyan09aae812015-05-12 16:00:45 -06004702 ASSERT_VK_SUCCESS(err);
4703
Mike Stroyan09aae812015-05-12 16:00:45 -06004704 err = vkResetEvent(device(), event);
4705 ASSERT_VK_SUCCESS(err);
4706
4707 struct thread_data_struct data;
Chia-I Wu1f851912015-10-27 18:04:07 +08004708 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyan09aae812015-05-12 16:00:45 -06004709 data.event = event;
4710 data.bailout = false;
4711 m_errorMonitor->SetBailout(&data.bailout);
4712 // Add many entries to command buffer from another thread.
Mike Stroyan7016f4f2015-07-13 14:45:35 -06004713 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyan09aae812015-05-12 16:00:45 -06004714 // Add many entries to command buffer from this thread at the same time.
4715 AddToCommandBuffer(&data);
Mark Lobodzinskia0f061c2015-09-30 16:19:16 -06004716
Mike Stroyan7016f4f2015-07-13 14:45:35 -06004717 test_platform_thread_join(thread, NULL);
Chia-I Wu1f851912015-10-27 18:04:07 +08004718 commandBuffer.EndCommandBuffer();
Mike Stroyan09aae812015-05-12 16:00:45 -06004719
Mike Stroyan450b0572016-01-22 15:22:03 -07004720 m_errorMonitor->SetBailout(NULL);
4721
Chris Forbes34d775f2016-04-07 13:21:07 +12004722 m_errorMonitor->VerifyFound();
Mike Stroyan09aae812015-05-12 16:00:45 -06004723
Chia-I Wu69f40122015-10-26 21:10:41 +08004724 vkDestroyEvent(device(), event, NULL);
Mike Stroyan09aae812015-05-12 16:00:45 -06004725}
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06004726#endif // GTEST_IS_THREADSAFE
4727#endif // THREADING_TESTS
4728
Chris Forbes5af3bf22015-05-25 11:13:08 +12004729#if SHADER_CHECKER_TESTS
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004730TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -07004731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004732 "Shader is not SPIR-V");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06004733
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06004734 ASSERT_NO_FATAL_FAILURE(InitState());
4735 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4736
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06004737 VkShaderModule module;
4738 VkShaderModuleCreateInfo moduleCreateInfo;
4739 struct icd_spv_header spv;
4740
4741 spv.magic = ICD_SPV_MAGIC;
4742 spv.version = ICD_SPV_VERSION;
4743 spv.gen_magic = 0;
4744
4745 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
4746 moduleCreateInfo.pNext = NULL;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004747 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06004748 moduleCreateInfo.codeSize = 4;
4749 moduleCreateInfo.flags = 0;
Chia-I Wu69f40122015-10-26 21:10:41 +08004750 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06004751
Chris Forbes34d775f2016-04-07 13:21:07 +12004752 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06004753}
4754
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004755TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -07004756 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004757 "Shader is not SPIR-V");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06004758
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06004759 ASSERT_NO_FATAL_FAILURE(InitState());
4760 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4761
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06004762 VkShaderModule module;
4763 VkShaderModuleCreateInfo moduleCreateInfo;
4764 struct icd_spv_header spv;
4765
4766 spv.magic = ~ICD_SPV_MAGIC;
4767 spv.version = ICD_SPV_VERSION;
4768 spv.gen_magic = 0;
4769
4770 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
4771 moduleCreateInfo.pNext = NULL;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004772 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06004773 moduleCreateInfo.codeSize = sizeof(spv) + 10;
4774 moduleCreateInfo.flags = 0;
Chia-I Wu69f40122015-10-26 21:10:41 +08004775 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06004776
Chris Forbes34d775f2016-04-07 13:21:07 +12004777 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06004778}
4779
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004780TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -07004781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004782 "Shader is not SPIR-V");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06004783
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06004784 ASSERT_NO_FATAL_FAILURE(InitState());
4785 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4786
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06004787 VkShaderModule module;
4788 VkShaderModuleCreateInfo moduleCreateInfo;
4789 struct icd_spv_header spv;
4790
4791 spv.magic = ICD_SPV_MAGIC;
4792 spv.version = ~ICD_SPV_VERSION;
4793 spv.gen_magic = 0;
4794
4795 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
4796 moduleCreateInfo.pNext = NULL;
4797
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004798 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06004799 moduleCreateInfo.codeSize = sizeof(spv) + 10;
4800 moduleCreateInfo.flags = 0;
Chia-I Wu69f40122015-10-26 21:10:41 +08004801 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06004802
Chris Forbes34d775f2016-04-07 13:21:07 +12004803 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06004804}
4805
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004806TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski5c13d4d2016-02-11 09:26:16 -07004807 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004808 "not consumed by fragment shader");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06004809
Chris Forbes5af3bf22015-05-25 11:13:08 +12004810 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisf2f97402015-09-11 12:57:55 -06004811 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes5af3bf22015-05-25 11:13:08 +12004812
4813 char const *vsSource =
Chris Forbes43494042016-04-04 17:28:05 +12004814 "#version 450\n"
Chris Forbes5af3bf22015-05-25 11:13:08 +12004815 "\n"
4816 "layout(location=0) out float x;\n"
Tony Barbour19b5f922016-01-05 13:37:45 -07004817 "out gl_PerVertex {\n"
4818 " vec4 gl_Position;\n"
4819 "};\n"
Chris Forbes5af3bf22015-05-25 11:13:08 +12004820 "void main(){\n"
4821 " gl_Position = vec4(1);\n"
4822 " x = 0;\n"
4823 "}\n";
4824 char const *fsSource =
Chris Forbes43494042016-04-04 17:28:05 +12004825 "#version 450\n"
Chris Forbes5af3bf22015-05-25 11:13:08 +12004826 "\n"
4827 "layout(location=0) out vec4 color;\n"
4828 "void main(){\n"
4829 " color = vec4(1);\n"
4830 "}\n";
4831
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06004832 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4833 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes5af3bf22015-05-25 11:13:08 +12004834
4835 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08004836 pipe.AddColorAttachment();
Chris Forbes5af3bf22015-05-25 11:13:08 +12004837 pipe.AddShader(&vs);
4838 pipe.AddShader(&fs);
4839
Chris Forbes5af3bf22015-05-25 11:13:08 +12004840 VkDescriptorSetObj descriptorSet(m_device);
4841 descriptorSet.AppendDummy();
Chia-I Wu1f851912015-10-27 18:04:07 +08004842 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes5af3bf22015-05-25 11:13:08 +12004843
Tony Barboured132432015-08-04 16:23:11 -06004844 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes5af3bf22015-05-25 11:13:08 +12004845
Chris Forbes34d775f2016-04-07 13:21:07 +12004846 m_errorMonitor->VerifyFound();
Chris Forbes5af3bf22015-05-25 11:13:08 +12004847}
Chris Forbes5af3bf22015-05-25 11:13:08 +12004848
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004849TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -07004850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004851 "not written by vertex shader");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06004852
Chris Forbes3c10b852015-05-25 11:13:13 +12004853 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisf2f97402015-09-11 12:57:55 -06004854 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes3c10b852015-05-25 11:13:13 +12004855
4856 char const *vsSource =
Chris Forbes43494042016-04-04 17:28:05 +12004857 "#version 450\n"
Chris Forbes3c10b852015-05-25 11:13:13 +12004858 "\n"
Tony Barbour19b5f922016-01-05 13:37:45 -07004859 "out gl_PerVertex {\n"
4860 " vec4 gl_Position;\n"
4861 "};\n"
Chris Forbes3c10b852015-05-25 11:13:13 +12004862 "void main(){\n"
4863 " gl_Position = vec4(1);\n"
4864 "}\n";
4865 char const *fsSource =
Chris Forbes43494042016-04-04 17:28:05 +12004866 "#version 450\n"
Chris Forbes3c10b852015-05-25 11:13:13 +12004867 "\n"
4868 "layout(location=0) in float x;\n"
4869 "layout(location=0) out vec4 color;\n"
4870 "void main(){\n"
4871 " color = vec4(x);\n"
4872 "}\n";
4873
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06004874 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4875 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes3c10b852015-05-25 11:13:13 +12004876
4877 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08004878 pipe.AddColorAttachment();
Chris Forbes3c10b852015-05-25 11:13:13 +12004879 pipe.AddShader(&vs);
4880 pipe.AddShader(&fs);
4881
Chris Forbes3c10b852015-05-25 11:13:13 +12004882 VkDescriptorSetObj descriptorSet(m_device);
4883 descriptorSet.AppendDummy();
Chia-I Wu1f851912015-10-27 18:04:07 +08004884 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes3c10b852015-05-25 11:13:13 +12004885
Tony Barboured132432015-08-04 16:23:11 -06004886 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes3c10b852015-05-25 11:13:13 +12004887
Chris Forbes34d775f2016-04-07 13:21:07 +12004888 m_errorMonitor->VerifyFound();
Chris Forbes3c10b852015-05-25 11:13:13 +12004889}
4890
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004891TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbes780820a2016-01-15 14:53:11 +13004892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004893 "not written by vertex shader");
Chris Forbes780820a2016-01-15 14:53:11 +13004894
4895 ASSERT_NO_FATAL_FAILURE(InitState());
4896 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4897
4898 char const *vsSource =
Chris Forbes43494042016-04-04 17:28:05 +12004899 "#version 450\n"
Chris Forbes780820a2016-01-15 14:53:11 +13004900 "\n"
4901 "out gl_PerVertex {\n"
4902 " vec4 gl_Position;\n"
4903 "};\n"
4904 "void main(){\n"
4905 " gl_Position = vec4(1);\n"
4906 "}\n";
4907 char const *fsSource =
4908 "#version 450\n"
Chris Forbes780820a2016-01-15 14:53:11 +13004909 "\n"
4910 "in block { layout(location=0) float x; } ins;\n"
4911 "layout(location=0) out vec4 color;\n"
4912 "void main(){\n"
4913 " color = vec4(ins.x);\n"
4914 "}\n";
4915
4916 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4917 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4918
4919 VkPipelineObj pipe(m_device);
4920 pipe.AddColorAttachment();
4921 pipe.AddShader(&vs);
4922 pipe.AddShader(&fs);
4923
4924 VkDescriptorSetObj descriptorSet(m_device);
4925 descriptorSet.AppendDummy();
4926 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
4927
4928 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
4929
Chris Forbes34d775f2016-04-07 13:21:07 +12004930 m_errorMonitor->VerifyFound();
Chris Forbes780820a2016-01-15 14:53:11 +13004931}
4932
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004933TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbesf14d10d2016-01-26 14:19:49 +13004934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbes12c72a42016-02-17 14:44:52 +13004935 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004936 "output arr[2] of float32' vs 'ptr to "
4937 "input arr[3] of float32'");
Chris Forbesf14d10d2016-01-26 14:19:49 +13004938
4939 ASSERT_NO_FATAL_FAILURE(InitState());
4940 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4941
4942 char const *vsSource =
Chris Forbes43494042016-04-04 17:28:05 +12004943 "#version 450\n"
Chris Forbesf14d10d2016-01-26 14:19:49 +13004944 "\n"
4945 "layout(location=0) out float x[2];\n"
4946 "out gl_PerVertex {\n"
4947 " vec4 gl_Position;\n"
4948 "};\n"
4949 "void main(){\n"
4950 " x[0] = 0; x[1] = 0;\n"
4951 " gl_Position = vec4(1);\n"
4952 "}\n";
4953 char const *fsSource =
Chris Forbes43494042016-04-04 17:28:05 +12004954 "#version 450\n"
Chris Forbesf14d10d2016-01-26 14:19:49 +13004955 "\n"
4956 "layout(location=0) in float x[3];\n"
4957 "layout(location=0) out vec4 color;\n"
4958 "void main(){\n"
4959 " color = vec4(x[0] + x[1] + x[2]);\n"
4960 "}\n";
4961
4962 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4963 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4964
4965 VkPipelineObj pipe(m_device);
4966 pipe.AddColorAttachment();
4967 pipe.AddShader(&vs);
4968 pipe.AddShader(&fs);
4969
4970 VkDescriptorSetObj descriptorSet(m_device);
4971 descriptorSet.AppendDummy();
4972 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
4973
4974 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
4975
Chris Forbes34d775f2016-04-07 13:21:07 +12004976 m_errorMonitor->VerifyFound();
Chris Forbesf14d10d2016-01-26 14:19:49 +13004977}
4978
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004979TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -07004980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07004981 "Type mismatch on location 0");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06004982
Chris Forbescc281692015-05-25 11:13:17 +12004983 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisf2f97402015-09-11 12:57:55 -06004984 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbescc281692015-05-25 11:13:17 +12004985
4986 char const *vsSource =
Chris Forbes43494042016-04-04 17:28:05 +12004987 "#version 450\n"
Chris Forbescc281692015-05-25 11:13:17 +12004988 "\n"
4989 "layout(location=0) out int x;\n"
Tony Barbour19b5f922016-01-05 13:37:45 -07004990 "out gl_PerVertex {\n"
4991 " vec4 gl_Position;\n"
4992 "};\n"
Chris Forbescc281692015-05-25 11:13:17 +12004993 "void main(){\n"
4994 " x = 0;\n"
4995 " gl_Position = vec4(1);\n"
4996 "}\n";
4997 char const *fsSource =
Chris Forbes43494042016-04-04 17:28:05 +12004998 "#version 450\n"
Chris Forbescc281692015-05-25 11:13:17 +12004999 "\n"
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005000 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbescc281692015-05-25 11:13:17 +12005001 "layout(location=0) out vec4 color;\n"
5002 "void main(){\n"
5003 " color = vec4(x);\n"
5004 "}\n";
5005
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06005006 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5007 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbescc281692015-05-25 11:13:17 +12005008
5009 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08005010 pipe.AddColorAttachment();
Chris Forbescc281692015-05-25 11:13:17 +12005011 pipe.AddShader(&vs);
5012 pipe.AddShader(&fs);
5013
Chris Forbescc281692015-05-25 11:13:17 +12005014 VkDescriptorSetObj descriptorSet(m_device);
5015 descriptorSet.AppendDummy();
Chia-I Wu1f851912015-10-27 18:04:07 +08005016 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbescc281692015-05-25 11:13:17 +12005017
Tony Barboured132432015-08-04 16:23:11 -06005018 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbescc281692015-05-25 11:13:17 +12005019
Chris Forbes34d775f2016-04-07 13:21:07 +12005020 m_errorMonitor->VerifyFound();
Chris Forbescc281692015-05-25 11:13:17 +12005021}
5022
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005023TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbes780820a2016-01-15 14:53:11 +13005024 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005025 "Type mismatch on location 0");
Chris Forbes780820a2016-01-15 14:53:11 +13005026
5027 ASSERT_NO_FATAL_FAILURE(InitState());
5028 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5029
5030 char const *vsSource =
5031 "#version 450\n"
Chris Forbes780820a2016-01-15 14:53:11 +13005032 "\n"
5033 "out block { layout(location=0) int x; } outs;\n"
5034 "out gl_PerVertex {\n"
5035 " vec4 gl_Position;\n"
5036 "};\n"
5037 "void main(){\n"
5038 " outs.x = 0;\n"
5039 " gl_Position = vec4(1);\n"
5040 "}\n";
5041 char const *fsSource =
5042 "#version 450\n"
Chris Forbes780820a2016-01-15 14:53:11 +13005043 "\n"
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005044 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbes780820a2016-01-15 14:53:11 +13005045 "layout(location=0) out vec4 color;\n"
5046 "void main(){\n"
5047 " color = vec4(ins.x);\n"
5048 "}\n";
5049
5050 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5051 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5052
5053 VkPipelineObj pipe(m_device);
5054 pipe.AddColorAttachment();
5055 pipe.AddShader(&vs);
5056 pipe.AddShader(&fs);
5057
5058 VkDescriptorSetObj descriptorSet(m_device);
5059 descriptorSet.AppendDummy();
5060 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5061
5062 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5063
Chris Forbes34d775f2016-04-07 13:21:07 +12005064 m_errorMonitor->VerifyFound();
Chris Forbes12c72a42016-02-17 14:44:52 +13005065}
5066
5067TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
5068 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5069 "location 0.0 which is not written by vertex shader");
5070
5071 ASSERT_NO_FATAL_FAILURE(InitState());
5072 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5073
5074 char const *vsSource =
5075 "#version 450\n"
Chris Forbes12c72a42016-02-17 14:44:52 +13005076 "\n"
5077 "out block { layout(location=1) float x; } outs;\n"
5078 "out gl_PerVertex {\n"
5079 " vec4 gl_Position;\n"
5080 "};\n"
5081 "void main(){\n"
5082 " outs.x = 0;\n"
5083 " gl_Position = vec4(1);\n"
5084 "}\n";
5085 char const *fsSource =
5086 "#version 450\n"
Chris Forbes12c72a42016-02-17 14:44:52 +13005087 "\n"
5088 "in block { layout(location=0) float x; } ins;\n"
5089 "layout(location=0) out vec4 color;\n"
5090 "void main(){\n"
5091 " color = vec4(ins.x);\n"
5092 "}\n";
5093
5094 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5095 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5096
5097 VkPipelineObj pipe(m_device);
5098 pipe.AddColorAttachment();
5099 pipe.AddShader(&vs);
5100 pipe.AddShader(&fs);
5101
5102 VkDescriptorSetObj descriptorSet(m_device);
5103 descriptorSet.AppendDummy();
5104 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5105
5106 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5107
Chris Forbes34d775f2016-04-07 13:21:07 +12005108 m_errorMonitor->VerifyFound();
Chris Forbes12c72a42016-02-17 14:44:52 +13005109}
5110
5111TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
5112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5113 "location 0.1 which is not written by vertex shader");
5114
5115 ASSERT_NO_FATAL_FAILURE(InitState());
5116 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5117
5118 char const *vsSource =
5119 "#version 450\n"
Chris Forbes12c72a42016-02-17 14:44:52 +13005120 "\n"
5121 "out block { layout(location=0, component=0) float x; } outs;\n"
5122 "out gl_PerVertex {\n"
5123 " vec4 gl_Position;\n"
5124 "};\n"
5125 "void main(){\n"
5126 " outs.x = 0;\n"
5127 " gl_Position = vec4(1);\n"
5128 "}\n";
5129 char const *fsSource =
5130 "#version 450\n"
Chris Forbes12c72a42016-02-17 14:44:52 +13005131 "\n"
5132 "in block { layout(location=0, component=1) float x; } ins;\n"
5133 "layout(location=0) out vec4 color;\n"
5134 "void main(){\n"
5135 " color = vec4(ins.x);\n"
5136 "}\n";
5137
5138 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5139 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5140
5141 VkPipelineObj pipe(m_device);
5142 pipe.AddColorAttachment();
5143 pipe.AddShader(&vs);
5144 pipe.AddShader(&fs);
5145
5146 VkDescriptorSetObj descriptorSet(m_device);
5147 descriptorSet.AppendDummy();
5148 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5149
5150 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5151
Chris Forbes34d775f2016-04-07 13:21:07 +12005152 m_errorMonitor->VerifyFound();
Chris Forbes780820a2016-01-15 14:53:11 +13005153}
5154
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005155TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski5c13d4d2016-02-11 09:26:16 -07005156 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005157 "location 0 not consumed by VS");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06005158
Chris Forbes8291c052015-05-25 11:13:28 +12005159 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisf2f97402015-09-11 12:57:55 -06005160 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes8291c052015-05-25 11:13:28 +12005161
5162 VkVertexInputBindingDescription input_binding;
5163 memset(&input_binding, 0, sizeof(input_binding));
5164
5165 VkVertexInputAttributeDescription input_attrib;
5166 memset(&input_attrib, 0, sizeof(input_attrib));
5167 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5168
5169 char const *vsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005170 "#version 450\n"
Chris Forbes8291c052015-05-25 11:13:28 +12005171 "\n"
Tony Barbour19b5f922016-01-05 13:37:45 -07005172 "out gl_PerVertex {\n"
5173 " vec4 gl_Position;\n"
5174 "};\n"
Chris Forbes8291c052015-05-25 11:13:28 +12005175 "void main(){\n"
5176 " gl_Position = vec4(1);\n"
5177 "}\n";
5178 char const *fsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005179 "#version 450\n"
Chris Forbes8291c052015-05-25 11:13:28 +12005180 "\n"
5181 "layout(location=0) out vec4 color;\n"
5182 "void main(){\n"
5183 " color = vec4(1);\n"
5184 "}\n";
5185
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06005186 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5187 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes8291c052015-05-25 11:13:28 +12005188
5189 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08005190 pipe.AddColorAttachment();
Chris Forbes8291c052015-05-25 11:13:28 +12005191 pipe.AddShader(&vs);
5192 pipe.AddShader(&fs);
5193
5194 pipe.AddVertexInputBindings(&input_binding, 1);
5195 pipe.AddVertexInputAttribs(&input_attrib, 1);
5196
Chris Forbes8291c052015-05-25 11:13:28 +12005197 VkDescriptorSetObj descriptorSet(m_device);
5198 descriptorSet.AppendDummy();
Chia-I Wu1f851912015-10-27 18:04:07 +08005199 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes8291c052015-05-25 11:13:28 +12005200
Tony Barboured132432015-08-04 16:23:11 -06005201 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes8291c052015-05-25 11:13:28 +12005202
Chris Forbes34d775f2016-04-07 13:21:07 +12005203 m_errorMonitor->VerifyFound();
Chris Forbes8291c052015-05-25 11:13:28 +12005204}
5205
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005206TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski5c13d4d2016-02-11 09:26:16 -07005207 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005208 "location 0 not consumed by VS");
Chris Forbes5e42b882016-01-15 11:32:03 +13005209
5210 ASSERT_NO_FATAL_FAILURE(InitState());
5211 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5212
5213 VkVertexInputBindingDescription input_binding;
5214 memset(&input_binding, 0, sizeof(input_binding));
5215
5216 VkVertexInputAttributeDescription input_attrib;
5217 memset(&input_attrib, 0, sizeof(input_attrib));
5218 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5219
5220 char const *vsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005221 "#version 450\n"
Chris Forbes5e42b882016-01-15 11:32:03 +13005222 "\n"
5223 "layout(location=1) in float x;\n"
5224 "out gl_PerVertex {\n"
5225 " vec4 gl_Position;\n"
5226 "};\n"
5227 "void main(){\n"
5228 " gl_Position = vec4(x);\n"
5229 "}\n";
5230 char const *fsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005231 "#version 450\n"
Chris Forbes5e42b882016-01-15 11:32:03 +13005232 "\n"
5233 "layout(location=0) out vec4 color;\n"
5234 "void main(){\n"
5235 " color = vec4(1);\n"
5236 "}\n";
5237
5238 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5239 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5240
5241 VkPipelineObj pipe(m_device);
5242 pipe.AddColorAttachment();
5243 pipe.AddShader(&vs);
5244 pipe.AddShader(&fs);
5245
5246 pipe.AddVertexInputBindings(&input_binding, 1);
5247 pipe.AddVertexInputAttribs(&input_attrib, 1);
5248
5249 VkDescriptorSetObj descriptorSet(m_device);
5250 descriptorSet.AppendDummy();
5251 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5252
5253 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5254
Chris Forbes34d775f2016-04-07 13:21:07 +12005255 m_errorMonitor->VerifyFound();
Chris Forbes5e42b882016-01-15 11:32:03 +13005256}
5257
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005258TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
5259 m_errorMonitor->SetDesiredFailureMsg(
5260 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06005261 "VS consumes input at location 0 but not provided");
5262
Chris Forbes37367e62015-05-25 11:13:29 +12005263 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisf2f97402015-09-11 12:57:55 -06005264 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes37367e62015-05-25 11:13:29 +12005265
5266 char const *vsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005267 "#version 450\n"
Chris Forbes37367e62015-05-25 11:13:29 +12005268 "\n"
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005269 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barbour19b5f922016-01-05 13:37:45 -07005270 "out gl_PerVertex {\n"
5271 " vec4 gl_Position;\n"
5272 "};\n"
Chris Forbes37367e62015-05-25 11:13:29 +12005273 "void main(){\n"
5274 " gl_Position = x;\n"
5275 "}\n";
5276 char const *fsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005277 "#version 450\n"
Chris Forbes37367e62015-05-25 11:13:29 +12005278 "\n"
5279 "layout(location=0) out vec4 color;\n"
5280 "void main(){\n"
5281 " color = vec4(1);\n"
5282 "}\n";
5283
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06005284 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5285 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes37367e62015-05-25 11:13:29 +12005286
5287 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08005288 pipe.AddColorAttachment();
Chris Forbes37367e62015-05-25 11:13:29 +12005289 pipe.AddShader(&vs);
5290 pipe.AddShader(&fs);
5291
Chris Forbes37367e62015-05-25 11:13:29 +12005292 VkDescriptorSetObj descriptorSet(m_device);
5293 descriptorSet.AppendDummy();
Chia-I Wu1f851912015-10-27 18:04:07 +08005294 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes37367e62015-05-25 11:13:29 +12005295
Tony Barboured132432015-08-04 16:23:11 -06005296 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes37367e62015-05-25 11:13:29 +12005297
Chris Forbes34d775f2016-04-07 13:21:07 +12005298 m_errorMonitor->VerifyFound();
Chris Forbes37367e62015-05-25 11:13:29 +12005299}
5300
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005301TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
5302 m_errorMonitor->SetDesiredFailureMsg(
5303 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06005304 "location 0 does not match VS input type");
5305
Chris Forbesa4b02322015-05-25 11:13:31 +12005306 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisf2f97402015-09-11 12:57:55 -06005307 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa4b02322015-05-25 11:13:31 +12005308
5309 VkVertexInputBindingDescription input_binding;
5310 memset(&input_binding, 0, sizeof(input_binding));
5311
5312 VkVertexInputAttributeDescription input_attrib;
5313 memset(&input_attrib, 0, sizeof(input_attrib));
5314 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5315
5316 char const *vsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005317 "#version 450\n"
Chris Forbesa4b02322015-05-25 11:13:31 +12005318 "\n"
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005319 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barbour19b5f922016-01-05 13:37:45 -07005320 "out gl_PerVertex {\n"
5321 " vec4 gl_Position;\n"
5322 "};\n"
Chris Forbesa4b02322015-05-25 11:13:31 +12005323 "void main(){\n"
5324 " gl_Position = vec4(x);\n"
5325 "}\n";
5326 char const *fsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005327 "#version 450\n"
Chris Forbesa4b02322015-05-25 11:13:31 +12005328 "\n"
5329 "layout(location=0) out vec4 color;\n"
5330 "void main(){\n"
5331 " color = vec4(1);\n"
5332 "}\n";
5333
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06005334 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5335 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa4b02322015-05-25 11:13:31 +12005336
5337 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08005338 pipe.AddColorAttachment();
Chris Forbesa4b02322015-05-25 11:13:31 +12005339 pipe.AddShader(&vs);
5340 pipe.AddShader(&fs);
5341
5342 pipe.AddVertexInputBindings(&input_binding, 1);
5343 pipe.AddVertexInputAttribs(&input_attrib, 1);
5344
Chris Forbesa4b02322015-05-25 11:13:31 +12005345 VkDescriptorSetObj descriptorSet(m_device);
5346 descriptorSet.AppendDummy();
Chia-I Wu1f851912015-10-27 18:04:07 +08005347 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa4b02322015-05-25 11:13:31 +12005348
Tony Barboured132432015-08-04 16:23:11 -06005349 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa4b02322015-05-25 11:13:31 +12005350
Chris Forbes34d775f2016-04-07 13:21:07 +12005351 m_errorMonitor->VerifyFound();
Chris Forbesa4b02322015-05-25 11:13:31 +12005352}
5353
Chris Forbes7230f2b2016-04-06 11:18:47 +12005354TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
5355 m_errorMonitor->SetDesiredFailureMsg(
5356 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5357 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
5358
5359 ASSERT_NO_FATAL_FAILURE(InitState());
5360 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5361
5362 char const *vsSource =
5363 "#version 450\n"
5364 "\n"
5365 "out gl_PerVertex {\n"
5366 " vec4 gl_Position;\n"
5367 "};\n"
5368 "void main(){\n"
5369 " gl_Position = vec4(1);\n"
5370 "}\n";
5371 char const *fsSource =
5372 "#version 450\n"
5373 "\n"
5374 "layout(location=0) out vec4 color;\n"
5375 "void main(){\n"
5376 " color = vec4(1);\n"
5377 "}\n";
5378
5379 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5380 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5381
5382 VkPipelineObj pipe(m_device);
5383 pipe.AddColorAttachment();
5384 pipe.AddShader(&vs);
5385 pipe.AddShader(&vs);
5386 pipe.AddShader(&fs);
5387
5388 VkDescriptorSetObj descriptorSet(m_device);
5389 descriptorSet.AppendDummy();
5390 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5391
5392 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5393
Chris Forbes34d775f2016-04-07 13:21:07 +12005394 m_errorMonitor->VerifyFound();
Chris Forbes7230f2b2016-04-06 11:18:47 +12005395}
5396
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005397TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes34d775f2016-04-07 13:21:07 +12005398 m_errorMonitor->ExpectSuccess();
Chris Forbes03e6d762015-11-24 11:13:14 +13005399
5400 ASSERT_NO_FATAL_FAILURE(InitState());
5401 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5402
5403 VkVertexInputBindingDescription input_binding;
5404 memset(&input_binding, 0, sizeof(input_binding));
5405
5406 VkVertexInputAttributeDescription input_attribs[2];
5407 memset(input_attribs, 0, sizeof(input_attribs));
5408
5409 for (int i = 0; i < 2; i++) {
5410 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
5411 input_attribs[i].location = i;
5412 }
5413
5414 char const *vsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005415 "#version 450\n"
Chris Forbes03e6d762015-11-24 11:13:14 +13005416 "\n"
5417 "layout(location=0) in mat2x4 x;\n"
Tony Barbour19b5f922016-01-05 13:37:45 -07005418 "out gl_PerVertex {\n"
5419 " vec4 gl_Position;\n"
5420 "};\n"
Chris Forbes03e6d762015-11-24 11:13:14 +13005421 "void main(){\n"
5422 " gl_Position = x[0] + x[1];\n"
5423 "}\n";
5424 char const *fsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005425 "#version 450\n"
Chris Forbes03e6d762015-11-24 11:13:14 +13005426 "\n"
5427 "layout(location=0) out vec4 color;\n"
5428 "void main(){\n"
5429 " color = vec4(1);\n"
5430 "}\n";
5431
5432 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5433 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5434
5435 VkPipelineObj pipe(m_device);
5436 pipe.AddColorAttachment();
5437 pipe.AddShader(&vs);
5438 pipe.AddShader(&fs);
5439
5440 pipe.AddVertexInputBindings(&input_binding, 1);
5441 pipe.AddVertexInputAttribs(input_attribs, 2);
5442
5443 VkDescriptorSetObj descriptorSet(m_device);
5444 descriptorSet.AppendDummy();
5445 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5446
5447 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5448
5449 /* expect success */
Chris Forbes34d775f2016-04-07 13:21:07 +12005450 m_errorMonitor->VerifyNotFound();
Chris Forbes03e6d762015-11-24 11:13:14 +13005451}
5452
Chris Forbes03e6d762015-11-24 11:13:14 +13005453TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
5454{
Chris Forbes34d775f2016-04-07 13:21:07 +12005455 m_errorMonitor->ExpectSuccess();
Chris Forbes03e6d762015-11-24 11:13:14 +13005456
5457 ASSERT_NO_FATAL_FAILURE(InitState());
5458 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5459
5460 VkVertexInputBindingDescription input_binding;
5461 memset(&input_binding, 0, sizeof(input_binding));
5462
5463 VkVertexInputAttributeDescription input_attribs[2];
5464 memset(input_attribs, 0, sizeof(input_attribs));
5465
5466 for (int i = 0; i < 2; i++) {
5467 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
5468 input_attribs[i].location = i;
5469 }
5470
5471 char const *vsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005472 "#version 450\n"
Chris Forbes03e6d762015-11-24 11:13:14 +13005473 "\n"
5474 "layout(location=0) in vec4 x[2];\n"
Tony Barbour19b5f922016-01-05 13:37:45 -07005475 "out gl_PerVertex {\n"
5476 " vec4 gl_Position;\n"
5477 "};\n"
Chris Forbes03e6d762015-11-24 11:13:14 +13005478 "void main(){\n"
5479 " gl_Position = x[0] + x[1];\n"
5480 "}\n";
5481 char const *fsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005482 "#version 450\n"
Chris Forbes03e6d762015-11-24 11:13:14 +13005483 "\n"
5484 "layout(location=0) out vec4 color;\n"
5485 "void main(){\n"
5486 " color = vec4(1);\n"
5487 "}\n";
5488
5489 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5490 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5491
5492 VkPipelineObj pipe(m_device);
5493 pipe.AddColorAttachment();
5494 pipe.AddShader(&vs);
5495 pipe.AddShader(&fs);
5496
5497 pipe.AddVertexInputBindings(&input_binding, 1);
5498 pipe.AddVertexInputAttribs(input_attribs, 2);
5499
5500 VkDescriptorSetObj descriptorSet(m_device);
5501 descriptorSet.AppendDummy();
5502 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5503
5504 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5505
Chris Forbes34d775f2016-04-07 13:21:07 +12005506 m_errorMonitor->VerifyNotFound();
Chris Forbes03e6d762015-11-24 11:13:14 +13005507}
Chris Forbes03e6d762015-11-24 11:13:14 +13005508
Chris Forbesf7782162016-04-04 18:52:54 +12005509TEST_F(VkLayerTest, CreatePipelineSimplePositive)
5510{
Chris Forbes34d775f2016-04-07 13:21:07 +12005511 m_errorMonitor->ExpectSuccess();
Chris Forbesf7782162016-04-04 18:52:54 +12005512
5513 ASSERT_NO_FATAL_FAILURE(InitState());
5514 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5515
5516 char const *vsSource =
5517 "#version 450\n"
5518 "out gl_PerVertex {\n"
5519 " vec4 gl_Position;\n"
5520 "};\n"
5521 "void main(){\n"
5522 " gl_Position = vec4(0);\n"
5523 "}\n";
5524 char const *fsSource =
5525 "#version 450\n"
5526 "\n"
5527 "layout(location=0) out vec4 color;\n"
5528 "void main(){\n"
5529 " color = vec4(1);\n"
5530 "}\n";
5531
5532 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5533 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5534
5535 VkPipelineObj pipe(m_device);
5536 pipe.AddColorAttachment();
5537 pipe.AddShader(&vs);
5538 pipe.AddShader(&fs);
5539
5540 VkDescriptorSetObj descriptorSet(m_device);
5541 descriptorSet.AppendDummy();
5542 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5543
5544 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5545
Chris Forbes34d775f2016-04-07 13:21:07 +12005546 m_errorMonitor->VerifyNotFound();
Chris Forbesf7782162016-04-04 18:52:54 +12005547}
5548
Chris Forbes84014d32016-04-05 17:50:35 +12005549TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
5550{
Chris Forbes34d775f2016-04-07 13:21:07 +12005551 m_errorMonitor->ExpectSuccess();
Chris Forbes84014d32016-04-05 17:50:35 +12005552
5553 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
5554
5555 ASSERT_NO_FATAL_FAILURE(InitState());
5556 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5557
5558 char const *vsSource =
5559 "#version 450\n"
5560 "out gl_PerVertex {\n"
5561 " vec4 gl_Position;\n"
5562 "};\n"
5563 "layout(location=0) out vec3 x;\n"
5564 "layout(location=1) out ivec3 y;\n"
5565 "layout(location=2) out vec3 z;\n"
5566 "void main(){\n"
5567 " gl_Position = vec4(0);\n"
5568 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
5569 "}\n";
5570 char const *fsSource =
5571 "#version 450\n"
5572 "\n"
5573 "layout(location=0) out vec4 color;\n"
5574 "layout(location=0) in float x;\n"
5575 "layout(location=1) flat in int y;\n"
5576 "layout(location=2) in vec2 z;\n"
5577 "void main(){\n"
5578 " color = vec4(1 + x + y + z.x);\n"
5579 "}\n";
5580
5581 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5582 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5583
5584 VkPipelineObj pipe(m_device);
5585 pipe.AddColorAttachment();
5586 pipe.AddShader(&vs);
5587 pipe.AddShader(&fs);
5588
5589 VkDescriptorSetObj descriptorSet(m_device);
5590 descriptorSet.AppendDummy();
5591 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5592
5593 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5594
Chris Forbes34d775f2016-04-07 13:21:07 +12005595 m_errorMonitor->VerifyNotFound();
Chris Forbes84014d32016-04-05 17:50:35 +12005596}
5597
Chris Forbesf7782162016-04-04 18:52:54 +12005598TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
5599{
Chris Forbes34d775f2016-04-07 13:21:07 +12005600 m_errorMonitor->ExpectSuccess();
Chris Forbesf7782162016-04-04 18:52:54 +12005601
5602 ASSERT_NO_FATAL_FAILURE(InitState());
5603 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5604
Chris Forbes0ce57ea2016-04-04 19:26:42 +12005605 if (!m_device->phy().features().tessellationShader) {
5606 printf("Device does not support tessellation shaders; skipped.\n");
5607 return;
5608 }
5609
Chris Forbesf7782162016-04-04 18:52:54 +12005610 char const *vsSource =
5611 "#version 450\n"
5612 "void main(){}\n";
5613 char const *tcsSource =
5614 "#version 450\n"
5615 "layout(location=0) out int x[];\n"
5616 "layout(vertices=3) out;\n"
5617 "void main(){\n"
5618 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
5619 " gl_TessLevelInner[0] = 1;\n"
5620 " x[gl_InvocationID] = gl_InvocationID;\n"
5621 "}\n";
5622 char const *tesSource =
5623 "#version 450\n"
5624 "layout(triangles, equal_spacing, cw) in;\n"
5625 "layout(location=0) in int x[];\n"
5626 "out gl_PerVertex { vec4 gl_Position; };\n"
5627 "void main(){\n"
5628 " gl_Position.xyz = gl_TessCoord;\n"
5629 " gl_Position.w = x[0] + x[1] + x[2];\n"
5630 "}\n";
5631 char const *fsSource =
5632 "#version 450\n"
5633 "layout(location=0) out vec4 color;\n"
5634 "void main(){\n"
5635 " color = vec4(1);\n"
5636 "}\n";
5637
5638 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5639 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
5640 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
5641 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5642
5643 VkPipelineInputAssemblyStateCreateInfo iasci{
5644 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
5645 nullptr,
5646 0,
5647 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
5648 VK_FALSE};
5649
Chris Forbes8c13a2e2016-04-04 19:15:00 +12005650 VkPipelineTessellationStateCreateInfo tsci{
5651 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
5652 nullptr,
5653 0,
5654 3};
5655
Chris Forbesf7782162016-04-04 18:52:54 +12005656 VkPipelineObj pipe(m_device);
5657 pipe.SetInputAssembly(&iasci);
Chris Forbes8c13a2e2016-04-04 19:15:00 +12005658 pipe.SetTessellation(&tsci);
Chris Forbesf7782162016-04-04 18:52:54 +12005659 pipe.AddColorAttachment();
5660 pipe.AddShader(&vs);
5661 pipe.AddShader(&tcs);
5662 pipe.AddShader(&tes);
5663 pipe.AddShader(&fs);
5664
5665 VkDescriptorSetObj descriptorSet(m_device);
5666 descriptorSet.AppendDummy();
5667 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5668
5669 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5670
Chris Forbes34d775f2016-04-07 13:21:07 +12005671 m_errorMonitor->VerifyNotFound();
Chris Forbesf7782162016-04-04 18:52:54 +12005672}
5673
Chris Forbesf706c502016-04-04 19:19:47 +12005674TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
5675{
5676 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5677 "is per-vertex in tessellation control shader stage "
5678 "but per-patch in tessellation evaluation shader stage");
5679
5680 ASSERT_NO_FATAL_FAILURE(InitState());
5681 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5682
Chris Forbes0ce57ea2016-04-04 19:26:42 +12005683 if (!m_device->phy().features().tessellationShader) {
5684 printf("Device does not support tessellation shaders; skipped.\n");
5685 return;
5686 }
5687
Chris Forbesf706c502016-04-04 19:19:47 +12005688 char const *vsSource =
5689 "#version 450\n"
5690 "void main(){}\n";
5691 char const *tcsSource =
5692 "#version 450\n"
5693 "layout(location=0) out int x[];\n"
5694 "layout(vertices=3) out;\n"
5695 "void main(){\n"
5696 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
5697 " gl_TessLevelInner[0] = 1;\n"
5698 " x[gl_InvocationID] = gl_InvocationID;\n"
5699 "}\n";
5700 char const *tesSource =
5701 "#version 450\n"
5702 "layout(triangles, equal_spacing, cw) in;\n"
5703 "layout(location=0) patch in int x;\n"
5704 "out gl_PerVertex { vec4 gl_Position; };\n"
5705 "void main(){\n"
5706 " gl_Position.xyz = gl_TessCoord;\n"
5707 " gl_Position.w = x;\n"
5708 "}\n";
5709 char const *fsSource =
5710 "#version 450\n"
5711 "layout(location=0) out vec4 color;\n"
5712 "void main(){\n"
5713 " color = vec4(1);\n"
5714 "}\n";
5715
5716 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5717 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
5718 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
5719 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5720
5721 VkPipelineInputAssemblyStateCreateInfo iasci{
5722 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
5723 nullptr,
5724 0,
5725 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
5726 VK_FALSE};
5727
5728 VkPipelineTessellationStateCreateInfo tsci{
5729 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
5730 nullptr,
5731 0,
5732 3};
5733
5734 VkPipelineObj pipe(m_device);
5735 pipe.SetInputAssembly(&iasci);
5736 pipe.SetTessellation(&tsci);
5737 pipe.AddColorAttachment();
5738 pipe.AddShader(&vs);
5739 pipe.AddShader(&tcs);
5740 pipe.AddShader(&tes);
5741 pipe.AddShader(&fs);
5742
5743 VkDescriptorSetObj descriptorSet(m_device);
5744 descriptorSet.AppendDummy();
5745 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5746
5747 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5748
Chris Forbes34d775f2016-04-07 13:21:07 +12005749 m_errorMonitor->VerifyFound();
Chris Forbesf706c502016-04-04 19:19:47 +12005750}
5751
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005752TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
5753 m_errorMonitor->SetDesiredFailureMsg(
5754 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06005755 "Duplicate vertex input binding descriptions for binding 0");
5756
Chris Forbes0bf8fe12015-06-12 11:16:41 +12005757 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisf2f97402015-09-11 12:57:55 -06005758 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes0bf8fe12015-06-12 11:16:41 +12005759
5760 /* Two binding descriptions for binding 0 */
5761 VkVertexInputBindingDescription input_bindings[2];
5762 memset(input_bindings, 0, sizeof(input_bindings));
5763
5764 VkVertexInputAttributeDescription input_attrib;
5765 memset(&input_attrib, 0, sizeof(input_attrib));
5766 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5767
5768 char const *vsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005769 "#version 450\n"
Chris Forbes0bf8fe12015-06-12 11:16:41 +12005770 "\n"
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005771 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barbour19b5f922016-01-05 13:37:45 -07005772 "out gl_PerVertex {\n"
5773 " vec4 gl_Position;\n"
5774 "};\n"
Chris Forbes0bf8fe12015-06-12 11:16:41 +12005775 "void main(){\n"
5776 " gl_Position = vec4(x);\n"
5777 "}\n";
5778 char const *fsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005779 "#version 450\n"
Chris Forbes0bf8fe12015-06-12 11:16:41 +12005780 "\n"
5781 "layout(location=0) out vec4 color;\n"
5782 "void main(){\n"
5783 " color = vec4(1);\n"
5784 "}\n";
5785
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06005786 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5787 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12005788
5789 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08005790 pipe.AddColorAttachment();
Chris Forbes0bf8fe12015-06-12 11:16:41 +12005791 pipe.AddShader(&vs);
5792 pipe.AddShader(&fs);
5793
5794 pipe.AddVertexInputBindings(input_bindings, 2);
5795 pipe.AddVertexInputAttribs(&input_attrib, 1);
5796
Chris Forbes0bf8fe12015-06-12 11:16:41 +12005797 VkDescriptorSetObj descriptorSet(m_device);
5798 descriptorSet.AppendDummy();
Chia-I Wu1f851912015-10-27 18:04:07 +08005799 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12005800
Tony Barboured132432015-08-04 16:23:11 -06005801 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes0bf8fe12015-06-12 11:16:41 +12005802
Chris Forbes34d775f2016-04-07 13:21:07 +12005803 m_errorMonitor->VerifyFound();
Chris Forbes0bf8fe12015-06-12 11:16:41 +12005804}
Chris Forbes4c948702015-05-25 11:13:32 +12005805
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005806TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -07005807 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005808 "Attachment 0 not written by FS");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06005809
Chris Forbesc12ef122015-05-25 11:13:40 +12005810 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc12ef122015-05-25 11:13:40 +12005811
5812 char const *vsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005813 "#version 450\n"
Chris Forbesc12ef122015-05-25 11:13:40 +12005814 "\n"
Tony Barbour19b5f922016-01-05 13:37:45 -07005815 "out gl_PerVertex {\n"
5816 " vec4 gl_Position;\n"
5817 "};\n"
Chris Forbesc12ef122015-05-25 11:13:40 +12005818 "void main(){\n"
5819 " gl_Position = vec4(1);\n"
5820 "}\n";
5821 char const *fsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005822 "#version 450\n"
Chris Forbesc12ef122015-05-25 11:13:40 +12005823 "\n"
5824 "void main(){\n"
5825 "}\n";
5826
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06005827 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5828 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc12ef122015-05-25 11:13:40 +12005829
5830 VkPipelineObj pipe(m_device);
5831 pipe.AddShader(&vs);
5832 pipe.AddShader(&fs);
5833
Chia-I Wuc278df82015-07-07 11:50:03 +08005834 /* set up CB 0, not written */
5835 pipe.AddColorAttachment();
5836 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc12ef122015-05-25 11:13:40 +12005837
Chris Forbesc12ef122015-05-25 11:13:40 +12005838 VkDescriptorSetObj descriptorSet(m_device);
5839 descriptorSet.AppendDummy();
Chia-I Wu1f851912015-10-27 18:04:07 +08005840 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc12ef122015-05-25 11:13:40 +12005841
Tony Barboured132432015-08-04 16:23:11 -06005842 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc12ef122015-05-25 11:13:40 +12005843
Chris Forbes34d775f2016-04-07 13:21:07 +12005844 m_errorMonitor->VerifyFound();
Chris Forbesc12ef122015-05-25 11:13:40 +12005845}
5846
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005847TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005848 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski5c13d4d2016-02-11 09:26:16 -07005849 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06005850 "FS writes to output location 1 with no matching attachment");
5851
Chris Forbes5d15a4f2015-05-25 11:13:43 +12005852 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes5d15a4f2015-05-25 11:13:43 +12005853
5854 char const *vsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005855 "#version 450\n"
Chris Forbes5d15a4f2015-05-25 11:13:43 +12005856 "\n"
Tony Barbour19b5f922016-01-05 13:37:45 -07005857 "out gl_PerVertex {\n"
5858 " vec4 gl_Position;\n"
5859 "};\n"
Chris Forbes5d15a4f2015-05-25 11:13:43 +12005860 "void main(){\n"
5861 " gl_Position = vec4(1);\n"
5862 "}\n";
5863 char const *fsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005864 "#version 450\n"
Chris Forbes5d15a4f2015-05-25 11:13:43 +12005865 "\n"
5866 "layout(location=0) out vec4 x;\n"
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005867 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbes5d15a4f2015-05-25 11:13:43 +12005868 "void main(){\n"
5869 " x = vec4(1);\n"
5870 " y = vec4(1);\n"
5871 "}\n";
5872
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06005873 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5874 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12005875
5876 VkPipelineObj pipe(m_device);
5877 pipe.AddShader(&vs);
5878 pipe.AddShader(&fs);
5879
Chia-I Wuc278df82015-07-07 11:50:03 +08005880 /* set up CB 0, not written */
5881 pipe.AddColorAttachment();
5882 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes5d15a4f2015-05-25 11:13:43 +12005883 /* FS writes CB 1, but we don't configure it */
5884
Chris Forbes5d15a4f2015-05-25 11:13:43 +12005885 VkDescriptorSetObj descriptorSet(m_device);
5886 descriptorSet.AppendDummy();
Chia-I Wu1f851912015-10-27 18:04:07 +08005887 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12005888
Tony Barboured132432015-08-04 16:23:11 -06005889 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes5d15a4f2015-05-25 11:13:43 +12005890
Chris Forbes34d775f2016-04-07 13:21:07 +12005891 m_errorMonitor->VerifyFound();
Chris Forbes5d15a4f2015-05-25 11:13:43 +12005892}
5893
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005894TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -07005895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005896 "does not match FS output type");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06005897
Chris Forbes7d64a4f2015-05-25 11:13:44 +12005898 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes7d64a4f2015-05-25 11:13:44 +12005899
5900 char const *vsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005901 "#version 450\n"
Chris Forbes7d64a4f2015-05-25 11:13:44 +12005902 "\n"
Tony Barbour19b5f922016-01-05 13:37:45 -07005903 "out gl_PerVertex {\n"
5904 " vec4 gl_Position;\n"
5905 "};\n"
Chris Forbes7d64a4f2015-05-25 11:13:44 +12005906 "void main(){\n"
5907 " gl_Position = vec4(1);\n"
5908 "}\n";
5909 char const *fsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005910 "#version 450\n"
Chris Forbes7d64a4f2015-05-25 11:13:44 +12005911 "\n"
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005912 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbes7d64a4f2015-05-25 11:13:44 +12005913 "void main(){\n"
5914 " x = ivec4(1);\n"
5915 "}\n";
5916
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06005917 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5918 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12005919
5920 VkPipelineObj pipe(m_device);
5921 pipe.AddShader(&vs);
5922 pipe.AddShader(&fs);
5923
Chia-I Wuc278df82015-07-07 11:50:03 +08005924 /* set up CB 0; type is UNORM by default */
5925 pipe.AddColorAttachment();
5926 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes7d64a4f2015-05-25 11:13:44 +12005927
Chris Forbes7d64a4f2015-05-25 11:13:44 +12005928 VkDescriptorSetObj descriptorSet(m_device);
5929 descriptorSet.AppendDummy();
Chia-I Wu1f851912015-10-27 18:04:07 +08005930 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12005931
Tony Barboured132432015-08-04 16:23:11 -06005932 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes7d64a4f2015-05-25 11:13:44 +12005933
Chris Forbes34d775f2016-04-07 13:21:07 +12005934 m_errorMonitor->VerifyFound();
Chris Forbes7d64a4f2015-05-25 11:13:44 +12005935}
Chris Forbesc2050732015-06-05 14:43:36 +12005936
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005937TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -07005938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07005939 "not declared in pipeline layout");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06005940
Chris Forbes76ce7882015-08-14 12:04:59 +12005941 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes76ce7882015-08-14 12:04:59 +12005942
5943 char const *vsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005944 "#version 450\n"
Chris Forbes76ce7882015-08-14 12:04:59 +12005945 "\n"
Tony Barbour19b5f922016-01-05 13:37:45 -07005946 "out gl_PerVertex {\n"
5947 " vec4 gl_Position;\n"
5948 "};\n"
Chris Forbes76ce7882015-08-14 12:04:59 +12005949 "void main(){\n"
5950 " gl_Position = vec4(1);\n"
5951 "}\n";
5952 char const *fsSource =
Chris Forbes43494042016-04-04 17:28:05 +12005953 "#version 450\n"
Chris Forbes76ce7882015-08-14 12:04:59 +12005954 "\n"
5955 "layout(location=0) out vec4 x;\n"
5956 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5957 "void main(){\n"
5958 " x = vec4(bar.y);\n"
5959 "}\n";
5960
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06005961 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5962 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes76ce7882015-08-14 12:04:59 +12005963
Chris Forbes76ce7882015-08-14 12:04:59 +12005964 VkPipelineObj pipe(m_device);
5965 pipe.AddShader(&vs);
5966 pipe.AddShader(&fs);
5967
5968 /* set up CB 0; type is UNORM by default */
5969 pipe.AddColorAttachment();
5970 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5971
5972 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1f851912015-10-27 18:04:07 +08005973 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes76ce7882015-08-14 12:04:59 +12005974
5975 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5976
Chris Forbes34d775f2016-04-07 13:21:07 +12005977 m_errorMonitor->VerifyFound();
Chris Forbes76ce7882015-08-14 12:04:59 +12005978}
5979
Chris Forbes680e9b72016-02-26 16:56:09 +13005980TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
5981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5982 "not declared in layout");
5983
5984 ASSERT_NO_FATAL_FAILURE(InitState());
5985
5986 char const *vsSource =
5987 "#version 450\n"
Chris Forbes680e9b72016-02-26 16:56:09 +13005988 "\n"
5989 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
5990 "out gl_PerVertex {\n"
5991 " vec4 gl_Position;\n"
5992 "};\n"
5993 "void main(){\n"
5994 " gl_Position = vec4(consts.x);\n"
5995 "}\n";
5996 char const *fsSource =
5997 "#version 450\n"
Chris Forbes680e9b72016-02-26 16:56:09 +13005998 "\n"
5999 "layout(location=0) out vec4 x;\n"
6000 "void main(){\n"
6001 " x = vec4(1);\n"
6002 "}\n";
6003
6004 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6005 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6006
6007 VkPipelineObj pipe(m_device);
6008 pipe.AddShader(&vs);
6009 pipe.AddShader(&fs);
6010
6011 /* set up CB 0; type is UNORM by default */
6012 pipe.AddColorAttachment();
6013 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6014
6015 VkDescriptorSetObj descriptorSet(m_device);
6016 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6017
6018 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6019
6020 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes34d775f2016-04-07 13:21:07 +12006021 m_errorMonitor->VerifyFound();
Chris Forbes680e9b72016-02-26 16:56:09 +13006022}
6023
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06006024#endif // SHADER_CHECKER_TESTS
6025
6026#if DEVICE_LIMITS_TESTS
Mark Young5acffad2016-04-11 14:26:49 -06006027TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006028 m_errorMonitor->SetDesiredFailureMsg(
6029 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06006030 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -06006031
6032 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -06006033
6034 // Create an image
6035 VkImage image;
6036
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006037 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6038 const int32_t tex_width = 32;
6039 const int32_t tex_height = 32;
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -06006040
6041 VkImageCreateInfo image_create_info = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006042 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6043 image_create_info.pNext = NULL;
6044 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6045 image_create_info.format = tex_format;
6046 image_create_info.extent.width = tex_width;
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -06006047 image_create_info.extent.height = tex_height;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006048 image_create_info.extent.depth = 1;
6049 image_create_info.mipLevels = 1;
6050 image_create_info.arrayLayers = 1;
6051 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6052 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6053 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6054 image_create_info.flags = 0;
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -06006055
6056 // Introduce error by sending down a bogus width extent
6057 image_create_info.extent.width = 65536;
Chia-I Wu69f40122015-10-26 21:10:41 +08006058 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -06006059
Chris Forbes34d775f2016-04-07 13:21:07 +12006060 m_errorMonitor->VerifyFound();
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -06006061}
6062
Mark Young5acffad2016-04-11 14:26:49 -06006063TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
6064 m_errorMonitor->SetDesiredFailureMsg(
6065 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6066 "CreateImage extents is 0 for at least one required dimension");
6067
6068 ASSERT_NO_FATAL_FAILURE(InitState());
6069
6070 // Create an image
6071 VkImage image;
6072
6073 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6074 const int32_t tex_width = 32;
6075 const int32_t tex_height = 32;
6076
6077 VkImageCreateInfo image_create_info = {};
6078 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6079 image_create_info.pNext = NULL;
6080 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6081 image_create_info.format = tex_format;
6082 image_create_info.extent.width = tex_width;
6083 image_create_info.extent.height = tex_height;
6084 image_create_info.extent.depth = 1;
6085 image_create_info.mipLevels = 1;
6086 image_create_info.arrayLayers = 1;
6087 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6088 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6089 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6090 image_create_info.flags = 0;
6091
6092 // Introduce error by sending down a bogus width extent
6093 image_create_info.extent.width = 0;
6094 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6095
6096 m_errorMonitor->VerifyFound();
6097}
6098
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006099TEST_F(VkLayerTest, UpdateBufferAlignment) {
6100 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyan43909d82015-09-25 13:39:21 -06006101
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -07006102 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006103 "dstOffset, is not a multiple of 4");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06006104
Mike Stroyan43909d82015-09-25 13:39:21 -06006105 ASSERT_NO_FATAL_FAILURE(InitState());
6106
6107 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
6108 vk_testing::Buffer buffer;
6109 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
6110
6111 BeginCommandBuffer();
6112 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu1f851912015-10-27 18:04:07 +08006113 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes34d775f2016-04-07 13:21:07 +12006114 m_errorMonitor->VerifyFound();
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06006115
Mike Stroyan43909d82015-09-25 13:39:21 -06006116 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -07006117 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006118 "dataSize, is not a multiple of 4");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06006119
Chia-I Wu1f851912015-10-27 18:04:07 +08006120 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes34d775f2016-04-07 13:21:07 +12006121 m_errorMonitor->VerifyFound();
Mike Stroyan43909d82015-09-25 13:39:21 -06006122 EndCommandBuffer();
6123}
6124
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006125TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -07006126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006127 "dstOffset, is not a multiple of 4");
Mike Stroyan43909d82015-09-25 13:39:21 -06006128
6129 ASSERT_NO_FATAL_FAILURE(InitState());
6130
6131 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
6132 vk_testing::Buffer buffer;
6133 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
6134
6135 BeginCommandBuffer();
6136 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu1f851912015-10-27 18:04:07 +08006137 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes34d775f2016-04-07 13:21:07 +12006138 m_errorMonitor->VerifyFound();
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06006139
Mike Stroyan43909d82015-09-25 13:39:21 -06006140 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -07006141 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006142 "size, is not a multiple of 4");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06006143
Chia-I Wu1f851912015-10-27 18:04:07 +08006144 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06006145
Chris Forbes34d775f2016-04-07 13:21:07 +12006146 m_errorMonitor->VerifyFound();
6147
Mike Stroyan43909d82015-09-25 13:39:21 -06006148 EndCommandBuffer();
6149}
6150
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06006151#endif // DEVICE_LIMITS_TESTS
Chris Forbes7d64a4f2015-05-25 11:13:44 +12006152
Tobin Ehlis342b9bf2015-09-22 10:11:37 -06006153#if IMAGE_TESTS
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006154TEST_F(VkLayerTest, InvalidImageView) {
6155 VkResult err;
Tobin Ehlis342b9bf2015-09-22 10:11:37 -06006156
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006157 m_errorMonitor->SetDesiredFailureMsg(
6158 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06006159 "vkCreateImageView called with baseMipLevel 10 ");
6160
Tobin Ehlis342b9bf2015-09-22 10:11:37 -06006161 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis342b9bf2015-09-22 10:11:37 -06006162
Mike Stroyan43909d82015-09-25 13:39:21 -06006163 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006164 VkImage image;
Tobin Ehlis342b9bf2015-09-22 10:11:37 -06006165
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006166 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6167 const int32_t tex_width = 32;
6168 const int32_t tex_height = 32;
Tobin Ehlis342b9bf2015-09-22 10:11:37 -06006169
6170 VkImageCreateInfo image_create_info = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006171 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6172 image_create_info.pNext = NULL;
6173 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6174 image_create_info.format = tex_format;
6175 image_create_info.extent.width = tex_width;
6176 image_create_info.extent.height = tex_height;
6177 image_create_info.extent.depth = 1;
6178 image_create_info.mipLevels = 1;
6179 image_create_info.arrayLayers = 1;
6180 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6181 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6182 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6183 image_create_info.flags = 0;
Tobin Ehlis342b9bf2015-09-22 10:11:37 -06006184
Chia-I Wu69f40122015-10-26 21:10:41 +08006185 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis342b9bf2015-09-22 10:11:37 -06006186 ASSERT_VK_SUCCESS(err);
6187
6188 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006189 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6190 image_view_create_info.image = image;
6191 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6192 image_view_create_info.format = tex_format;
6193 image_view_create_info.subresourceRange.layerCount = 1;
6194 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
6195 image_view_create_info.subresourceRange.levelCount = 1;
6196 image_view_create_info.subresourceRange.aspectMask =
6197 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis342b9bf2015-09-22 10:11:37 -06006198
6199 VkImageView view;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006200 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
6201 &view);
Tobin Ehlis342b9bf2015-09-22 10:11:37 -06006202
Chris Forbes34d775f2016-04-07 13:21:07 +12006203 m_errorMonitor->VerifyFound();
Tobin Ehlis342b9bf2015-09-22 10:11:37 -06006204}
Mike Stroyan43909d82015-09-25 13:39:21 -06006205
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006206TEST_F(VkLayerTest, InvalidImageViewAspect) {
6207 VkResult err;
Mark Lobodzinskib4092de2015-10-23 14:20:31 -06006208
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -07006209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006210 "vkCreateImageView: Color image "
6211 "formats must have ONLY the "
6212 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06006213
Mark Lobodzinskib4092de2015-10-23 14:20:31 -06006214 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskib4092de2015-10-23 14:20:31 -06006215
6216 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006217 VkImage image;
Mark Lobodzinskib4092de2015-10-23 14:20:31 -06006218
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006219 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6220 const int32_t tex_width = 32;
6221 const int32_t tex_height = 32;
Mark Lobodzinskib4092de2015-10-23 14:20:31 -06006222
6223 VkImageCreateInfo image_create_info = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006224 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6225 image_create_info.pNext = NULL;
6226 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6227 image_create_info.format = tex_format;
6228 image_create_info.extent.width = tex_width;
6229 image_create_info.extent.height = tex_height;
6230 image_create_info.extent.depth = 1;
6231 image_create_info.mipLevels = 1;
6232 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6233 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6234 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6235 image_create_info.flags = 0;
Mark Lobodzinskib4092de2015-10-23 14:20:31 -06006236
Chia-I Wu69f40122015-10-26 21:10:41 +08006237 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskib4092de2015-10-23 14:20:31 -06006238 ASSERT_VK_SUCCESS(err);
6239
6240 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006241 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6242 image_view_create_info.image = image;
6243 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6244 image_view_create_info.format = tex_format;
6245 image_view_create_info.subresourceRange.baseMipLevel = 0;
6246 image_view_create_info.subresourceRange.levelCount = 1;
6247 // Cause an error by setting an invalid image aspect
6248 image_view_create_info.subresourceRange.aspectMask =
6249 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskib4092de2015-10-23 14:20:31 -06006250
6251 VkImageView view;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006252 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
6253 &view);
Mark Lobodzinskib4092de2015-10-23 14:20:31 -06006254
Chris Forbes34d775f2016-04-07 13:21:07 +12006255 m_errorMonitor->VerifyFound();
Mark Lobodzinskib4092de2015-10-23 14:20:31 -06006256}
6257
Mark Lobodzinski298f1c12016-03-31 10:45:56 -06006258TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006259 VkResult err;
6260 bool pass;
Mike Stroyan43909d82015-09-25 13:39:21 -06006261
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006262 m_errorMonitor->SetDesiredFailureMsg(
6263 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski298f1c12016-03-31 10:45:56 -06006264 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06006265
Mike Stroyan43909d82015-09-25 13:39:21 -06006266 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan43909d82015-09-25 13:39:21 -06006267
6268 // Create two images of different types and try to copy between them
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006269 VkImage srcImage;
6270 VkImage dstImage;
6271 VkDeviceMemory srcMem;
6272 VkDeviceMemory destMem;
6273 VkMemoryRequirements memReqs;
Mike Stroyan43909d82015-09-25 13:39:21 -06006274
6275 VkImageCreateInfo image_create_info = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006276 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6277 image_create_info.pNext = NULL;
6278 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6279 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6280 image_create_info.extent.width = 32;
6281 image_create_info.extent.height = 32;
6282 image_create_info.extent.depth = 1;
6283 image_create_info.mipLevels = 1;
Mark Lobodzinski298f1c12016-03-31 10:45:56 -06006284 image_create_info.arrayLayers = 4;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006285 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6286 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6287 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6288 image_create_info.flags = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006289
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006290 err =
6291 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyan43909d82015-09-25 13:39:21 -06006292 ASSERT_VK_SUCCESS(err);
6293
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006294 err =
6295 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyan43909d82015-09-25 13:39:21 -06006296 ASSERT_VK_SUCCESS(err);
6297
6298 // Allocate memory
Chia-I Wu1f851912015-10-27 18:04:07 +08006299 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006300 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6301 memAlloc.pNext = NULL;
6302 memAlloc.allocationSize = 0;
6303 memAlloc.memoryTypeIndex = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006304
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -06006305 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06006306 memAlloc.allocationSize = memReqs.size;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006307 pass =
6308 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06006309 ASSERT_TRUE(pass);
Chia-I Wu1f851912015-10-27 18:04:07 +08006310 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyan43909d82015-09-25 13:39:21 -06006311 ASSERT_VK_SUCCESS(err);
6312
Chia-I Wu1f851912015-10-27 18:04:07 +08006313 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06006314 memAlloc.allocationSize = memReqs.size;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006315 pass =
6316 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan43909d82015-09-25 13:39:21 -06006317 ASSERT_VK_SUCCESS(err);
Chia-I Wu1f851912015-10-27 18:04:07 +08006318 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyan43909d82015-09-25 13:39:21 -06006319 ASSERT_VK_SUCCESS(err);
6320
6321 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6322 ASSERT_VK_SUCCESS(err);
Chia-I Wu1f851912015-10-27 18:04:07 +08006323 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyan43909d82015-09-25 13:39:21 -06006324 ASSERT_VK_SUCCESS(err);
6325
6326 BeginCommandBuffer();
6327 VkImageCopy copyRegion;
Chia-I Wu4291d882015-10-27 19:00:15 +08006328 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06006329 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06006330 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinski298f1c12016-03-31 10:45:56 -06006331 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyan43909d82015-09-25 13:39:21 -06006332 copyRegion.srcOffset.x = 0;
6333 copyRegion.srcOffset.y = 0;
6334 copyRegion.srcOffset.z = 0;
Chia-I Wu4291d882015-10-27 19:00:15 +08006335 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu1f851912015-10-27 18:04:07 +08006336 copyRegion.dstSubresource.mipLevel = 0;
6337 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinski298f1c12016-03-31 10:45:56 -06006338 // Introduce failure by forcing the dst layerCount to differ from src
6339 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu1f851912015-10-27 18:04:07 +08006340 copyRegion.dstOffset.x = 0;
6341 copyRegion.dstOffset.y = 0;
6342 copyRegion.dstOffset.z = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006343 copyRegion.extent.width = 1;
6344 copyRegion.extent.height = 1;
6345 copyRegion.extent.depth = 1;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006346 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6347 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyan43909d82015-09-25 13:39:21 -06006348 EndCommandBuffer();
6349
Chris Forbes34d775f2016-04-07 13:21:07 +12006350 m_errorMonitor->VerifyFound();
Mike Stroyan43909d82015-09-25 13:39:21 -06006351
Chia-I Wu69f40122015-10-26 21:10:41 +08006352 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu1f851912015-10-27 18:04:07 +08006353 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wu69f40122015-10-26 21:10:41 +08006354 vkFreeMemory(m_device->device(), srcMem, NULL);
6355 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyan43909d82015-09-25 13:39:21 -06006356}
6357
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006358TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultz772fcd12016-04-19 11:36:49 -06006359 VkResult err;
6360 bool pass;
6361
6362 // Create color images with different format sizes and try to copy between them
6363 m_errorMonitor->SetDesiredFailureMsg(
6364 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6365 "vkCmdCopyImage called with unmatched source and dest image format sizes");
6366
6367 ASSERT_NO_FATAL_FAILURE(InitState());
6368
6369 // Create two images of different types and try to copy between them
6370 VkImage srcImage;
6371 VkImage dstImage;
6372 VkDeviceMemory srcMem;
6373 VkDeviceMemory destMem;
6374 VkMemoryRequirements memReqs;
6375
6376 VkImageCreateInfo image_create_info = {};
6377 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6378 image_create_info.pNext = NULL;
6379 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6380 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6381 image_create_info.extent.width = 32;
6382 image_create_info.extent.height = 32;
6383 image_create_info.extent.depth = 1;
6384 image_create_info.mipLevels = 1;
6385 image_create_info.arrayLayers = 1;
6386 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6387 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6388 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6389 image_create_info.flags = 0;
6390
6391 err =
6392 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
6393 ASSERT_VK_SUCCESS(err);
6394
6395 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6396 // Introduce failure by creating second image with a different-sized format.
6397 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
6398
6399 err =
6400 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
6401 ASSERT_VK_SUCCESS(err);
6402
6403 // Allocate memory
6404 VkMemoryAllocateInfo memAlloc = {};
6405 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6406 memAlloc.pNext = NULL;
6407 memAlloc.allocationSize = 0;
6408 memAlloc.memoryTypeIndex = 0;
6409
6410 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
6411 memAlloc.allocationSize = memReqs.size;
6412 pass =
6413 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
6414 ASSERT_TRUE(pass);
6415 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
6416 ASSERT_VK_SUCCESS(err);
6417
6418 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
6419 memAlloc.allocationSize = memReqs.size;
6420 pass =
6421 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
6422 ASSERT_TRUE(pass);
6423 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
6424 ASSERT_VK_SUCCESS(err);
6425
6426 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6427 ASSERT_VK_SUCCESS(err);
6428 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
6429 ASSERT_VK_SUCCESS(err);
6430
6431 BeginCommandBuffer();
6432 VkImageCopy copyRegion;
6433 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6434 copyRegion.srcSubresource.mipLevel = 0;
6435 copyRegion.srcSubresource.baseArrayLayer = 0;
6436 copyRegion.srcSubresource.layerCount = 0;
6437 copyRegion.srcOffset.x = 0;
6438 copyRegion.srcOffset.y = 0;
6439 copyRegion.srcOffset.z = 0;
6440 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6441 copyRegion.dstSubresource.mipLevel = 0;
6442 copyRegion.dstSubresource.baseArrayLayer = 0;
6443 copyRegion.dstSubresource.layerCount = 0;
6444 copyRegion.dstOffset.x = 0;
6445 copyRegion.dstOffset.y = 0;
6446 copyRegion.dstOffset.z = 0;
6447 copyRegion.extent.width = 1;
6448 copyRegion.extent.height = 1;
6449 copyRegion.extent.depth = 1;
6450 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6451 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6452 EndCommandBuffer();
6453
6454 m_errorMonitor->VerifyFound();
6455
6456 vkDestroyImage(m_device->device(), srcImage, NULL);
6457 vkDestroyImage(m_device->device(), dstImage, NULL);
6458 vkFreeMemory(m_device->device(), srcMem, NULL);
6459 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyan43909d82015-09-25 13:39:21 -06006460}
6461
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006462TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
6463 VkResult err;
6464 bool pass;
Mike Stroyan43909d82015-09-25 13:39:21 -06006465
Mark Lobodzinski298f1c12016-03-31 10:45:56 -06006466 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006467 m_errorMonitor->SetDesiredFailureMsg(
6468 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski298f1c12016-03-31 10:45:56 -06006469 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06006470
Mike Stroyan43909d82015-09-25 13:39:21 -06006471 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan43909d82015-09-25 13:39:21 -06006472
6473 // Create two images of different types and try to copy between them
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006474 VkImage srcImage;
6475 VkImage dstImage;
6476 VkDeviceMemory srcMem;
6477 VkDeviceMemory destMem;
6478 VkMemoryRequirements memReqs;
Mike Stroyan43909d82015-09-25 13:39:21 -06006479
6480 VkImageCreateInfo image_create_info = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006481 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6482 image_create_info.pNext = NULL;
6483 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6484 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6485 image_create_info.extent.width = 32;
6486 image_create_info.extent.height = 32;
6487 image_create_info.extent.depth = 1;
6488 image_create_info.mipLevels = 1;
6489 image_create_info.arrayLayers = 1;
6490 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6491 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6492 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6493 image_create_info.flags = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006494
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006495 err =
6496 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyan43909d82015-09-25 13:39:21 -06006497 ASSERT_VK_SUCCESS(err);
6498
Karl Schultz772fcd12016-04-19 11:36:49 -06006499 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6500
Mark Lobodzinski298f1c12016-03-31 10:45:56 -06006501 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006502 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinski298f1c12016-03-31 10:45:56 -06006503 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
6504 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06006505
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006506 err =
6507 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyan43909d82015-09-25 13:39:21 -06006508 ASSERT_VK_SUCCESS(err);
6509
6510 // Allocate memory
Chia-I Wu1f851912015-10-27 18:04:07 +08006511 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006512 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6513 memAlloc.pNext = NULL;
6514 memAlloc.allocationSize = 0;
6515 memAlloc.memoryTypeIndex = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006516
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -06006517 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06006518 memAlloc.allocationSize = memReqs.size;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006519 pass =
6520 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06006521 ASSERT_TRUE(pass);
Chia-I Wu1f851912015-10-27 18:04:07 +08006522 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyan43909d82015-09-25 13:39:21 -06006523 ASSERT_VK_SUCCESS(err);
6524
Chia-I Wu1f851912015-10-27 18:04:07 +08006525 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06006526 memAlloc.allocationSize = memReqs.size;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006527 pass =
6528 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06006529 ASSERT_TRUE(pass);
Chia-I Wu1f851912015-10-27 18:04:07 +08006530 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyan43909d82015-09-25 13:39:21 -06006531 ASSERT_VK_SUCCESS(err);
6532
6533 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6534 ASSERT_VK_SUCCESS(err);
Chia-I Wu1f851912015-10-27 18:04:07 +08006535 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyan43909d82015-09-25 13:39:21 -06006536 ASSERT_VK_SUCCESS(err);
6537
6538 BeginCommandBuffer();
6539 VkImageCopy copyRegion;
Chia-I Wu4291d882015-10-27 19:00:15 +08006540 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06006541 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06006542 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu1f851912015-10-27 18:04:07 +08006543 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006544 copyRegion.srcOffset.x = 0;
6545 copyRegion.srcOffset.y = 0;
6546 copyRegion.srcOffset.z = 0;
Chia-I Wu4291d882015-10-27 19:00:15 +08006547 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu1f851912015-10-27 18:04:07 +08006548 copyRegion.dstSubresource.mipLevel = 0;
6549 copyRegion.dstSubresource.baseArrayLayer = 0;
6550 copyRegion.dstSubresource.layerCount = 0;
6551 copyRegion.dstOffset.x = 0;
6552 copyRegion.dstOffset.y = 0;
6553 copyRegion.dstOffset.z = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006554 copyRegion.extent.width = 1;
6555 copyRegion.extent.height = 1;
6556 copyRegion.extent.depth = 1;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006557 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6558 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyan43909d82015-09-25 13:39:21 -06006559 EndCommandBuffer();
6560
Chris Forbes34d775f2016-04-07 13:21:07 +12006561 m_errorMonitor->VerifyFound();
Mike Stroyan43909d82015-09-25 13:39:21 -06006562
Chia-I Wu69f40122015-10-26 21:10:41 +08006563 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu1f851912015-10-27 18:04:07 +08006564 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wu69f40122015-10-26 21:10:41 +08006565 vkFreeMemory(m_device->device(), srcMem, NULL);
6566 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyan43909d82015-09-25 13:39:21 -06006567}
6568
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006569TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
6570 VkResult err;
6571 bool pass;
Mike Stroyan43909d82015-09-25 13:39:21 -06006572
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006573 m_errorMonitor->SetDesiredFailureMsg(
6574 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06006575 "vkCmdResolveImage called with source sample count less than 2.");
6576
Mike Stroyan43909d82015-09-25 13:39:21 -06006577 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan43909d82015-09-25 13:39:21 -06006578
6579 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006580 VkImage srcImage;
6581 VkImage dstImage;
6582 VkDeviceMemory srcMem;
6583 VkDeviceMemory destMem;
6584 VkMemoryRequirements memReqs;
Mike Stroyan43909d82015-09-25 13:39:21 -06006585
6586 VkImageCreateInfo image_create_info = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006587 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6588 image_create_info.pNext = NULL;
6589 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6590 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6591 image_create_info.extent.width = 32;
6592 image_create_info.extent.height = 1;
6593 image_create_info.extent.depth = 1;
6594 image_create_info.mipLevels = 1;
6595 image_create_info.arrayLayers = 1;
6596 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6597 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6598 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6599 image_create_info.flags = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006600
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006601 err =
6602 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyan43909d82015-09-25 13:39:21 -06006603 ASSERT_VK_SUCCESS(err);
6604
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006605 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6606 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06006607
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006608 err =
6609 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyan43909d82015-09-25 13:39:21 -06006610 ASSERT_VK_SUCCESS(err);
6611
6612 // Allocate memory
Chia-I Wu1f851912015-10-27 18:04:07 +08006613 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006614 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6615 memAlloc.pNext = NULL;
6616 memAlloc.allocationSize = 0;
6617 memAlloc.memoryTypeIndex = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006618
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -06006619 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06006620 memAlloc.allocationSize = memReqs.size;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006621 pass =
6622 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06006623 ASSERT_TRUE(pass);
Chia-I Wu1f851912015-10-27 18:04:07 +08006624 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyan43909d82015-09-25 13:39:21 -06006625 ASSERT_VK_SUCCESS(err);
6626
Chia-I Wu1f851912015-10-27 18:04:07 +08006627 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06006628 memAlloc.allocationSize = memReqs.size;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006629 pass =
6630 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06006631 ASSERT_TRUE(pass);
Chia-I Wu1f851912015-10-27 18:04:07 +08006632 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyan43909d82015-09-25 13:39:21 -06006633 ASSERT_VK_SUCCESS(err);
6634
6635 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6636 ASSERT_VK_SUCCESS(err);
Chia-I Wu1f851912015-10-27 18:04:07 +08006637 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyan43909d82015-09-25 13:39:21 -06006638 ASSERT_VK_SUCCESS(err);
6639
6640 BeginCommandBuffer();
6641 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006642 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6643 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyan43909d82015-09-25 13:39:21 -06006644 VkImageResolve resolveRegion;
Chia-I Wu4291d882015-10-27 19:00:15 +08006645 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06006646 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06006647 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu1f851912015-10-27 18:04:07 +08006648 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006649 resolveRegion.srcOffset.x = 0;
6650 resolveRegion.srcOffset.y = 0;
6651 resolveRegion.srcOffset.z = 0;
Chia-I Wu4291d882015-10-27 19:00:15 +08006652 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu1f851912015-10-27 18:04:07 +08006653 resolveRegion.dstSubresource.mipLevel = 0;
6654 resolveRegion.dstSubresource.baseArrayLayer = 0;
6655 resolveRegion.dstSubresource.layerCount = 0;
6656 resolveRegion.dstOffset.x = 0;
6657 resolveRegion.dstOffset.y = 0;
6658 resolveRegion.dstOffset.z = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006659 resolveRegion.extent.width = 1;
6660 resolveRegion.extent.height = 1;
6661 resolveRegion.extent.depth = 1;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006662 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6663 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyan43909d82015-09-25 13:39:21 -06006664 EndCommandBuffer();
6665
Chris Forbes34d775f2016-04-07 13:21:07 +12006666 m_errorMonitor->VerifyFound();
Mike Stroyan43909d82015-09-25 13:39:21 -06006667
Chia-I Wu69f40122015-10-26 21:10:41 +08006668 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu1f851912015-10-27 18:04:07 +08006669 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wu69f40122015-10-26 21:10:41 +08006670 vkFreeMemory(m_device->device(), srcMem, NULL);
6671 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyan43909d82015-09-25 13:39:21 -06006672}
6673
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006674TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
6675 VkResult err;
6676 bool pass;
Mike Stroyan43909d82015-09-25 13:39:21 -06006677
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006678 m_errorMonitor->SetDesiredFailureMsg(
6679 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06006680 "vkCmdResolveImage called with dest sample count greater than 1.");
6681
Mike Stroyan43909d82015-09-25 13:39:21 -06006682 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan43909d82015-09-25 13:39:21 -06006683
6684 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006685 VkImage srcImage;
6686 VkImage dstImage;
6687 VkDeviceMemory srcMem;
6688 VkDeviceMemory destMem;
6689 VkMemoryRequirements memReqs;
Mike Stroyan43909d82015-09-25 13:39:21 -06006690
6691 VkImageCreateInfo image_create_info = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006692 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6693 image_create_info.pNext = NULL;
6694 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6695 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6696 image_create_info.extent.width = 32;
6697 image_create_info.extent.height = 1;
6698 image_create_info.extent.depth = 1;
6699 image_create_info.mipLevels = 1;
6700 image_create_info.arrayLayers = 1;
6701 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6702 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6703 // Note: Some implementations expect color attachment usage for any
6704 // multisample surface
6705 image_create_info.usage =
6706 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6707 image_create_info.flags = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006708
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006709 err =
6710 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyan43909d82015-09-25 13:39:21 -06006711 ASSERT_VK_SUCCESS(err);
6712
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006713 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6714 // Note: Some implementations expect color attachment usage for any
6715 // multisample surface
6716 image_create_info.usage =
6717 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06006718
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006719 err =
6720 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyan43909d82015-09-25 13:39:21 -06006721 ASSERT_VK_SUCCESS(err);
6722
6723 // Allocate memory
Chia-I Wu1f851912015-10-27 18:04:07 +08006724 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006725 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6726 memAlloc.pNext = NULL;
6727 memAlloc.allocationSize = 0;
6728 memAlloc.memoryTypeIndex = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006729
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -06006730 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06006731 memAlloc.allocationSize = memReqs.size;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006732 pass =
6733 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06006734 ASSERT_TRUE(pass);
Chia-I Wu1f851912015-10-27 18:04:07 +08006735 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyan43909d82015-09-25 13:39:21 -06006736 ASSERT_VK_SUCCESS(err);
6737
Chia-I Wu1f851912015-10-27 18:04:07 +08006738 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06006739 memAlloc.allocationSize = memReqs.size;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006740 pass =
6741 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06006742 ASSERT_TRUE(pass);
Chia-I Wu1f851912015-10-27 18:04:07 +08006743 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyan43909d82015-09-25 13:39:21 -06006744 ASSERT_VK_SUCCESS(err);
6745
6746 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6747 ASSERT_VK_SUCCESS(err);
Chia-I Wu1f851912015-10-27 18:04:07 +08006748 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyan43909d82015-09-25 13:39:21 -06006749 ASSERT_VK_SUCCESS(err);
6750
6751 BeginCommandBuffer();
6752 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006753 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6754 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyan43909d82015-09-25 13:39:21 -06006755 VkImageResolve resolveRegion;
Chia-I Wu4291d882015-10-27 19:00:15 +08006756 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06006757 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06006758 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu1f851912015-10-27 18:04:07 +08006759 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006760 resolveRegion.srcOffset.x = 0;
6761 resolveRegion.srcOffset.y = 0;
6762 resolveRegion.srcOffset.z = 0;
Chia-I Wu4291d882015-10-27 19:00:15 +08006763 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu1f851912015-10-27 18:04:07 +08006764 resolveRegion.dstSubresource.mipLevel = 0;
6765 resolveRegion.dstSubresource.baseArrayLayer = 0;
6766 resolveRegion.dstSubresource.layerCount = 0;
6767 resolveRegion.dstOffset.x = 0;
6768 resolveRegion.dstOffset.y = 0;
6769 resolveRegion.dstOffset.z = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006770 resolveRegion.extent.width = 1;
6771 resolveRegion.extent.height = 1;
6772 resolveRegion.extent.depth = 1;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006773 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6774 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyan43909d82015-09-25 13:39:21 -06006775 EndCommandBuffer();
6776
Chris Forbes34d775f2016-04-07 13:21:07 +12006777 m_errorMonitor->VerifyFound();
Mike Stroyan43909d82015-09-25 13:39:21 -06006778
Chia-I Wu69f40122015-10-26 21:10:41 +08006779 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu1f851912015-10-27 18:04:07 +08006780 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wu69f40122015-10-26 21:10:41 +08006781 vkFreeMemory(m_device->device(), srcMem, NULL);
6782 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyan43909d82015-09-25 13:39:21 -06006783}
6784
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006785TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
6786 VkResult err;
6787 bool pass;
Mike Stroyan43909d82015-09-25 13:39:21 -06006788
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006789 m_errorMonitor->SetDesiredFailureMsg(
6790 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06006791 "vkCmdResolveImage called with unmatched source and dest formats.");
6792
Mike Stroyan43909d82015-09-25 13:39:21 -06006793 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan43909d82015-09-25 13:39:21 -06006794
6795 // Create two images of different types and try to copy between them
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006796 VkImage srcImage;
6797 VkImage dstImage;
6798 VkDeviceMemory srcMem;
6799 VkDeviceMemory destMem;
6800 VkMemoryRequirements memReqs;
Mike Stroyan43909d82015-09-25 13:39:21 -06006801
6802 VkImageCreateInfo image_create_info = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006803 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6804 image_create_info.pNext = NULL;
6805 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6806 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6807 image_create_info.extent.width = 32;
6808 image_create_info.extent.height = 1;
6809 image_create_info.extent.depth = 1;
6810 image_create_info.mipLevels = 1;
6811 image_create_info.arrayLayers = 1;
6812 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6813 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6814 // Note: Some implementations expect color attachment usage for any
6815 // multisample surface
6816 image_create_info.usage =
6817 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6818 image_create_info.flags = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006819
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006820 err =
6821 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyan43909d82015-09-25 13:39:21 -06006822 ASSERT_VK_SUCCESS(err);
6823
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006824 // Set format to something other than source image
6825 image_create_info.format = VK_FORMAT_R32_SFLOAT;
6826 // Note: Some implementations expect color attachment usage for any
6827 // multisample surface
6828 image_create_info.usage =
6829 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6830 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06006831
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006832 err =
6833 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyan43909d82015-09-25 13:39:21 -06006834 ASSERT_VK_SUCCESS(err);
6835
6836 // Allocate memory
Chia-I Wu1f851912015-10-27 18:04:07 +08006837 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006838 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6839 memAlloc.pNext = NULL;
6840 memAlloc.allocationSize = 0;
6841 memAlloc.memoryTypeIndex = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006842
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -06006843 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06006844 memAlloc.allocationSize = memReqs.size;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006845 pass =
6846 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06006847 ASSERT_TRUE(pass);
Chia-I Wu1f851912015-10-27 18:04:07 +08006848 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyan43909d82015-09-25 13:39:21 -06006849 ASSERT_VK_SUCCESS(err);
6850
Chia-I Wu1f851912015-10-27 18:04:07 +08006851 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06006852 memAlloc.allocationSize = memReqs.size;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006853 pass =
6854 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06006855 ASSERT_TRUE(pass);
Chia-I Wu1f851912015-10-27 18:04:07 +08006856 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyan43909d82015-09-25 13:39:21 -06006857 ASSERT_VK_SUCCESS(err);
6858
6859 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6860 ASSERT_VK_SUCCESS(err);
Chia-I Wu1f851912015-10-27 18:04:07 +08006861 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyan43909d82015-09-25 13:39:21 -06006862 ASSERT_VK_SUCCESS(err);
6863
6864 BeginCommandBuffer();
6865 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006866 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6867 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyan43909d82015-09-25 13:39:21 -06006868 VkImageResolve resolveRegion;
Chia-I Wu4291d882015-10-27 19:00:15 +08006869 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06006870 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06006871 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu1f851912015-10-27 18:04:07 +08006872 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006873 resolveRegion.srcOffset.x = 0;
6874 resolveRegion.srcOffset.y = 0;
6875 resolveRegion.srcOffset.z = 0;
Chia-I Wu4291d882015-10-27 19:00:15 +08006876 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu1f851912015-10-27 18:04:07 +08006877 resolveRegion.dstSubresource.mipLevel = 0;
6878 resolveRegion.dstSubresource.baseArrayLayer = 0;
6879 resolveRegion.dstSubresource.layerCount = 0;
6880 resolveRegion.dstOffset.x = 0;
6881 resolveRegion.dstOffset.y = 0;
6882 resolveRegion.dstOffset.z = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006883 resolveRegion.extent.width = 1;
6884 resolveRegion.extent.height = 1;
6885 resolveRegion.extent.depth = 1;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006886 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6887 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyan43909d82015-09-25 13:39:21 -06006888 EndCommandBuffer();
6889
Chris Forbes34d775f2016-04-07 13:21:07 +12006890 m_errorMonitor->VerifyFound();
Mike Stroyan43909d82015-09-25 13:39:21 -06006891
Chia-I Wu69f40122015-10-26 21:10:41 +08006892 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu1f851912015-10-27 18:04:07 +08006893 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wu69f40122015-10-26 21:10:41 +08006894 vkFreeMemory(m_device->device(), srcMem, NULL);
6895 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyan43909d82015-09-25 13:39:21 -06006896}
6897
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006898TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
6899 VkResult err;
6900 bool pass;
Mike Stroyan43909d82015-09-25 13:39:21 -06006901
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006902 m_errorMonitor->SetDesiredFailureMsg(
6903 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06006904 "vkCmdResolveImage called with unmatched source and dest image types.");
6905
Mike Stroyan43909d82015-09-25 13:39:21 -06006906 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan43909d82015-09-25 13:39:21 -06006907
6908 // Create two images of different types and try to copy between them
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006909 VkImage srcImage;
6910 VkImage dstImage;
6911 VkDeviceMemory srcMem;
6912 VkDeviceMemory destMem;
6913 VkMemoryRequirements memReqs;
Mike Stroyan43909d82015-09-25 13:39:21 -06006914
6915 VkImageCreateInfo image_create_info = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006916 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6917 image_create_info.pNext = NULL;
6918 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6919 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6920 image_create_info.extent.width = 32;
6921 image_create_info.extent.height = 1;
6922 image_create_info.extent.depth = 1;
6923 image_create_info.mipLevels = 1;
6924 image_create_info.arrayLayers = 1;
6925 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6926 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6927 // Note: Some implementations expect color attachment usage for any
6928 // multisample surface
6929 image_create_info.usage =
6930 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6931 image_create_info.flags = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006932
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006933 err =
6934 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyan43909d82015-09-25 13:39:21 -06006935 ASSERT_VK_SUCCESS(err);
6936
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006937 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6938 // Note: Some implementations expect color attachment usage for any
6939 // multisample surface
6940 image_create_info.usage =
6941 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6942 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06006943
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006944 err =
6945 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyan43909d82015-09-25 13:39:21 -06006946 ASSERT_VK_SUCCESS(err);
6947
6948 // Allocate memory
Chia-I Wu1f851912015-10-27 18:04:07 +08006949 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006950 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6951 memAlloc.pNext = NULL;
6952 memAlloc.allocationSize = 0;
6953 memAlloc.memoryTypeIndex = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006954
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -06006955 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06006956 memAlloc.allocationSize = memReqs.size;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006957 pass =
6958 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06006959 ASSERT_TRUE(pass);
Chia-I Wu1f851912015-10-27 18:04:07 +08006960 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyan43909d82015-09-25 13:39:21 -06006961 ASSERT_VK_SUCCESS(err);
6962
Chia-I Wu1f851912015-10-27 18:04:07 +08006963 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06006964 memAlloc.allocationSize = memReqs.size;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006965 pass =
6966 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06006967 ASSERT_TRUE(pass);
Chia-I Wu1f851912015-10-27 18:04:07 +08006968 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyan43909d82015-09-25 13:39:21 -06006969 ASSERT_VK_SUCCESS(err);
6970
6971 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6972 ASSERT_VK_SUCCESS(err);
Chia-I Wu1f851912015-10-27 18:04:07 +08006973 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyan43909d82015-09-25 13:39:21 -06006974 ASSERT_VK_SUCCESS(err);
6975
6976 BeginCommandBuffer();
6977 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006978 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6979 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyan43909d82015-09-25 13:39:21 -06006980 VkImageResolve resolveRegion;
Chia-I Wu4291d882015-10-27 19:00:15 +08006981 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06006982 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06006983 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu1f851912015-10-27 18:04:07 +08006984 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006985 resolveRegion.srcOffset.x = 0;
6986 resolveRegion.srcOffset.y = 0;
6987 resolveRegion.srcOffset.z = 0;
Chia-I Wu4291d882015-10-27 19:00:15 +08006988 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu1f851912015-10-27 18:04:07 +08006989 resolveRegion.dstSubresource.mipLevel = 0;
6990 resolveRegion.dstSubresource.baseArrayLayer = 0;
6991 resolveRegion.dstSubresource.layerCount = 0;
6992 resolveRegion.dstOffset.x = 0;
6993 resolveRegion.dstOffset.y = 0;
6994 resolveRegion.dstOffset.z = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06006995 resolveRegion.extent.width = 1;
6996 resolveRegion.extent.height = 1;
6997 resolveRegion.extent.depth = 1;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07006998 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6999 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyan43909d82015-09-25 13:39:21 -06007000 EndCommandBuffer();
7001
Chris Forbes34d775f2016-04-07 13:21:07 +12007002 m_errorMonitor->VerifyFound();
Mike Stroyan43909d82015-09-25 13:39:21 -06007003
Chia-I Wu69f40122015-10-26 21:10:41 +08007004 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu1f851912015-10-27 18:04:07 +08007005 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wu69f40122015-10-26 21:10:41 +08007006 vkFreeMemory(m_device->device(), srcMem, NULL);
7007 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyan43909d82015-09-25 13:39:21 -06007008}
Tobin Ehlisb46be812015-10-23 16:00:08 -06007009
Karl Schultz99e9d1d2016-02-02 17:17:23 -07007010TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisb46be812015-10-23 16:00:08 -06007011 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz99e9d1d2016-02-02 17:17:23 -07007012 // to using a DS format, then cause it to hit error due to COLOR_BIT not
7013 // set in aspect
Tobin Ehlisb46be812015-10-23 16:00:08 -06007014 // The image format check comes 2nd in validation so we trigger it first,
7015 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz99e9d1d2016-02-02 17:17:23 -07007016 VkResult err;
Tobin Ehlisb46be812015-10-23 16:00:08 -06007017
Karl Schultz99e9d1d2016-02-02 17:17:23 -07007018 m_errorMonitor->SetDesiredFailureMsg(
7019 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06007020 "Combination depth/stencil image formats can have only the ");
7021
Tobin Ehlisb46be812015-10-23 16:00:08 -06007022 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06007023
Chia-I Wuc51b1212015-10-27 19:25:11 +08007024 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07007025 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7026 ds_type_count.descriptorCount = 1;
Tobin Ehlisb46be812015-10-23 16:00:08 -06007027
7028 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07007029 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7030 ds_pool_ci.pNext = NULL;
7031 ds_pool_ci.maxSets = 1;
7032 ds_pool_ci.poolSizeCount = 1;
7033 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisb46be812015-10-23 16:00:08 -06007034
7035 VkDescriptorPool ds_pool;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07007036 err =
7037 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisb46be812015-10-23 16:00:08 -06007038 ASSERT_VK_SUCCESS(err);
7039
7040 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07007041 dsl_binding.binding = 0;
7042 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7043 dsl_binding.descriptorCount = 1;
7044 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7045 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisb46be812015-10-23 16:00:08 -06007046
7047 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07007048 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7049 ds_layout_ci.pNext = NULL;
7050 ds_layout_ci.bindingCount = 1;
7051 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisb46be812015-10-23 16:00:08 -06007052 VkDescriptorSetLayout ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07007053 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7054 &ds_layout);
Tobin Ehlisb46be812015-10-23 16:00:08 -06007055 ASSERT_VK_SUCCESS(err);
7056
7057 VkDescriptorSet descriptorSet;
Chia-I Wu1f851912015-10-27 18:04:07 +08007058 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +08007059 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07007060 alloc_info.descriptorSetCount = 1;
Tobin Ehlisb46be812015-10-23 16:00:08 -06007061 alloc_info.descriptorPool = ds_pool;
7062 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07007063 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7064 &descriptorSet);
Tobin Ehlisb46be812015-10-23 16:00:08 -06007065 ASSERT_VK_SUCCESS(err);
7066
Karl Schultz99e9d1d2016-02-02 17:17:23 -07007067 VkImage image_bad;
7068 VkImage image_good;
Tobin Ehlisb46be812015-10-23 16:00:08 -06007069 // One bad format and one good format for Color attachment
Karl Schultz99e9d1d2016-02-02 17:17:23 -07007070 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisb46be812015-10-23 16:00:08 -06007071 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07007072 const int32_t tex_width = 32;
7073 const int32_t tex_height = 32;
Tobin Ehlisb46be812015-10-23 16:00:08 -06007074
7075 VkImageCreateInfo image_create_info = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07007076 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7077 image_create_info.pNext = NULL;
7078 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7079 image_create_info.format = tex_format_bad;
7080 image_create_info.extent.width = tex_width;
7081 image_create_info.extent.height = tex_height;
7082 image_create_info.extent.depth = 1;
7083 image_create_info.mipLevels = 1;
7084 image_create_info.arrayLayers = 1;
7085 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7086 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7087 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
7088 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
7089 image_create_info.flags = 0;
Tobin Ehlisb46be812015-10-23 16:00:08 -06007090
Karl Schultz99e9d1d2016-02-02 17:17:23 -07007091 err =
7092 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisb46be812015-10-23 16:00:08 -06007093 ASSERT_VK_SUCCESS(err);
7094 image_create_info.format = tex_format_good;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07007095 image_create_info.usage =
7096 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
7097 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
7098 &image_good);
Tobin Ehlisb46be812015-10-23 16:00:08 -06007099 ASSERT_VK_SUCCESS(err);
7100
7101 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz99e9d1d2016-02-02 17:17:23 -07007102 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7103 image_view_create_info.image = image_bad;
7104 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7105 image_view_create_info.format = tex_format_bad;
7106 image_view_create_info.subresourceRange.baseArrayLayer = 0;
7107 image_view_create_info.subresourceRange.baseMipLevel = 0;
7108 image_view_create_info.subresourceRange.layerCount = 1;
7109 image_view_create_info.subresourceRange.levelCount = 1;
7110 image_view_create_info.subresourceRange.aspectMask =
7111 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisb46be812015-10-23 16:00:08 -06007112
7113 VkImageView view;
Karl Schultz99e9d1d2016-02-02 17:17:23 -07007114 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7115 &view);
Mark Lobodzinskic4d306c2015-10-29 09:02:49 -06007116
Chris Forbes34d775f2016-04-07 13:21:07 +12007117 m_errorMonitor->VerifyFound();
Tobin Ehlisb46be812015-10-23 16:00:08 -06007118
Chia-I Wu69f40122015-10-26 21:10:41 +08007119 vkDestroyImage(m_device->device(), image_bad, NULL);
7120 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wu69f40122015-10-26 21:10:41 +08007121 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7122 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisb46be812015-10-23 16:00:08 -06007123}
Tobin Ehlis342b9bf2015-09-22 10:11:37 -06007124#endif // IMAGE_TESTS
7125
Tony Barbour30486ea2015-04-07 13:44:53 -06007126int main(int argc, char **argv) {
7127 int result;
7128
Cody Northrop50537d02016-03-08 22:25:52 -07007129#ifdef ANDROID
7130 int vulkanSupport = InitVulkan();
7131 if (vulkanSupport == 0)
7132 return 1;
7133#endif
7134
Tony Barbour30486ea2015-04-07 13:44:53 -06007135 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour01999182015-04-09 12:58:51 -06007136 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour30486ea2015-04-07 13:44:53 -06007137
7138 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
7139
7140 result = RUN_ALL_TESTS();
7141
Tony Barbour01999182015-04-09 12:58:51 -06007142 VkTestFramework::Finish();
Tony Barbour30486ea2015-04-07 13:44:53 -06007143 return result;
7144}