blob: 73475ae1b0158f0752308c84d1a41a81ff17a733 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Michael Lentine0a369f62016-02-03 16:51:46 -06005 * Copyright (c) 2015-2016 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
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 Schultz6addd812016-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 Barbour65c48b32015-11-17 10:02:56 -070034
David Pinedo9316d3b2015-11-06 12:54:48 -070035#include <vulkan/vulkan.h>
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060036#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060037#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060038#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070039#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060040
Mark Lobodzinski3780e142015-05-14 15:08:13 -050041#define GLM_FORCE_RADIANS
42#include "glm/glm.hpp"
43#include <glm/gtc/matrix_transform.hpp>
44
Tobin Ehlis0788f522015-05-26 16:11:58 -060045#define MEM_TRACKER_TESTS 1
46#define OBJ_TRACKER_TESTS 1
47#define DRAW_STATE_TESTS 1
48#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120049#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060050#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060051#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060052
Mark Lobodzinski3780e142015-05-14 15:08:13 -050053//--------------------------------------------------------------------------------------
54// Mesh and VertexFormat Data
55//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070056struct Vertex {
57 float posX, posY, posZ, posW; // Position data
58 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050059};
60
Karl Schultz6addd812016-02-02 17:17:23 -070061#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050062
63typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070064 BsoFailNone = 0x00000000,
65 BsoFailLineWidth = 0x00000001,
66 BsoFailDepthBias = 0x00000002,
67 BsoFailViewport = 0x00000004,
68 BsoFailScissor = 0x00000008,
69 BsoFailBlend = 0x00000010,
70 BsoFailDepthBounds = 0x00000020,
71 BsoFailStencilReadMask = 0x00000040,
72 BsoFailStencilWriteMask = 0x00000080,
73 BsoFailStencilReference = 0x00000100,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050074} BsoFailSelect;
75
76struct vktriangle_vs_uniform {
77 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070078 float mvp[4][4];
79 float position[3][4];
80 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050081};
82
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050083static const char bindStateVertShaderText[] =
Karl Schultz6addd812016-02-02 17:17:23 -070084 "#version 400\n"
85 "#extension GL_ARB_separate_shader_objects : require\n"
86 "#extension GL_ARB_shading_language_420pack : require\n"
87 "vec2 vertices[3];\n"
88 "out gl_PerVertex {\n"
89 " vec4 gl_Position;\n"
90 "};\n"
91 "void main() {\n"
92 " vertices[0] = vec2(-1.0, -1.0);\n"
93 " vertices[1] = vec2( 1.0, -1.0);\n"
94 " vertices[2] = vec2( 0.0, 1.0);\n"
95 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
96 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050097
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050098static const char bindStateFragShaderText[] =
Karl Schultz6addd812016-02-02 17:17:23 -070099 "#version 400\n"
100 "#extension GL_ARB_separate_shader_objects: require\n"
101 "#extension GL_ARB_shading_language_420pack: require\n"
102 "\n"
103 "layout(location = 0) out vec4 uFragColor;\n"
104 "void main(){\n"
105 " uFragColor = vec4(0,1,0,1);\n"
106 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500107
Karl Schultz6addd812016-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 Barbour300a6082015-04-07 13:44:53 -0600112
Mark Lobodzinski8507f2f2015-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 Barbour300a6082015-04-07 13:44:53 -0600123class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700124 public:
125 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600126 test_platform_thread_create_mutex(&m_mutex);
127 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700128 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700129 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600130 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600131 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600132
Karl Schultz6addd812016-02-02 17:17:23 -0700133 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600134 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600135 m_desiredMsg.clear();
136 m_failureMsg.clear();
137 m_otherMsgs.clear();
138 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700139 m_msgFound = VK_FALSE;
140 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600141 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600142 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600143
Karl Schultz6addd812016-02-02 17:17:23 -0700144 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600145 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600146 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600147 if (m_bailout != NULL) {
148 *m_bailout = true;
149 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600150 string errorString(msgString);
151 if (msgFlags & m_msgFlags) {
152 if (errorString.find(m_desiredMsg) != string::npos) {
153 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700154 m_msgFound = VK_TRUE;
155 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600156 } else {
157 m_otherMsgs.push_back(errorString);
158 }
159 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600160 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600161 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600162 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600163
Karl Schultz6addd812016-02-02 17:17:23 -0700164 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165
Karl Schultz6addd812016-02-02 17:17:23 -0700166 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600167
Karl Schultz6addd812016-02-02 17:17:23 -0700168 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600169
Karl Schultz6addd812016-02-02 17:17:23 -0700170 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600171
Karl Schultz6addd812016-02-02 17:17:23 -0700172 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600173 vector<string> otherMsgs = GetOtherFailureMsgs();
174 cout << "Other error messages logged for this test were:" << endl;
175 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
176 cout << " " << *iter << endl;
177 }
178 }
179
Karl Schultz6addd812016-02-02 17:17:23 -0700180 private:
181 VkFlags m_msgFlags;
182 string m_desiredMsg;
183 string m_failureMsg;
184 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600185 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700186 bool *m_bailout;
187 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600188};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500189
Karl Schultz6addd812016-02-02 17:17:23 -0700190static VKAPI_ATTR VkBool32 VKAPI_CALL
191myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
192 uint64_t srcObject, size_t location, int32_t msgCode,
193 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
194 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700195 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700196 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600197 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600198 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600199 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600200 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600201}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500202
Karl Schultz6addd812016-02-02 17:17:23 -0700203class VkLayerTest : public VkRenderFramework {
204 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800205 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
206 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700207 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
208 BsoFailSelect failMask);
209 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
210 VkPipelineObj &pipelineobj,
211 VkDescriptorSetObj &descriptorSet,
212 BsoFailSelect failMask);
213 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
214 VkDescriptorSetObj &descriptorSet,
215 BsoFailSelect failMask) {
216 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
217 failMask);
218 }
Tony Barbour300a6082015-04-07 13:44:53 -0600219
Tony Barbourfe3351b2015-07-28 10:17:20 -0600220 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700221 VkResult BeginCommandBuffer() {
222 return BeginCommandBuffer(*m_commandBuffer);
223 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800224 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700225 void Draw(uint32_t vertexCount, uint32_t instanceCount,
226 uint32_t firstVertex, uint32_t firstInstance) {
227 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
228 firstInstance);
229 }
230 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
231 uint32_t firstIndex, int32_t vertexOffset,
232 uint32_t firstInstance) {
233 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
234 vertexOffset, firstInstance);
235 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800236 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); }
Karl Schultz6addd812016-02-02 17:17:23 -0700237 void QueueCommandBuffer(const VkFence &fence) {
238 m_commandBuffer->QueueCommandBuffer(fence);
239 }
240 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
241 VkDeviceSize offset, uint32_t binding) {
242 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
243 }
244 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
245 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
246 }
247
248 protected:
249 ErrorMonitor *m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600250
251 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600252 std::vector<const char *> instance_layer_names;
253 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600254 std::vector<const char *> instance_extension_names;
255 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600256
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700257 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600258 /*
259 * Since CreateDbgMsgCallback is an instance level extension call
260 * any extension / layer that utilizes that feature also needs
261 * to be enabled at create instance time.
262 */
Karl Schultz6addd812016-02-02 17:17:23 -0700263 // Use Threading layer first to protect others from
264 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700265 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Michael Lentine03107b42015-12-11 10:49:51 -0800266 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
267 instance_layer_names.push_back("VK_LAYER_LUNARG_mem_tracker");
268 instance_layer_names.push_back("VK_LAYER_LUNARG_draw_state");
269 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
270 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700271 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600272
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700273 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Michael Lentine03107b42015-12-11 10:49:51 -0800274 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
275 device_layer_names.push_back("VK_LAYER_LUNARG_mem_tracker");
276 device_layer_names.push_back("VK_LAYER_LUNARG_draw_state");
277 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
278 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700279 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600280
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600281 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600282 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800283 this->app_info.pApplicationName = "layer_tests";
284 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600285 this->app_info.pEngineName = "unittest";
286 this->app_info.engineVersion = 1;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600287 this->app_info.apiVersion = VK_API_VERSION;
Tony Barbour300a6082015-04-07 13:44:53 -0600288
Tony Barbour15524c32015-04-29 17:34:29 -0600289 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600290 InitFramework(instance_layer_names, device_layer_names,
291 instance_extension_names, device_extension_names,
292 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600293 }
294
295 virtual void TearDown() {
296 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600297 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600298 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600299 }
300};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500301
Karl Schultz6addd812016-02-02 17:17:23 -0700302VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600303 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600304
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800305 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600306
307 /*
308 * For render test all drawing happens in a single render pass
309 * on a single command buffer.
310 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200311 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800312 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600313 }
314
315 return result;
316}
317
Karl Schultz6addd812016-02-02 17:17:23 -0700318VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600319 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600320
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200321 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800322 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200323 }
Tony Barbour300a6082015-04-07 13:44:53 -0600324
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800325 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600326
327 return result;
328}
329
Karl Schultz6addd812016-02-02 17:17:23 -0700330void VkLayerTest::VKTriangleTest(const char *vertShaderText,
331 const char *fragShaderText,
332 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500333 // Create identity matrix
334 int i;
335 struct vktriangle_vs_uniform data;
336
337 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700338 glm::mat4 View = glm::mat4(1.0f);
339 glm::mat4 Model = glm::mat4(1.0f);
340 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500341 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700342 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500343
344 memcpy(&data.mvp, &MVP[0][0], matrixSize);
345
Karl Schultz6addd812016-02-02 17:17:23 -0700346 static const Vertex tri_data[] = {
347 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
348 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
349 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500350 };
351
Karl Schultz6addd812016-02-02 17:17:23 -0700352 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500353 data.position[i][0] = tri_data[i].posX;
354 data.position[i][1] = tri_data[i].posY;
355 data.position[i][2] = tri_data[i].posZ;
356 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700357 data.color[i][0] = tri_data[i].r;
358 data.color[i][1] = tri_data[i].g;
359 data.color[i][2] = tri_data[i].b;
360 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500361 }
362
363 ASSERT_NO_FATAL_FAILURE(InitState());
364 ASSERT_NO_FATAL_FAILURE(InitViewport());
365
Karl Schultz6addd812016-02-02 17:17:23 -0700366 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
367 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500368
Karl Schultz6addd812016-02-02 17:17:23 -0700369 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
370 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
371 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500372
373 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800374 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500375 pipelineobj.AddShader(&vs);
376 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600377 if (failMask & BsoFailLineWidth) {
378 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
379 }
380 if (failMask & BsoFailDepthBias) {
381 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
382 }
Karl Schultz6addd812016-02-02 17:17:23 -0700383 // Viewport and scissors must stay in synch or other errors will occur than
384 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600385 if (failMask & BsoFailViewport) {
386 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600387 m_viewports.clear();
388 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600389 }
390 if (failMask & BsoFailScissor) {
391 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600392 m_scissors.clear();
393 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600394 }
395 if (failMask & BsoFailBlend) {
396 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
397 }
398 if (failMask & BsoFailDepthBounds) {
399 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
400 }
401 if (failMask & BsoFailStencilReadMask) {
402 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
403 }
404 if (failMask & BsoFailStencilWriteMask) {
405 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
406 }
407 if (failMask & BsoFailStencilReference) {
408 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
409 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500410
411 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700412 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
413 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500414
415 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600416 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500417
Tony Barbourfe3351b2015-07-28 10:17:20 -0600418 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500419
420 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600421 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500422
423 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600424 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500425
Tony Barbourfe3351b2015-07-28 10:17:20 -0600426 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500427}
428
Karl Schultz6addd812016-02-02 17:17:23 -0700429void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
430 VkPipelineObj &pipelineobj,
431 VkDescriptorSetObj &descriptorSet,
432 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500433 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700434 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
435 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500436 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700437 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
438 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500439 }
440
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800441 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700442 // Make sure depthWriteEnable is set so that Depth fail test will work
443 // correctly
444 // Make sure stencilTestEnable is set so that Stencil fail test will work
445 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600446 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800447 stencil.failOp = VK_STENCIL_OP_KEEP;
448 stencil.passOp = VK_STENCIL_OP_KEEP;
449 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
450 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600451
452 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
453 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600454 ds_ci.pNext = NULL;
455 ds_ci.depthTestEnable = VK_FALSE;
456 ds_ci.depthWriteEnable = VK_TRUE;
457 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
458 ds_ci.depthBoundsTestEnable = VK_FALSE;
459 ds_ci.stencilTestEnable = VK_TRUE;
460 ds_ci.front = stencil;
461 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600462
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600463 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600464 pipelineobj.SetViewport(m_viewports);
465 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800466 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700467 VkResult err = pipelineobj.CreateVKPipeline(
468 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600469 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800470 commandBuffer->BindPipeline(pipelineobj);
471 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500472}
473
474// ********************************************************************************************************************
475// ********************************************************************************************************************
476// ********************************************************************************************************************
477// ********************************************************************************************************************
Tobin Ehlis0788f522015-05-26 16:11:58 -0600478#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700479#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800480TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500481{
482 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500483 VkFenceCreateInfo fenceInfo = {};
484 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
485 fenceInfo.pNext = NULL;
486 fenceInfo.flags = 0;
487
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600489
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500490 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600491
492 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
493 vk_testing::Buffer buffer;
494 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500495
Tony Barbourfe3351b2015-07-28 10:17:20 -0600496 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800497 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600498 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500499
500 testFence.init(*m_device, fenceInfo);
501
502 // Bypass framework since it does the waits automatically
503 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600504 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800505 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
506 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800507 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600508 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700509 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800510 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800511 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800512 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600513 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600514
515 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500516 ASSERT_VK_SUCCESS( err );
517
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500518 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800519 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500520
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600521 if (!m_errorMonitor->DesiredMsgFound()) {
522 FAIL() << "Did not receive Error 'Resetting CB (0xaddress) before it has completed. You must check CB flag before.'";
523 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500524 }
525}
526
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800527TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500528{
529 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500530 VkFenceCreateInfo fenceInfo = {};
531 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
532 fenceInfo.pNext = NULL;
533 fenceInfo.flags = 0;
534
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700535 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600536
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500537 ASSERT_NO_FATAL_FAILURE(InitState());
538 ASSERT_NO_FATAL_FAILURE(InitViewport());
539 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
540
Tony Barbourfe3351b2015-07-28 10:17:20 -0600541 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800542 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600543 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-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 Goeltzenleuchter806c7002015-10-27 11:22:14 -0600549 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800550 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
551 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800552 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600553 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700554 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800555 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800556 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800557 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600558 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600559
560 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500561 ASSERT_VK_SUCCESS( err );
562
Jon Ashburnf19916e2016-01-11 13:12:43 -0700563 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800564 VkCommandBufferBeginInfo info = {};
565 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
566 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600567 info.renderPass = VK_NULL_HANDLE;
568 info.subpass = 0;
569 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +0800570 info.occlusionQueryEnable = VK_FALSE;
571 info.queryFlags = 0;
572 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600573
574 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800575 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500576
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600577 if (!m_errorMonitor->DesiredMsgFound()) {
578 FAIL() << "Did not receive Error 'Calling vkBeginCommandBuffer() on an active CB (0xaddress) before it has completed'";
579 m_errorMonitor->DumpFailureMsgs();
580
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500581 }
582}
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700583#endif
Karl Schultz6addd812016-02-02 17:17:23 -0700584TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
585 VkResult err;
586 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500587
Karl Schultz6addd812016-02-02 17:17:23 -0700588 m_errorMonitor->SetDesiredFailureMsg(
589 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600590 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
591
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500592 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500593
594 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700595 VkImage image;
596 VkDeviceMemory mem;
597 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500598
Karl Schultz6addd812016-02-02 17:17:23 -0700599 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
600 const int32_t tex_width = 32;
601 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500602
Tony Barboureb254902015-07-15 12:50:33 -0600603 VkImageCreateInfo image_create_info = {};
604 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700605 image_create_info.pNext = NULL;
606 image_create_info.imageType = VK_IMAGE_TYPE_2D;
607 image_create_info.format = tex_format;
608 image_create_info.extent.width = tex_width;
609 image_create_info.extent.height = tex_height;
610 image_create_info.extent.depth = 1;
611 image_create_info.mipLevels = 1;
612 image_create_info.arrayLayers = 1;
613 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
614 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
615 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
616 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600617
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800618 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800619 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700620 mem_alloc.pNext = NULL;
621 mem_alloc.allocationSize = 0;
622 // Introduce failure, do NOT set memProps to
623 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
624 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500625
Chia-I Wuf7458c52015-10-26 21:10:41 +0800626 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500627 ASSERT_VK_SUCCESS(err);
628
Karl Schultz6addd812016-02-02 17:17:23 -0700629 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500630
Mark Lobodzinski23065352015-05-29 09:32:35 -0500631 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500632
Karl Schultz6addd812016-02-02 17:17:23 -0700633 pass =
634 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
635 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
636 if (!pass) { // If we can't find any unmappable memory this test doesn't
637 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +0800638 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -0600639 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -0600640 }
Mike Stroyan713b2d72015-08-04 10:49:29 -0600641
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500642 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800643 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500644 ASSERT_VK_SUCCESS(err);
645
646 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -0600647 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500648 ASSERT_VK_SUCCESS(err);
649
650 // Map memory as if to initialize the image
651 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -0700652 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
653 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500654
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600655 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700656 FAIL() << "Did not receive Error 'Error received did not match "
657 "expected error message from vkMapMemory in MemTracker'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600658 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500659 }
Mike Stroyand1c84a52015-08-18 14:40:24 -0600660
Chia-I Wuf7458c52015-10-26 21:10:41 +0800661 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500662}
663
Karl Schultz6addd812016-02-02 17:17:23 -0700664// TODO : Is this test still valid. Not sure it is with updates to memory
665// binding model
Tobin Ehlis2717d132015-07-10 18:25:07 -0600666// Verify and delete the test of fix the check
Karl Schultz6addd812016-02-02 17:17:23 -0700667// TEST_F(VkLayerTest, FreeBoundMemory)
Tobin Ehlis2717d132015-07-10 18:25:07 -0600668//{
Tobin Ehlis2717d132015-07-10 18:25:07 -0600669// VkResult err;
670//
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700671// m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600672// "Freeing memory object while it still has references");
Tobin Ehlis2717d132015-07-10 18:25:07 -0600673//
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600674// ASSERT_NO_FATAL_FAILURE(InitState());
675
Tobin Ehlis2717d132015-07-10 18:25:07 -0600676// // Create an image, allocate memory, free it, and then try to bind it
677// VkImage image;
678// VkDeviceMemory mem;
679// VkMemoryRequirements mem_reqs;
680//
681// const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
682// const int32_t tex_width = 32;
683// const int32_t tex_height = 32;
684//
685// const VkImageCreateInfo image_create_info = {
686// .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
687// .pNext = NULL,
688// .imageType = VK_IMAGE_TYPE_2D,
689// .format = tex_format,
690// .extent = { tex_width, tex_height, 1 },
691// .mipLevels = 1,
692// .arraySize = 1,
Chia-I Wu5c17c962015-10-31 00:31:16 +0800693// .samples = VK_SAMPLE_COUNT_1_BIT,
Tobin Ehlis2717d132015-07-10 18:25:07 -0600694// .tiling = VK_IMAGE_TILING_LINEAR,
695// .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
696// .flags = 0,
697// };
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800698// VkMemoryAllocateInfo mem_alloc = {
Chia-I Wu00ce5402015-11-10 16:21:09 +0800699// .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
Tobin Ehlis2717d132015-07-10 18:25:07 -0600700// .pNext = NULL,
701// .allocationSize = 0,
702// .memoryTypeIndex = 0,
703// };
704//
Chia-I Wuf7458c52015-10-26 21:10:41 +0800705// err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis2717d132015-07-10 18:25:07 -0600706// ASSERT_VK_SUCCESS(err);
707//
708// err = vkGetImageMemoryRequirements(m_device->device(),
709// image,
710// &mem_reqs);
711// ASSERT_VK_SUCCESS(err);
712//
713// mem_alloc.allocationSize = mem_reqs.size;
714//
Karl Schultz6addd812016-02-02 17:17:23 -0700715// err = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
716// 0);
Tobin Ehlis2717d132015-07-10 18:25:07 -0600717// ASSERT_VK_SUCCESS(err);
718//
719// // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800720// err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis2717d132015-07-10 18:25:07 -0600721// ASSERT_VK_SUCCESS(err);
722//
723// // Bind memory to Image object
724// err = vkBindImageMemory(m_device->device(), image, mem, 0);
725// ASSERT_VK_SUCCESS(err);
726//
727// // Introduce validation failure, free memory while still bound to object
Chia-I Wuf7458c52015-10-26 21:10:41 +0800728// vkFreeMemory(m_device->device(), mem, NULL);
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600729//
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600730// if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700731// FAIL() << "Did not receive Warning 'Freeing memory object while it
732// still has references'");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600733// m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis2717d132015-07-10 18:25:07 -0600734// }
735//}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500736
Karl Schultz6addd812016-02-02 17:17:23 -0700737TEST_F(VkLayerTest, RebindMemory) {
738 VkResult err;
739 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500740
Karl Schultz6addd812016-02-02 17:17:23 -0700741 m_errorMonitor->SetDesiredFailureMsg(
742 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600743 "which has already been bound to mem object");
744
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500745 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500746
747 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700748 VkImage image;
749 VkDeviceMemory mem1;
750 VkDeviceMemory mem2;
751 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500752
Karl Schultz6addd812016-02-02 17:17:23 -0700753 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
754 const int32_t tex_width = 32;
755 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500756
Tony Barboureb254902015-07-15 12:50:33 -0600757 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700758 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
759 image_create_info.pNext = NULL;
760 image_create_info.imageType = VK_IMAGE_TYPE_2D;
761 image_create_info.format = tex_format;
762 image_create_info.extent.width = tex_width;
763 image_create_info.extent.height = tex_height;
764 image_create_info.extent.depth = 1;
765 image_create_info.mipLevels = 1;
766 image_create_info.arrayLayers = 1;
767 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
768 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
769 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
770 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500771
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800772 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700773 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
774 mem_alloc.pNext = NULL;
775 mem_alloc.allocationSize = 0;
776 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -0600777
Karl Schultz6addd812016-02-02 17:17:23 -0700778 // Introduce failure, do NOT set memProps to
779 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -0600780 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800781 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500782 ASSERT_VK_SUCCESS(err);
783
Karl Schultz6addd812016-02-02 17:17:23 -0700784 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500785
786 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -0700787 pass =
788 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -0600789 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500790
791 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800792 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500793 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800794 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500795 ASSERT_VK_SUCCESS(err);
796
797 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -0600798 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500799 ASSERT_VK_SUCCESS(err);
800
Karl Schultz6addd812016-02-02 17:17:23 -0700801 // Introduce validation failure, try to bind a different memory object to
802 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -0600803 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500804
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600805 if (!m_errorMonitor->DesiredMsgFound()) {
806 FAIL() << "Did not receive Error when rebinding memory to an object";
807 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500808 }
Mike Stroyand1c84a52015-08-18 14:40:24 -0600809
Chia-I Wuf7458c52015-10-26 21:10:41 +0800810 vkDestroyImage(m_device->device(), image, NULL);
811 vkFreeMemory(m_device->device(), mem1, NULL);
812 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500813}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500814
Karl Schultz6addd812016-02-02 17:17:23 -0700815TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600816 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600817
Karl Schultz6addd812016-02-02 17:17:23 -0700818 m_errorMonitor->SetDesiredFailureMsg(
819 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
820 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600821
822 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600823 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
824 fenceInfo.pNext = NULL;
825 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -0600826
Tony Barbour300a6082015-04-07 13:44:53 -0600827 ASSERT_NO_FATAL_FAILURE(InitState());
828 ASSERT_NO_FATAL_FAILURE(InitViewport());
829 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
830
Tony Barbourfe3351b2015-07-28 10:17:20 -0600831 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -0700832 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
833 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600834 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600835
836 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600837
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600838 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800839 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
840 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800841 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600842 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700843 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800844 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800845 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800846 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600847 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600848
849 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -0700850 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600851
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600852 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700853 FAIL() << "Did not receive Error 'VkQueueSubmit with fence in "
854 "SIGNALED_STATE'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600855 m_errorMonitor->DumpFailureMsgs();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600856 }
Tony Barbour0b4d9562015-04-09 10:48:04 -0600857}
858
Karl Schultz6addd812016-02-02 17:17:23 -0700859TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600860 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600861 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600862 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
863 fenceInfo.pNext = NULL;
864
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700865 // TODO: verify that this matches layer
Karl Schultz6addd812016-02-02 17:17:23 -0700866 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700867 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600868 "submitted to VkResetFences in UNSIGNALED STATE");
869
Tony Barbour0b4d9562015-04-09 10:48:04 -0600870 ASSERT_NO_FATAL_FAILURE(InitState());
871 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +0800872 VkFence fences[1] = {testFence.handle()};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600873 vkResetFences(m_device->device(), 1, fences);
Tony Barbour300a6082015-04-07 13:44:53 -0600874
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600875 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700876 FAIL() << "Did not receive Error 'VkResetFences with fence in "
877 "UNSIGNALED_STATE'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600878 m_errorMonitor->DumpFailureMsgs();
879 }
Tony Barbour300a6082015-04-07 13:44:53 -0600880}
Tobin Ehlis41376e12015-07-03 08:45:14 -0600881
Chia-I Wu08accc62015-07-07 11:50:03 +0800882/* TODO: Update for changes due to bug-14075 tiling across render passes */
883#if 0
Tobin Ehlis41376e12015-07-03 08:45:14 -0600884TEST_F(VkLayerTest, InvalidUsageBits)
885{
886 // Initiate Draw w/o a PSO bound
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600887
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600889 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -0600890
891 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800892 VkCommandBufferObj commandBuffer(m_device);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600893 BeginCommandBuffer();
Tobin Ehlis41376e12015-07-03 08:45:14 -0600894
895 const VkExtent3D e3d = {
896 .width = 128,
897 .height = 128,
898 .depth = 1,
899 };
900 const VkImageCreateInfo ici = {
901 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
902 .pNext = NULL,
903 .imageType = VK_IMAGE_TYPE_2D,
904 .format = VK_FORMAT_D32_SFLOAT_S8_UINT,
905 .extent = e3d,
906 .mipLevels = 1,
907 .arraySize = 1,
Chia-I Wu5c17c962015-10-31 00:31:16 +0800908 .samples = VK_SAMPLE_COUNT_1_BIT,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600909 .tiling = VK_IMAGE_TILING_LINEAR,
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600910 .usage = 0, // Not setting VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
Tobin Ehlis41376e12015-07-03 08:45:14 -0600911 .flags = 0,
912 };
913
914 VkImage dsi;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800915 vkCreateImage(m_device->device(), &ici, NULL, &dsi);
Tobin Ehlis41376e12015-07-03 08:45:14 -0600916 VkDepthStencilView dsv;
917 const VkDepthStencilViewCreateInfo dsvci = {
918 .sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO,
919 .pNext = NULL,
920 .image = dsi,
921 .mipLevel = 0,
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -0600922 .baseArrayLayer = 0,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600923 .arraySize = 1,
924 .flags = 0,
925 };
Chia-I Wuf7458c52015-10-26 21:10:41 +0800926 vkCreateDepthStencilView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600927
928 if (!m_errorMonitor->DesiredMsgFound()) {
Tobin Ehlis41376e12015-07-03 08:45:14 -0600929 FAIL() << "Error received was not 'Invalid usage flag for image...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600930 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis41376e12015-07-03 08:45:14 -0600931 }
932}
Mark Lobodzinski209b5292015-09-17 09:44:05 -0600933#endif // 0
934#endif // MEM_TRACKER_TESTS
935
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600936#if OBJ_TRACKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -0700937TEST_F(VkLayerTest, PipelineNotBound) {
938 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600939
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -0700941 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600942
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600943 ASSERT_NO_FATAL_FAILURE(InitState());
944 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600945
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800946 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700947 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
948 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600949
950 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700951 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
952 ds_pool_ci.pNext = NULL;
953 ds_pool_ci.maxSets = 1;
954 ds_pool_ci.poolSizeCount = 1;
955 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600956
957 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -0700958 err =
959 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600960 ASSERT_VK_SUCCESS(err);
961
962 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700963 dsl_binding.binding = 0;
964 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
965 dsl_binding.descriptorCount = 1;
966 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
967 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600968
969 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700970 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
971 ds_layout_ci.pNext = NULL;
972 ds_layout_ci.bindingCount = 1;
973 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600974
975 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700976 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
977 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600978 ASSERT_VK_SUCCESS(err);
979
980 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800981 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800982 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -0700983 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -0600984 alloc_info.descriptorPool = ds_pool;
985 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700986 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
987 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600988 ASSERT_VK_SUCCESS(err);
989
990 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700991 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
992 pipeline_layout_ci.pNext = NULL;
993 pipeline_layout_ci.setLayoutCount = 1;
994 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600995
996 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700997 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
998 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600999 ASSERT_VK_SUCCESS(err);
1000
Mark Youngad779052016-01-06 14:26:04 -07001001 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001002
1003 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001004 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1005 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001006
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001007 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001008 FAIL()
1009 << "Error received was not 'Invalid VkPipeline Object 0xbaadb1be'"
1010 << endl;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001011 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisec598302015-09-15 15:02:17 -06001012 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06001013
Chia-I Wuf7458c52015-10-26 21:10:41 +08001014 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1015 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1016 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001017}
1018
Karl Schultz6addd812016-02-02 17:17:23 -07001019TEST_F(VkLayerTest, BindInvalidMemory) {
1020 VkResult err;
1021 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001022
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001023 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001024 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001025
Tobin Ehlisec598302015-09-15 15:02:17 -06001026 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001027
1028 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001029 VkImage image;
1030 VkDeviceMemory mem;
1031 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001032
Karl Schultz6addd812016-02-02 17:17:23 -07001033 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1034 const int32_t tex_width = 32;
1035 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001036
1037 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001038 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1039 image_create_info.pNext = NULL;
1040 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1041 image_create_info.format = tex_format;
1042 image_create_info.extent.width = tex_width;
1043 image_create_info.extent.height = tex_height;
1044 image_create_info.extent.depth = 1;
1045 image_create_info.mipLevels = 1;
1046 image_create_info.arrayLayers = 1;
1047 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1048 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1049 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1050 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001051
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001052 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001053 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1054 mem_alloc.pNext = NULL;
1055 mem_alloc.allocationSize = 0;
1056 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001057
Chia-I Wuf7458c52015-10-26 21:10:41 +08001058 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001059 ASSERT_VK_SUCCESS(err);
1060
Karl Schultz6addd812016-02-02 17:17:23 -07001061 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001062
1063 mem_alloc.allocationSize = mem_reqs.size;
1064
Karl Schultz6addd812016-02-02 17:17:23 -07001065 pass =
1066 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001067 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001068
1069 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001070 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001071 ASSERT_VK_SUCCESS(err);
1072
1073 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001074 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001075
1076 // Try to bind free memory that has been freed
1077 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1078 // This may very well return an error.
1079 (void)err;
1080
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001081 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001082 FAIL() << "Did not receive Error 'Invalid VkDeviceMemory Object "
1083 "0x<handle>'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001084 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisec598302015-09-15 15:02:17 -06001085 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06001086
Chia-I Wuf7458c52015-10-26 21:10:41 +08001087 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001088}
1089
Karl Schultz6addd812016-02-02 17:17:23 -07001090TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1091 VkResult err;
1092 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001093
Karl Schultz6addd812016-02-02 17:17:23 -07001094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1095 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001096
Tobin Ehlisec598302015-09-15 15:02:17 -06001097 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001098
Karl Schultz6addd812016-02-02 17:17:23 -07001099 // Create an image object, allocate memory, destroy the object and then try
1100 // to bind it
1101 VkImage image;
1102 VkDeviceMemory mem;
1103 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001104
Karl Schultz6addd812016-02-02 17:17:23 -07001105 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1106 const int32_t tex_width = 32;
1107 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001108
1109 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001110 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1111 image_create_info.pNext = NULL;
1112 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1113 image_create_info.format = tex_format;
1114 image_create_info.extent.width = tex_width;
1115 image_create_info.extent.height = tex_height;
1116 image_create_info.extent.depth = 1;
1117 image_create_info.mipLevels = 1;
1118 image_create_info.arrayLayers = 1;
1119 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1120 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1121 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1122 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001123
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001124 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001125 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1126 mem_alloc.pNext = NULL;
1127 mem_alloc.allocationSize = 0;
1128 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001129
Chia-I Wuf7458c52015-10-26 21:10:41 +08001130 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001131 ASSERT_VK_SUCCESS(err);
1132
Karl Schultz6addd812016-02-02 17:17:23 -07001133 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001134
1135 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001136 pass =
1137 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001138 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001139
1140 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001141 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001142 ASSERT_VK_SUCCESS(err);
1143
1144 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001145 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001146 ASSERT_VK_SUCCESS(err);
1147
1148 // Now Try to bind memory to this destroyed object
1149 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1150 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001151 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001152
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001153 if (!m_errorMonitor->DesiredMsgFound()) {
1154 FAIL() << "Did not receive Error 'Invalid VkImage Object 0x<handle>'";
1155 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001156 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06001157
Chia-I Wuf7458c52015-10-26 21:10:41 +08001158 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001159}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001160
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001161#endif // OBJ_TRACKER_TESTS
1162
Tobin Ehlis0788f522015-05-26 16:11:58 -06001163#if DRAW_STATE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07001164TEST_F(VkLayerTest, LineWidthStateNotBound) {
1165 m_errorMonitor->SetDesiredFailureMsg(
1166 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001167 "Dynamic line width state not set for this command buffer");
1168
Karl Schultz6addd812016-02-02 17:17:23 -07001169 TEST_DESCRIPTION("Simple Draw Call that validates failure when a line "
1170 "width state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001171
Karl Schultz6addd812016-02-02 17:17:23 -07001172 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1173 BsoFailLineWidth);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001174
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001175 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001176 FAIL() << "Did not receive Error 'Dynamic line width state not set for "
1177 "this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001178 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001179 }
1180}
1181
Karl Schultz6addd812016-02-02 17:17:23 -07001182TEST_F(VkLayerTest, DepthBiasStateNotBound) {
1183 m_errorMonitor->SetDesiredFailureMsg(
1184 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001185 "Dynamic depth bias state not set for this command buffer");
1186
Karl Schultz6addd812016-02-02 17:17:23 -07001187 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
1188 "bias state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001189
Karl Schultz6addd812016-02-02 17:17:23 -07001190 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1191 BsoFailDepthBias);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001192
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001193 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001194 FAIL() << "Did not receive Error 'Dynamic depth bias state not set for "
1195 "this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001196 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001197 }
1198}
1199
Karl Schultz6addd812016-02-02 17:17:23 -07001200// Disable these two tests until we can sort out how to track multiple layer
1201// errors
1202TEST_F(VkLayerTest, ViewportStateNotBound) {
1203 m_errorMonitor->SetDesiredFailureMsg(
1204 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001205 "Dynamic viewport state not set for this command buffer");
1206
Karl Schultz6addd812016-02-02 17:17:23 -07001207 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
1208 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001209
Karl Schultz6addd812016-02-02 17:17:23 -07001210 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1211 BsoFailViewport);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001212
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001213 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001214 FAIL() << "Did not recieve Error 'Dynamic scissor state not set for "
1215 "this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001216 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001217 }
1218}
1219
Karl Schultz6addd812016-02-02 17:17:23 -07001220TEST_F(VkLayerTest, ScissorStateNotBound) {
1221 m_errorMonitor->SetDesiredFailureMsg(
1222 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001223 "Dynamic scissor state not set for this command buffer");
1224
Karl Schultz6addd812016-02-02 17:17:23 -07001225 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
1226 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001227
Karl Schultz6addd812016-02-02 17:17:23 -07001228 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1229 BsoFailScissor);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001230
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001231 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001232 FAIL() << "Did not recieve Error ' Expected: 'Dynamic scissor state "
1233 "not set for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001234 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001235 }
1236}
1237
Karl Schultz6addd812016-02-02 17:17:23 -07001238TEST_F(VkLayerTest, BlendStateNotBound) {
1239 m_errorMonitor->SetDesiredFailureMsg(
1240 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001241 "Dynamic blend object state not set for this command buffer");
1242
Karl Schultz6addd812016-02-02 17:17:23 -07001243 TEST_DESCRIPTION("Simple Draw Call that validates failure when a blend "
1244 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001245
Karl Schultz6addd812016-02-02 17:17:23 -07001246 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1247 BsoFailBlend);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001248
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001249 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001250 FAIL() << "Did not recieve Error 'Dynamic blend object state not set "
1251 "for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001252 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001253 }
1254}
1255
Karl Schultz6addd812016-02-02 17:17:23 -07001256TEST_F(VkLayerTest, DepthBoundsStateNotBound) {
1257 m_errorMonitor->SetDesiredFailureMsg(
1258 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001259 "Dynamic depth bounds state not set for this command buffer");
1260
Karl Schultz6addd812016-02-02 17:17:23 -07001261 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
1262 "bounds state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001263
Karl Schultz6addd812016-02-02 17:17:23 -07001264 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1265 BsoFailDepthBounds);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001266
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001267 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001268 FAIL() << "Did not receive Error 'Dynamic depth bounds state not set "
1269 "for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001270 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001271 }
1272}
1273
Karl Schultz6addd812016-02-02 17:17:23 -07001274TEST_F(VkLayerTest, StencilReadMaskNotSet) {
1275 m_errorMonitor->SetDesiredFailureMsg(
1276 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001277 "Dynamic stencil read mask state not set for this command buffer");
1278
Tobin Ehlis963a4042015-09-29 08:18:34 -06001279 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001280
Karl Schultz6addd812016-02-02 17:17:23 -07001281 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
1282 "read mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001283
Karl Schultz6addd812016-02-02 17:17:23 -07001284 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1285 BsoFailStencilReadMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001286
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001287 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001288 FAIL() << "Did not receive Error 'Dynamic stencil read mask state not "
1289 "set for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001290 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001291 }
1292}
1293
Karl Schultz6addd812016-02-02 17:17:23 -07001294TEST_F(VkLayerTest, StencilWriteMaskNotSet) {
1295 m_errorMonitor->SetDesiredFailureMsg(
1296 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001297 "Dynamic stencil write mask state not set for this command buffer");
1298
Tobin Ehlis963a4042015-09-29 08:18:34 -06001299 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001300
Karl Schultz6addd812016-02-02 17:17:23 -07001301 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
1302 "write mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001303
Karl Schultz6addd812016-02-02 17:17:23 -07001304 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1305 BsoFailStencilWriteMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001306
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001307 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001308 FAIL() << "Did not receive Error 'Dynamic stencil write mask state not "
1309 "set for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001310 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001311 }
1312}
1313
Karl Schultz6addd812016-02-02 17:17:23 -07001314TEST_F(VkLayerTest, StencilReferenceNotSet) {
1315 m_errorMonitor->SetDesiredFailureMsg(
1316 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001317 "Dynamic stencil reference state not set for this command buffer");
1318
Karl Schultz6addd812016-02-02 17:17:23 -07001319 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
1320 "reference is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001321
Karl Schultz6addd812016-02-02 17:17:23 -07001322 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1323 BsoFailStencilReference);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001324
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001325 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001326 FAIL() << "Did not receive Error 'Dynamic stencil reference state not "
1327 "set for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001328 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001329 }
1330}
1331
Karl Schultz6addd812016-02-02 17:17:23 -07001332TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001333 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001334
Karl Schultz6addd812016-02-02 17:17:23 -07001335 m_errorMonitor->SetDesiredFailureMsg(
1336 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1337 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
1338 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001339
1340 VkFenceCreateInfo fenceInfo = {};
1341 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1342 fenceInfo.pNext = NULL;
1343 fenceInfo.flags = 0;
1344
1345 ASSERT_NO_FATAL_FAILURE(InitState());
1346 ASSERT_NO_FATAL_FAILURE(InitViewport());
1347 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1348
Karl Schultz6addd812016-02-02 17:17:23 -07001349 // We luck out b/c by default the framework creates CB w/ the
1350 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001351 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001352 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
1353 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001354 EndCommandBuffer();
1355
1356 testFence.init(*m_device, fenceInfo);
1357
1358 // Bypass framework since it does the waits automatically
1359 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001360 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001361 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1362 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001363 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001364 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001365 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001366 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001367 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001368 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001369 submit_info.pSignalSemaphores = NULL;
1370
Karl Schultz6addd812016-02-02 17:17:23 -07001371 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
1372 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001373
Karl Schultz6addd812016-02-02 17:17:23 -07001374 // Cause validation error by re-submitting cmd buffer that should only be
1375 // submitted once
1376 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001377
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001378 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001379 FAIL() << "Did not receive Error 'CB (0xaddress) was created w/ "
1380 "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001381 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001382 }
1383}
1384
Karl Schultz6addd812016-02-02 17:17:23 -07001385TEST_F(VkLayerTest, BindPipelineNoRenderPass) {
Mark Lobodzinski74635932015-12-18 15:35:38 -07001386 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07001387 VkResult err;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001388
1389 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001390 "vkCmdBindPipeline: This call must be "
1391 "issued inside an active render pass");
Mark Lobodzinski74635932015-12-18 15:35:38 -07001392
1393 ASSERT_NO_FATAL_FAILURE(InitState());
1394 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1395
1396 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001397 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1398 ds_type_count.descriptorCount = 1;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001399
1400 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001401 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1402 ds_pool_ci.pNext = NULL;
1403 ds_pool_ci.maxSets = 1;
1404 ds_pool_ci.poolSizeCount = 1;
1405 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001406
1407 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001408 err =
1409 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Lobodzinski74635932015-12-18 15:35:38 -07001410 ASSERT_VK_SUCCESS(err);
1411
1412 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001413 dsl_binding.binding = 0;
1414 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1415 dsl_binding.descriptorCount = 1;
1416 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1417 dsl_binding.pImmutableSamplers = NULL;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001418
1419 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001420 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1421 ds_layout_ci.pNext = NULL;
1422 ds_layout_ci.bindingCount = 1;
1423 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001424
1425 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001426 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1427 &ds_layout);
Mark Lobodzinski74635932015-12-18 15:35:38 -07001428 ASSERT_VK_SUCCESS(err);
1429
1430 VkDescriptorSet descriptorSet;
1431 VkDescriptorSetAllocateInfo alloc_info = {};
1432 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001433 alloc_info.descriptorSetCount = 1;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001434 alloc_info.descriptorPool = ds_pool;
1435 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001436 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1437 &descriptorSet);
Mark Lobodzinski74635932015-12-18 15:35:38 -07001438 ASSERT_VK_SUCCESS(err);
1439 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001440 pipe_ms_state_ci.sType =
1441 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
1442 pipe_ms_state_ci.pNext = NULL;
1443 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
1444 pipe_ms_state_ci.sampleShadingEnable = 0;
1445 pipe_ms_state_ci.minSampleShading = 1.0;
1446 pipe_ms_state_ci.pSampleMask = NULL;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001447
1448 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001449 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1450 pipeline_layout_ci.pNext = NULL;
1451 pipeline_layout_ci.setLayoutCount = 1;
1452 pipeline_layout_ci.pSetLayouts = &ds_layout;
1453 VkPipelineLayout pipeline_layout;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001454
Karl Schultz6addd812016-02-02 17:17:23 -07001455 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1456 &pipeline_layout);
Mark Lobodzinski74635932015-12-18 15:35:38 -07001457 ASSERT_VK_SUCCESS(err);
1458
Karl Schultz6addd812016-02-02 17:17:23 -07001459 VkShaderObj vs(m_device, bindStateVertShaderText,
1460 VK_SHADER_STAGE_VERTEX_BIT, this);
1461 VkShaderObj fs(m_device, bindStateFragShaderText,
1462 VK_SHADER_STAGE_FRAGMENT_BIT,
1463 this); // TODO - We shouldn't need a fragment shader
1464 // but add it to be able to run on more devices
Mark Lobodzinski74635932015-12-18 15:35:38 -07001465 VkPipelineObj pipe(m_device);
1466 pipe.AddShader(&vs);
1467 pipe.AddShader(&fs);
1468 pipe.SetMSAA(&pipe_ms_state_ci);
1469 pipe.CreateVKPipeline(pipeline_layout, renderPass());
1470
1471 // Calls AllocateCommandBuffers
1472 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
1473 VkCommandBufferBeginInfo cmd_buf_info = {};
1474 memset(&cmd_buf_info, 0, sizeof(VkCommandBufferBeginInfo));
Jon Ashburnf19916e2016-01-11 13:12:43 -07001475 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
1476 memset(&cmd_buf_hinfo, 0, sizeof(VkCommandBufferInheritanceInfo));
Mark Lobodzinski74635932015-12-18 15:35:38 -07001477 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1478 cmd_buf_info.pNext = NULL;
1479 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001480 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001481
1482 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Karl Schultz6addd812016-02-02 17:17:23 -07001483 vkCmdBindPipeline(commandBuffer.GetBufferHandle(),
1484 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Lobodzinski74635932015-12-18 15:35:38 -07001485
1486 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001487 FAIL() << "Did not receive Error 'vkCmdBindPipeline: This call must be "
1488 "issued inside an active render pass'";
Mark Lobodzinski74635932015-12-18 15:35:38 -07001489 m_errorMonitor->DumpFailureMsgs();
1490 }
1491
1492 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1493 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1494 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1495}
1496
Karl Schultz6addd812016-02-02 17:17:23 -07001497TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001498 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07001499 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001500
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001501 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001502 "Unable to allocate 1 descriptors of "
1503 "type "
1504 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001505
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001506 ASSERT_NO_FATAL_FAILURE(InitState());
1507 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001508
Karl Schultz6addd812016-02-02 17:17:23 -07001509 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
1510 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001511 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001512 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
1513 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001514
1515 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001516 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1517 ds_pool_ci.pNext = NULL;
1518 ds_pool_ci.flags = 0;
1519 ds_pool_ci.maxSets = 1;
1520 ds_pool_ci.poolSizeCount = 1;
1521 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001522
1523 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001524 err =
1525 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001526 ASSERT_VK_SUCCESS(err);
1527
1528 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001529 dsl_binding.binding = 0;
1530 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1531 dsl_binding.descriptorCount = 1;
1532 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1533 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001534
1535 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001536 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1537 ds_layout_ci.pNext = NULL;
1538 ds_layout_ci.bindingCount = 1;
1539 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001540
1541 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001542 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1543 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001544 ASSERT_VK_SUCCESS(err);
1545
1546 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001547 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001548 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001549 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001550 alloc_info.descriptorPool = ds_pool;
1551 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001552 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1553 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001554
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001555 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001556 FAIL() << "Did not receive Error 'Unable to allocate 1 descriptors of "
1557 "type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001558 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001559 }
1560
Chia-I Wuf7458c52015-10-26 21:10:41 +08001561 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1562 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001563}
1564
Karl Schultz6addd812016-02-02 17:17:23 -07001565TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
1566 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06001567
Karl Schultz6addd812016-02-02 17:17:23 -07001568 m_errorMonitor->SetDesiredFailureMsg(
1569 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1570 "It is invalid to call vkFreeDescriptorSets() with a pool created "
1571 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001572
Tobin Ehlise735c692015-10-08 13:13:50 -06001573 ASSERT_NO_FATAL_FAILURE(InitState());
1574 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06001575
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001576 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001577 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1578 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06001579
1580 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001581 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1582 ds_pool_ci.pNext = NULL;
1583 ds_pool_ci.maxSets = 1;
1584 ds_pool_ci.poolSizeCount = 1;
1585 ds_pool_ci.flags = 0;
1586 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
1587 // app can only call vkResetDescriptorPool on this pool.;
1588 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06001589
1590 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001591 err =
1592 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06001593 ASSERT_VK_SUCCESS(err);
1594
1595 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001596 dsl_binding.binding = 0;
1597 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1598 dsl_binding.descriptorCount = 1;
1599 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1600 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06001601
1602 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001603 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1604 ds_layout_ci.pNext = NULL;
1605 ds_layout_ci.bindingCount = 1;
1606 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06001607
1608 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001609 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1610 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06001611 ASSERT_VK_SUCCESS(err);
1612
1613 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001614 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001615 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001616 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001617 alloc_info.descriptorPool = ds_pool;
1618 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001619 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1620 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06001621 ASSERT_VK_SUCCESS(err);
1622
1623 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001624 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001625 FAIL() << "Did not receive Error 'It is invalid to call "
1626 "vkFreeDescriptorSets() with a pool created with...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001627 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlise735c692015-10-08 13:13:50 -06001628 }
1629
Chia-I Wuf7458c52015-10-26 21:10:41 +08001630 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1631 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06001632}
1633
Karl Schultz6addd812016-02-02 17:17:23 -07001634TEST_F(VkLayerTest, InvalidDescriptorPool) {
1635 // TODO : Simple check for bad object should be added to ObjectTracker to
1636 // catch this case
1637 // The DS check for this is after driver has been called to validate DS
1638 // internal data struct
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001639 // Attempt to clear DS Pool with bad object
Karl Schultz6addd812016-02-02 17:17:23 -07001640 /*
1641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1642 "Unable to find pool node for pool 0xbaad6001 specified in
1643 vkResetDescriptorPool() call");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001644
Karl Schultz6addd812016-02-02 17:17:23 -07001645 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
1646 vkResetDescriptorPool(device(), badPool);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001647
Karl Schultz6addd812016-02-02 17:17:23 -07001648 if (!m_errorMonitor->DesiredMsgFound()) {
1649 FAIL() << "Did not receive Error 'Unable to find pool node for pool
1650 0xbaad6001 specified in vkResetDescriptorPool() call'";
1651 m_errorMonitor->DumpFailureMsgs();
1652 }*/
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001653}
1654
Karl Schultz6addd812016-02-02 17:17:23 -07001655TEST_F(VkLayerTest, InvalidDescriptorSet) {
1656 // TODO : Simple check for bad object should be added to ObjectTracker to
1657 // catch this case
1658 // The DS check for this is after driver has been called to validate DS
1659 // internal data struct
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001660 // Create a valid cmd buffer
1661 // call vkCmdBindDescriptorSets w/ false DS
1662}
1663
Karl Schultz6addd812016-02-02 17:17:23 -07001664TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
1665 // TODO : Simple check for bad object should be added to ObjectTracker to
1666 // catch this case
1667 // The DS check for this is after driver has been called to validate DS
1668 // internal data struct
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001669}
1670
Karl Schultz6addd812016-02-02 17:17:23 -07001671TEST_F(VkLayerTest, InvalidPipeline) {
1672 // TODO : Simple check for bad object should be added to ObjectTracker to
1673 // catch this case
1674 // The DS check for this is after driver has been called to validate DS
1675 // internal data struct
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001676 // Create a valid cmd buffer
1677 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultz6addd812016-02-02 17:17:23 -07001678 //
1679 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1680 // "Attempt to bind Pipeline ");
1681 //
1682 // ASSERT_NO_FATAL_FAILURE(InitState());
1683 // VkCommandBufferObj commandBuffer(m_device);
1684 // BeginCommandBuffer();
1685 // VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
1686 // vkCmdBindPipeline(commandBuffer.GetBufferHandle(),
1687 // VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
1688 //
1689 // if (!m_errorMonitor->DesiredMsgFound()) {
1690 // FAIL() << "Did not receive Error 'Attempt to bind Pipeline
1691 // 0xbaadb1be that doesn't exist!'";
1692 // m_errorMonitor->DumpFailureMsgs();
1693 // }
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001694}
1695
Karl Schultz6addd812016-02-02 17:17:23 -07001696TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
1697 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
1698 // CommandBuffer
1699 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001700
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001701 // TODO: verify that this matches layer
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07001702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001703 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001704
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001705 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06001706 ASSERT_NO_FATAL_FAILURE(InitViewport());
1707 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001708 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001709 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1710 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06001711
1712 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001713 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1714 ds_pool_ci.pNext = NULL;
1715 ds_pool_ci.maxSets = 1;
1716 ds_pool_ci.poolSizeCount = 1;
1717 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06001718
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001719 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001720 err =
1721 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001722 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001723
Tony Barboureb254902015-07-15 12:50:33 -06001724 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001725 dsl_binding.binding = 0;
1726 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1727 dsl_binding.descriptorCount = 1;
1728 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1729 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001730
Tony Barboureb254902015-07-15 12:50:33 -06001731 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001732 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1733 ds_layout_ci.pNext = NULL;
1734 ds_layout_ci.bindingCount = 1;
1735 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001736 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001737 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1738 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001739 ASSERT_VK_SUCCESS(err);
1740
1741 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001742 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001743 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001744 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001745 alloc_info.descriptorPool = ds_pool;
1746 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001747 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1748 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001749 ASSERT_VK_SUCCESS(err);
1750
Tony Barboureb254902015-07-15 12:50:33 -06001751 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001752 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1753 pipeline_layout_ci.pNext = NULL;
1754 pipeline_layout_ci.setLayoutCount = 1;
1755 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001756
1757 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001758 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1759 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001760 ASSERT_VK_SUCCESS(err);
1761
Karl Schultz6addd812016-02-02 17:17:23 -07001762 VkShaderObj vs(m_device, bindStateVertShaderText,
1763 VK_SHADER_STAGE_VERTEX_BIT, this);
1764 // TODO - We shouldn't need a fragment shader but add it to be able to run
1765 // on more devices
1766 VkShaderObj fs(m_device, bindStateFragShaderText,
1767 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001768
Tony Barbourc95e4ac2015-08-04 17:05:26 -06001769 VkPipelineObj pipe(m_device);
1770 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06001771 pipe.AddShader(&fs);
Tony Barbourc95e4ac2015-08-04 17:05:26 -06001772 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06001773
1774 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001775 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1776 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
1777 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1778 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1779 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001780
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001781 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001782 FAIL() << "Did not recieve Warning 'DS <blah> bound but it was never "
1783 "updated. You may want to either update it or not bind it.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001784 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06001785 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06001786
Chia-I Wuf7458c52015-10-26 21:10:41 +08001787 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1788 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1789 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06001790}
1791
Karl Schultz6addd812016-02-02 17:17:23 -07001792TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001793 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07001794 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001795
Karl Schultz6addd812016-02-02 17:17:23 -07001796 m_errorMonitor->SetDesiredFailureMsg(
1797 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001798 "Attempt to update descriptor with invalid bufferView ");
1799
1800 ASSERT_NO_FATAL_FAILURE(InitState());
1801 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001802 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1803 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001804
1805 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001806 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1807 ds_pool_ci.pNext = NULL;
1808 ds_pool_ci.maxSets = 1;
1809 ds_pool_ci.poolSizeCount = 1;
1810 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001811
1812 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001813 err =
1814 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001815 ASSERT_VK_SUCCESS(err);
1816
1817 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001818 dsl_binding.binding = 0;
1819 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1820 dsl_binding.descriptorCount = 1;
1821 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1822 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001823
1824 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001825 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1826 ds_layout_ci.pNext = NULL;
1827 ds_layout_ci.bindingCount = 1;
1828 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001829 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001830 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1831 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001832 ASSERT_VK_SUCCESS(err);
1833
1834 VkDescriptorSet descriptorSet;
1835 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001836 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001837 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001838 alloc_info.descriptorPool = ds_pool;
1839 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001840 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1841 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001842 ASSERT_VK_SUCCESS(err);
1843
Karl Schultz6addd812016-02-02 17:17:23 -07001844 VkBufferView view =
1845 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001846 VkWriteDescriptorSet descriptor_write;
1847 memset(&descriptor_write, 0, sizeof(descriptor_write));
1848 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1849 descriptor_write.dstSet = descriptorSet;
1850 descriptor_write.dstBinding = 0;
1851 descriptor_write.descriptorCount = 1;
1852 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1853 descriptor_write.pTexelBufferView = &view;
1854
1855 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1856
1857 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001858 FAIL() << "Did not receive Error 'Attempt to update descriptor with "
1859 "invalid bufferView'";
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001860 m_errorMonitor->DumpFailureMsgs();
1861 }
1862
1863 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1864 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1865}
1866
Karl Schultz6addd812016-02-02 17:17:23 -07001867TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
1868 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
1869 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07001870 // 1. No dynamicOffset supplied
1871 // 2. Too many dynamicOffsets supplied
1872 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07001873 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001875 " requires 1 dynamicOffsets, but only "
1876 "0 dynamicOffsets are left in "
1877 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001878
1879 ASSERT_NO_FATAL_FAILURE(InitState());
1880 ASSERT_NO_FATAL_FAILURE(InitViewport());
1881 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1882
1883 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001884 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
1885 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001886
1887 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001888 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1889 ds_pool_ci.pNext = NULL;
1890 ds_pool_ci.maxSets = 1;
1891 ds_pool_ci.poolSizeCount = 1;
1892 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001893
1894 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001895 err =
1896 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001897 ASSERT_VK_SUCCESS(err);
1898
1899 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001900 dsl_binding.binding = 0;
1901 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
1902 dsl_binding.descriptorCount = 1;
1903 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1904 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001905
1906 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001907 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1908 ds_layout_ci.pNext = NULL;
1909 ds_layout_ci.bindingCount = 1;
1910 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001911 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001912 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1913 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001914 ASSERT_VK_SUCCESS(err);
1915
1916 VkDescriptorSet descriptorSet;
1917 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001918 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001919 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001920 alloc_info.descriptorPool = ds_pool;
1921 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001922 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1923 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001924 ASSERT_VK_SUCCESS(err);
1925
1926 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001927 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1928 pipeline_layout_ci.pNext = NULL;
1929 pipeline_layout_ci.setLayoutCount = 1;
1930 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001931
1932 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001933 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1934 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001935 ASSERT_VK_SUCCESS(err);
1936
1937 // Create a buffer to update the descriptor with
1938 uint32_t qfi = 0;
1939 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001940 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1941 buffCI.size = 1024;
1942 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1943 buffCI.queueFamilyIndexCount = 1;
1944 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001945
1946 VkBuffer dyub;
1947 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
1948 ASSERT_VK_SUCCESS(err);
1949 // Correctly update descriptor to avoid "NOT_UPDATED" error
1950 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001951 buffInfo.buffer = dyub;
1952 buffInfo.offset = 0;
1953 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001954
1955 VkWriteDescriptorSet descriptor_write;
1956 memset(&descriptor_write, 0, sizeof(descriptor_write));
1957 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1958 descriptor_write.dstSet = descriptorSet;
1959 descriptor_write.dstBinding = 0;
1960 descriptor_write.descriptorCount = 1;
1961 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
1962 descriptor_write.pBufferInfo = &buffInfo;
1963
1964 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1965
1966 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001967 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1968 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1969 1, &descriptorSet, 0, NULL);
Tobin Ehlisf6585052015-12-17 11:48:42 -07001970 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001971 FAIL() << "Error received was not 'descriptorSet #0 (0x<ADDR>) "
1972 "requires 1 dynamicOffsets, but only 0 dynamicOffsets are "
1973 "left in pDynamicOffsets array...'";
Tobin Ehlisf6585052015-12-17 11:48:42 -07001974 m_errorMonitor->DumpFailureMsgs();
1975 }
1976 uint32_t pDynOff[2] = {512, 756};
1977 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07001978 m_errorMonitor->SetDesiredFailureMsg(
1979 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07001980 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07001981 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1982 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1983 1, &descriptorSet, 2, pDynOff);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001984 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001985 FAIL() << "Error received was not 'Attempting to bind 1 descriptorSets "
1986 "with 1 dynamic descriptors, but dynamicOffsetCount is 0...'";
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001987 m_errorMonitor->DumpFailureMsgs();
1988 }
Tobin Ehlisf6585052015-12-17 11:48:42 -07001989 // Finally cause error due to dynamicOffset being too big
Karl Schultz6addd812016-02-02 17:17:23 -07001990 m_errorMonitor->SetDesiredFailureMsg(
1991 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07001992 " from its update, this oversteps its buffer (");
1993 // Create PSO to be used for draw-time errors below
1994 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07001995 "#version 400\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07001996 "#extension GL_ARB_separate_shader_objects: require\n"
1997 "#extension GL_ARB_shading_language_420pack: require\n"
1998 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07001999 "out gl_PerVertex { \n"
2000 " vec4 gl_Position;\n"
2001 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002002 "void main(){\n"
2003 " gl_Position = vec4(1);\n"
2004 "}\n";
2005 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07002006 "#version 400\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002007 "#extension GL_ARB_separate_shader_objects: require\n"
2008 "#extension GL_ARB_shading_language_420pack: require\n"
2009 "\n"
2010 "layout(location=0) out vec4 x;\n"
2011 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2012 "void main(){\n"
2013 " x = vec4(bar.y);\n"
2014 "}\n";
2015 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2016 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2017 VkPipelineObj pipe(m_device);
2018 pipe.AddShader(&vs);
2019 pipe.AddShader(&fs);
2020 pipe.AddColorAttachment();
2021 pipe.CreateVKPipeline(pipeline_layout, renderPass());
2022
Karl Schultz6addd812016-02-02 17:17:23 -07002023 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2024 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2025 // This update should succeed, but offset size of 512 will overstep buffer
2026 // /w range 1024 & size 1024
2027 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2028 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2029 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07002030 Draw(1, 0, 0, 0);
2031 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002032 FAIL() << "Error received was not 'VkDescriptorSet (0x<ADDR>) bound as "
2033 "set #0 has dynamic offset 512. Combined with offet 0 and "
2034 "range 1024 from its update, this oversteps...'";
Tobin Ehlisf6585052015-12-17 11:48:42 -07002035 m_errorMonitor->DumpFailureMsgs();
2036 }
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002037
2038 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2039 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2040}
2041
Karl Schultz6addd812016-02-02 17:17:23 -07002042TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07002043 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07002044 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002045
2046 ASSERT_NO_FATAL_FAILURE(InitState());
2047 ASSERT_NO_FATAL_FAILURE(InitViewport());
2048 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2049
2050 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
2051 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002052 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2053 ds_type_count[0].descriptorCount = 10;
2054 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
2055 ds_type_count[1].descriptorCount = 2;
2056 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
2057 ds_type_count[2].descriptorCount = 2;
2058 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
2059 ds_type_count[3].descriptorCount = 5;
2060 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
2061 // type
2062 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
2063 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
2064 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002065
2066 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002067 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2068 ds_pool_ci.pNext = NULL;
2069 ds_pool_ci.maxSets = 5;
2070 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
2071 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002072
2073 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002074 err =
2075 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002076 ASSERT_VK_SUCCESS(err);
2077
2078 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
2079 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002080 dsl_binding[0].binding = 0;
2081 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2082 dsl_binding[0].descriptorCount = 5;
2083 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
2084 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002085
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002086 // Create layout identical to set0 layout but w/ different stageFlags
2087 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002088 dsl_fs_stage_only.binding = 0;
2089 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2090 dsl_fs_stage_only.descriptorCount = 5;
2091 dsl_fs_stage_only.stageFlags =
2092 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
2093 // bind time
2094 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002095 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002096 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2097 ds_layout_ci.pNext = NULL;
2098 ds_layout_ci.bindingCount = 1;
2099 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002100 static const uint32_t NUM_LAYOUTS = 4;
2101 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002102 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002103 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
2104 // layout for error case
2105 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2106 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002107 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002108 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002109 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2110 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002111 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002112 dsl_binding[0].binding = 0;
2113 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002114 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002115 dsl_binding[1].binding = 1;
2116 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
2117 dsl_binding[1].descriptorCount = 2;
2118 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
2119 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002120 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002121 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07002122 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2123 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002124 ASSERT_VK_SUCCESS(err);
2125 dsl_binding[0].binding = 0;
2126 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002127 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002128 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07002129 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2130 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002131 ASSERT_VK_SUCCESS(err);
2132 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002133 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07002134 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2135 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002136 ASSERT_VK_SUCCESS(err);
2137
2138 static const uint32_t NUM_SETS = 4;
2139 VkDescriptorSet descriptorSet[NUM_SETS] = {};
2140 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002141 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002142 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002143 alloc_info.descriptorPool = ds_pool;
2144 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002145 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2146 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002147 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002148 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07002149 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002150 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002151 err =
2152 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002153 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002154
2155 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002156 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2157 pipeline_layout_ci.pNext = NULL;
2158 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
2159 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002160
2161 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002162 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2163 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002164 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002165 // Create pipelineLayout with only one setLayout
2166 pipeline_layout_ci.setLayoutCount = 1;
2167 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002168 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2169 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002170 ASSERT_VK_SUCCESS(err);
2171 // Create pipelineLayout with 2 descriptor setLayout at index 0
2172 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
2173 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07002174 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2175 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002176 ASSERT_VK_SUCCESS(err);
2177 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
2178 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
2179 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07002180 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2181 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002182 ASSERT_VK_SUCCESS(err);
2183 // Create pipelineLayout with UB type, but stageFlags for FS only
2184 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
2185 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002186 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2187 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002188 ASSERT_VK_SUCCESS(err);
2189 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
2190 VkDescriptorSetLayout pl_bad_s0[2] = {};
2191 pl_bad_s0[0] = ds_layout_fs_only;
2192 pl_bad_s0[1] = ds_layout[1];
2193 pipeline_layout_ci.setLayoutCount = 2;
2194 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
2195 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07002196 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2197 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002198 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002199
2200 // Create a buffer to update the descriptor with
2201 uint32_t qfi = 0;
2202 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002203 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2204 buffCI.size = 1024;
2205 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2206 buffCI.queueFamilyIndexCount = 1;
2207 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002208
2209 VkBuffer dyub;
2210 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2211 ASSERT_VK_SUCCESS(err);
2212 // Correctly update descriptor to avoid "NOT_UPDATED" error
2213 static const uint32_t NUM_BUFFS = 5;
2214 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002215 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07002216 buffInfo[i].buffer = dyub;
2217 buffInfo[i].offset = 0;
2218 buffInfo[i].range = 1024;
2219 }
Karl Schultz6addd812016-02-02 17:17:23 -07002220 VkImage image;
2221 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2222 const int32_t tex_width = 32;
2223 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002224 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002225 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2226 image_create_info.pNext = NULL;
2227 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2228 image_create_info.format = tex_format;
2229 image_create_info.extent.width = tex_width;
2230 image_create_info.extent.height = tex_height;
2231 image_create_info.extent.depth = 1;
2232 image_create_info.mipLevels = 1;
2233 image_create_info.arrayLayers = 1;
2234 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2235 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2236 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2237 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002238 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2239 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002240
Karl Schultz6addd812016-02-02 17:17:23 -07002241 VkMemoryRequirements memReqs;
2242 VkDeviceMemory imageMem;
2243 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002244 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002245 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2246 memAlloc.pNext = NULL;
2247 memAlloc.allocationSize = 0;
2248 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002249 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
2250 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002251 pass =
2252 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002253 ASSERT_TRUE(pass);
2254 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
2255 ASSERT_VK_SUCCESS(err);
2256 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
2257 ASSERT_VK_SUCCESS(err);
2258
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002259 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002260 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2261 image_view_create_info.image = image;
2262 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
2263 image_view_create_info.format = tex_format;
2264 image_view_create_info.subresourceRange.layerCount = 1;
2265 image_view_create_info.subresourceRange.baseMipLevel = 0;
2266 image_view_create_info.subresourceRange.levelCount = 1;
2267 image_view_create_info.subresourceRange.aspectMask =
2268 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002269
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002270 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07002271 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
2272 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002273 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002274 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002275 imageInfo[0].imageView = view;
2276 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2277 imageInfo[1].imageView = view;
2278 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002279 imageInfo[2].imageView = view;
2280 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2281 imageInfo[3].imageView = view;
2282 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002283
2284 static const uint32_t NUM_SET_UPDATES = 3;
2285 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
2286 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2287 descriptor_write[0].dstSet = descriptorSet[0];
2288 descriptor_write[0].dstBinding = 0;
2289 descriptor_write[0].descriptorCount = 5;
2290 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2291 descriptor_write[0].pBufferInfo = buffInfo;
2292 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2293 descriptor_write[1].dstSet = descriptorSet[1];
2294 descriptor_write[1].dstBinding = 0;
2295 descriptor_write[1].descriptorCount = 2;
2296 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
2297 descriptor_write[1].pImageInfo = imageInfo;
2298 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2299 descriptor_write[2].dstSet = descriptorSet[1];
2300 descriptor_write[2].dstBinding = 1;
2301 descriptor_write[2].descriptorCount = 2;
2302 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002303 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002304
2305 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002306
Tobin Ehlis88452832015-12-03 09:40:56 -07002307 // Create PSO to be used for draw-time errors below
2308 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07002309 "#version 400\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002310 "#extension GL_ARB_separate_shader_objects: require\n"
2311 "#extension GL_ARB_shading_language_420pack: require\n"
2312 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07002313 "out gl_PerVertex {\n"
2314 " vec4 gl_Position;\n"
2315 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002316 "void main(){\n"
2317 " gl_Position = vec4(1);\n"
2318 "}\n";
2319 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07002320 "#version 400\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002321 "#extension GL_ARB_separate_shader_objects: require\n"
2322 "#extension GL_ARB_shading_language_420pack: require\n"
2323 "\n"
2324 "layout(location=0) out vec4 x;\n"
2325 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2326 "void main(){\n"
2327 " x = vec4(bar.y);\n"
2328 "}\n";
2329 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2330 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002331 VkPipelineObj pipe(m_device);
2332 pipe.AddShader(&vs);
2333 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07002334 pipe.AddColorAttachment();
2335 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07002336
2337 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07002338
Karl Schultz6addd812016-02-02 17:17:23 -07002339 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2340 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2341 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
2342 // of PSO
2343 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
2344 // cmd_pipeline.c
2345 // due to the fact that cmd_alloc_dset_data() has not been called in
2346 // cmd_bind_graphics_pipeline()
2347 // TODO : Want to cause various binding incompatibility issues here to test
2348 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07002349 // First cause various verify_layout_compatibility() fails
2350 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002351 // verify_set_layout_compatibility fail cases:
2352 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07002353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2354 " due to: invalid VkPipelineLayout ");
2355 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2356 VK_PIPELINE_BIND_POINT_GRAPHICS,
2357 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
2358 &descriptorSet[0], 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002359 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002360 FAIL() << "Did not receive correct error msg when attempting to bind "
2361 "descriptorSets with invalid VkPipelineLayout.";
Tobin Ehlis559c6382015-11-05 09:52:49 -07002362 m_errorMonitor->DumpFailureMsgs();
2363 }
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002364 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07002365 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2366 " attempting to bind set to index 1");
2367 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2368 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
2369 0, 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002370 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002371 FAIL() << "Did not receive correct error msg when attempting to bind "
2372 "descriptorSet to index 1 when pipelineLayout only has index "
2373 "0.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002374 m_errorMonitor->DumpFailureMsgs();
2375 }
2376 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07002377 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
2378 // descriptors
2379 m_errorMonitor->SetDesiredFailureMsg(
2380 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2381 ", but corresponding set being bound has 5 descriptors.");
2382 vkCmdBindDescriptorSets(
2383 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2384 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002385 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002386 FAIL() << "Did not receive correct error msg when attempting to bind "
2387 "descriptorSet w/ 5 descriptors to pipelineLayout with only "
2388 "2 descriptors.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002389 m_errorMonitor->DumpFailureMsgs();
2390 }
2391 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
2392 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07002393 m_errorMonitor->SetDesiredFailureMsg(
2394 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2395 " descriptor from pipelineLayout is type 'VK_DESCRIPTOR_TYPE_SAMPLER'");
2396 vkCmdBindDescriptorSets(
2397 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2398 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002399 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002400 FAIL() << "Did not receive correct error msg when attempting to bind "
2401 "UNIFORM_BUFFER descriptorSet to pipelineLayout with "
2402 "overlapping SAMPLER type.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002403 m_errorMonitor->DumpFailureMsgs();
2404 }
2405 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
2406 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07002407 m_errorMonitor->SetDesiredFailureMsg(
2408 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2409 " descriptor from pipelineLayout has stageFlags ");
2410 vkCmdBindDescriptorSets(
2411 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2412 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002413 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002414 FAIL() << "Did not receive correct error msg when attempting to bind "
2415 "UNIFORM_BUFFER descriptorSet with ALL stageFlags to "
2416 "pipelineLayout with FS-only stageFlags.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002417 m_errorMonitor->DumpFailureMsgs();
2418 }
2419 // Cause INFO messages due to disturbing previously bound Sets
2420 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07002421 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2422 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2423 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002424 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07002425 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002426 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002427 " previously bound as set #0 was disturbed ");
2428 vkCmdBindDescriptorSets(
2429 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2430 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002431 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002432 FAIL() << "Did not receive correct info msg when binding Set1 w/ "
2433 "pipelineLayout that should disturb Set0.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002434 m_errorMonitor->DumpFailureMsgs();
2435 }
Karl Schultz6addd812016-02-02 17:17:23 -07002436 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2437 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2438 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002439 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002441 " newly bound as set #0 so set #1 and "
2442 "any subsequent sets were disturbed ");
2443 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2444 VK_PIPELINE_BIND_POINT_GRAPHICS,
2445 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002446 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002447 FAIL() << "Did not receive correct info msg when re-binding Set0 w/ "
2448 "pipelineLayout that should disturb Set1.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002449 m_errorMonitor->DumpFailureMsgs();
2450 }
Tobin Ehlis88452832015-12-03 09:40:56 -07002451 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07002452 // 1. Error due to not binding required set (we actually use same code as
2453 // above to disturb set0)
2454 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2455 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2456 2, &descriptorSet[0], 0, NULL);
2457 vkCmdBindDescriptorSets(
2458 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2459 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
2460 m_errorMonitor->SetDesiredFailureMsg(
2461 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2462 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07002463 Draw(1, 0, 0, 0);
2464 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002465 FAIL() << "Did not receive correct error msg when attempting draw "
2466 "requiring Set0 but Set0 is not bound.";
Tobin Ehlis88452832015-12-03 09:40:56 -07002467 m_errorMonitor->DumpFailureMsgs();
2468 }
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002469 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07002470 // 2. Error due to bound set not being compatible with PSO's
2471 // VkPipelineLayout (diff stageFlags in this case)
2472 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2473 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2474 2, &descriptorSet[0], 0, NULL);
2475 m_errorMonitor->SetDesiredFailureMsg(
2476 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2477 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07002478 Draw(1, 0, 0, 0);
2479 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002480 FAIL() << "Did not receive correct error msg when attempted draw where "
2481 "bound Set0 layout is not compatible PSO Set0 layout.";
Tobin Ehlis88452832015-12-03 09:40:56 -07002482 m_errorMonitor->DumpFailureMsgs();
2483 }
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002484 // Remaining clean-up
2485 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07002486 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002487 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
2488 }
2489 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
2490 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, descriptorSet);
2491 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002492 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2493 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2494}
Tobin Ehlis559c6382015-11-05 09:52:49 -07002495
Karl Schultz6addd812016-02-02 17:17:23 -07002496TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002497
Karl Schultz6addd812016-02-02 17:17:23 -07002498 m_errorMonitor->SetDesiredFailureMsg(
2499 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002500 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002501
2502 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002503 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002504 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002505 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002506
2507 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002508 FAIL() << "Did not recieve Error 'You must call vkBeginCommandBuffer() "
2509 "before this call to vkEndCommandBuffer()'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002510 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002511 }
2512}
2513
Karl Schultz6addd812016-02-02 17:17:23 -07002514TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
2515 VkResult err;
2516 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002517
Karl Schultz6addd812016-02-02 17:17:23 -07002518 m_errorMonitor->SetDesiredFailureMsg(
2519 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07002520 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002521
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002522 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002523
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002524 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002525 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06002526 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002527 cmd.commandPool = m_commandPool;
2528 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002529 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06002530
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002531 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06002532 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002533
2534 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002535 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07002536 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002537 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06002538 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07002539 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
2540 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002541 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002542
2543 // The error should be caught by validation of the BeginCommandBuffer call
2544 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
2545
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002546 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002547 FAIL() << "Did not receive Error 'vkBeginCommandBuffer(): Secondary "
2548 "Command Buffers (0x<ADDR>) must specify a valid renderpass "
2549 "parameter.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002550 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002551 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002552 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002553}
2554
Karl Schultz6addd812016-02-02 17:17:23 -07002555TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002556 // Cause error due to Begin while recording CB
2557 // Then cause 2 errors for attempting to reset CB w/o having
2558 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
2559 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002560 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002561 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002562
2563 ASSERT_NO_FATAL_FAILURE(InitState());
2564
2565 // Calls AllocateCommandBuffers
2566 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
2567
Karl Schultz6addd812016-02-02 17:17:23 -07002568 // Force the failure by setting the Renderpass and Framebuffer fields with
2569 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002570 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07002571 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002572 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2573 cmd_buf_info.pNext = NULL;
2574 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002575 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002576
2577 // Begin CB to transition to recording state
2578 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
2579 // Can't re-begin. This should trigger error
2580 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
2581 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002582 FAIL() << "Did not receive Error 'Cannot call Begin on CB (0x<ADDR>) "
2583 "in the RECORDING state...'";
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002584 m_errorMonitor->DumpFailureMsgs();
2585 }
Karl Schultz6addd812016-02-02 17:17:23 -07002586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2587 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002588 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
2589 // Reset attempt will trigger error due to incorrect CommandPool state
2590 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
2591 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002592 FAIL() << "Did not receive Error 'Attempt to reset command buffer "
2593 "(0x<ADDR>) created from command pool...'";
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002594 m_errorMonitor->DumpFailureMsgs();
2595 }
Karl Schultz6addd812016-02-02 17:17:23 -07002596 m_errorMonitor->SetDesiredFailureMsg(
2597 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2598 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002599 // Transition CB to RECORDED state
2600 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
2601 // Now attempting to Begin will implicitly reset, which triggers error
2602 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
2603 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002604 FAIL() << "Did not receive Error 'Call to vkBeginCommandBuffer() on "
2605 "command buffer (0x<ADDR>) attempts to implicitly reset...'";
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002606 m_errorMonitor->DumpFailureMsgs();
2607 }
2608}
2609
Karl Schultz6addd812016-02-02 17:17:23 -07002610TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002611 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07002612 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002613
Karl Schultz6addd812016-02-02 17:17:23 -07002614 m_errorMonitor->SetDesiredFailureMsg(
2615 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002616 "Invalid Pipeline CreateInfo State: Vtx Shader required");
2617
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002618 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002619 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002620
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002621 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002622 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2623 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06002624
2625 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002626 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2627 ds_pool_ci.pNext = NULL;
2628 ds_pool_ci.maxSets = 1;
2629 ds_pool_ci.poolSizeCount = 1;
2630 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002631
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002632 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002633 err =
2634 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002635 ASSERT_VK_SUCCESS(err);
2636
Tony Barboureb254902015-07-15 12:50:33 -06002637 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002638 dsl_binding.binding = 0;
2639 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2640 dsl_binding.descriptorCount = 1;
2641 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2642 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002643
Tony Barboureb254902015-07-15 12:50:33 -06002644 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002645 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2646 ds_layout_ci.pNext = NULL;
2647 ds_layout_ci.bindingCount = 1;
2648 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06002649
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002650 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002651 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2652 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002653 ASSERT_VK_SUCCESS(err);
2654
2655 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002656 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002657 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002658 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002659 alloc_info.descriptorPool = ds_pool;
2660 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002661 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2662 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002663 ASSERT_VK_SUCCESS(err);
2664
Tony Barboureb254902015-07-15 12:50:33 -06002665 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002666 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2667 pipeline_layout_ci.setLayoutCount = 1;
2668 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002669
2670 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002671 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2672 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002673 ASSERT_VK_SUCCESS(err);
2674
Tobin Ehlise68360f2015-10-01 11:15:13 -06002675 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07002676 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06002677
2678 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002679 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
2680 vp_state_ci.scissorCount = 1;
2681 vp_state_ci.pScissors = &sc;
2682 vp_state_ci.viewportCount = 1;
2683 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002684
Tony Barboureb254902015-07-15 12:50:33 -06002685 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002686 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2687 gp_ci.pViewportState = &vp_state_ci;
2688 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2689 gp_ci.layout = pipeline_layout;
2690 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06002691
2692 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002693 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2694 pc_ci.initialDataSize = 0;
2695 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002696
2697 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06002698 VkPipelineCache pipelineCache;
2699
Karl Schultz6addd812016-02-02 17:17:23 -07002700 err =
2701 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06002702 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07002703 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2704 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002705
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002706 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002707 FAIL() << "Did not receive Error 'Invalid Pipeline CreateInfo State: "
2708 "Vtx Shader required'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002709 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002710 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06002711
Chia-I Wuf7458c52015-10-26 21:10:41 +08002712 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2713 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2714 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2715 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002716}
Tobin Ehlis912df022015-09-17 08:46:18 -06002717/*// TODO : This test should be good, but needs Tess support in compiler to run
2718TEST_F(VkLayerTest, InvalidPatchControlPoints)
2719{
2720 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06002721 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002722
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002724 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
2725primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002726
Tobin Ehlis912df022015-09-17 08:46:18 -06002727 ASSERT_NO_FATAL_FAILURE(InitState());
2728 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06002729
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002730 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06002731 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002732 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06002733
2734 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2735 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2736 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002737 ds_pool_ci.poolSizeCount = 1;
2738 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06002739
2740 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002741 err = vkCreateDescriptorPool(m_device->device(),
2742VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06002743 ASSERT_VK_SUCCESS(err);
2744
2745 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08002746 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06002747 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08002748 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06002749 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2750 dsl_binding.pImmutableSamplers = NULL;
2751
2752 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002753 ds_layout_ci.sType =
2754VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06002755 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002756 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002757 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06002758
2759 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002760 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2761&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06002762 ASSERT_VK_SUCCESS(err);
2763
2764 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07002765 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
2766VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06002767 ASSERT_VK_SUCCESS(err);
2768
2769 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002770 pipeline_layout_ci.sType =
2771VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06002772 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002773 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06002774 pipeline_layout_ci.pSetLayouts = &ds_layout;
2775
2776 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002777 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2778&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06002779 ASSERT_VK_SUCCESS(err);
2780
2781 VkPipelineShaderStageCreateInfo shaderStages[3];
2782 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
2783
Karl Schultz6addd812016-02-02 17:17:23 -07002784 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
2785this);
Tobin Ehlis912df022015-09-17 08:46:18 -06002786 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07002787 VkShaderObj
2788tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
2789this);
2790 VkShaderObj
2791te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
2792this);
Tobin Ehlis912df022015-09-17 08:46:18 -06002793
Karl Schultz6addd812016-02-02 17:17:23 -07002794 shaderStages[0].sType =
2795VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06002796 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06002797 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07002798 shaderStages[1].sType =
2799VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06002800 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06002801 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07002802 shaderStages[2].sType =
2803VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06002804 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06002805 shaderStages[2].shader = te.handle();
2806
2807 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002808 iaCI.sType =
2809VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08002810 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06002811
2812 VkPipelineTessellationStateCreateInfo tsCI = {};
2813 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
2814 tsCI.patchControlPoints = 0; // This will cause an error
2815
2816 VkGraphicsPipelineCreateInfo gp_ci = {};
2817 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2818 gp_ci.pNext = NULL;
2819 gp_ci.stageCount = 3;
2820 gp_ci.pStages = shaderStages;
2821 gp_ci.pVertexInputState = NULL;
2822 gp_ci.pInputAssemblyState = &iaCI;
2823 gp_ci.pTessellationState = &tsCI;
2824 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002825 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06002826 gp_ci.pMultisampleState = NULL;
2827 gp_ci.pDepthStencilState = NULL;
2828 gp_ci.pColorBlendState = NULL;
2829 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2830 gp_ci.layout = pipeline_layout;
2831 gp_ci.renderPass = renderPass();
2832
2833 VkPipelineCacheCreateInfo pc_ci = {};
2834 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2835 pc_ci.pNext = NULL;
2836 pc_ci.initialSize = 0;
2837 pc_ci.initialData = 0;
2838 pc_ci.maxSize = 0;
2839
2840 VkPipeline pipeline;
2841 VkPipelineCache pipelineCache;
2842
Karl Schultz6addd812016-02-02 17:17:23 -07002843 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
2844&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06002845 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07002846 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2847&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06002848
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002849 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002850 FAIL() << "Did not receive Error 'Invalid Pipeline CreateInfo State:
2851VK_PRIMITIVE_TOPOLOGY_PATCH primitive...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002852 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis912df022015-09-17 08:46:18 -06002853 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06002854
Chia-I Wuf7458c52015-10-26 21:10:41 +08002855 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2856 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2857 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2858 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06002859}
2860*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06002861// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07002862TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06002863 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07002864 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002865
Karl Schultz6addd812016-02-02 17:17:23 -07002866 m_errorMonitor->SetDesiredFailureMsg(
2867 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002868 "Gfx Pipeline viewport count (1) must match scissor count (0).");
2869
Tobin Ehlise68360f2015-10-01 11:15:13 -06002870 ASSERT_NO_FATAL_FAILURE(InitState());
2871 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06002872
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002873 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002874 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2875 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002876
2877 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002878 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2879 ds_pool_ci.maxSets = 1;
2880 ds_pool_ci.poolSizeCount = 1;
2881 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002882
2883 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002884 err =
2885 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002886 ASSERT_VK_SUCCESS(err);
2887
2888 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002889 dsl_binding.binding = 0;
2890 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2891 dsl_binding.descriptorCount = 1;
2892 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002893
2894 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002895 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2896 ds_layout_ci.bindingCount = 1;
2897 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002898
2899 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002900 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2901 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002902 ASSERT_VK_SUCCESS(err);
2903
2904 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002905 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002906 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002907 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002908 alloc_info.descriptorPool = ds_pool;
2909 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002910 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2911 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002912 ASSERT_VK_SUCCESS(err);
2913
2914 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002915 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2916 pipeline_layout_ci.setLayoutCount = 1;
2917 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002918
2919 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002920 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2921 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002922 ASSERT_VK_SUCCESS(err);
2923
2924 VkViewport vp = {}; // Just need dummy vp to point to
2925
2926 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002927 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
2928 vp_state_ci.scissorCount = 0;
2929 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
2930 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002931
Cody Northropeb3a6c12015-10-05 14:44:45 -06002932 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07002933 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06002934
Karl Schultz6addd812016-02-02 17:17:23 -07002935 VkShaderObj vs(m_device, bindStateVertShaderText,
2936 VK_SHADER_STAGE_VERTEX_BIT, this);
2937 VkShaderObj fs(m_device, bindStateFragShaderText,
2938 VK_SHADER_STAGE_FRAGMENT_BIT,
2939 this); // TODO - We shouldn't need a fragment shader
2940 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08002941 shaderStages[0] = vs.GetStageCreateInfo();
2942 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002943
2944 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002945 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2946 gp_ci.stageCount = 2;
2947 gp_ci.pStages = shaderStages;
2948 gp_ci.pViewportState = &vp_state_ci;
2949 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2950 gp_ci.layout = pipeline_layout;
2951 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002952
2953 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002954 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002955
2956 VkPipeline pipeline;
2957 VkPipelineCache pipelineCache;
2958
Karl Schultz6addd812016-02-02 17:17:23 -07002959 err =
2960 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002961 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07002962 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2963 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002964
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002965 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002966 FAIL() << "Did not receive Error 'Gfx Pipeline viewport count (1) must "
2967 "match scissor count (0).'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002968 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002969 }
2970
Chia-I Wuf7458c52015-10-26 21:10:41 +08002971 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2972 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2973 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2974 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002975}
Karl Schultz6addd812016-02-02 17:17:23 -07002976// Don't set viewport state in PSO. This is an error b/c we always need this
2977// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06002978// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07002979TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06002980 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07002981 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002982
Karl Schultz6addd812016-02-02 17:17:23 -07002983 m_errorMonitor->SetDesiredFailureMsg(
2984 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002985 "Gfx Pipeline pViewportState is null. Even if ");
2986
Tobin Ehlise68360f2015-10-01 11:15:13 -06002987 ASSERT_NO_FATAL_FAILURE(InitState());
2988 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06002989
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002990 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002991 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2992 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002993
2994 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002995 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2996 ds_pool_ci.maxSets = 1;
2997 ds_pool_ci.poolSizeCount = 1;
2998 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002999
3000 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003001 err =
3002 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003003 ASSERT_VK_SUCCESS(err);
3004
3005 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003006 dsl_binding.binding = 0;
3007 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3008 dsl_binding.descriptorCount = 1;
3009 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003010
3011 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003012 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3013 ds_layout_ci.bindingCount = 1;
3014 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003015
3016 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003017 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3018 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003019 ASSERT_VK_SUCCESS(err);
3020
3021 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003022 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003023 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003024 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003025 alloc_info.descriptorPool = ds_pool;
3026 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003027 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3028 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003029 ASSERT_VK_SUCCESS(err);
3030
3031 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003032 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3033 pipeline_layout_ci.setLayoutCount = 1;
3034 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003035
3036 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003037 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3038 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003039 ASSERT_VK_SUCCESS(err);
3040
3041 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
3042 // Set scissor as dynamic to avoid second error
3043 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003044 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3045 dyn_state_ci.dynamicStateCount = 1;
3046 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003047
Cody Northropeb3a6c12015-10-05 14:44:45 -06003048 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003049 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003050
Karl Schultz6addd812016-02-02 17:17:23 -07003051 VkShaderObj vs(m_device, bindStateVertShaderText,
3052 VK_SHADER_STAGE_VERTEX_BIT, this);
3053 VkShaderObj fs(m_device, bindStateFragShaderText,
3054 VK_SHADER_STAGE_FRAGMENT_BIT,
3055 this); // TODO - We shouldn't need a fragment shader
3056 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003057 shaderStages[0] = vs.GetStageCreateInfo();
3058 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003059
3060 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003061 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3062 gp_ci.stageCount = 2;
3063 gp_ci.pStages = shaderStages;
3064 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
3065 // should cause validation error
3066 gp_ci.pDynamicState = &dyn_state_ci;
3067 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3068 gp_ci.layout = pipeline_layout;
3069 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003070
3071 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003072 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003073
3074 VkPipeline pipeline;
3075 VkPipelineCache pipelineCache;
3076
Karl Schultz6addd812016-02-02 17:17:23 -07003077 err =
3078 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003079 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003080 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3081 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003082
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003083 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003084 FAIL() << "Did not receive Error 'Gfx Pipeline pViewportState is null. "
3085 "Even if...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003086 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003087 }
3088
Chia-I Wuf7458c52015-10-26 21:10:41 +08003089 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3090 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3091 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3092 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003093}
3094// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07003095// Then run second test where dynamic scissor count doesn't match PSO scissor
3096// count
3097TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
3098 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003099
Karl Schultz6addd812016-02-02 17:17:23 -07003100 m_errorMonitor->SetDesiredFailureMsg(
3101 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003102 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
3103
Tobin Ehlise68360f2015-10-01 11:15:13 -06003104 ASSERT_NO_FATAL_FAILURE(InitState());
3105 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003106
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003107 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003108 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3109 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003110
3111 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003112 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3113 ds_pool_ci.maxSets = 1;
3114 ds_pool_ci.poolSizeCount = 1;
3115 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003116
3117 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003118 err =
3119 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003120 ASSERT_VK_SUCCESS(err);
3121
3122 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003123 dsl_binding.binding = 0;
3124 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3125 dsl_binding.descriptorCount = 1;
3126 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003127
3128 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003129 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3130 ds_layout_ci.bindingCount = 1;
3131 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003132
3133 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003134 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3135 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003136 ASSERT_VK_SUCCESS(err);
3137
3138 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003139 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003140 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003141 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003142 alloc_info.descriptorPool = ds_pool;
3143 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003144 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3145 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003146 ASSERT_VK_SUCCESS(err);
3147
3148 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003149 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3150 pipeline_layout_ci.setLayoutCount = 1;
3151 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003152
3153 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003154 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3155 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003156 ASSERT_VK_SUCCESS(err);
3157
3158 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003159 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3160 vp_state_ci.viewportCount = 1;
3161 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
3162 vp_state_ci.scissorCount = 1;
3163 vp_state_ci.pScissors =
3164 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06003165
3166 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
3167 // Set scissor as dynamic to avoid that error
3168 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003169 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3170 dyn_state_ci.dynamicStateCount = 1;
3171 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003172
Cody Northropeb3a6c12015-10-05 14:44:45 -06003173 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003174 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003175
Karl Schultz6addd812016-02-02 17:17:23 -07003176 VkShaderObj vs(m_device, bindStateVertShaderText,
3177 VK_SHADER_STAGE_VERTEX_BIT, this);
3178 VkShaderObj fs(m_device, bindStateFragShaderText,
3179 VK_SHADER_STAGE_FRAGMENT_BIT,
3180 this); // TODO - We shouldn't need a fragment shader
3181 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003182 shaderStages[0] = vs.GetStageCreateInfo();
3183 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003184
Cody Northropf6622dc2015-10-06 10:33:21 -06003185 VkPipelineVertexInputStateCreateInfo vi_ci = {};
3186 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
3187 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003188 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06003189 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003190 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06003191 vi_ci.pVertexAttributeDescriptions = nullptr;
3192
3193 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
3194 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
3195 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
3196
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003197 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003198 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06003199 rs_ci.pNext = nullptr;
3200
3201 VkPipelineColorBlendStateCreateInfo cb_ci = {};
3202 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
3203 cb_ci.pNext = nullptr;
3204
Tobin Ehlise68360f2015-10-01 11:15:13 -06003205 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003206 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3207 gp_ci.stageCount = 2;
3208 gp_ci.pStages = shaderStages;
3209 gp_ci.pVertexInputState = &vi_ci;
3210 gp_ci.pInputAssemblyState = &ia_ci;
3211 gp_ci.pViewportState = &vp_state_ci;
3212 gp_ci.pRasterizationState = &rs_ci;
3213 gp_ci.pColorBlendState = &cb_ci;
3214 gp_ci.pDynamicState = &dyn_state_ci;
3215 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3216 gp_ci.layout = pipeline_layout;
3217 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003218
3219 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003220 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003221
3222 VkPipeline pipeline;
3223 VkPipelineCache pipelineCache;
3224
Karl Schultz6addd812016-02-02 17:17:23 -07003225 err =
3226 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003227 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003228 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3229 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003230
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003231 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003232 FAIL() << "Did not recieve Error 'Gfx Pipeline viewportCount is 1, but "
3233 "pViewports is NULL...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003234 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003235 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003236
Tobin Ehlisd332f282015-10-02 11:00:56 -06003237 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07003238 // First need to successfully create the PSO from above by setting
3239 // pViewports
3240 m_errorMonitor->SetDesiredFailureMsg(
3241 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3242 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
3243 "scissorCount is 1. These counts must match.");
3244
3245 VkViewport vp = {}; // Just need dummy vp to point to
3246 vp_state_ci.pViewports = &vp;
3247 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3248 &gp_ci, NULL, &pipeline);
3249 ASSERT_VK_SUCCESS(err);
3250 BeginCommandBuffer();
3251 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3252 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
3253 VkRect2D scissors[2] = {}; // don't care about data
3254 // Count of 2 doesn't match PSO count of 1
3255 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
3256 Draw(1, 0, 0, 0);
3257
3258 if (!m_errorMonitor->DesiredMsgFound()) {
3259 FAIL() << "Did not receive Error 'Dynamic scissorCount from "
3260 "vkCmdSetScissor() is 2, but PSO scissorCount is 1...'";
3261 m_errorMonitor->DumpFailureMsgs();
3262 }
3263
3264 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3265 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3266 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3267 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3268}
3269// Create PSO w/o non-zero scissorCount but no scissor data
3270// Then run second test where dynamic viewportCount doesn't match PSO
3271// viewportCount
3272TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
3273 VkResult err;
3274
3275 m_errorMonitor->SetDesiredFailureMsg(
3276 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3277 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
3278
3279 ASSERT_NO_FATAL_FAILURE(InitState());
3280 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3281
3282 VkDescriptorPoolSize ds_type_count = {};
3283 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3284 ds_type_count.descriptorCount = 1;
3285
3286 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3287 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3288 ds_pool_ci.maxSets = 1;
3289 ds_pool_ci.poolSizeCount = 1;
3290 ds_pool_ci.pPoolSizes = &ds_type_count;
3291
3292 VkDescriptorPool ds_pool;
3293 err =
3294 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
3295 ASSERT_VK_SUCCESS(err);
3296
3297 VkDescriptorSetLayoutBinding dsl_binding = {};
3298 dsl_binding.binding = 0;
3299 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3300 dsl_binding.descriptorCount = 1;
3301 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3302
3303 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3304 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3305 ds_layout_ci.bindingCount = 1;
3306 ds_layout_ci.pBindings = &dsl_binding;
3307
3308 VkDescriptorSetLayout ds_layout;
3309 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3310 &ds_layout);
3311 ASSERT_VK_SUCCESS(err);
3312
3313 VkDescriptorSet descriptorSet;
3314 VkDescriptorSetAllocateInfo alloc_info = {};
3315 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3316 alloc_info.descriptorSetCount = 1;
3317 alloc_info.descriptorPool = ds_pool;
3318 alloc_info.pSetLayouts = &ds_layout;
3319 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3320 &descriptorSet);
3321 ASSERT_VK_SUCCESS(err);
3322
3323 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3324 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3325 pipeline_layout_ci.setLayoutCount = 1;
3326 pipeline_layout_ci.pSetLayouts = &ds_layout;
3327
3328 VkPipelineLayout pipeline_layout;
3329 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3330 &pipeline_layout);
3331 ASSERT_VK_SUCCESS(err);
3332
3333 VkPipelineViewportStateCreateInfo vp_state_ci = {};
3334 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3335 vp_state_ci.scissorCount = 1;
3336 vp_state_ci.pScissors =
3337 NULL; // Null scissor w/ count of 1 should cause error
3338 vp_state_ci.viewportCount = 1;
3339 vp_state_ci.pViewports =
3340 NULL; // vp is dynamic (below) so this won't cause error
3341
3342 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
3343 // Set scissor as dynamic to avoid that error
3344 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
3345 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3346 dyn_state_ci.dynamicStateCount = 1;
3347 dyn_state_ci.pDynamicStates = &vp_state;
3348
3349 VkPipelineShaderStageCreateInfo shaderStages[2];
3350 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
3351
3352 VkShaderObj vs(m_device, bindStateVertShaderText,
3353 VK_SHADER_STAGE_VERTEX_BIT, this);
3354 VkShaderObj fs(m_device, bindStateFragShaderText,
3355 VK_SHADER_STAGE_FRAGMENT_BIT,
3356 this); // TODO - We shouldn't need a fragment shader
3357 // but add it to be able to run on more devices
3358 shaderStages[0] = vs.GetStageCreateInfo();
3359 shaderStages[1] = fs.GetStageCreateInfo();
3360
3361 VkPipelineVertexInputStateCreateInfo vi_ci = {};
3362 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
3363 vi_ci.pNext = nullptr;
3364 vi_ci.vertexBindingDescriptionCount = 0;
3365 vi_ci.pVertexBindingDescriptions = nullptr;
3366 vi_ci.vertexAttributeDescriptionCount = 0;
3367 vi_ci.pVertexAttributeDescriptions = nullptr;
3368
3369 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
3370 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
3371 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
3372
3373 VkPipelineRasterizationStateCreateInfo rs_ci = {};
3374 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3375 rs_ci.pNext = nullptr;
3376
3377 VkPipelineColorBlendStateCreateInfo cb_ci = {};
3378 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
3379 cb_ci.pNext = nullptr;
3380
3381 VkGraphicsPipelineCreateInfo gp_ci = {};
3382 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3383 gp_ci.stageCount = 2;
3384 gp_ci.pStages = shaderStages;
3385 gp_ci.pVertexInputState = &vi_ci;
3386 gp_ci.pInputAssemblyState = &ia_ci;
3387 gp_ci.pViewportState = &vp_state_ci;
3388 gp_ci.pRasterizationState = &rs_ci;
3389 gp_ci.pColorBlendState = &cb_ci;
3390 gp_ci.pDynamicState = &dyn_state_ci;
3391 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3392 gp_ci.layout = pipeline_layout;
3393 gp_ci.renderPass = renderPass();
3394
3395 VkPipelineCacheCreateInfo pc_ci = {};
3396 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3397
3398 VkPipeline pipeline;
3399 VkPipelineCache pipelineCache;
3400
3401 err =
3402 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
3403 ASSERT_VK_SUCCESS(err);
3404 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3405 &gp_ci, NULL, &pipeline);
3406
3407 if (!m_errorMonitor->DesiredMsgFound()) {
3408 FAIL() << "Did not recieve Error 'Gfx Pipeline scissorCount is 1, but "
3409 "pScissors is NULL...'";
3410 m_errorMonitor->DumpFailureMsgs();
3411 }
3412
3413 // Now hit second fail case where we set scissor w/ different count than PSO
3414 // First need to successfully create the PSO from above by setting
3415 // pViewports
3416 m_errorMonitor->SetDesiredFailureMsg(
3417 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3418 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
3419 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003420
Tobin Ehlisd332f282015-10-02 11:00:56 -06003421 VkRect2D sc = {}; // Just need dummy vp to point to
3422 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07003423 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3424 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06003425 ASSERT_VK_SUCCESS(err);
3426 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003427 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3428 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06003429 VkViewport viewports[2] = {}; // don't care about data
3430 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07003431 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06003432 Draw(1, 0, 0, 0);
3433
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003434 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003435 FAIL() << "Did not receive Error 'Dynamic viewportCount from "
3436 "vkCmdSetViewport() is 2, but PSO viewportCount is 1...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003437 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisd332f282015-10-02 11:00:56 -06003438 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06003439
Chia-I Wuf7458c52015-10-26 21:10:41 +08003440 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3441 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3442 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3443 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003444}
3445
Karl Schultz6addd812016-02-02 17:17:23 -07003446TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003447 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003448 m_errorMonitor->SetDesiredFailureMsg(
3449 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003450 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003451
3452 ASSERT_NO_FATAL_FAILURE(InitState());
3453 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003454
Tony Barbourfe3351b2015-07-28 10:17:20 -06003455 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003456 // Don't care about RenderPass handle b/c error should be flagged before
3457 // that
3458 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
3459 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003460
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003461 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003462 FAIL() << "Did not receive Error 'You cannot use a NULL RenderPass "
3463 "object in vkCmdBeginRenderPass()'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003464 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003465 }
3466}
3467
Karl Schultz6addd812016-02-02 17:17:23 -07003468TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003469 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003470 m_errorMonitor->SetDesiredFailureMsg(
3471 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003472 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003473
3474 ASSERT_NO_FATAL_FAILURE(InitState());
3475 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003476
Tony Barbourfe3351b2015-07-28 10:17:20 -06003477 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003478 // Just create a dummy Renderpass that's non-NULL so we can get to the
3479 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06003480 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003481 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
3482 rp_begin.pNext = NULL;
3483 rp_begin.renderPass = renderPass();
3484 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003485
Karl Schultz6addd812016-02-02 17:17:23 -07003486 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
3487 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003488
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003489 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003490 FAIL() << "Did not receive Error 'It is invalid to issue this call "
3491 "inside an active render pass...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003492 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003493 }
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003494}
3495
Karl Schultz6addd812016-02-02 17:17:23 -07003496TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003497 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07003498 m_errorMonitor->SetDesiredFailureMsg(
3499 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003500 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003501
3502 ASSERT_NO_FATAL_FAILURE(InitState());
3503 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003504
3505 // Renderpass is started here
3506 BeginCommandBuffer();
3507
3508 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003509 vk_testing::Buffer dstBuffer;
3510 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003511
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003512 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003513
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003514 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003515 FAIL() << "Did not receive Error 'It is invalid to issue this call "
3516 "inside an active render pass...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003517 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003518 }
3519}
3520
Karl Schultz6addd812016-02-02 17:17:23 -07003521TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003522 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07003523 m_errorMonitor->SetDesiredFailureMsg(
3524 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003525 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003526
3527 ASSERT_NO_FATAL_FAILURE(InitState());
3528 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003529
3530 // Renderpass is started here
3531 BeginCommandBuffer();
3532
3533 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003534 vk_testing::Buffer dstBuffer;
3535 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003536
Karl Schultz6addd812016-02-02 17:17:23 -07003537 VkDeviceSize dstOffset = 0;
3538 VkDeviceSize dataSize = 1024;
3539 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003540
Karl Schultz6addd812016-02-02 17:17:23 -07003541 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
3542 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003543
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003544 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003545 FAIL() << "Did not receive Error 'It is invalid to issue this call "
3546 "inside an active render pass...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003547 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003548 }
3549}
3550
Karl Schultz6addd812016-02-02 17:17:23 -07003551TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003552 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003553 m_errorMonitor->SetDesiredFailureMsg(
3554 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003555 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003556
3557 ASSERT_NO_FATAL_FAILURE(InitState());
3558 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003559
3560 // Renderpass is started here
3561 BeginCommandBuffer();
3562
Michael Lentine0a369f62016-02-03 16:51:46 -06003563 VkClearColorValue clear_color;
3564 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07003565 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
3566 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3567 const int32_t tex_width = 32;
3568 const int32_t tex_height = 32;
3569 VkImageCreateInfo image_create_info = {};
3570 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3571 image_create_info.pNext = NULL;
3572 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3573 image_create_info.format = tex_format;
3574 image_create_info.extent.width = tex_width;
3575 image_create_info.extent.height = tex_height;
3576 image_create_info.extent.depth = 1;
3577 image_create_info.mipLevels = 1;
3578 image_create_info.arrayLayers = 1;
3579 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3580 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3581 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003582
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003583 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07003584 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
3585 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003586
Karl Schultz6addd812016-02-02 17:17:23 -07003587 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
3588 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003589
Karl Schultz6addd812016-02-02 17:17:23 -07003590 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
3591 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003592
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003593 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003594 FAIL() << "Did not receive Error 'It is invalid to issue this call "
3595 "inside an active render pass...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003596 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003597 }
3598}
3599
Karl Schultz6addd812016-02-02 17:17:23 -07003600TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003601 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003602 m_errorMonitor->SetDesiredFailureMsg(
3603 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003604 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003605
3606 ASSERT_NO_FATAL_FAILURE(InitState());
3607 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003608
3609 // Renderpass is started here
3610 BeginCommandBuffer();
3611
3612 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07003613 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07003614 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
3615 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3616 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
3617 image_create_info.extent.width = 64;
3618 image_create_info.extent.height = 64;
3619 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3620 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003621
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003622 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07003623 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
3624 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003625
Karl Schultz6addd812016-02-02 17:17:23 -07003626 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
3627 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003628
Karl Schultz6addd812016-02-02 17:17:23 -07003629 vkCmdClearDepthStencilImage(
3630 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
3631 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
3632 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003633
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003634 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003635 FAIL() << "Did not receive Error 'It is invalid to issue this call "
3636 "inside an active render pass...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003637 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003638 }
3639}
3640
Karl Schultz6addd812016-02-02 17:17:23 -07003641TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06003642 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003643 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003644
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003645 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003646 "vkCmdClearAttachments: This call "
3647 "must be issued inside an active "
3648 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003649
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003650 ASSERT_NO_FATAL_FAILURE(InitState());
3651 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003652
3653 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003654 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003655 ASSERT_VK_SUCCESS(err);
3656
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06003657 VkClearAttachment color_attachment;
3658 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3659 color_attachment.clearValue.color.float32[0] = 0;
3660 color_attachment.clearValue.color.float32[1] = 0;
3661 color_attachment.clearValue.color.float32[2] = 0;
3662 color_attachment.clearValue.color.float32[3] = 0;
3663 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07003664 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
3665 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
3666 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003667
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003668 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003669 FAIL() << "Did not receive Error 'vkCmdClearAttachments: This call "
3670 "must be issued inside an active render pass.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003671 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003672 }
3673}
3674
Karl Schultz6addd812016-02-02 17:17:23 -07003675TEST_F(VkLayerTest, InvalidDynamicStateObject) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003676 // Create a valid cmd buffer
3677 // call vkCmdBindDynamicStateObject w/ false DS Obj
Karl Schultz6addd812016-02-02 17:17:23 -07003678 // TODO : Simple check for bad object should be added to ObjectTracker to
3679 // catch this case
3680 // The DS check for this is after driver has been called to validate DS
3681 // internal data struct
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003682}
Tobin Ehlis1056d452015-05-27 14:55:35 -06003683
Karl Schultz6addd812016-02-02 17:17:23 -07003684TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003685 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003686 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003687
Karl Schultz6addd812016-02-02 17:17:23 -07003688 m_errorMonitor->SetDesiredFailureMsg(
3689 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003690 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
3691
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003692 ASSERT_NO_FATAL_FAILURE(InitState());
3693 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003694 uint32_t qfi = 0;
3695 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003696 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3697 buffCI.size = 1024;
3698 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
3699 buffCI.queueFamilyIndexCount = 1;
3700 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003701
3702 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003703 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003704 ASSERT_VK_SUCCESS(err);
3705
3706 BeginCommandBuffer();
3707 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003708 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3709 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003710 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07003711 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
3712 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003713
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003714 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003715 FAIL() << "Did not receive Error 'vkCmdBindIndexBuffer() offset (0x7) "
3716 "does not fall on ...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003717 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003718 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06003719
Chia-I Wuf7458c52015-10-26 21:10:41 +08003720 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003721}
3722
Karl Schultz6addd812016-02-02 17:17:23 -07003723TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
3724 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
3725 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003726
Karl Schultz6addd812016-02-02 17:17:23 -07003727 m_errorMonitor->SetDesiredFailureMsg(
3728 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003729 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003730
3731 ASSERT_NO_FATAL_FAILURE(InitState());
3732 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003733
3734 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003735 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003736 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
3737 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003738
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003739 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003740 FAIL() << "Did not receive Error 'vkCmdExecuteCommands() called w/ "
3741 "Primary Cmd Buffer '";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003742 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003743 }
3744}
3745
Karl Schultz6addd812016-02-02 17:17:23 -07003746TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003747 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07003748 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003749
Karl Schultz6addd812016-02-02 17:17:23 -07003750 m_errorMonitor->SetDesiredFailureMsg(
3751 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Write descriptor update has descriptor "
3752 "type VK_DESCRIPTOR_TYPE_SAMPLER that "
3753 "does not match ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003754
Tobin Ehlis3b780662015-05-28 12:11:26 -06003755 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07003756 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003757 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003758 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3759 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003760
3761 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003762 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3763 ds_pool_ci.pNext = NULL;
3764 ds_pool_ci.maxSets = 1;
3765 ds_pool_ci.poolSizeCount = 1;
3766 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06003767
Tobin Ehlis3b780662015-05-28 12:11:26 -06003768 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003769 err =
3770 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003771 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06003772 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003773 dsl_binding.binding = 0;
3774 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3775 dsl_binding.descriptorCount = 1;
3776 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3777 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003778
Tony Barboureb254902015-07-15 12:50:33 -06003779 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003780 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3781 ds_layout_ci.pNext = NULL;
3782 ds_layout_ci.bindingCount = 1;
3783 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003784
Tobin Ehlis3b780662015-05-28 12:11:26 -06003785 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003786 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3787 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003788 ASSERT_VK_SUCCESS(err);
3789
3790 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003791 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003792 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003793 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003794 alloc_info.descriptorPool = ds_pool;
3795 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003796 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3797 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003798 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003799
Tony Barboureb254902015-07-15 12:50:33 -06003800 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003801 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3802 sampler_ci.pNext = NULL;
3803 sampler_ci.magFilter = VK_FILTER_NEAREST;
3804 sampler_ci.minFilter = VK_FILTER_NEAREST;
3805 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3806 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3807 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3808 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3809 sampler_ci.mipLodBias = 1.0;
3810 sampler_ci.anisotropyEnable = VK_FALSE;
3811 sampler_ci.maxAnisotropy = 1;
3812 sampler_ci.compareEnable = VK_FALSE;
3813 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3814 sampler_ci.minLod = 1.0;
3815 sampler_ci.maxLod = 1.0;
3816 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3817 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Mark Lobodzinski52ac6582015-09-01 15:42:56 -06003818
Tobin Ehlis3b780662015-05-28 12:11:26 -06003819 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003820 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003821 ASSERT_VK_SUCCESS(err);
3822
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003823 VkDescriptorImageInfo info = {};
3824 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003825
3826 VkWriteDescriptorSet descriptor_write;
3827 memset(&descriptor_write, 0, sizeof(descriptor_write));
3828 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003829 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003830 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003831 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003832 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003833 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003834
3835 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3836
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003837 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003838 FAIL() << "Did not receive Error 'Write descriptor update has "
3839 "descriptor type VK_DESCRIPTOR_TYPE_SAMPLER that does not "
3840 "match...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003841 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis3b780662015-05-28 12:11:26 -06003842 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06003843
Chia-I Wuf7458c52015-10-26 21:10:41 +08003844 vkDestroySampler(m_device->device(), sampler, NULL);
3845 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3846 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003847}
3848
Karl Schultz6addd812016-02-02 17:17:23 -07003849TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003850 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07003851 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003852
Karl Schultz6addd812016-02-02 17:17:23 -07003853 m_errorMonitor->SetDesiredFailureMsg(
3854 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Descriptor update type of "
3855 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET "
3856 "is out of bounds for matching binding");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003857
Tobin Ehlis3b780662015-05-28 12:11:26 -06003858 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07003859 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003860 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003861 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3862 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003863
3864 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003865 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3866 ds_pool_ci.pNext = NULL;
3867 ds_pool_ci.maxSets = 1;
3868 ds_pool_ci.poolSizeCount = 1;
3869 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06003870
Tobin Ehlis3b780662015-05-28 12:11:26 -06003871 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003872 err =
3873 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003874 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003875
Tony Barboureb254902015-07-15 12:50:33 -06003876 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003877 dsl_binding.binding = 0;
3878 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3879 dsl_binding.descriptorCount = 1;
3880 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3881 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06003882
3883 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003884 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3885 ds_layout_ci.pNext = NULL;
3886 ds_layout_ci.bindingCount = 1;
3887 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003888
Tobin Ehlis3b780662015-05-28 12:11:26 -06003889 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003890 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3891 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003892 ASSERT_VK_SUCCESS(err);
3893
3894 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003895 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003896 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003897 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003898 alloc_info.descriptorPool = ds_pool;
3899 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003900 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3901 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003902 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003903
Tony Barboureb254902015-07-15 12:50:33 -06003904 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003905 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3906 sampler_ci.pNext = NULL;
3907 sampler_ci.magFilter = VK_FILTER_NEAREST;
3908 sampler_ci.minFilter = VK_FILTER_NEAREST;
3909 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3910 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3911 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3912 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3913 sampler_ci.mipLodBias = 1.0;
3914 sampler_ci.anisotropyEnable = VK_FALSE;
3915 sampler_ci.maxAnisotropy = 1;
3916 sampler_ci.compareEnable = VK_FALSE;
3917 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3918 sampler_ci.minLod = 1.0;
3919 sampler_ci.maxLod = 1.0;
3920 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3921 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06003922
Tobin Ehlis3b780662015-05-28 12:11:26 -06003923 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003924 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003925 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003926
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003927 VkDescriptorImageInfo info = {};
3928 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003929
3930 VkWriteDescriptorSet descriptor_write;
3931 memset(&descriptor_write, 0, sizeof(descriptor_write));
3932 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003933 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07003934 descriptor_write.dstArrayElement =
3935 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08003936 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003937 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003938 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003939 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003940
3941 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3942
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003943 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003944 FAIL() << "Did not receive Error 'Descriptor update type of "
3945 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET is out of bounds for "
3946 "matching binding...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003947 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis3b780662015-05-28 12:11:26 -06003948 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06003949
Chia-I Wuf7458c52015-10-26 21:10:41 +08003950 vkDestroySampler(m_device->device(), sampler, NULL);
3951 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3952 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003953}
3954
Karl Schultz6addd812016-02-02 17:17:23 -07003955TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
3956 // Create layout w/ count of 1 and attempt update to that layout w/ binding
3957 // index 2
3958 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003959
Karl Schultz6addd812016-02-02 17:17:23 -07003960 m_errorMonitor->SetDesiredFailureMsg(
3961 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003962 " does not have binding to match update binding ");
3963
Tobin Ehlis3b780662015-05-28 12:11:26 -06003964 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07003965 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003966 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003967 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3968 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003969
3970 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003971 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3972 ds_pool_ci.pNext = NULL;
3973 ds_pool_ci.maxSets = 1;
3974 ds_pool_ci.poolSizeCount = 1;
3975 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06003976
Tobin Ehlis3b780662015-05-28 12:11:26 -06003977 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003978 err =
3979 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003980 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003981
Tony Barboureb254902015-07-15 12:50:33 -06003982 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003983 dsl_binding.binding = 0;
3984 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3985 dsl_binding.descriptorCount = 1;
3986 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3987 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06003988
3989 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003990 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3991 ds_layout_ci.pNext = NULL;
3992 ds_layout_ci.bindingCount = 1;
3993 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003994 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003995 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3996 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003997 ASSERT_VK_SUCCESS(err);
3998
3999 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004000 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004001 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004002 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004003 alloc_info.descriptorPool = ds_pool;
4004 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004005 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4006 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004007 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004008
Tony Barboureb254902015-07-15 12:50:33 -06004009 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004010 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4011 sampler_ci.pNext = NULL;
4012 sampler_ci.magFilter = VK_FILTER_NEAREST;
4013 sampler_ci.minFilter = VK_FILTER_NEAREST;
4014 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4015 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4016 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4017 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4018 sampler_ci.mipLodBias = 1.0;
4019 sampler_ci.anisotropyEnable = VK_FALSE;
4020 sampler_ci.maxAnisotropy = 1;
4021 sampler_ci.compareEnable = VK_FALSE;
4022 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4023 sampler_ci.minLod = 1.0;
4024 sampler_ci.maxLod = 1.0;
4025 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4026 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06004027
Tobin Ehlis3b780662015-05-28 12:11:26 -06004028 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004029 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004030 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004031
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004032 VkDescriptorImageInfo info = {};
4033 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004034
4035 VkWriteDescriptorSet descriptor_write;
4036 memset(&descriptor_write, 0, sizeof(descriptor_write));
4037 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004038 descriptor_write.dstSet = descriptorSet;
4039 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004040 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004041 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004042 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004043 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004044
4045 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4046
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004047 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004048 FAIL() << "Did not receive Error 'Descriptor Set <blah> does not have "
4049 "binding to match update binding '";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004050 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis3b780662015-05-28 12:11:26 -06004051 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06004052
Chia-I Wuf7458c52015-10-26 21:10:41 +08004053 vkDestroySampler(m_device->device(), sampler, NULL);
4054 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4055 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004056}
4057
Karl Schultz6addd812016-02-02 17:17:23 -07004058TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
4059 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
4060 // types
4061 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004062
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004063 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004064 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004065
Tobin Ehlis3b780662015-05-28 12:11:26 -06004066 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004067
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004068 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004069 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4070 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004071
4072 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004073 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4074 ds_pool_ci.pNext = NULL;
4075 ds_pool_ci.maxSets = 1;
4076 ds_pool_ci.poolSizeCount = 1;
4077 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004078
Tobin Ehlis3b780662015-05-28 12:11:26 -06004079 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004080 err =
4081 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004082 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06004083 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004084 dsl_binding.binding = 0;
4085 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4086 dsl_binding.descriptorCount = 1;
4087 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4088 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004089
Tony Barboureb254902015-07-15 12:50:33 -06004090 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004091 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4092 ds_layout_ci.pNext = NULL;
4093 ds_layout_ci.bindingCount = 1;
4094 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004095
Tobin Ehlis3b780662015-05-28 12:11:26 -06004096 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004097 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4098 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004099 ASSERT_VK_SUCCESS(err);
4100
4101 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004102 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004103 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004104 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004105 alloc_info.descriptorPool = ds_pool;
4106 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004107 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4108 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004109 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004110
Tony Barboureb254902015-07-15 12:50:33 -06004111 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004112 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4113 sampler_ci.pNext = NULL;
4114 sampler_ci.magFilter = VK_FILTER_NEAREST;
4115 sampler_ci.minFilter = VK_FILTER_NEAREST;
4116 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4117 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4118 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4119 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4120 sampler_ci.mipLodBias = 1.0;
4121 sampler_ci.anisotropyEnable = VK_FALSE;
4122 sampler_ci.maxAnisotropy = 1;
4123 sampler_ci.compareEnable = VK_FALSE;
4124 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4125 sampler_ci.minLod = 1.0;
4126 sampler_ci.maxLod = 1.0;
4127 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4128 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004129 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004130 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004131 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004132
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004133 VkDescriptorImageInfo info = {};
4134 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004135
4136 VkWriteDescriptorSet descriptor_write;
4137 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07004138 descriptor_write.sType =
4139 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004140 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004141 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004142 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004143 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004144 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004145
4146 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4147
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004148 if (!m_errorMonitor->DesiredMsgFound()) {
4149 FAIL() << "Did not receive Error 'Unexpected UPDATE struct of type '";
4150 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis3b780662015-05-28 12:11:26 -06004151 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06004152
Chia-I Wuf7458c52015-10-26 21:10:41 +08004153 vkDestroySampler(m_device->device(), sampler, NULL);
4154 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4155 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004156}
4157
Karl Schultz6addd812016-02-02 17:17:23 -07004158TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004159 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07004160 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004161
Karl Schultz6addd812016-02-02 17:17:23 -07004162 m_errorMonitor->SetDesiredFailureMsg(
4163 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004164 "Attempt to update descriptor with invalid sampler 0xbaadbeef");
4165
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004166 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004167 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
4168 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004169 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004170 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
4171 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004172
4173 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004174 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4175 ds_pool_ci.pNext = NULL;
4176 ds_pool_ci.maxSets = 1;
4177 ds_pool_ci.poolSizeCount = 1;
4178 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004179
4180 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004181 err =
4182 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004183 ASSERT_VK_SUCCESS(err);
4184
4185 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004186 dsl_binding.binding = 0;
4187 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4188 dsl_binding.descriptorCount = 1;
4189 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4190 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004191
4192 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004193 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4194 ds_layout_ci.pNext = NULL;
4195 ds_layout_ci.bindingCount = 1;
4196 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004197 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004198 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4199 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004200 ASSERT_VK_SUCCESS(err);
4201
4202 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004203 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004204 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004205 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004206 alloc_info.descriptorPool = ds_pool;
4207 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004208 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4209 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004210 ASSERT_VK_SUCCESS(err);
4211
Karl Schultz6addd812016-02-02 17:17:23 -07004212 VkSampler sampler =
4213 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004214
4215 VkDescriptorImageInfo descriptor_info;
4216 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
4217 descriptor_info.sampler = sampler;
4218
4219 VkWriteDescriptorSet descriptor_write;
4220 memset(&descriptor_write, 0, sizeof(descriptor_write));
4221 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004222 descriptor_write.dstSet = descriptorSet;
4223 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004224 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004225 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4226 descriptor_write.pImageInfo = &descriptor_info;
4227
4228 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4229
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004230 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004231 FAIL() << "Did not receive Error 'Attempt to update descriptor with "
4232 "invalid sampler...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004233 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004234 }
4235
Chia-I Wuf7458c52015-10-26 21:10:41 +08004236 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4237 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004238}
4239
Karl Schultz6addd812016-02-02 17:17:23 -07004240TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
4241 // Create a single combined Image/Sampler descriptor and send it an invalid
4242 // imageView
4243 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004244
Karl Schultz6addd812016-02-02 17:17:23 -07004245 m_errorMonitor->SetDesiredFailureMsg(
4246 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004247 "Attempt to update descriptor with invalid imageView 0xbaadbeef");
4248
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004249 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004250 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004251 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4252 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004253
4254 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004255 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4256 ds_pool_ci.pNext = NULL;
4257 ds_pool_ci.maxSets = 1;
4258 ds_pool_ci.poolSizeCount = 1;
4259 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004260
4261 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004262 err =
4263 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004264 ASSERT_VK_SUCCESS(err);
4265
4266 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004267 dsl_binding.binding = 0;
4268 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4269 dsl_binding.descriptorCount = 1;
4270 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4271 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004272
4273 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004274 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4275 ds_layout_ci.pNext = NULL;
4276 ds_layout_ci.bindingCount = 1;
4277 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004278 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004279 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4280 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004281 ASSERT_VK_SUCCESS(err);
4282
4283 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004284 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004285 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004286 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004287 alloc_info.descriptorPool = ds_pool;
4288 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004289 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4290 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004291 ASSERT_VK_SUCCESS(err);
4292
4293 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004294 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4295 sampler_ci.pNext = NULL;
4296 sampler_ci.magFilter = VK_FILTER_NEAREST;
4297 sampler_ci.minFilter = VK_FILTER_NEAREST;
4298 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4299 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4300 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4301 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4302 sampler_ci.mipLodBias = 1.0;
4303 sampler_ci.anisotropyEnable = VK_FALSE;
4304 sampler_ci.maxAnisotropy = 1;
4305 sampler_ci.compareEnable = VK_FALSE;
4306 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4307 sampler_ci.minLod = 1.0;
4308 sampler_ci.maxLod = 1.0;
4309 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4310 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004311
4312 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004313 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004314 ASSERT_VK_SUCCESS(err);
4315
Karl Schultz6addd812016-02-02 17:17:23 -07004316 VkImageView view =
4317 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004318
4319 VkDescriptorImageInfo descriptor_info;
4320 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
4321 descriptor_info.sampler = sampler;
4322 descriptor_info.imageView = view;
4323
4324 VkWriteDescriptorSet descriptor_write;
4325 memset(&descriptor_write, 0, sizeof(descriptor_write));
4326 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004327 descriptor_write.dstSet = descriptorSet;
4328 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004329 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004330 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4331 descriptor_write.pImageInfo = &descriptor_info;
4332
4333 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4334
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004335 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004336 FAIL() << "Did not receive Error 'Attempt to update descriptor with "
4337 "invalid imageView...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004338 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004339 }
4340
Chia-I Wuf7458c52015-10-26 21:10:41 +08004341 vkDestroySampler(m_device->device(), sampler, NULL);
4342 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4343 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004344}
4345
Karl Schultz6addd812016-02-02 17:17:23 -07004346TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
4347 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
4348 // into the other
4349 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004350
Karl Schultz6addd812016-02-02 17:17:23 -07004351 m_errorMonitor->SetDesiredFailureMsg(
4352 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Copy descriptor update index 0, update "
4353 "count #1, has src update descriptor "
4354 "type VK_DESCRIPTOR_TYPE_SAMPLER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004355
Tobin Ehlis04356f92015-10-27 16:35:27 -06004356 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004357 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004358 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004359 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4360 ds_type_count[0].descriptorCount = 1;
4361 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
4362 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004363
4364 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004365 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4366 ds_pool_ci.pNext = NULL;
4367 ds_pool_ci.maxSets = 1;
4368 ds_pool_ci.poolSizeCount = 2;
4369 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004370
4371 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004372 err =
4373 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004374 ASSERT_VK_SUCCESS(err);
4375 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004376 dsl_binding[0].binding = 0;
4377 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4378 dsl_binding[0].descriptorCount = 1;
4379 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4380 dsl_binding[0].pImmutableSamplers = NULL;
4381 dsl_binding[1].binding = 1;
4382 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4383 dsl_binding[1].descriptorCount = 1;
4384 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
4385 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004386
4387 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004388 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4389 ds_layout_ci.pNext = NULL;
4390 ds_layout_ci.bindingCount = 2;
4391 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004392
4393 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004394 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4395 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004396 ASSERT_VK_SUCCESS(err);
4397
4398 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004399 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004400 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004401 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004402 alloc_info.descriptorPool = ds_pool;
4403 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004404 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4405 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004406 ASSERT_VK_SUCCESS(err);
4407
4408 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004409 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4410 sampler_ci.pNext = NULL;
4411 sampler_ci.magFilter = VK_FILTER_NEAREST;
4412 sampler_ci.minFilter = VK_FILTER_NEAREST;
4413 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4414 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4415 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4416 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4417 sampler_ci.mipLodBias = 1.0;
4418 sampler_ci.anisotropyEnable = VK_FALSE;
4419 sampler_ci.maxAnisotropy = 1;
4420 sampler_ci.compareEnable = VK_FALSE;
4421 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4422 sampler_ci.minLod = 1.0;
4423 sampler_ci.maxLod = 1.0;
4424 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4425 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004426
4427 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004428 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004429 ASSERT_VK_SUCCESS(err);
4430
4431 VkDescriptorImageInfo info = {};
4432 info.sampler = sampler;
4433
4434 VkWriteDescriptorSet descriptor_write;
4435 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
4436 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004437 descriptor_write.dstSet = descriptorSet;
4438 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08004439 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004440 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4441 descriptor_write.pImageInfo = &info;
4442 // This write update should succeed
4443 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4444 // Now perform a copy update that fails due to type mismatch
4445 VkCopyDescriptorSet copy_ds_update;
4446 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
4447 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
4448 copy_ds_update.srcSet = descriptorSet;
4449 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004450 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004451 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08004452 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06004453 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
4454
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004455 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004456 FAIL() << "Did not receive Error 'Copy descriptor update index 0, "
4457 "update count #1, has src update descriptor "
4458 "type_DESCRIPTOR_TYPE_SAMPLER'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004459 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis04356f92015-10-27 16:35:27 -06004460 }
4461 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07004462 m_errorMonitor->SetDesiredFailureMsg(
4463 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004464 "Copy descriptor update 0 has srcBinding 3 which is out of bounds ");
Tobin Ehlis04356f92015-10-27 16:35:27 -06004465 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
4466 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
4467 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004468 copy_ds_update.srcBinding =
4469 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004470 copy_ds_update.dstSet = descriptorSet;
4471 copy_ds_update.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004472 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06004473 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
4474
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004475 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004476 FAIL() << "Did not receive Error 'Copy descriptor update 0 has "
4477 "srcBinding 3 which is out of bounds...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004478 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis04356f92015-10-27 16:35:27 -06004479 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004480
Tobin Ehlis04356f92015-10-27 16:35:27 -06004481 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07004482 m_errorMonitor->SetDesiredFailureMsg(
4483 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004484 "Copy descriptor src update is out of bounds for matching binding 1 ");
4485
Tobin Ehlis04356f92015-10-27 16:35:27 -06004486 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
4487 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
4488 copy_ds_update.srcSet = descriptorSet;
4489 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004490 copy_ds_update.dstSet = descriptorSet;
4491 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004492 copy_ds_update.descriptorCount =
4493 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06004494 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
4495
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004496 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004497 FAIL() << "Did not receive Error 'Copy descriptor src update is out of "
4498 "bounds for matching binding 1...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004499 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis04356f92015-10-27 16:35:27 -06004500 }
4501
Chia-I Wuf7458c52015-10-26 21:10:41 +08004502 vkDestroySampler(m_device->device(), sampler, NULL);
4503 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4504 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004505}
4506
Karl Schultz6addd812016-02-02 17:17:23 -07004507TEST_F(VkLayerTest, NumSamplesMismatch) {
4508 // Create CommandBuffer where MSAA samples doesn't match RenderPass
4509 // sampleCount
4510 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004511
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004512 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004513 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004514
Tobin Ehlis3b780662015-05-28 12:11:26 -06004515 ASSERT_NO_FATAL_FAILURE(InitState());
4516 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004517 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06004518 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004519 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004520
4521 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004522 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4523 ds_pool_ci.pNext = NULL;
4524 ds_pool_ci.maxSets = 1;
4525 ds_pool_ci.poolSizeCount = 1;
4526 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004527
Tobin Ehlis3b780662015-05-28 12:11:26 -06004528 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004529 err =
4530 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004531 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004532
Tony Barboureb254902015-07-15 12:50:33 -06004533 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08004534 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06004535 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08004536 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004537 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4538 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004539
Tony Barboureb254902015-07-15 12:50:33 -06004540 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4541 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4542 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004543 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004544 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004545
Tobin Ehlis3b780662015-05-28 12:11:26 -06004546 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004547 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4548 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004549 ASSERT_VK_SUCCESS(err);
4550
4551 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004552 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004553 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004554 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004555 alloc_info.descriptorPool = ds_pool;
4556 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004557 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4558 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004559 ASSERT_VK_SUCCESS(err);
4560
Tony Barboureb254902015-07-15 12:50:33 -06004561 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004562 pipe_ms_state_ci.sType =
4563 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4564 pipe_ms_state_ci.pNext = NULL;
4565 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
4566 pipe_ms_state_ci.sampleShadingEnable = 0;
4567 pipe_ms_state_ci.minSampleShading = 1.0;
4568 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004569
Tony Barboureb254902015-07-15 12:50:33 -06004570 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004571 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4572 pipeline_layout_ci.pNext = NULL;
4573 pipeline_layout_ci.setLayoutCount = 1;
4574 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004575
4576 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004577 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4578 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004579 ASSERT_VK_SUCCESS(err);
4580
Karl Schultz6addd812016-02-02 17:17:23 -07004581 VkShaderObj vs(m_device, bindStateVertShaderText,
4582 VK_SHADER_STAGE_VERTEX_BIT, this);
4583 VkShaderObj fs(m_device, bindStateFragShaderText,
4584 VK_SHADER_STAGE_FRAGMENT_BIT,
4585 this); // TODO - We shouldn't need a fragment shader
4586 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004587 VkPipelineObj pipe(m_device);
4588 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06004589 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004590 pipe.SetMSAA(&pipe_ms_state_ci);
4591 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06004592
Tony Barbourfe3351b2015-07-28 10:17:20 -06004593 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004594 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4595 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06004596
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004597 if (!m_errorMonitor->DesiredMsgFound()) {
4598 FAIL() << "Did not recieve Error 'Num samples mismatch!...'";
4599 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis3b780662015-05-28 12:11:26 -06004600 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06004601
Chia-I Wuf7458c52015-10-26 21:10:41 +08004602 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4603 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4604 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004605}
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004606
Karl Schultz6addd812016-02-02 17:17:23 -07004607TEST_F(VkLayerTest, ClearCmdNoDraw) {
4608 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
4609 // to issuing a Draw
4610 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004611
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004612 // TODO: verify that this matches layer
Karl Schultz6addd812016-02-02 17:17:23 -07004613 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004614 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004615 "vkCmdClearAttachments() issued on CB object ");
4616
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004617 ASSERT_NO_FATAL_FAILURE(InitState());
4618 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06004619
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004620 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004621 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4622 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004623
4624 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004625 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4626 ds_pool_ci.pNext = NULL;
4627 ds_pool_ci.maxSets = 1;
4628 ds_pool_ci.poolSizeCount = 1;
4629 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004630
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004631 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004632 err =
4633 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004634 ASSERT_VK_SUCCESS(err);
4635
Tony Barboureb254902015-07-15 12:50:33 -06004636 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004637 dsl_binding.binding = 0;
4638 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4639 dsl_binding.descriptorCount = 1;
4640 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4641 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004642
Tony Barboureb254902015-07-15 12:50:33 -06004643 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004644 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4645 ds_layout_ci.pNext = NULL;
4646 ds_layout_ci.bindingCount = 1;
4647 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004648
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004649 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004650 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4651 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004652 ASSERT_VK_SUCCESS(err);
4653
4654 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004655 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004656 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004657 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004658 alloc_info.descriptorPool = ds_pool;
4659 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004660 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4661 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004662 ASSERT_VK_SUCCESS(err);
4663
Tony Barboureb254902015-07-15 12:50:33 -06004664 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004665 pipe_ms_state_ci.sType =
4666 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4667 pipe_ms_state_ci.pNext = NULL;
4668 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
4669 pipe_ms_state_ci.sampleShadingEnable = 0;
4670 pipe_ms_state_ci.minSampleShading = 1.0;
4671 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004672
Tony Barboureb254902015-07-15 12:50:33 -06004673 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004674 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4675 pipeline_layout_ci.pNext = NULL;
4676 pipeline_layout_ci.setLayoutCount = 1;
4677 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004678
4679 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004680 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4681 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004682 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004683
Karl Schultz6addd812016-02-02 17:17:23 -07004684 VkShaderObj vs(m_device, bindStateVertShaderText,
4685 VK_SHADER_STAGE_VERTEX_BIT, this);
4686 // TODO - We shouldn't need a fragment shader but add it to be able to run
4687 // on more devices
4688 VkShaderObj fs(m_device, bindStateFragShaderText,
4689 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004690
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004691 VkPipelineObj pipe(m_device);
4692 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06004693 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004694 pipe.SetMSAA(&pipe_ms_state_ci);
4695 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06004696
4697 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004698
Karl Schultz6addd812016-02-02 17:17:23 -07004699 // Main thing we care about for this test is that the VkImage obj we're
4700 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004701 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004702 VkClearAttachment color_attachment;
4703 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4704 color_attachment.clearValue.color.float32[0] = 1.0;
4705 color_attachment.clearValue.color.float32[1] = 1.0;
4706 color_attachment.clearValue.color.float32[2] = 1.0;
4707 color_attachment.clearValue.color.float32[3] = 1.0;
4708 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004709 VkClearRect clear_rect = {
4710 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004711
Karl Schultz6addd812016-02-02 17:17:23 -07004712 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
4713 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004714
4715 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004716 FAIL() << "Did not receive Error 'vkCommandClearAttachments() issued "
4717 "on CB object...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004718 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004719 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06004720
Chia-I Wuf7458c52015-10-26 21:10:41 +08004721 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4722 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4723 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004724}
4725
Karl Schultz6addd812016-02-02 17:17:23 -07004726TEST_F(VkLayerTest, VtxBufferBadIndex) {
4727 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004728
Karl Schultz6addd812016-02-02 17:17:23 -07004729 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004730 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07004731 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004732
Tobin Ehlis502480b2015-06-24 15:53:07 -06004733 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06004734 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06004735 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06004736
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004737 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004738 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4739 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004740
4741 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004742 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4743 ds_pool_ci.pNext = NULL;
4744 ds_pool_ci.maxSets = 1;
4745 ds_pool_ci.poolSizeCount = 1;
4746 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004747
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004748 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004749 err =
4750 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004751 ASSERT_VK_SUCCESS(err);
4752
Tony Barboureb254902015-07-15 12:50:33 -06004753 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004754 dsl_binding.binding = 0;
4755 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4756 dsl_binding.descriptorCount = 1;
4757 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4758 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004759
Tony Barboureb254902015-07-15 12:50:33 -06004760 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004761 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4762 ds_layout_ci.pNext = NULL;
4763 ds_layout_ci.bindingCount = 1;
4764 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004765
Tobin Ehlis502480b2015-06-24 15:53:07 -06004766 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004767 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4768 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004769 ASSERT_VK_SUCCESS(err);
4770
4771 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004772 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004773 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004774 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004775 alloc_info.descriptorPool = ds_pool;
4776 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004777 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4778 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004779 ASSERT_VK_SUCCESS(err);
4780
Tony Barboureb254902015-07-15 12:50:33 -06004781 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004782 pipe_ms_state_ci.sType =
4783 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4784 pipe_ms_state_ci.pNext = NULL;
4785 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
4786 pipe_ms_state_ci.sampleShadingEnable = 0;
4787 pipe_ms_state_ci.minSampleShading = 1.0;
4788 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004789
Tony Barboureb254902015-07-15 12:50:33 -06004790 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004791 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4792 pipeline_layout_ci.pNext = NULL;
4793 pipeline_layout_ci.setLayoutCount = 1;
4794 pipeline_layout_ci.pSetLayouts = &ds_layout;
4795 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004796
Karl Schultz6addd812016-02-02 17:17:23 -07004797 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4798 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004799 ASSERT_VK_SUCCESS(err);
4800
Karl Schultz6addd812016-02-02 17:17:23 -07004801 VkShaderObj vs(m_device, bindStateVertShaderText,
4802 VK_SHADER_STAGE_VERTEX_BIT, this);
4803 VkShaderObj fs(m_device, bindStateFragShaderText,
4804 VK_SHADER_STAGE_FRAGMENT_BIT,
4805 this); // TODO - We shouldn't need a fragment shader
4806 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004807 VkPipelineObj pipe(m_device);
4808 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06004809 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004810 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004811 pipe.SetViewport(m_viewports);
4812 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004813 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06004814
4815 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004816 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4817 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06004818 // Don't care about actual data, just need to get to draw to flag error
4819 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07004820 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
4821 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06004822 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06004823 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004824
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004825 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004826 FAIL() << "Did not receive Error 'Vtx Buffer Index 0 was bound, but no "
4827 "vtx buffers are attached to PSO.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004828 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis502480b2015-06-24 15:53:07 -06004829 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06004830
Chia-I Wuf7458c52015-10-26 21:10:41 +08004831 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4832 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4833 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004834}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004835#endif // DRAW_STATE_TESTS
4836
Tobin Ehlis0788f522015-05-26 16:11:58 -06004837#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06004838#if GTEST_IS_THREADSAFE
4839struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004840 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004841 VkEvent event;
4842 bool bailout;
4843};
4844
Karl Schultz6addd812016-02-02 17:17:23 -07004845extern "C" void *AddToCommandBuffer(void *arg) {
4846 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004847
Karl Schultz6addd812016-02-02 17:17:23 -07004848 for (int i = 0; i < 10000; i++) {
4849 vkCmdSetEvent(data->commandBuffer, data->event,
4850 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004851 if (data->bailout) {
4852 break;
4853 }
4854 }
4855 return NULL;
4856}
4857
Karl Schultz6addd812016-02-02 17:17:23 -07004858TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06004859 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004860
Karl Schultz6addd812016-02-02 17:17:23 -07004861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4862 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004863
Mike Stroyanaccf7692015-05-12 16:00:45 -06004864 ASSERT_NO_FATAL_FAILURE(InitState());
4865 ASSERT_NO_FATAL_FAILURE(InitViewport());
4866 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4867
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004868 // Calls AllocateCommandBuffers
4869 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06004870
4871 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004872 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004873
4874 VkEventCreateInfo event_info;
4875 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004876 VkResult err;
4877
4878 memset(&event_info, 0, sizeof(event_info));
4879 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4880
Chia-I Wuf7458c52015-10-26 21:10:41 +08004881 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004882 ASSERT_VK_SUCCESS(err);
4883
Mike Stroyanaccf7692015-05-12 16:00:45 -06004884 err = vkResetEvent(device(), event);
4885 ASSERT_VK_SUCCESS(err);
4886
4887 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004888 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004889 data.event = event;
4890 data.bailout = false;
4891 m_errorMonitor->SetBailout(&data.bailout);
4892 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06004893 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004894 // Add many entries to command buffer from this thread at the same time.
4895 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06004896
Mike Stroyan4268d1f2015-07-13 14:45:35 -06004897 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004898 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004899
Mike Stroyan10b8cb72016-01-22 15:22:03 -07004900 m_errorMonitor->SetBailout(NULL);
4901
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004902 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004903 FAIL() << "Did not receive Error 'THREADING ERROR' from using one "
4904 "VkCommandBufferObj in two threads";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004905 m_errorMonitor->DumpFailureMsgs();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004906 }
4907
Chia-I Wuf7458c52015-10-26 21:10:41 +08004908 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004909}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004910#endif // GTEST_IS_THREADSAFE
4911#endif // THREADING_TESTS
4912
Chris Forbes9f7ff632015-05-25 11:13:08 +12004913#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07004914TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004915 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004916 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004917
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004918 ASSERT_NO_FATAL_FAILURE(InitState());
4919 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4920
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004921 VkShaderModule module;
4922 VkShaderModuleCreateInfo moduleCreateInfo;
4923 struct icd_spv_header spv;
4924
4925 spv.magic = ICD_SPV_MAGIC;
4926 spv.version = ICD_SPV_VERSION;
4927 spv.gen_magic = 0;
4928
4929 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
4930 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07004931 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004932 moduleCreateInfo.codeSize = 4;
4933 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004934 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004935
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004936 if (!m_errorMonitor->DesiredMsgFound()) {
4937 FAIL() << "Did not recieive Error 'Shader is not SPIR-V'";
4938 m_errorMonitor->DumpFailureMsgs();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004939 }
4940}
4941
Karl Schultz6addd812016-02-02 17:17:23 -07004942TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004944 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004945
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004946 ASSERT_NO_FATAL_FAILURE(InitState());
4947 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4948
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004949 VkShaderModule module;
4950 VkShaderModuleCreateInfo moduleCreateInfo;
4951 struct icd_spv_header spv;
4952
4953 spv.magic = ~ICD_SPV_MAGIC;
4954 spv.version = ICD_SPV_VERSION;
4955 spv.gen_magic = 0;
4956
4957 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
4958 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07004959 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004960 moduleCreateInfo.codeSize = sizeof(spv) + 10;
4961 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004962 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004963
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004964 if (!m_errorMonitor->DesiredMsgFound()) {
4965 FAIL() << "Did not recieive Error 'Shader is not SPIR-V'";
4966 m_errorMonitor->DumpFailureMsgs();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004967 }
4968}
4969
Karl Schultz6addd812016-02-02 17:17:23 -07004970TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004972 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004973
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004974 ASSERT_NO_FATAL_FAILURE(InitState());
4975 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4976
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004977 VkShaderModule module;
4978 VkShaderModuleCreateInfo moduleCreateInfo;
4979 struct icd_spv_header spv;
4980
4981 spv.magic = ICD_SPV_MAGIC;
4982 spv.version = ~ICD_SPV_VERSION;
4983 spv.gen_magic = 0;
4984
4985 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
4986 moduleCreateInfo.pNext = NULL;
4987
Karl Schultz6addd812016-02-02 17:17:23 -07004988 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004989 moduleCreateInfo.codeSize = sizeof(spv) + 10;
4990 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004991 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004992
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004993 if (!m_errorMonitor->DesiredMsgFound()) {
4994 FAIL() << "Did not recieive Error 'Shader is not SPIR-V'";
4995 m_errorMonitor->DumpFailureMsgs();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004996 }
4997}
4998
Karl Schultz6addd812016-02-02 17:17:23 -07004999TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005001 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005002
Chris Forbes9f7ff632015-05-25 11:13:08 +12005003 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005004 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12005005
5006 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005007 "#version 400\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005008 "#extension GL_ARB_separate_shader_objects: require\n"
5009 "#extension GL_ARB_shading_language_420pack: require\n"
5010 "\n"
5011 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07005012 "out gl_PerVertex {\n"
5013 " vec4 gl_Position;\n"
5014 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005015 "void main(){\n"
5016 " gl_Position = vec4(1);\n"
5017 " x = 0;\n"
5018 "}\n";
5019 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005020 "#version 400\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005021 "#extension GL_ARB_separate_shader_objects: require\n"
5022 "#extension GL_ARB_shading_language_420pack: require\n"
5023 "\n"
5024 "layout(location=0) out vec4 color;\n"
5025 "void main(){\n"
5026 " color = vec4(1);\n"
5027 "}\n";
5028
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005029 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5030 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12005031
5032 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005033 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12005034 pipe.AddShader(&vs);
5035 pipe.AddShader(&fs);
5036
Chris Forbes9f7ff632015-05-25 11:13:08 +12005037 VkDescriptorSetObj descriptorSet(m_device);
5038 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005039 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12005040
Tony Barbour5781e8f2015-08-04 16:23:11 -06005041 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12005042
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005043 if (!m_errorMonitor->DesiredMsgFound()) {
5044 FAIL() << "Did not receive Warning 'not consumed by fragment shader'";
5045 m_errorMonitor->DumpFailureMsgs();
Chris Forbes9f7ff632015-05-25 11:13:08 +12005046 }
5047}
Chris Forbes9f7ff632015-05-25 11:13:08 +12005048
Karl Schultz6addd812016-02-02 17:17:23 -07005049TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005050 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005051 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005052
Chris Forbes59cb88d2015-05-25 11:13:13 +12005053 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005054 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12005055
5056 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005057 "#version 400\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005058 "#extension GL_ARB_separate_shader_objects: require\n"
5059 "#extension GL_ARB_shading_language_420pack: require\n"
5060 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005061 "out gl_PerVertex {\n"
5062 " vec4 gl_Position;\n"
5063 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005064 "void main(){\n"
5065 " gl_Position = vec4(1);\n"
5066 "}\n";
5067 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005068 "#version 400\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005069 "#extension GL_ARB_separate_shader_objects: require\n"
5070 "#extension GL_ARB_shading_language_420pack: require\n"
5071 "\n"
5072 "layout(location=0) in float x;\n"
5073 "layout(location=0) out vec4 color;\n"
5074 "void main(){\n"
5075 " color = vec4(x);\n"
5076 "}\n";
5077
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005078 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5079 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12005080
5081 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005082 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12005083 pipe.AddShader(&vs);
5084 pipe.AddShader(&fs);
5085
Chris Forbes59cb88d2015-05-25 11:13:13 +12005086 VkDescriptorSetObj descriptorSet(m_device);
5087 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005088 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12005089
Tony Barbour5781e8f2015-08-04 16:23:11 -06005090 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12005091
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005092 if (!m_errorMonitor->DesiredMsgFound()) {
5093 FAIL() << "Did not receive Error 'not written by vertex shader'";
5094 m_errorMonitor->DumpFailureMsgs();
Chris Forbes59cb88d2015-05-25 11:13:13 +12005095 }
5096}
5097
Karl Schultz6addd812016-02-02 17:17:23 -07005098TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13005099 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005100 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13005101
5102 ASSERT_NO_FATAL_FAILURE(InitState());
5103 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5104
5105 char const *vsSource =
5106 "#version 400\n"
5107 "#extension GL_ARB_separate_shader_objects: require\n"
5108 "#extension GL_ARB_shading_language_420pack: require\n"
5109 "\n"
5110 "out gl_PerVertex {\n"
5111 " vec4 gl_Position;\n"
5112 "};\n"
5113 "void main(){\n"
5114 " gl_Position = vec4(1);\n"
5115 "}\n";
5116 char const *fsSource =
5117 "#version 450\n"
5118 "#extension GL_ARB_separate_shader_objects: require\n"
5119 "#extension GL_ARB_shading_language_420pack: require\n"
5120 "\n"
5121 "in block { layout(location=0) float x; } ins;\n"
5122 "layout(location=0) out vec4 color;\n"
5123 "void main(){\n"
5124 " color = vec4(ins.x);\n"
5125 "}\n";
5126
5127 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5128 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5129
5130 VkPipelineObj pipe(m_device);
5131 pipe.AddColorAttachment();
5132 pipe.AddShader(&vs);
5133 pipe.AddShader(&fs);
5134
5135 VkDescriptorSetObj descriptorSet(m_device);
5136 descriptorSet.AppendDummy();
5137 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5138
5139 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5140
5141 if (!m_errorMonitor->DesiredMsgFound()) {
5142 FAIL() << "Did not receive Error 'not written by vertex shader'";
5143 m_errorMonitor->DumpFailureMsgs();
5144 }
5145}
5146
Karl Schultz6addd812016-02-02 17:17:23 -07005147TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13005148 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005149 "Type mismatch on location 0: 'ptr to "
5150 "output arr[2] of float32' vs 'ptr to "
5151 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13005152
5153 ASSERT_NO_FATAL_FAILURE(InitState());
5154 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5155
5156 char const *vsSource =
5157 "#version 400\n"
5158 "#extension GL_ARB_separate_shader_objects: require\n"
5159 "#extension GL_ARB_shading_language_420pack: require\n"
5160 "\n"
5161 "layout(location=0) out float x[2];\n"
5162 "out gl_PerVertex {\n"
5163 " vec4 gl_Position;\n"
5164 "};\n"
5165 "void main(){\n"
5166 " x[0] = 0; x[1] = 0;\n"
5167 " gl_Position = vec4(1);\n"
5168 "}\n";
5169 char const *fsSource =
5170 "#version 400\n"
5171 "#extension GL_ARB_separate_shader_objects: require\n"
5172 "#extension GL_ARB_shading_language_420pack: require\n"
5173 "\n"
5174 "layout(location=0) in float x[3];\n"
5175 "layout(location=0) out vec4 color;\n"
5176 "void main(){\n"
5177 " color = vec4(x[0] + x[1] + x[2]);\n"
5178 "}\n";
5179
5180 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5181 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5182
5183 VkPipelineObj pipe(m_device);
5184 pipe.AddColorAttachment();
5185 pipe.AddShader(&vs);
5186 pipe.AddShader(&fs);
5187
5188 VkDescriptorSetObj descriptorSet(m_device);
5189 descriptorSet.AppendDummy();
5190 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5191
5192 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5193
5194 if (!m_errorMonitor->DesiredMsgFound()) {
5195 m_errorMonitor->DumpFailureMsgs();
Karl Schultz6addd812016-02-02 17:17:23 -07005196 FAIL() << "Did not receive Error 'Type mismatch on location 0: 'ptr to "
5197 "output arr[2] of float32' vs 'ptr to input arr[3] of "
5198 "float32''";
Chris Forbes0036fd12016-01-26 14:19:49 +13005199 }
5200}
5201
Karl Schultz6addd812016-02-02 17:17:23 -07005202TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005203 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005204 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005205
Chris Forbesb56af562015-05-25 11:13:17 +12005206 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005207 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12005208
5209 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005210 "#version 400\n"
Chris Forbesb56af562015-05-25 11:13:17 +12005211 "#extension GL_ARB_separate_shader_objects: require\n"
5212 "#extension GL_ARB_shading_language_420pack: require\n"
5213 "\n"
5214 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07005215 "out gl_PerVertex {\n"
5216 " vec4 gl_Position;\n"
5217 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12005218 "void main(){\n"
5219 " x = 0;\n"
5220 " gl_Position = vec4(1);\n"
5221 "}\n";
5222 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005223 "#version 400\n"
Chris Forbesb56af562015-05-25 11:13:17 +12005224 "#extension GL_ARB_separate_shader_objects: require\n"
5225 "#extension GL_ARB_shading_language_420pack: require\n"
5226 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005227 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12005228 "layout(location=0) out vec4 color;\n"
5229 "void main(){\n"
5230 " color = vec4(x);\n"
5231 "}\n";
5232
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005233 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5234 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12005235
5236 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005237 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12005238 pipe.AddShader(&vs);
5239 pipe.AddShader(&fs);
5240
Chris Forbesb56af562015-05-25 11:13:17 +12005241 VkDescriptorSetObj descriptorSet(m_device);
5242 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005243 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12005244
Tony Barbour5781e8f2015-08-04 16:23:11 -06005245 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12005246
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005247 if (!m_errorMonitor->DesiredMsgFound()) {
5248 FAIL() << "Did not receive Error 'Type mismatch on location 0'";
5249 m_errorMonitor->DumpFailureMsgs();
Chris Forbesb56af562015-05-25 11:13:17 +12005250 }
5251}
5252
Karl Schultz6addd812016-02-02 17:17:23 -07005253TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13005254 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005255 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13005256
5257 ASSERT_NO_FATAL_FAILURE(InitState());
5258 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5259
5260 char const *vsSource =
5261 "#version 450\n"
5262 "#extension GL_ARB_separate_shader_objects: require\n"
5263 "#extension GL_ARB_shading_language_420pack: require\n"
5264 "\n"
5265 "out block { layout(location=0) int x; } outs;\n"
5266 "out gl_PerVertex {\n"
5267 " vec4 gl_Position;\n"
5268 "};\n"
5269 "void main(){\n"
5270 " outs.x = 0;\n"
5271 " gl_Position = vec4(1);\n"
5272 "}\n";
5273 char const *fsSource =
5274 "#version 450\n"
5275 "#extension GL_ARB_separate_shader_objects: require\n"
5276 "#extension GL_ARB_shading_language_420pack: require\n"
5277 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005278 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13005279 "layout(location=0) out vec4 color;\n"
5280 "void main(){\n"
5281 " color = vec4(ins.x);\n"
5282 "}\n";
5283
5284 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5285 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5286
5287 VkPipelineObj pipe(m_device);
5288 pipe.AddColorAttachment();
5289 pipe.AddShader(&vs);
5290 pipe.AddShader(&fs);
5291
5292 VkDescriptorSetObj descriptorSet(m_device);
5293 descriptorSet.AppendDummy();
5294 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5295
5296 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5297
5298 if (!m_errorMonitor->DesiredMsgFound()) {
5299 FAIL() << "Did not receive Error 'Type mismatch on location 0'";
5300 m_errorMonitor->DumpFailureMsgs();
5301 }
5302}
5303
Karl Schultz6addd812016-02-02 17:17:23 -07005304TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005305 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005306 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005307
Chris Forbesde136e02015-05-25 11:13:28 +12005308 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005309 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12005310
5311 VkVertexInputBindingDescription input_binding;
5312 memset(&input_binding, 0, sizeof(input_binding));
5313
5314 VkVertexInputAttributeDescription input_attrib;
5315 memset(&input_attrib, 0, sizeof(input_attrib));
5316 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5317
5318 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005319 "#version 400\n"
Chris Forbesde136e02015-05-25 11:13:28 +12005320 "#extension GL_ARB_separate_shader_objects: require\n"
5321 "#extension GL_ARB_shading_language_420pack: require\n"
5322 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005323 "out gl_PerVertex {\n"
5324 " vec4 gl_Position;\n"
5325 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12005326 "void main(){\n"
5327 " gl_Position = vec4(1);\n"
5328 "}\n";
5329 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005330 "#version 400\n"
Chris Forbesde136e02015-05-25 11:13:28 +12005331 "#extension GL_ARB_separate_shader_objects: require\n"
5332 "#extension GL_ARB_shading_language_420pack: require\n"
5333 "\n"
5334 "layout(location=0) out vec4 color;\n"
5335 "void main(){\n"
5336 " color = vec4(1);\n"
5337 "}\n";
5338
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005339 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5340 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12005341
5342 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005343 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12005344 pipe.AddShader(&vs);
5345 pipe.AddShader(&fs);
5346
5347 pipe.AddVertexInputBindings(&input_binding, 1);
5348 pipe.AddVertexInputAttribs(&input_attrib, 1);
5349
Chris Forbesde136e02015-05-25 11:13:28 +12005350 VkDescriptorSetObj descriptorSet(m_device);
5351 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005352 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12005353
Tony Barbour5781e8f2015-08-04 16:23:11 -06005354 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12005355
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005356 if (!m_errorMonitor->DesiredMsgFound()) {
5357 FAIL() << "Did not receive Warning 'location 0 not consumed by VS'";
5358 m_errorMonitor->DumpFailureMsgs();
Chris Forbesde136e02015-05-25 11:13:28 +12005359 }
5360}
5361
Karl Schultz6addd812016-02-02 17:17:23 -07005362TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005363 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005364 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13005365
5366 ASSERT_NO_FATAL_FAILURE(InitState());
5367 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5368
5369 VkVertexInputBindingDescription input_binding;
5370 memset(&input_binding, 0, sizeof(input_binding));
5371
5372 VkVertexInputAttributeDescription input_attrib;
5373 memset(&input_attrib, 0, sizeof(input_attrib));
5374 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5375
5376 char const *vsSource =
5377 "#version 400\n"
5378 "#extension GL_ARB_separate_shader_objects: require\n"
5379 "#extension GL_ARB_shading_language_420pack: require\n"
5380 "\n"
5381 "layout(location=1) in float x;\n"
5382 "out gl_PerVertex {\n"
5383 " vec4 gl_Position;\n"
5384 "};\n"
5385 "void main(){\n"
5386 " gl_Position = vec4(x);\n"
5387 "}\n";
5388 char const *fsSource =
5389 "#version 400\n"
5390 "#extension GL_ARB_separate_shader_objects: require\n"
5391 "#extension GL_ARB_shading_language_420pack: require\n"
5392 "\n"
5393 "layout(location=0) out vec4 color;\n"
5394 "void main(){\n"
5395 " color = vec4(1);\n"
5396 "}\n";
5397
5398 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5399 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5400
5401 VkPipelineObj pipe(m_device);
5402 pipe.AddColorAttachment();
5403 pipe.AddShader(&vs);
5404 pipe.AddShader(&fs);
5405
5406 pipe.AddVertexInputBindings(&input_binding, 1);
5407 pipe.AddVertexInputAttribs(&input_attrib, 1);
5408
5409 VkDescriptorSetObj descriptorSet(m_device);
5410 descriptorSet.AppendDummy();
5411 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5412
5413 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5414
5415 if (!m_errorMonitor->DesiredMsgFound()) {
5416 m_errorMonitor->DumpFailureMsgs();
5417 FAIL() << "Did not receive Warning 'location 0 not consumed by VS'";
5418 }
5419}
5420
Karl Schultz6addd812016-02-02 17:17:23 -07005421TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
5422 m_errorMonitor->SetDesiredFailureMsg(
5423 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005424 "VS consumes input at location 0 but not provided");
5425
Chris Forbes62e8e502015-05-25 11:13:29 +12005426 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005427 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12005428
5429 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005430 "#version 400\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12005431 "#extension GL_ARB_separate_shader_objects: require\n"
5432 "#extension GL_ARB_shading_language_420pack: require\n"
5433 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005434 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07005435 "out gl_PerVertex {\n"
5436 " vec4 gl_Position;\n"
5437 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12005438 "void main(){\n"
5439 " gl_Position = x;\n"
5440 "}\n";
5441 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005442 "#version 400\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12005443 "#extension GL_ARB_separate_shader_objects: require\n"
5444 "#extension GL_ARB_shading_language_420pack: require\n"
5445 "\n"
5446 "layout(location=0) out vec4 color;\n"
5447 "void main(){\n"
5448 " color = vec4(1);\n"
5449 "}\n";
5450
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005451 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5452 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12005453
5454 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005455 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12005456 pipe.AddShader(&vs);
5457 pipe.AddShader(&fs);
5458
Chris Forbes62e8e502015-05-25 11:13:29 +12005459 VkDescriptorSetObj descriptorSet(m_device);
5460 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005461 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12005462
Tony Barbour5781e8f2015-08-04 16:23:11 -06005463 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12005464
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005465 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005466 FAIL() << "Did not receive Error 'VS consumes input at location 0 but "
5467 "not provided'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005468 m_errorMonitor->DumpFailureMsgs();
Chris Forbes62e8e502015-05-25 11:13:29 +12005469 }
5470}
5471
Karl Schultz6addd812016-02-02 17:17:23 -07005472TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
5473 m_errorMonitor->SetDesiredFailureMsg(
5474 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005475 "location 0 does not match VS input type");
5476
Chris Forbesc97d98e2015-05-25 11:13:31 +12005477 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005478 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12005479
5480 VkVertexInputBindingDescription input_binding;
5481 memset(&input_binding, 0, sizeof(input_binding));
5482
5483 VkVertexInputAttributeDescription input_attrib;
5484 memset(&input_attrib, 0, sizeof(input_attrib));
5485 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5486
5487 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005488 "#version 400\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12005489 "#extension GL_ARB_separate_shader_objects: require\n"
5490 "#extension GL_ARB_shading_language_420pack: require\n"
5491 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005492 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07005493 "out gl_PerVertex {\n"
5494 " vec4 gl_Position;\n"
5495 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12005496 "void main(){\n"
5497 " gl_Position = vec4(x);\n"
5498 "}\n";
5499 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005500 "#version 400\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12005501 "#extension GL_ARB_separate_shader_objects: require\n"
5502 "#extension GL_ARB_shading_language_420pack: require\n"
5503 "\n"
5504 "layout(location=0) out vec4 color;\n"
5505 "void main(){\n"
5506 " color = vec4(1);\n"
5507 "}\n";
5508
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005509 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5510 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12005511
5512 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005513 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12005514 pipe.AddShader(&vs);
5515 pipe.AddShader(&fs);
5516
5517 pipe.AddVertexInputBindings(&input_binding, 1);
5518 pipe.AddVertexInputAttribs(&input_attrib, 1);
5519
Chris Forbesc97d98e2015-05-25 11:13:31 +12005520 VkDescriptorSetObj descriptorSet(m_device);
5521 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005522 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12005523
Tony Barbour5781e8f2015-08-04 16:23:11 -06005524 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12005525
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005526 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005527 FAIL() << "Did not receive Error 'location 0 does not match VS input "
5528 "type'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005529 m_errorMonitor->DumpFailureMsgs();
Chris Forbesc97d98e2015-05-25 11:13:31 +12005530 }
5531}
5532
Karl Schultz6addd812016-02-02 17:17:23 -07005533TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes2682b242015-11-24 11:13:14 +13005534 m_errorMonitor->SetDesiredFailureMsg(~0u, "");
5535
5536 ASSERT_NO_FATAL_FAILURE(InitState());
5537 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5538
5539 VkVertexInputBindingDescription input_binding;
5540 memset(&input_binding, 0, sizeof(input_binding));
5541
5542 VkVertexInputAttributeDescription input_attribs[2];
5543 memset(input_attribs, 0, sizeof(input_attribs));
5544
5545 for (int i = 0; i < 2; i++) {
5546 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
5547 input_attribs[i].location = i;
5548 }
5549
5550 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005551 "#version 400\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005552 "#extension GL_ARB_separate_shader_objects: require\n"
5553 "#extension GL_ARB_shading_language_420pack: require\n"
5554 "\n"
5555 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07005556 "out gl_PerVertex {\n"
5557 " vec4 gl_Position;\n"
5558 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005559 "void main(){\n"
5560 " gl_Position = x[0] + x[1];\n"
5561 "}\n";
5562 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005563 "#version 400\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005564 "#extension GL_ARB_separate_shader_objects: require\n"
5565 "#extension GL_ARB_shading_language_420pack: require\n"
5566 "\n"
5567 "layout(location=0) out vec4 color;\n"
5568 "void main(){\n"
5569 " color = vec4(1);\n"
5570 "}\n";
5571
5572 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5573 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5574
5575 VkPipelineObj pipe(m_device);
5576 pipe.AddColorAttachment();
5577 pipe.AddShader(&vs);
5578 pipe.AddShader(&fs);
5579
5580 pipe.AddVertexInputBindings(&input_binding, 1);
5581 pipe.AddVertexInputAttribs(input_attribs, 2);
5582
5583 VkDescriptorSetObj descriptorSet(m_device);
5584 descriptorSet.AppendDummy();
5585 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5586
5587 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5588
5589 /* expect success */
5590 if (m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005591 FAIL() << "Expected to succeed but: "
5592 << m_errorMonitor->GetFailureMsg();
Chris Forbes2682b242015-11-24 11:13:14 +13005593 m_errorMonitor->DumpFailureMsgs();
5594 }
5595}
5596
5597/*
Karl Schultz6addd812016-02-02 17:17:23 -07005598 * Would work, but not supported by glslang! This is similar to the matrix case
5599above.
Chris Forbes2682b242015-11-24 11:13:14 +13005600 *
5601TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
5602{
5603 m_errorMonitor->SetDesiredFailureMsg(~0u, "");
5604
5605 ASSERT_NO_FATAL_FAILURE(InitState());
5606 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5607
5608 VkVertexInputBindingDescription input_binding;
5609 memset(&input_binding, 0, sizeof(input_binding));
5610
5611 VkVertexInputAttributeDescription input_attribs[2];
5612 memset(input_attribs, 0, sizeof(input_attribs));
5613
5614 for (int i = 0; i < 2; i++) {
5615 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
5616 input_attribs[i].location = i;
5617 }
5618
5619 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005620 "#version 400\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005621 "#extension GL_ARB_separate_shader_objects: require\n"
5622 "#extension GL_ARB_shading_language_420pack: require\n"
5623 "\n"
5624 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07005625 "out gl_PerVertex {\n"
5626 " vec4 gl_Position;\n"
5627 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005628 "void main(){\n"
5629 " gl_Position = x[0] + x[1];\n"
5630 "}\n";
5631 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005632 "#version 400\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005633 "#extension GL_ARB_separate_shader_objects: require\n"
5634 "#extension GL_ARB_shading_language_420pack: require\n"
5635 "\n"
5636 "layout(location=0) out vec4 color;\n"
5637 "void main(){\n"
5638 " color = vec4(1);\n"
5639 "}\n";
5640
5641 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5642 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5643
5644 VkPipelineObj pipe(m_device);
5645 pipe.AddColorAttachment();
5646 pipe.AddShader(&vs);
5647 pipe.AddShader(&fs);
5648
5649 pipe.AddVertexInputBindings(&input_binding, 1);
5650 pipe.AddVertexInputAttribs(input_attribs, 2);
5651
5652 VkDescriptorSetObj descriptorSet(m_device);
5653 descriptorSet.AppendDummy();
5654 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5655
5656 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5657
5658 if (m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005659 FAIL() << "Expected to succeed but: " <<
5660m_errorMonitor->GetFailureMsg();
Chris Forbes2682b242015-11-24 11:13:14 +13005661 m_errorMonitor->DumpFailureMsgs();
5662 }
5663}
5664*/
5665
Karl Schultz6addd812016-02-02 17:17:23 -07005666TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
5667 m_errorMonitor->SetDesiredFailureMsg(
5668 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005669 "Duplicate vertex input binding descriptions for binding 0");
5670
Chris Forbes280ba2c2015-06-12 11:16:41 +12005671 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005672 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12005673
5674 /* Two binding descriptions for binding 0 */
5675 VkVertexInputBindingDescription input_bindings[2];
5676 memset(input_bindings, 0, sizeof(input_bindings));
5677
5678 VkVertexInputAttributeDescription input_attrib;
5679 memset(&input_attrib, 0, sizeof(input_attrib));
5680 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5681
5682 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005683 "#version 400\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12005684 "#extension GL_ARB_separate_shader_objects: require\n"
5685 "#extension GL_ARB_shading_language_420pack: require\n"
5686 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005687 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07005688 "out gl_PerVertex {\n"
5689 " vec4 gl_Position;\n"
5690 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12005691 "void main(){\n"
5692 " gl_Position = vec4(x);\n"
5693 "}\n";
5694 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005695 "#version 400\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12005696 "#extension GL_ARB_separate_shader_objects: require\n"
5697 "#extension GL_ARB_shading_language_420pack: require\n"
5698 "\n"
5699 "layout(location=0) out vec4 color;\n"
5700 "void main(){\n"
5701 " color = vec4(1);\n"
5702 "}\n";
5703
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005704 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5705 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12005706
5707 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005708 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12005709 pipe.AddShader(&vs);
5710 pipe.AddShader(&fs);
5711
5712 pipe.AddVertexInputBindings(input_bindings, 2);
5713 pipe.AddVertexInputAttribs(&input_attrib, 1);
5714
Chris Forbes280ba2c2015-06-12 11:16:41 +12005715 VkDescriptorSetObj descriptorSet(m_device);
5716 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005717 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12005718
Tony Barbour5781e8f2015-08-04 16:23:11 -06005719 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12005720
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005721 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005722 FAIL() << "Did not receive Error 'Duplicate vertex input binding "
5723 "descriptions for binding 0'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005724 m_errorMonitor->DumpFailureMsgs();
Chris Forbes280ba2c2015-06-12 11:16:41 +12005725 }
5726}
Chris Forbes8f68b562015-05-25 11:13:32 +12005727
Karl Schultz6addd812016-02-02 17:17:23 -07005728TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005729 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005730 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005731
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005732 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005733
5734 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005735 "#version 400\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005736 "#extension GL_ARB_separate_shader_objects: require\n"
5737 "#extension GL_ARB_shading_language_420pack: require\n"
5738 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005739 "out gl_PerVertex {\n"
5740 " vec4 gl_Position;\n"
5741 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005742 "void main(){\n"
5743 " gl_Position = vec4(1);\n"
5744 "}\n";
5745 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005746 "#version 400\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005747 "#extension GL_ARB_separate_shader_objects: require\n"
5748 "#extension GL_ARB_shading_language_420pack: require\n"
5749 "\n"
5750 "void main(){\n"
5751 "}\n";
5752
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005753 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5754 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005755
5756 VkPipelineObj pipe(m_device);
5757 pipe.AddShader(&vs);
5758 pipe.AddShader(&fs);
5759
Chia-I Wu08accc62015-07-07 11:50:03 +08005760 /* set up CB 0, not written */
5761 pipe.AddColorAttachment();
5762 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005763
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005764 VkDescriptorSetObj descriptorSet(m_device);
5765 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005766 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005767
Tony Barbour5781e8f2015-08-04 16:23:11 -06005768 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005769
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005770 if (!m_errorMonitor->DesiredMsgFound()) {
5771 FAIL() << "Did not receive Error 'Attachment 0 not written by FS'";
5772 m_errorMonitor->DumpFailureMsgs();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005773 }
5774}
5775
Karl Schultz6addd812016-02-02 17:17:23 -07005776TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005777 // TODO: verify that this matches layer
Karl Schultz6addd812016-02-02 17:17:23 -07005778 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005779 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005780 "FS writes to output location 1 with no matching attachment");
5781
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005782 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005783
5784 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005785 "#version 400\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005786 "#extension GL_ARB_separate_shader_objects: require\n"
5787 "#extension GL_ARB_shading_language_420pack: require\n"
5788 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005789 "out gl_PerVertex {\n"
5790 " vec4 gl_Position;\n"
5791 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005792 "void main(){\n"
5793 " gl_Position = vec4(1);\n"
5794 "}\n";
5795 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005796 "#version 400\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005797 "#extension GL_ARB_separate_shader_objects: require\n"
5798 "#extension GL_ARB_shading_language_420pack: require\n"
5799 "\n"
5800 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005801 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005802 "void main(){\n"
5803 " x = vec4(1);\n"
5804 " y = vec4(1);\n"
5805 "}\n";
5806
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005807 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5808 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005809
5810 VkPipelineObj pipe(m_device);
5811 pipe.AddShader(&vs);
5812 pipe.AddShader(&fs);
5813
Chia-I Wu08accc62015-07-07 11:50:03 +08005814 /* set up CB 0, not written */
5815 pipe.AddColorAttachment();
5816 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005817 /* FS writes CB 1, but we don't configure it */
5818
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005819 VkDescriptorSetObj descriptorSet(m_device);
5820 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005821 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005822
Tony Barbour5781e8f2015-08-04 16:23:11 -06005823 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005824
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005825 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005826 FAIL() << "Did not receive Error 'FS writes to output location 1 with "
5827 "no matching attachment'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005828 m_errorMonitor->DumpFailureMsgs();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005829 }
5830}
5831
Karl Schultz6addd812016-02-02 17:17:23 -07005832TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005833 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005834 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005835
Chris Forbesa36d69e2015-05-25 11:13:44 +12005836 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12005837
5838 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005839 "#version 400\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12005840 "#extension GL_ARB_separate_shader_objects: require\n"
5841 "#extension GL_ARB_shading_language_420pack: require\n"
5842 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005843 "out gl_PerVertex {\n"
5844 " vec4 gl_Position;\n"
5845 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12005846 "void main(){\n"
5847 " gl_Position = vec4(1);\n"
5848 "}\n";
5849 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005850 "#version 400\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12005851 "#extension GL_ARB_separate_shader_objects: require\n"
5852 "#extension GL_ARB_shading_language_420pack: require\n"
5853 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005854 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12005855 "void main(){\n"
5856 " x = ivec4(1);\n"
5857 "}\n";
5858
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005859 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5860 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12005861
5862 VkPipelineObj pipe(m_device);
5863 pipe.AddShader(&vs);
5864 pipe.AddShader(&fs);
5865
Chia-I Wu08accc62015-07-07 11:50:03 +08005866 /* set up CB 0; type is UNORM by default */
5867 pipe.AddColorAttachment();
5868 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12005869
Chris Forbesa36d69e2015-05-25 11:13:44 +12005870 VkDescriptorSetObj descriptorSet(m_device);
5871 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005872 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12005873
Tony Barbour5781e8f2015-08-04 16:23:11 -06005874 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12005875
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005876 if (!m_errorMonitor->DesiredMsgFound()) {
5877 FAIL() << "Did not receive Error 'does not match FS output type'";
5878 m_errorMonitor->DumpFailureMsgs();
Chris Forbesa36d69e2015-05-25 11:13:44 +12005879 }
5880}
Chris Forbes7b1b8932015-06-05 14:43:36 +12005881
Karl Schultz6addd812016-02-02 17:17:23 -07005882TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005884 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005885
Chris Forbes556c76c2015-08-14 12:04:59 +12005886 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12005887
5888 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005889 "#version 400\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12005890 "#extension GL_ARB_separate_shader_objects: require\n"
5891 "#extension GL_ARB_shading_language_420pack: require\n"
5892 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005893 "out gl_PerVertex {\n"
5894 " vec4 gl_Position;\n"
5895 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12005896 "void main(){\n"
5897 " gl_Position = vec4(1);\n"
5898 "}\n";
5899 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005900 "#version 400\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12005901 "#extension GL_ARB_separate_shader_objects: require\n"
5902 "#extension GL_ARB_shading_language_420pack: require\n"
5903 "\n"
5904 "layout(location=0) out vec4 x;\n"
5905 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5906 "void main(){\n"
5907 " x = vec4(bar.y);\n"
5908 "}\n";
5909
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005910 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5911 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12005912
Chris Forbes556c76c2015-08-14 12:04:59 +12005913 VkPipelineObj pipe(m_device);
5914 pipe.AddShader(&vs);
5915 pipe.AddShader(&fs);
5916
5917 /* set up CB 0; type is UNORM by default */
5918 pipe.AddColorAttachment();
5919 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5920
5921 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005922 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12005923
5924 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5925
5926 /* should have generated an error -- pipeline layout does not
5927 * provide a uniform buffer in 0.0
5928 */
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005929 if (!m_errorMonitor->DesiredMsgFound()) {
5930 FAIL() << "Did not receive Error 'not declared in pipeline layout'";
5931 m_errorMonitor->DumpFailureMsgs();
Chris Forbes556c76c2015-08-14 12:04:59 +12005932 }
5933}
5934
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005935#endif // SHADER_CHECKER_TESTS
5936
5937#if DEVICE_LIMITS_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07005938TEST_F(VkLayerTest, CreateImageLimitsViolationWidth) {
5939 m_errorMonitor->SetDesiredFailureMsg(
5940 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005941 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06005942
5943 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06005944
5945 // Create an image
5946 VkImage image;
5947
Karl Schultz6addd812016-02-02 17:17:23 -07005948 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5949 const int32_t tex_width = 32;
5950 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06005951
5952 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005953 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5954 image_create_info.pNext = NULL;
5955 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5956 image_create_info.format = tex_format;
5957 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06005958 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07005959 image_create_info.extent.depth = 1;
5960 image_create_info.mipLevels = 1;
5961 image_create_info.arrayLayers = 1;
5962 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5963 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
5964 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5965 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06005966
5967 // Introduce error by sending down a bogus width extent
5968 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005969 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06005970
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005971 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005972 FAIL() << "Did not receive Error 'CreateImage extents exceed allowable "
5973 "limits for format'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005974 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06005975 }
5976}
5977
Karl Schultz6addd812016-02-02 17:17:23 -07005978TEST_F(VkLayerTest, UpdateBufferAlignment) {
5979 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06005980
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005982 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005983
Mike Stroyana3082432015-09-25 13:39:21 -06005984 ASSERT_NO_FATAL_FAILURE(InitState());
5985
5986 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
5987 vk_testing::Buffer buffer;
5988 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
5989
5990 BeginCommandBuffer();
5991 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005992 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005993 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005994 FAIL() << "Did not receive Error 'vkCommandUpdateBuffer parameter, "
5995 "VkDeviceSize dstOffset, is not a multiple of 4'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005996 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06005997 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005998
Mike Stroyana3082432015-09-25 13:39:21 -06005999 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006001 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006002
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006003 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006004
6005 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006006 FAIL() << "Did not receive Error 'vkCommandUpdateBuffer parameter, "
6007 "VkDeviceSize dataSize, is not a multiple of 4'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006008 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006009 }
6010 EndCommandBuffer();
6011}
6012
Karl Schultz6addd812016-02-02 17:17:23 -07006013TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006014 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006015 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06006016
6017 ASSERT_NO_FATAL_FAILURE(InitState());
6018
6019 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
6020 vk_testing::Buffer buffer;
6021 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
6022
6023 BeginCommandBuffer();
6024 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006025 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006026 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006027 FAIL() << "Did not receive Error 'vkCommandFillBuffer parameter, "
6028 "VkDeviceSize dstOffset, is not a multiple of 4'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006029 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006030 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006031
Mike Stroyana3082432015-09-25 13:39:21 -06006032 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006033 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006034 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006035
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006036 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006037
6038 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006039 FAIL() << "Did not receive Error 'vkCommandFillBuffer parameter, "
6040 "VkDeviceSize size, is not a multiple of 4'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006041 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006042 }
6043 EndCommandBuffer();
6044}
6045
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006046#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12006047
Tobin Ehliscde08892015-09-22 10:11:37 -06006048#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006049TEST_F(VkLayerTest, InvalidImageView) {
6050 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06006051
Karl Schultz6addd812016-02-02 17:17:23 -07006052 m_errorMonitor->SetDesiredFailureMsg(
6053 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006054 "vkCreateImageView called with baseMipLevel 10 ");
6055
Tobin Ehliscde08892015-09-22 10:11:37 -06006056 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06006057
Mike Stroyana3082432015-09-25 13:39:21 -06006058 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07006059 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06006060
Karl Schultz6addd812016-02-02 17:17:23 -07006061 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6062 const int32_t tex_width = 32;
6063 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06006064
6065 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006066 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6067 image_create_info.pNext = NULL;
6068 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6069 image_create_info.format = tex_format;
6070 image_create_info.extent.width = tex_width;
6071 image_create_info.extent.height = tex_height;
6072 image_create_info.extent.depth = 1;
6073 image_create_info.mipLevels = 1;
6074 image_create_info.arrayLayers = 1;
6075 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6076 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6077 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6078 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06006079
Chia-I Wuf7458c52015-10-26 21:10:41 +08006080 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06006081 ASSERT_VK_SUCCESS(err);
6082
6083 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006084 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6085 image_view_create_info.image = image;
6086 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6087 image_view_create_info.format = tex_format;
6088 image_view_create_info.subresourceRange.layerCount = 1;
6089 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
6090 image_view_create_info.subresourceRange.levelCount = 1;
6091 image_view_create_info.subresourceRange.aspectMask =
6092 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06006093
6094 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07006095 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
6096 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06006097
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006098 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006099 FAIL() << "Did not receive Error 'vkCreateImageView called with "
6100 "baseMipLevel 10...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006101 m_errorMonitor->DumpFailureMsgs();
Tobin Ehliscde08892015-09-22 10:11:37 -06006102 }
6103}
Mike Stroyana3082432015-09-25 13:39:21 -06006104
Karl Schultz6addd812016-02-02 17:17:23 -07006105TEST_F(VkLayerTest, InvalidImageViewAspect) {
6106 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006107
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006109 "vkCreateImageView: Color image "
6110 "formats must have ONLY the "
6111 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006112
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006113 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006114
6115 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07006116 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006117
Karl Schultz6addd812016-02-02 17:17:23 -07006118 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6119 const int32_t tex_width = 32;
6120 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006121
6122 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006123 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6124 image_create_info.pNext = NULL;
6125 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6126 image_create_info.format = tex_format;
6127 image_create_info.extent.width = tex_width;
6128 image_create_info.extent.height = tex_height;
6129 image_create_info.extent.depth = 1;
6130 image_create_info.mipLevels = 1;
6131 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6132 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6133 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6134 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006135
Chia-I Wuf7458c52015-10-26 21:10:41 +08006136 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006137 ASSERT_VK_SUCCESS(err);
6138
6139 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006140 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6141 image_view_create_info.image = image;
6142 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6143 image_view_create_info.format = tex_format;
6144 image_view_create_info.subresourceRange.baseMipLevel = 0;
6145 image_view_create_info.subresourceRange.levelCount = 1;
6146 // Cause an error by setting an invalid image aspect
6147 image_view_create_info.subresourceRange.aspectMask =
6148 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006149
6150 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07006151 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
6152 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006153
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006154 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006155 FAIL() << "Did not receive Error 'VkCreateImageView: Color image "
6156 "formats must have ...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006157 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006158 }
6159}
6160
Karl Schultz6addd812016-02-02 17:17:23 -07006161TEST_F(VkLayerTest, CopyImageTypeMismatch) {
6162 VkResult err;
6163 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006164
Karl Schultz6addd812016-02-02 17:17:23 -07006165 m_errorMonitor->SetDesiredFailureMsg(
6166 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006167 "vkCmdCopyImage called with unmatched source and dest image types");
6168
Mike Stroyana3082432015-09-25 13:39:21 -06006169 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006170
6171 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006172 VkImage srcImage;
6173 VkImage dstImage;
6174 VkDeviceMemory srcMem;
6175 VkDeviceMemory destMem;
6176 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006177
6178 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006179 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6180 image_create_info.pNext = NULL;
6181 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6182 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6183 image_create_info.extent.width = 32;
6184 image_create_info.extent.height = 32;
6185 image_create_info.extent.depth = 1;
6186 image_create_info.mipLevels = 1;
6187 image_create_info.arrayLayers = 1;
6188 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6189 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6190 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6191 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006192
Karl Schultz6addd812016-02-02 17:17:23 -07006193 err =
6194 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006195 ASSERT_VK_SUCCESS(err);
6196
Karl Schultz6addd812016-02-02 17:17:23 -07006197 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6198 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006199
Karl Schultz6addd812016-02-02 17:17:23 -07006200 err =
6201 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006202 ASSERT_VK_SUCCESS(err);
6203
6204 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006205 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006206 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6207 memAlloc.pNext = NULL;
6208 memAlloc.allocationSize = 0;
6209 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006210
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006211 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006212 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006213 pass =
6214 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006215 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006216 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006217 ASSERT_VK_SUCCESS(err);
6218
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006219 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006220 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006221 pass =
6222 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006223 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006224 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006225 ASSERT_VK_SUCCESS(err);
6226
6227 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6228 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006229 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006230 ASSERT_VK_SUCCESS(err);
6231
6232 BeginCommandBuffer();
6233 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006234 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006235 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006236 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006237 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006238 copyRegion.srcOffset.x = 0;
6239 copyRegion.srcOffset.y = 0;
6240 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006241 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006242 copyRegion.dstSubresource.mipLevel = 0;
6243 copyRegion.dstSubresource.baseArrayLayer = 0;
6244 copyRegion.dstSubresource.layerCount = 0;
6245 copyRegion.dstOffset.x = 0;
6246 copyRegion.dstOffset.y = 0;
6247 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006248 copyRegion.extent.width = 1;
6249 copyRegion.extent.height = 1;
6250 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006251 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6252 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006253 EndCommandBuffer();
6254
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006255 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006256 FAIL() << "Did not receive Error 'vkCmdCopyImage called with unmatched "
6257 "source and dest image types'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006258 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006259 }
6260
Chia-I Wuf7458c52015-10-26 21:10:41 +08006261 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006262 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006263 vkFreeMemory(m_device->device(), srcMem, NULL);
6264 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006265}
6266
Karl Schultz6addd812016-02-02 17:17:23 -07006267TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
6268 // TODO : Create two images with different format sizes and vkCmdCopyImage
6269 // between them
Mike Stroyana3082432015-09-25 13:39:21 -06006270}
6271
Karl Schultz6addd812016-02-02 17:17:23 -07006272TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
6273 VkResult err;
6274 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006275
Karl Schultz6addd812016-02-02 17:17:23 -07006276 m_errorMonitor->SetDesiredFailureMsg(
6277 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006278 "vkCmdCopyImage called with unmatched source and dest image types");
6279
Mike Stroyana3082432015-09-25 13:39:21 -06006280 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006281
6282 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006283 VkImage srcImage;
6284 VkImage dstImage;
6285 VkDeviceMemory srcMem;
6286 VkDeviceMemory destMem;
6287 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006288
6289 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006290 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6291 image_create_info.pNext = NULL;
6292 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6293 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6294 image_create_info.extent.width = 32;
6295 image_create_info.extent.height = 32;
6296 image_create_info.extent.depth = 1;
6297 image_create_info.mipLevels = 1;
6298 image_create_info.arrayLayers = 1;
6299 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6300 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6301 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6302 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006303
Karl Schultz6addd812016-02-02 17:17:23 -07006304 err =
6305 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006306 ASSERT_VK_SUCCESS(err);
6307
Karl Schultz6addd812016-02-02 17:17:23 -07006308 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6309 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6310 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006311
Karl Schultz6addd812016-02-02 17:17:23 -07006312 err =
6313 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006314 ASSERT_VK_SUCCESS(err);
6315
6316 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006317 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006318 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6319 memAlloc.pNext = NULL;
6320 memAlloc.allocationSize = 0;
6321 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006322
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006323 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006324 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006325 pass =
6326 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006327 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006328 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006329 ASSERT_VK_SUCCESS(err);
6330
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006331 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006332 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006333 pass =
6334 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006335 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006336 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006337 ASSERT_VK_SUCCESS(err);
6338
6339 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6340 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006341 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006342 ASSERT_VK_SUCCESS(err);
6343
6344 BeginCommandBuffer();
6345 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006346 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006347 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006348 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006349 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006350 copyRegion.srcOffset.x = 0;
6351 copyRegion.srcOffset.y = 0;
6352 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006353 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006354 copyRegion.dstSubresource.mipLevel = 0;
6355 copyRegion.dstSubresource.baseArrayLayer = 0;
6356 copyRegion.dstSubresource.layerCount = 0;
6357 copyRegion.dstOffset.x = 0;
6358 copyRegion.dstOffset.y = 0;
6359 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006360 copyRegion.extent.width = 1;
6361 copyRegion.extent.height = 1;
6362 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006363 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6364 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006365 EndCommandBuffer();
6366
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006367 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006368 FAIL() << "Did not receive Error 'vkCmdCopyImage called with unmatched "
6369 "source and dest image types'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006370 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006371 }
6372
Chia-I Wuf7458c52015-10-26 21:10:41 +08006373 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006374 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006375 vkFreeMemory(m_device->device(), srcMem, NULL);
6376 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006377}
6378
Karl Schultz6addd812016-02-02 17:17:23 -07006379TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
6380 VkResult err;
6381 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006382
Karl Schultz6addd812016-02-02 17:17:23 -07006383 m_errorMonitor->SetDesiredFailureMsg(
6384 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006385 "vkCmdResolveImage called with source sample count less than 2.");
6386
Mike Stroyana3082432015-09-25 13:39:21 -06006387 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006388
6389 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07006390 VkImage srcImage;
6391 VkImage dstImage;
6392 VkDeviceMemory srcMem;
6393 VkDeviceMemory destMem;
6394 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006395
6396 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006397 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6398 image_create_info.pNext = NULL;
6399 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6400 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6401 image_create_info.extent.width = 32;
6402 image_create_info.extent.height = 1;
6403 image_create_info.extent.depth = 1;
6404 image_create_info.mipLevels = 1;
6405 image_create_info.arrayLayers = 1;
6406 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6407 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6408 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6409 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006410
Karl Schultz6addd812016-02-02 17:17:23 -07006411 err =
6412 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006413 ASSERT_VK_SUCCESS(err);
6414
Karl Schultz6addd812016-02-02 17:17:23 -07006415 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6416 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006417
Karl Schultz6addd812016-02-02 17:17:23 -07006418 err =
6419 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006420 ASSERT_VK_SUCCESS(err);
6421
6422 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006423 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006424 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6425 memAlloc.pNext = NULL;
6426 memAlloc.allocationSize = 0;
6427 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006428
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006429 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006430 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006431 pass =
6432 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006433 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006434 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006435 ASSERT_VK_SUCCESS(err);
6436
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006437 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006438 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006439 pass =
6440 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006441 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006442 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006443 ASSERT_VK_SUCCESS(err);
6444
6445 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6446 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006447 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006448 ASSERT_VK_SUCCESS(err);
6449
6450 BeginCommandBuffer();
6451 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006452 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6453 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006454 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006455 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006456 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006457 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006458 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006459 resolveRegion.srcOffset.x = 0;
6460 resolveRegion.srcOffset.y = 0;
6461 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006462 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006463 resolveRegion.dstSubresource.mipLevel = 0;
6464 resolveRegion.dstSubresource.baseArrayLayer = 0;
6465 resolveRegion.dstSubresource.layerCount = 0;
6466 resolveRegion.dstOffset.x = 0;
6467 resolveRegion.dstOffset.y = 0;
6468 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006469 resolveRegion.extent.width = 1;
6470 resolveRegion.extent.height = 1;
6471 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006472 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6473 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006474 EndCommandBuffer();
6475
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006476 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006477 FAIL() << "Did not receive Error 'vkCmdResolveImage called with source "
6478 "sample count less than 2.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006479 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006480 }
6481
Chia-I Wuf7458c52015-10-26 21:10:41 +08006482 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006483 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006484 vkFreeMemory(m_device->device(), srcMem, NULL);
6485 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006486}
6487
Karl Schultz6addd812016-02-02 17:17:23 -07006488TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
6489 VkResult err;
6490 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006491
Karl Schultz6addd812016-02-02 17:17:23 -07006492 m_errorMonitor->SetDesiredFailureMsg(
6493 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006494 "vkCmdResolveImage called with dest sample count greater than 1.");
6495
Mike Stroyana3082432015-09-25 13:39:21 -06006496 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006497
6498 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07006499 VkImage srcImage;
6500 VkImage dstImage;
6501 VkDeviceMemory srcMem;
6502 VkDeviceMemory destMem;
6503 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006504
6505 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006506 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6507 image_create_info.pNext = NULL;
6508 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6509 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6510 image_create_info.extent.width = 32;
6511 image_create_info.extent.height = 1;
6512 image_create_info.extent.depth = 1;
6513 image_create_info.mipLevels = 1;
6514 image_create_info.arrayLayers = 1;
6515 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6516 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6517 // Note: Some implementations expect color attachment usage for any
6518 // multisample surface
6519 image_create_info.usage =
6520 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6521 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006522
Karl Schultz6addd812016-02-02 17:17:23 -07006523 err =
6524 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006525 ASSERT_VK_SUCCESS(err);
6526
Karl Schultz6addd812016-02-02 17:17:23 -07006527 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6528 // Note: Some implementations expect color attachment usage for any
6529 // multisample surface
6530 image_create_info.usage =
6531 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006532
Karl Schultz6addd812016-02-02 17:17:23 -07006533 err =
6534 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006535 ASSERT_VK_SUCCESS(err);
6536
6537 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006538 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006539 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6540 memAlloc.pNext = NULL;
6541 memAlloc.allocationSize = 0;
6542 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006543
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006544 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006545 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006546 pass =
6547 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006548 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006549 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006550 ASSERT_VK_SUCCESS(err);
6551
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006552 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006553 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006554 pass =
6555 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006556 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006557 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006558 ASSERT_VK_SUCCESS(err);
6559
6560 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6561 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006562 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006563 ASSERT_VK_SUCCESS(err);
6564
6565 BeginCommandBuffer();
6566 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006567 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6568 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006569 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006570 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006571 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006572 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006573 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006574 resolveRegion.srcOffset.x = 0;
6575 resolveRegion.srcOffset.y = 0;
6576 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006577 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006578 resolveRegion.dstSubresource.mipLevel = 0;
6579 resolveRegion.dstSubresource.baseArrayLayer = 0;
6580 resolveRegion.dstSubresource.layerCount = 0;
6581 resolveRegion.dstOffset.x = 0;
6582 resolveRegion.dstOffset.y = 0;
6583 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006584 resolveRegion.extent.width = 1;
6585 resolveRegion.extent.height = 1;
6586 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006587 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6588 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006589 EndCommandBuffer();
6590
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006591 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006592 FAIL() << "Did not receive Error 'vkCmdResolveImage called with dest "
6593 "sample count greater than 1.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006594 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006595 }
6596
Chia-I Wuf7458c52015-10-26 21:10:41 +08006597 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006598 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006599 vkFreeMemory(m_device->device(), srcMem, NULL);
6600 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006601}
6602
Karl Schultz6addd812016-02-02 17:17:23 -07006603TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
6604 VkResult err;
6605 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006606
Karl Schultz6addd812016-02-02 17:17:23 -07006607 m_errorMonitor->SetDesiredFailureMsg(
6608 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006609 "vkCmdResolveImage called with unmatched source and dest formats.");
6610
Mike Stroyana3082432015-09-25 13:39:21 -06006611 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006612
6613 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006614 VkImage srcImage;
6615 VkImage dstImage;
6616 VkDeviceMemory srcMem;
6617 VkDeviceMemory destMem;
6618 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006619
6620 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006621 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6622 image_create_info.pNext = NULL;
6623 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6624 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6625 image_create_info.extent.width = 32;
6626 image_create_info.extent.height = 1;
6627 image_create_info.extent.depth = 1;
6628 image_create_info.mipLevels = 1;
6629 image_create_info.arrayLayers = 1;
6630 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6631 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6632 // Note: Some implementations expect color attachment usage for any
6633 // multisample surface
6634 image_create_info.usage =
6635 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6636 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006637
Karl Schultz6addd812016-02-02 17:17:23 -07006638 err =
6639 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006640 ASSERT_VK_SUCCESS(err);
6641
Karl Schultz6addd812016-02-02 17:17:23 -07006642 // Set format to something other than source image
6643 image_create_info.format = VK_FORMAT_R32_SFLOAT;
6644 // Note: Some implementations expect color attachment usage for any
6645 // multisample surface
6646 image_create_info.usage =
6647 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6648 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006649
Karl Schultz6addd812016-02-02 17:17:23 -07006650 err =
6651 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006652 ASSERT_VK_SUCCESS(err);
6653
6654 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006655 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006656 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6657 memAlloc.pNext = NULL;
6658 memAlloc.allocationSize = 0;
6659 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006660
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006661 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006662 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006663 pass =
6664 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006665 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006666 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006667 ASSERT_VK_SUCCESS(err);
6668
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006669 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006670 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006671 pass =
6672 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006673 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006674 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006675 ASSERT_VK_SUCCESS(err);
6676
6677 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6678 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006679 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006680 ASSERT_VK_SUCCESS(err);
6681
6682 BeginCommandBuffer();
6683 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006684 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6685 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006686 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006687 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006688 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006689 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006690 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006691 resolveRegion.srcOffset.x = 0;
6692 resolveRegion.srcOffset.y = 0;
6693 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006694 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006695 resolveRegion.dstSubresource.mipLevel = 0;
6696 resolveRegion.dstSubresource.baseArrayLayer = 0;
6697 resolveRegion.dstSubresource.layerCount = 0;
6698 resolveRegion.dstOffset.x = 0;
6699 resolveRegion.dstOffset.y = 0;
6700 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006701 resolveRegion.extent.width = 1;
6702 resolveRegion.extent.height = 1;
6703 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006704 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6705 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006706 EndCommandBuffer();
6707
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006708 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006709 FAIL() << "Did not receive Error 'vkCmdResolveImage called with "
6710 "unmatched source and dest formats.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006711 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006712 }
6713
Chia-I Wuf7458c52015-10-26 21:10:41 +08006714 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006715 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006716 vkFreeMemory(m_device->device(), srcMem, NULL);
6717 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006718}
6719
Karl Schultz6addd812016-02-02 17:17:23 -07006720TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
6721 VkResult err;
6722 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006723
Karl Schultz6addd812016-02-02 17:17:23 -07006724 m_errorMonitor->SetDesiredFailureMsg(
6725 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006726 "vkCmdResolveImage called with unmatched source and dest image types.");
6727
Mike Stroyana3082432015-09-25 13:39:21 -06006728 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006729
6730 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006731 VkImage srcImage;
6732 VkImage dstImage;
6733 VkDeviceMemory srcMem;
6734 VkDeviceMemory destMem;
6735 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006736
6737 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006738 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6739 image_create_info.pNext = NULL;
6740 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6741 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6742 image_create_info.extent.width = 32;
6743 image_create_info.extent.height = 1;
6744 image_create_info.extent.depth = 1;
6745 image_create_info.mipLevels = 1;
6746 image_create_info.arrayLayers = 1;
6747 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6748 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6749 // Note: Some implementations expect color attachment usage for any
6750 // multisample surface
6751 image_create_info.usage =
6752 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6753 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006754
Karl Schultz6addd812016-02-02 17:17:23 -07006755 err =
6756 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006757 ASSERT_VK_SUCCESS(err);
6758
Karl Schultz6addd812016-02-02 17:17:23 -07006759 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6760 // Note: Some implementations expect color attachment usage for any
6761 // multisample surface
6762 image_create_info.usage =
6763 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6764 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006765
Karl Schultz6addd812016-02-02 17:17:23 -07006766 err =
6767 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006768 ASSERT_VK_SUCCESS(err);
6769
6770 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006771 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006772 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6773 memAlloc.pNext = NULL;
6774 memAlloc.allocationSize = 0;
6775 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006776
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006777 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006778 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006779 pass =
6780 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006781 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006782 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006783 ASSERT_VK_SUCCESS(err);
6784
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006785 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006786 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006787 pass =
6788 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006789 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006790 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006791 ASSERT_VK_SUCCESS(err);
6792
6793 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6794 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006795 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006796 ASSERT_VK_SUCCESS(err);
6797
6798 BeginCommandBuffer();
6799 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006800 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6801 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006802 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006803 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006804 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006805 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006806 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006807 resolveRegion.srcOffset.x = 0;
6808 resolveRegion.srcOffset.y = 0;
6809 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006810 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006811 resolveRegion.dstSubresource.mipLevel = 0;
6812 resolveRegion.dstSubresource.baseArrayLayer = 0;
6813 resolveRegion.dstSubresource.layerCount = 0;
6814 resolveRegion.dstOffset.x = 0;
6815 resolveRegion.dstOffset.y = 0;
6816 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006817 resolveRegion.extent.width = 1;
6818 resolveRegion.extent.height = 1;
6819 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006820 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6821 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006822 EndCommandBuffer();
6823
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006824 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006825 FAIL() << "Did not receive Error 'vkCmdResolveImage called with "
6826 "unmatched source and dest image types.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006827 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006828 }
6829
Chia-I Wuf7458c52015-10-26 21:10:41 +08006830 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006831 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006832 vkFreeMemory(m_device->device(), srcMem, NULL);
6833 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006834}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006835
Karl Schultz6addd812016-02-02 17:17:23 -07006836TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006837 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07006838 // to using a DS format, then cause it to hit error due to COLOR_BIT not
6839 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006840 // The image format check comes 2nd in validation so we trigger it first,
6841 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07006842 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006843
Karl Schultz6addd812016-02-02 17:17:23 -07006844 m_errorMonitor->SetDesiredFailureMsg(
6845 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006846 "Combination depth/stencil image formats can have only the ");
6847
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006848 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006849
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006850 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006851 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
6852 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006853
6854 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006855 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6856 ds_pool_ci.pNext = NULL;
6857 ds_pool_ci.maxSets = 1;
6858 ds_pool_ci.poolSizeCount = 1;
6859 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006860
6861 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006862 err =
6863 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006864 ASSERT_VK_SUCCESS(err);
6865
6866 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006867 dsl_binding.binding = 0;
6868 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
6869 dsl_binding.descriptorCount = 1;
6870 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6871 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006872
6873 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006874 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6875 ds_layout_ci.pNext = NULL;
6876 ds_layout_ci.bindingCount = 1;
6877 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006878 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006879 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6880 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006881 ASSERT_VK_SUCCESS(err);
6882
6883 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006884 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006885 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006886 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006887 alloc_info.descriptorPool = ds_pool;
6888 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006889 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6890 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006891 ASSERT_VK_SUCCESS(err);
6892
Karl Schultz6addd812016-02-02 17:17:23 -07006893 VkImage image_bad;
6894 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006895 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07006896 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006897 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07006898 const int32_t tex_width = 32;
6899 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006900
6901 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006902 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6903 image_create_info.pNext = NULL;
6904 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6905 image_create_info.format = tex_format_bad;
6906 image_create_info.extent.width = tex_width;
6907 image_create_info.extent.height = tex_height;
6908 image_create_info.extent.depth = 1;
6909 image_create_info.mipLevels = 1;
6910 image_create_info.arrayLayers = 1;
6911 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6912 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6913 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
6914 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
6915 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006916
Karl Schultz6addd812016-02-02 17:17:23 -07006917 err =
6918 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006919 ASSERT_VK_SUCCESS(err);
6920 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07006921 image_create_info.usage =
6922 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6923 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
6924 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006925 ASSERT_VK_SUCCESS(err);
6926
6927 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006928 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6929 image_view_create_info.image = image_bad;
6930 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6931 image_view_create_info.format = tex_format_bad;
6932 image_view_create_info.subresourceRange.baseArrayLayer = 0;
6933 image_view_create_info.subresourceRange.baseMipLevel = 0;
6934 image_view_create_info.subresourceRange.layerCount = 1;
6935 image_view_create_info.subresourceRange.levelCount = 1;
6936 image_view_create_info.subresourceRange.aspectMask =
6937 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006938
6939 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07006940 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
6941 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006942
6943 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006944 FAIL() << "Did not receive Error 'Combination depth-stencil image "
6945 "formats can have only the....'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006946 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006947 }
6948
Chia-I Wuf7458c52015-10-26 21:10:41 +08006949 vkDestroyImage(m_device->device(), image_bad, NULL);
6950 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006951 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6952 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006953}
Tobin Ehliscde08892015-09-22 10:11:37 -06006954#endif // IMAGE_TESTS
6955
Tony Barbour300a6082015-04-07 13:44:53 -06006956int main(int argc, char **argv) {
6957 int result;
6958
6959 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06006960 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06006961
6962 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
6963
6964 result = RUN_ALL_TESTS();
6965
Tony Barbour6918cd52015-04-09 12:58:51 -06006966 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06006967 return result;
6968}