blob: f33b77410358e0fbf3d143959babaea27a388a2b [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.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and/or associated documentation files (the "Materials"), to
8 * deal in the Materials without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Materials, and to permit persons to whom the Materials are
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice(s) and this permission notice shall be included in
14 * all copies or substantial portions of the Materials.
15 *
16 * The Materials are Confidential Information as defined by the Khronos
17 * Membership Agreement until designated non-confidential by Khronos, at which
18 * point this condition clause shall be removed.
19 *
20 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 *
24 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
25 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
26 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
27 * USE OR OTHER DEALINGS IN THE MATERIALS.
28 *
29 * Author: Chia-I Wu <olvaffe@gmail.com>
30 * Author: Chris Forbes <chrisf@ijw.co.nz>
31 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
32 * Author: Mark Lobodzinski <mark@lunarg.com>
33 * Author: Mike Stroyan <mike@LunarG.com>
34 * Author: Tobin Ehlis <tobine@google.com>
35 * Author: Tony Barbour <tony@LunarG.com>
36 */
Tony Barbour65c48b32015-11-17 10:02:56 -070037
David Pinedo9316d3b2015-11-06 12:54:48 -070038#include <vulkan/vulkan.h>
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070039#include <vulkan/vk_ext_debug_report.h>
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060040#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060041#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060042#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070043#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060044
Mark Lobodzinski3780e142015-05-14 15:08:13 -050045#define GLM_FORCE_RADIANS
46#include "glm/glm.hpp"
47#include <glm/gtc/matrix_transform.hpp>
48
Tobin Ehlis0788f522015-05-26 16:11:58 -060049#define MEM_TRACKER_TESTS 1
50#define OBJ_TRACKER_TESTS 1
51#define DRAW_STATE_TESTS 1
52#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120053#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060054#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060055#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060056
Mark Lobodzinski3780e142015-05-14 15:08:13 -050057//--------------------------------------------------------------------------------------
58// Mesh and VertexFormat Data
59//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070060struct Vertex {
61 float posX, posY, posZ, posW; // Position data
62 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050063};
64
Karl Schultz6addd812016-02-02 17:17:23 -070065#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050066
67typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070068 BsoFailNone = 0x00000000,
69 BsoFailLineWidth = 0x00000001,
70 BsoFailDepthBias = 0x00000002,
71 BsoFailViewport = 0x00000004,
72 BsoFailScissor = 0x00000008,
73 BsoFailBlend = 0x00000010,
74 BsoFailDepthBounds = 0x00000020,
75 BsoFailStencilReadMask = 0x00000040,
76 BsoFailStencilWriteMask = 0x00000080,
77 BsoFailStencilReference = 0x00000100,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050078} BsoFailSelect;
79
80struct vktriangle_vs_uniform {
81 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070082 float mvp[4][4];
83 float position[3][4];
84 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050085};
86
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050087static const char bindStateVertShaderText[] =
Karl Schultz6addd812016-02-02 17:17:23 -070088 "#version 400\n"
89 "#extension GL_ARB_separate_shader_objects : require\n"
90 "#extension GL_ARB_shading_language_420pack : require\n"
91 "vec2 vertices[3];\n"
92 "out gl_PerVertex {\n"
93 " vec4 gl_Position;\n"
94 "};\n"
95 "void main() {\n"
96 " vertices[0] = vec2(-1.0, -1.0);\n"
97 " vertices[1] = vec2( 1.0, -1.0);\n"
98 " vertices[2] = vec2( 0.0, 1.0);\n"
99 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
100 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500101
Mark Lobodzinski75a97e62015-06-02 09:41:30 -0500102static const char bindStateFragShaderText[] =
Karl Schultz6addd812016-02-02 17:17:23 -0700103 "#version 400\n"
104 "#extension GL_ARB_separate_shader_objects: require\n"
105 "#extension GL_ARB_shading_language_420pack: require\n"
106 "\n"
107 "layout(location = 0) out vec4 uFragColor;\n"
108 "void main(){\n"
109 " uFragColor = vec4(0,1,0,1);\n"
110 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500111
Karl Schultz6addd812016-02-02 17:17:23 -0700112static VKAPI_ATTR VkBool32 VKAPI_CALL
113myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
114 uint64_t srcObject, size_t location, int32_t msgCode,
115 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -0600116
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600117// ********************************************************
118// ErrorMonitor Usage:
119//
120// Call SetDesiredFailureMsg with a string to be compared against all
121// encountered log messages. Passing NULL will match all log messages.
122// logMsg will return true for skipCall only if msg is matched or NULL.
123//
124// Call DesiredMsgFound to determine if the desired failure message
125// was encountered.
126
Tony Barbour300a6082015-04-07 13:44:53 -0600127class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700128 public:
129 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600130 test_platform_thread_create_mutex(&m_mutex);
131 test_platform_thread_lock_mutex(&m_mutex);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700132 m_msgFlags = VK_DEBUG_REPORT_INFO_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700133 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600134 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600135 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600136
Karl Schultz6addd812016-02-02 17:17:23 -0700137 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600138 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600139 m_desiredMsg.clear();
140 m_failureMsg.clear();
141 m_otherMsgs.clear();
142 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700143 m_msgFound = VK_FALSE;
144 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600145 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600146 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600147
Karl Schultz6addd812016-02-02 17:17:23 -0700148 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600149 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600150 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600151 if (m_bailout != NULL) {
152 *m_bailout = true;
153 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600154 string errorString(msgString);
155 if (msgFlags & m_msgFlags) {
156 if (errorString.find(m_desiredMsg) != string::npos) {
157 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700158 m_msgFound = VK_TRUE;
159 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600160 } else {
161 m_otherMsgs.push_back(errorString);
162 }
163 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600164 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600166 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600167
Karl Schultz6addd812016-02-02 17:17:23 -0700168 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600169
Karl Schultz6addd812016-02-02 17:17:23 -0700170 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600171
Karl Schultz6addd812016-02-02 17:17:23 -0700172 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600173
Karl Schultz6addd812016-02-02 17:17:23 -0700174 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600175
Karl Schultz6addd812016-02-02 17:17:23 -0700176 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600177 vector<string> otherMsgs = GetOtherFailureMsgs();
178 cout << "Other error messages logged for this test were:" << endl;
179 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
180 cout << " " << *iter << endl;
181 }
182 }
183
Karl Schultz6addd812016-02-02 17:17:23 -0700184 private:
185 VkFlags m_msgFlags;
186 string m_desiredMsg;
187 string m_failureMsg;
188 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600189 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700190 bool *m_bailout;
191 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600192};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500193
Karl Schultz6addd812016-02-02 17:17:23 -0700194static VKAPI_ATTR VkBool32 VKAPI_CALL
195myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
196 uint64_t srcObject, size_t location, int32_t msgCode,
197 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
198 if (msgFlags &
199 (VK_DEBUG_REPORT_WARN_BIT_EXT | VK_DEBUG_REPORT_PERF_WARN_BIT_EXT |
200 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600201 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600202 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600203 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600204 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600205}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500206
Karl Schultz6addd812016-02-02 17:17:23 -0700207class VkLayerTest : public VkRenderFramework {
208 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800209 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
210 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700211 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
212 BsoFailSelect failMask);
213 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
214 VkPipelineObj &pipelineobj,
215 VkDescriptorSetObj &descriptorSet,
216 BsoFailSelect failMask);
217 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
218 VkDescriptorSetObj &descriptorSet,
219 BsoFailSelect failMask) {
220 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
221 failMask);
222 }
Tony Barbour300a6082015-04-07 13:44:53 -0600223
Tony Barbourfe3351b2015-07-28 10:17:20 -0600224 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700225 VkResult BeginCommandBuffer() {
226 return BeginCommandBuffer(*m_commandBuffer);
227 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800228 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700229 void Draw(uint32_t vertexCount, uint32_t instanceCount,
230 uint32_t firstVertex, uint32_t firstInstance) {
231 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
232 firstInstance);
233 }
234 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
235 uint32_t firstIndex, int32_t vertexOffset,
236 uint32_t firstInstance) {
237 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
238 vertexOffset, firstInstance);
239 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800240 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); }
Karl Schultz6addd812016-02-02 17:17:23 -0700241 void QueueCommandBuffer(const VkFence &fence) {
242 m_commandBuffer->QueueCommandBuffer(fence);
243 }
244 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
245 VkDeviceSize offset, uint32_t binding) {
246 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
247 }
248 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
249 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
250 }
251
252 protected:
253 ErrorMonitor *m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600254
255 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600256 std::vector<const char *> instance_layer_names;
257 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600258 std::vector<const char *> instance_extension_names;
259 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600260
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700261 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600262 /*
263 * Since CreateDbgMsgCallback is an instance level extension call
264 * any extension / layer that utilizes that feature also needs
265 * to be enabled at create instance time.
266 */
Karl Schultz6addd812016-02-02 17:17:23 -0700267 // Use Threading layer first to protect others from
268 // ThreadCommandBufferCollision test
Michael Lentine03107b42015-12-11 10:49:51 -0800269 instance_layer_names.push_back("VK_LAYER_LUNARG_threading");
270 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
271 instance_layer_names.push_back("VK_LAYER_LUNARG_mem_tracker");
272 instance_layer_names.push_back("VK_LAYER_LUNARG_draw_state");
273 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
274 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700275 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600276
Michael Lentine03107b42015-12-11 10:49:51 -0800277 device_layer_names.push_back("VK_LAYER_LUNARG_threading");
278 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
279 device_layer_names.push_back("VK_LAYER_LUNARG_mem_tracker");
280 device_layer_names.push_back("VK_LAYER_LUNARG_draw_state");
281 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
282 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700283 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600284
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600285 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600286 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800287 this->app_info.pApplicationName = "layer_tests";
288 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600289 this->app_info.pEngineName = "unittest";
290 this->app_info.engineVersion = 1;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600291 this->app_info.apiVersion = VK_API_VERSION;
Tony Barbour300a6082015-04-07 13:44:53 -0600292
Tony Barbour15524c32015-04-29 17:34:29 -0600293 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600294 InitFramework(instance_layer_names, device_layer_names,
295 instance_extension_names, device_extension_names,
296 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600297 }
298
299 virtual void TearDown() {
300 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600301 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600302 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600303 }
304};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500305
Karl Schultz6addd812016-02-02 17:17:23 -0700306VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600307 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600308
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800309 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600310
311 /*
312 * For render test all drawing happens in a single render pass
313 * on a single command buffer.
314 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200315 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800316 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600317 }
318
319 return result;
320}
321
Karl Schultz6addd812016-02-02 17:17:23 -0700322VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600323 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600324
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200325 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800326 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200327 }
Tony Barbour300a6082015-04-07 13:44:53 -0600328
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800329 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600330
331 return result;
332}
333
Karl Schultz6addd812016-02-02 17:17:23 -0700334void VkLayerTest::VKTriangleTest(const char *vertShaderText,
335 const char *fragShaderText,
336 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500337 // Create identity matrix
338 int i;
339 struct vktriangle_vs_uniform data;
340
341 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700342 glm::mat4 View = glm::mat4(1.0f);
343 glm::mat4 Model = glm::mat4(1.0f);
344 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500345 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700346 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500347
348 memcpy(&data.mvp, &MVP[0][0], matrixSize);
349
Karl Schultz6addd812016-02-02 17:17:23 -0700350 static const Vertex tri_data[] = {
351 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
352 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
353 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500354 };
355
Karl Schultz6addd812016-02-02 17:17:23 -0700356 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500357 data.position[i][0] = tri_data[i].posX;
358 data.position[i][1] = tri_data[i].posY;
359 data.position[i][2] = tri_data[i].posZ;
360 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700361 data.color[i][0] = tri_data[i].r;
362 data.color[i][1] = tri_data[i].g;
363 data.color[i][2] = tri_data[i].b;
364 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500365 }
366
367 ASSERT_NO_FATAL_FAILURE(InitState());
368 ASSERT_NO_FATAL_FAILURE(InitViewport());
369
Karl Schultz6addd812016-02-02 17:17:23 -0700370 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
371 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500372
Karl Schultz6addd812016-02-02 17:17:23 -0700373 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
374 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
375 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500376
377 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800378 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500379 pipelineobj.AddShader(&vs);
380 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600381 if (failMask & BsoFailLineWidth) {
382 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
383 }
384 if (failMask & BsoFailDepthBias) {
385 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
386 }
Karl Schultz6addd812016-02-02 17:17:23 -0700387 // Viewport and scissors must stay in synch or other errors will occur than
388 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600389 if (failMask & BsoFailViewport) {
390 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600391 m_viewports.clear();
392 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600393 }
394 if (failMask & BsoFailScissor) {
395 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600396 m_scissors.clear();
397 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600398 }
399 if (failMask & BsoFailBlend) {
400 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
401 }
402 if (failMask & BsoFailDepthBounds) {
403 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
404 }
405 if (failMask & BsoFailStencilReadMask) {
406 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
407 }
408 if (failMask & BsoFailStencilWriteMask) {
409 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
410 }
411 if (failMask & BsoFailStencilReference) {
412 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
413 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500414
415 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700416 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
417 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500418
419 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600420 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500421
Tony Barbourfe3351b2015-07-28 10:17:20 -0600422 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500423
424 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600425 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500426
427 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600428 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500429
Tony Barbourfe3351b2015-07-28 10:17:20 -0600430 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500431}
432
Karl Schultz6addd812016-02-02 17:17:23 -0700433void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
434 VkPipelineObj &pipelineobj,
435 VkDescriptorSetObj &descriptorSet,
436 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500437 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700438 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
439 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500440 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700441 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
442 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500443 }
444
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800445 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700446 // Make sure depthWriteEnable is set so that Depth fail test will work
447 // correctly
448 // Make sure stencilTestEnable is set so that Stencil fail test will work
449 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600450 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800451 stencil.failOp = VK_STENCIL_OP_KEEP;
452 stencil.passOp = VK_STENCIL_OP_KEEP;
453 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
454 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600455
456 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
457 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600458 ds_ci.pNext = NULL;
459 ds_ci.depthTestEnable = VK_FALSE;
460 ds_ci.depthWriteEnable = VK_TRUE;
461 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
462 ds_ci.depthBoundsTestEnable = VK_FALSE;
463 ds_ci.stencilTestEnable = VK_TRUE;
464 ds_ci.front = stencil;
465 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600466
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600467 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600468 pipelineobj.SetViewport(m_viewports);
469 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800470 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700471 VkResult err = pipelineobj.CreateVKPipeline(
472 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600473 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800474 commandBuffer->BindPipeline(pipelineobj);
475 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500476}
477
478// ********************************************************************************************************************
479// ********************************************************************************************************************
480// ********************************************************************************************************************
481// ********************************************************************************************************************
Tobin Ehlis0788f522015-05-26 16:11:58 -0600482#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700483#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800484TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500485{
486 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500487 VkFenceCreateInfo fenceInfo = {};
488 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
489 fenceInfo.pNext = NULL;
490 fenceInfo.flags = 0;
491
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600493
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500494 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600495
496 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
497 vk_testing::Buffer buffer;
498 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500499
Tony Barbourfe3351b2015-07-28 10:17:20 -0600500 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800501 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600502 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500503
504 testFence.init(*m_device, fenceInfo);
505
506 // Bypass framework since it does the waits automatically
507 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600508 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800509 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
510 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800511 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600512 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700513 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800514 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800515 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800516 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600517 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600518
519 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500520 ASSERT_VK_SUCCESS( err );
521
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500522 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800523 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500524
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600525 if (!m_errorMonitor->DesiredMsgFound()) {
526 FAIL() << "Did not receive Error 'Resetting CB (0xaddress) before it has completed. You must check CB flag before.'";
527 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500528 }
529}
530
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800531TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500532{
533 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500534 VkFenceCreateInfo fenceInfo = {};
535 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
536 fenceInfo.pNext = NULL;
537 fenceInfo.flags = 0;
538
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700539 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600540
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500541 ASSERT_NO_FATAL_FAILURE(InitState());
542 ASSERT_NO_FATAL_FAILURE(InitViewport());
543 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
544
Tony Barbourfe3351b2015-07-28 10:17:20 -0600545 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800546 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600547 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500548
549 testFence.init(*m_device, fenceInfo);
550
551 // Bypass framework since it does the waits automatically
552 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600553 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800554 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
555 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800556 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600557 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700558 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800559 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800560 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800561 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600562 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600563
564 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500565 ASSERT_VK_SUCCESS( err );
566
Jon Ashburnf19916e2016-01-11 13:12:43 -0700567 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800568 VkCommandBufferBeginInfo info = {};
569 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
570 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600571 info.renderPass = VK_NULL_HANDLE;
572 info.subpass = 0;
573 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +0800574 info.occlusionQueryEnable = VK_FALSE;
575 info.queryFlags = 0;
576 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600577
578 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800579 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500580
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600581 if (!m_errorMonitor->DesiredMsgFound()) {
582 FAIL() << "Did not receive Error 'Calling vkBeginCommandBuffer() on an active CB (0xaddress) before it has completed'";
583 m_errorMonitor->DumpFailureMsgs();
584
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500585 }
586}
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700587#endif
Karl Schultz6addd812016-02-02 17:17:23 -0700588TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
589 VkResult err;
590 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500591
Karl Schultz6addd812016-02-02 17:17:23 -0700592 m_errorMonitor->SetDesiredFailureMsg(
593 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600594 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
595
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500596 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500597
598 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700599 VkImage image;
600 VkDeviceMemory mem;
601 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500602
Karl Schultz6addd812016-02-02 17:17:23 -0700603 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
604 const int32_t tex_width = 32;
605 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500606
Tony Barboureb254902015-07-15 12:50:33 -0600607 VkImageCreateInfo image_create_info = {};
608 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700609 image_create_info.pNext = NULL;
610 image_create_info.imageType = VK_IMAGE_TYPE_2D;
611 image_create_info.format = tex_format;
612 image_create_info.extent.width = tex_width;
613 image_create_info.extent.height = tex_height;
614 image_create_info.extent.depth = 1;
615 image_create_info.mipLevels = 1;
616 image_create_info.arrayLayers = 1;
617 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
618 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
619 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
620 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600621
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800622 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800623 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700624 mem_alloc.pNext = NULL;
625 mem_alloc.allocationSize = 0;
626 // Introduce failure, do NOT set memProps to
627 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
628 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500629
Chia-I Wuf7458c52015-10-26 21:10:41 +0800630 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500631 ASSERT_VK_SUCCESS(err);
632
Karl Schultz6addd812016-02-02 17:17:23 -0700633 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500634
Mark Lobodzinski23065352015-05-29 09:32:35 -0500635 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500636
Karl Schultz6addd812016-02-02 17:17:23 -0700637 pass =
638 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
639 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
640 if (!pass) { // If we can't find any unmappable memory this test doesn't
641 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +0800642 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -0600643 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -0600644 }
Mike Stroyan713b2d72015-08-04 10:49:29 -0600645
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500646 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800647 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500648 ASSERT_VK_SUCCESS(err);
649
650 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -0600651 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500652 ASSERT_VK_SUCCESS(err);
653
654 // Map memory as if to initialize the image
655 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -0700656 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
657 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500658
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600659 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700660 FAIL() << "Did not receive Error 'Error received did not match "
661 "expected error message from vkMapMemory in MemTracker'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600662 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500663 }
Mike Stroyand1c84a52015-08-18 14:40:24 -0600664
Chia-I Wuf7458c52015-10-26 21:10:41 +0800665 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500666}
667
Karl Schultz6addd812016-02-02 17:17:23 -0700668// TODO : Is this test still valid. Not sure it is with updates to memory
669// binding model
Tobin Ehlis2717d132015-07-10 18:25:07 -0600670// Verify and delete the test of fix the check
Karl Schultz6addd812016-02-02 17:17:23 -0700671// TEST_F(VkLayerTest, FreeBoundMemory)
Tobin Ehlis2717d132015-07-10 18:25:07 -0600672//{
Tobin Ehlis2717d132015-07-10 18:25:07 -0600673// VkResult err;
674//
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700675// m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARN_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600676// "Freeing memory object while it still has references");
Tobin Ehlis2717d132015-07-10 18:25:07 -0600677//
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600678// ASSERT_NO_FATAL_FAILURE(InitState());
679
Tobin Ehlis2717d132015-07-10 18:25:07 -0600680// // Create an image, allocate memory, free it, and then try to bind it
681// VkImage image;
682// VkDeviceMemory mem;
683// VkMemoryRequirements mem_reqs;
684//
685// const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
686// const int32_t tex_width = 32;
687// const int32_t tex_height = 32;
688//
689// const VkImageCreateInfo image_create_info = {
690// .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
691// .pNext = NULL,
692// .imageType = VK_IMAGE_TYPE_2D,
693// .format = tex_format,
694// .extent = { tex_width, tex_height, 1 },
695// .mipLevels = 1,
696// .arraySize = 1,
Chia-I Wu5c17c962015-10-31 00:31:16 +0800697// .samples = VK_SAMPLE_COUNT_1_BIT,
Tobin Ehlis2717d132015-07-10 18:25:07 -0600698// .tiling = VK_IMAGE_TILING_LINEAR,
699// .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
700// .flags = 0,
701// };
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800702// VkMemoryAllocateInfo mem_alloc = {
Chia-I Wu00ce5402015-11-10 16:21:09 +0800703// .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
Tobin Ehlis2717d132015-07-10 18:25:07 -0600704// .pNext = NULL,
705// .allocationSize = 0,
706// .memoryTypeIndex = 0,
707// };
708//
Chia-I Wuf7458c52015-10-26 21:10:41 +0800709// err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis2717d132015-07-10 18:25:07 -0600710// ASSERT_VK_SUCCESS(err);
711//
712// err = vkGetImageMemoryRequirements(m_device->device(),
713// image,
714// &mem_reqs);
715// ASSERT_VK_SUCCESS(err);
716//
717// mem_alloc.allocationSize = mem_reqs.size;
718//
Karl Schultz6addd812016-02-02 17:17:23 -0700719// err = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
720// 0);
Tobin Ehlis2717d132015-07-10 18:25:07 -0600721// ASSERT_VK_SUCCESS(err);
722//
723// // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800724// err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis2717d132015-07-10 18:25:07 -0600725// ASSERT_VK_SUCCESS(err);
726//
727// // Bind memory to Image object
728// err = vkBindImageMemory(m_device->device(), image, mem, 0);
729// ASSERT_VK_SUCCESS(err);
730//
731// // Introduce validation failure, free memory while still bound to object
Chia-I Wuf7458c52015-10-26 21:10:41 +0800732// vkFreeMemory(m_device->device(), mem, NULL);
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600733//
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600734// if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700735// FAIL() << "Did not receive Warning 'Freeing memory object while it
736// still has references'");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600737// m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis2717d132015-07-10 18:25:07 -0600738// }
739//}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500740
Karl Schultz6addd812016-02-02 17:17:23 -0700741TEST_F(VkLayerTest, RebindMemory) {
742 VkResult err;
743 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500744
Karl Schultz6addd812016-02-02 17:17:23 -0700745 m_errorMonitor->SetDesiredFailureMsg(
746 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600747 "which has already been bound to mem object");
748
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500749 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500750
751 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700752 VkImage image;
753 VkDeviceMemory mem1;
754 VkDeviceMemory mem2;
755 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500756
Karl Schultz6addd812016-02-02 17:17:23 -0700757 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
758 const int32_t tex_width = 32;
759 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500760
Tony Barboureb254902015-07-15 12:50:33 -0600761 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700762 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
763 image_create_info.pNext = NULL;
764 image_create_info.imageType = VK_IMAGE_TYPE_2D;
765 image_create_info.format = tex_format;
766 image_create_info.extent.width = tex_width;
767 image_create_info.extent.height = tex_height;
768 image_create_info.extent.depth = 1;
769 image_create_info.mipLevels = 1;
770 image_create_info.arrayLayers = 1;
771 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
772 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
773 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
774 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500775
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800776 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700777 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
778 mem_alloc.pNext = NULL;
779 mem_alloc.allocationSize = 0;
780 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -0600781
Karl Schultz6addd812016-02-02 17:17:23 -0700782 // Introduce failure, do NOT set memProps to
783 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -0600784 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800785 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500786 ASSERT_VK_SUCCESS(err);
787
Karl Schultz6addd812016-02-02 17:17:23 -0700788 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500789
790 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -0700791 pass =
792 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -0600793 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500794
795 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800796 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500797 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800798 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500799 ASSERT_VK_SUCCESS(err);
800
801 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -0600802 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500803 ASSERT_VK_SUCCESS(err);
804
Karl Schultz6addd812016-02-02 17:17:23 -0700805 // Introduce validation failure, try to bind a different memory object to
806 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -0600807 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500808
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600809 if (!m_errorMonitor->DesiredMsgFound()) {
810 FAIL() << "Did not receive Error when rebinding memory to an object";
811 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500812 }
Mike Stroyand1c84a52015-08-18 14:40:24 -0600813
Chia-I Wuf7458c52015-10-26 21:10:41 +0800814 vkDestroyImage(m_device->device(), image, NULL);
815 vkFreeMemory(m_device->device(), mem1, NULL);
816 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500817}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500818
Karl Schultz6addd812016-02-02 17:17:23 -0700819TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600820 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600821
Karl Schultz6addd812016-02-02 17:17:23 -0700822 m_errorMonitor->SetDesiredFailureMsg(
823 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
824 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600825
826 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600827 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
828 fenceInfo.pNext = NULL;
829 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -0600830
Tony Barbour300a6082015-04-07 13:44:53 -0600831 ASSERT_NO_FATAL_FAILURE(InitState());
832 ASSERT_NO_FATAL_FAILURE(InitViewport());
833 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
834
Tony Barbourfe3351b2015-07-28 10:17:20 -0600835 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -0700836 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
837 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600838 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600839
840 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600841
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600842 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800843 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
844 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800845 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600846 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700847 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800848 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800849 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800850 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600851 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600852
853 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -0700854 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600855
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600856 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700857 FAIL() << "Did not receive Error 'VkQueueSubmit with fence in "
858 "SIGNALED_STATE'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600859 m_errorMonitor->DumpFailureMsgs();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600860 }
Tony Barbour0b4d9562015-04-09 10:48:04 -0600861}
862
Karl Schultz6addd812016-02-02 17:17:23 -0700863TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600864 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600865 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600866 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
867 fenceInfo.pNext = NULL;
868
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700869 // TODO: verify that this matches layer
Karl Schultz6addd812016-02-02 17:17:23 -0700870 m_errorMonitor->SetDesiredFailureMsg(
871 VK_DEBUG_REPORT_WARN_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600872 "submitted to VkResetFences in UNSIGNALED STATE");
873
Tony Barbour0b4d9562015-04-09 10:48:04 -0600874 ASSERT_NO_FATAL_FAILURE(InitState());
875 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +0800876 VkFence fences[1] = {testFence.handle()};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600877 vkResetFences(m_device->device(), 1, fences);
Tony Barbour300a6082015-04-07 13:44:53 -0600878
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600879 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700880 FAIL() << "Did not receive Error 'VkResetFences with fence in "
881 "UNSIGNALED_STATE'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600882 m_errorMonitor->DumpFailureMsgs();
883 }
Tony Barbour300a6082015-04-07 13:44:53 -0600884}
Tobin Ehlis41376e12015-07-03 08:45:14 -0600885
Chia-I Wu08accc62015-07-07 11:50:03 +0800886/* TODO: Update for changes due to bug-14075 tiling across render passes */
887#if 0
Tobin Ehlis41376e12015-07-03 08:45:14 -0600888TEST_F(VkLayerTest, InvalidUsageBits)
889{
890 // Initiate Draw w/o a PSO bound
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600891
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600893 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -0600894
895 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800896 VkCommandBufferObj commandBuffer(m_device);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600897 BeginCommandBuffer();
Tobin Ehlis41376e12015-07-03 08:45:14 -0600898
899 const VkExtent3D e3d = {
900 .width = 128,
901 .height = 128,
902 .depth = 1,
903 };
904 const VkImageCreateInfo ici = {
905 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
906 .pNext = NULL,
907 .imageType = VK_IMAGE_TYPE_2D,
908 .format = VK_FORMAT_D32_SFLOAT_S8_UINT,
909 .extent = e3d,
910 .mipLevels = 1,
911 .arraySize = 1,
Chia-I Wu5c17c962015-10-31 00:31:16 +0800912 .samples = VK_SAMPLE_COUNT_1_BIT,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600913 .tiling = VK_IMAGE_TILING_LINEAR,
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600914 .usage = 0, // Not setting VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
Tobin Ehlis41376e12015-07-03 08:45:14 -0600915 .flags = 0,
916 };
917
918 VkImage dsi;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800919 vkCreateImage(m_device->device(), &ici, NULL, &dsi);
Tobin Ehlis41376e12015-07-03 08:45:14 -0600920 VkDepthStencilView dsv;
921 const VkDepthStencilViewCreateInfo dsvci = {
922 .sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO,
923 .pNext = NULL,
924 .image = dsi,
925 .mipLevel = 0,
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -0600926 .baseArrayLayer = 0,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600927 .arraySize = 1,
928 .flags = 0,
929 };
Chia-I Wuf7458c52015-10-26 21:10:41 +0800930 vkCreateDepthStencilView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600931
932 if (!m_errorMonitor->DesiredMsgFound()) {
Tobin Ehlis41376e12015-07-03 08:45:14 -0600933 FAIL() << "Error received was not 'Invalid usage flag for image...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600934 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis41376e12015-07-03 08:45:14 -0600935 }
936}
Mark Lobodzinski209b5292015-09-17 09:44:05 -0600937#endif // 0
938#endif // MEM_TRACKER_TESTS
939
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600940#if OBJ_TRACKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -0700941TEST_F(VkLayerTest, PipelineNotBound) {
942 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600943
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -0700945 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600946
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600947 ASSERT_NO_FATAL_FAILURE(InitState());
948 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600949
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800950 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700951 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
952 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600953
954 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700955 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
956 ds_pool_ci.pNext = NULL;
957 ds_pool_ci.maxSets = 1;
958 ds_pool_ci.poolSizeCount = 1;
959 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600960
961 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -0700962 err =
963 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600964 ASSERT_VK_SUCCESS(err);
965
966 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700967 dsl_binding.binding = 0;
968 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
969 dsl_binding.descriptorCount = 1;
970 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
971 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600972
973 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700974 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
975 ds_layout_ci.pNext = NULL;
976 ds_layout_ci.bindingCount = 1;
977 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600978
979 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700980 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
981 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600982 ASSERT_VK_SUCCESS(err);
983
984 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800985 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800986 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -0700987 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -0600988 alloc_info.descriptorPool = ds_pool;
989 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700990 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
991 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600992 ASSERT_VK_SUCCESS(err);
993
994 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700995 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
996 pipeline_layout_ci.pNext = NULL;
997 pipeline_layout_ci.setLayoutCount = 1;
998 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600999
1000 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001001 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1002 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001003 ASSERT_VK_SUCCESS(err);
1004
Mark Youngad779052016-01-06 14:26:04 -07001005 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001006
1007 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001008 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1009 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001010
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001011 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001012 FAIL()
1013 << "Error received was not 'Invalid VkPipeline Object 0xbaadb1be'"
1014 << endl;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001015 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisec598302015-09-15 15:02:17 -06001016 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06001017
Chia-I Wuf7458c52015-10-26 21:10:41 +08001018 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1019 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1020 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001021}
1022
Karl Schultz6addd812016-02-02 17:17:23 -07001023TEST_F(VkLayerTest, BindInvalidMemory) {
1024 VkResult err;
1025 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001026
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001028 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001029
Tobin Ehlisec598302015-09-15 15:02:17 -06001030 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001031
1032 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001033 VkImage image;
1034 VkDeviceMemory mem;
1035 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001036
Karl Schultz6addd812016-02-02 17:17:23 -07001037 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1038 const int32_t tex_width = 32;
1039 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001040
1041 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001042 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1043 image_create_info.pNext = NULL;
1044 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1045 image_create_info.format = tex_format;
1046 image_create_info.extent.width = tex_width;
1047 image_create_info.extent.height = tex_height;
1048 image_create_info.extent.depth = 1;
1049 image_create_info.mipLevels = 1;
1050 image_create_info.arrayLayers = 1;
1051 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1052 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1053 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1054 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001055
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001056 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001057 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1058 mem_alloc.pNext = NULL;
1059 mem_alloc.allocationSize = 0;
1060 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001061
Chia-I Wuf7458c52015-10-26 21:10:41 +08001062 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001063 ASSERT_VK_SUCCESS(err);
1064
Karl Schultz6addd812016-02-02 17:17:23 -07001065 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001066
1067 mem_alloc.allocationSize = mem_reqs.size;
1068
Karl Schultz6addd812016-02-02 17:17:23 -07001069 pass =
1070 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001071 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001072
1073 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001074 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001075 ASSERT_VK_SUCCESS(err);
1076
1077 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001078 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001079
1080 // Try to bind free memory that has been freed
1081 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1082 // This may very well return an error.
1083 (void)err;
1084
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001085 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001086 FAIL() << "Did not receive Error 'Invalid VkDeviceMemory Object "
1087 "0x<handle>'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001088 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisec598302015-09-15 15:02:17 -06001089 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06001090
Chia-I Wuf7458c52015-10-26 21:10:41 +08001091 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001092}
1093
Karl Schultz6addd812016-02-02 17:17:23 -07001094TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1095 VkResult err;
1096 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001097
Karl Schultz6addd812016-02-02 17:17:23 -07001098 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1099 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001100
Tobin Ehlisec598302015-09-15 15:02:17 -06001101 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001102
Karl Schultz6addd812016-02-02 17:17:23 -07001103 // Create an image object, allocate memory, destroy the object and then try
1104 // to bind it
1105 VkImage image;
1106 VkDeviceMemory mem;
1107 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001108
Karl Schultz6addd812016-02-02 17:17:23 -07001109 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1110 const int32_t tex_width = 32;
1111 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001112
1113 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001114 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1115 image_create_info.pNext = NULL;
1116 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1117 image_create_info.format = tex_format;
1118 image_create_info.extent.width = tex_width;
1119 image_create_info.extent.height = tex_height;
1120 image_create_info.extent.depth = 1;
1121 image_create_info.mipLevels = 1;
1122 image_create_info.arrayLayers = 1;
1123 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1124 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1125 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1126 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001127
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001128 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001129 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1130 mem_alloc.pNext = NULL;
1131 mem_alloc.allocationSize = 0;
1132 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001133
Chia-I Wuf7458c52015-10-26 21:10:41 +08001134 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001135 ASSERT_VK_SUCCESS(err);
1136
Karl Schultz6addd812016-02-02 17:17:23 -07001137 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001138
1139 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001140 pass =
1141 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001142 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001143
1144 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001145 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001146 ASSERT_VK_SUCCESS(err);
1147
1148 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001149 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001150 ASSERT_VK_SUCCESS(err);
1151
1152 // Now Try to bind memory to this destroyed object
1153 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1154 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001155 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001156
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001157 if (!m_errorMonitor->DesiredMsgFound()) {
1158 FAIL() << "Did not receive Error 'Invalid VkImage Object 0x<handle>'";
1159 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001160 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06001161
Chia-I Wuf7458c52015-10-26 21:10:41 +08001162 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001163}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001164
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001165#endif // OBJ_TRACKER_TESTS
1166
Tobin Ehlis0788f522015-05-26 16:11:58 -06001167#if DRAW_STATE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07001168TEST_F(VkLayerTest, LineWidthStateNotBound) {
1169 m_errorMonitor->SetDesiredFailureMsg(
1170 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001171 "Dynamic line width state not set for this command buffer");
1172
Karl Schultz6addd812016-02-02 17:17:23 -07001173 TEST_DESCRIPTION("Simple Draw Call that validates failure when a line "
1174 "width state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001175
Karl Schultz6addd812016-02-02 17:17:23 -07001176 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1177 BsoFailLineWidth);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001178
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001179 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001180 FAIL() << "Did not receive Error 'Dynamic line width state not set for "
1181 "this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001182 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001183 }
1184}
1185
Karl Schultz6addd812016-02-02 17:17:23 -07001186TEST_F(VkLayerTest, DepthBiasStateNotBound) {
1187 m_errorMonitor->SetDesiredFailureMsg(
1188 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001189 "Dynamic depth bias state not set for this command buffer");
1190
Karl Schultz6addd812016-02-02 17:17:23 -07001191 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
1192 "bias state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001193
Karl Schultz6addd812016-02-02 17:17:23 -07001194 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1195 BsoFailDepthBias);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001196
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001197 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001198 FAIL() << "Did not receive Error 'Dynamic depth bias state not set for "
1199 "this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001200 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001201 }
1202}
1203
Karl Schultz6addd812016-02-02 17:17:23 -07001204// Disable these two tests until we can sort out how to track multiple layer
1205// errors
1206TEST_F(VkLayerTest, ViewportStateNotBound) {
1207 m_errorMonitor->SetDesiredFailureMsg(
1208 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001209 "Dynamic viewport state not set for this command buffer");
1210
Karl Schultz6addd812016-02-02 17:17:23 -07001211 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
1212 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001213
Karl Schultz6addd812016-02-02 17:17:23 -07001214 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1215 BsoFailViewport);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001216
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001217 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001218 FAIL() << "Did not recieve Error 'Dynamic scissor state not set for "
1219 "this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001220 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001221 }
1222}
1223
Karl Schultz6addd812016-02-02 17:17:23 -07001224TEST_F(VkLayerTest, ScissorStateNotBound) {
1225 m_errorMonitor->SetDesiredFailureMsg(
1226 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001227 "Dynamic scissor state not set for this command buffer");
1228
Karl Schultz6addd812016-02-02 17:17:23 -07001229 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
1230 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001231
Karl Schultz6addd812016-02-02 17:17:23 -07001232 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1233 BsoFailScissor);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001234
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001235 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001236 FAIL() << "Did not recieve Error ' Expected: 'Dynamic scissor state "
1237 "not set for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001238 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001239 }
1240}
1241
Karl Schultz6addd812016-02-02 17:17:23 -07001242TEST_F(VkLayerTest, BlendStateNotBound) {
1243 m_errorMonitor->SetDesiredFailureMsg(
1244 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001245 "Dynamic blend object state not set for this command buffer");
1246
Karl Schultz6addd812016-02-02 17:17:23 -07001247 TEST_DESCRIPTION("Simple Draw Call that validates failure when a blend "
1248 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001249
Karl Schultz6addd812016-02-02 17:17:23 -07001250 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1251 BsoFailBlend);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001252
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001253 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001254 FAIL() << "Did not recieve Error 'Dynamic blend object state not set "
1255 "for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001256 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001257 }
1258}
1259
Karl Schultz6addd812016-02-02 17:17:23 -07001260TEST_F(VkLayerTest, DepthBoundsStateNotBound) {
1261 m_errorMonitor->SetDesiredFailureMsg(
1262 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001263 "Dynamic depth bounds state not set for this command buffer");
1264
Karl Schultz6addd812016-02-02 17:17:23 -07001265 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
1266 "bounds state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001267
Karl Schultz6addd812016-02-02 17:17:23 -07001268 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1269 BsoFailDepthBounds);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001270
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001271 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001272 FAIL() << "Did not receive Error 'Dynamic depth bounds state not set "
1273 "for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001274 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001275 }
1276}
1277
Karl Schultz6addd812016-02-02 17:17:23 -07001278TEST_F(VkLayerTest, StencilReadMaskNotSet) {
1279 m_errorMonitor->SetDesiredFailureMsg(
1280 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001281 "Dynamic stencil read mask state not set for this command buffer");
1282
Tobin Ehlis963a4042015-09-29 08:18:34 -06001283 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001284
Karl Schultz6addd812016-02-02 17:17:23 -07001285 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
1286 "read mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001287
Karl Schultz6addd812016-02-02 17:17:23 -07001288 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1289 BsoFailStencilReadMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001290
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001291 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001292 FAIL() << "Did not receive Error 'Dynamic stencil read mask state not "
1293 "set for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001294 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001295 }
1296}
1297
Karl Schultz6addd812016-02-02 17:17:23 -07001298TEST_F(VkLayerTest, StencilWriteMaskNotSet) {
1299 m_errorMonitor->SetDesiredFailureMsg(
1300 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001301 "Dynamic stencil write mask state not set for this command buffer");
1302
Tobin Ehlis963a4042015-09-29 08:18:34 -06001303 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001304
Karl Schultz6addd812016-02-02 17:17:23 -07001305 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
1306 "write mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001307
Karl Schultz6addd812016-02-02 17:17:23 -07001308 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1309 BsoFailStencilWriteMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001310
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001311 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001312 FAIL() << "Did not receive Error 'Dynamic stencil write mask state not "
1313 "set for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001314 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001315 }
1316}
1317
Karl Schultz6addd812016-02-02 17:17:23 -07001318TEST_F(VkLayerTest, StencilReferenceNotSet) {
1319 m_errorMonitor->SetDesiredFailureMsg(
1320 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001321 "Dynamic stencil reference state not set for this command buffer");
1322
Karl Schultz6addd812016-02-02 17:17:23 -07001323 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
1324 "reference is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001325
Karl Schultz6addd812016-02-02 17:17:23 -07001326 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1327 BsoFailStencilReference);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001328
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001329 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001330 FAIL() << "Did not receive Error 'Dynamic stencil reference state not "
1331 "set for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001332 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001333 }
1334}
1335
Karl Schultz6addd812016-02-02 17:17:23 -07001336TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001337 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001338
Karl Schultz6addd812016-02-02 17:17:23 -07001339 m_errorMonitor->SetDesiredFailureMsg(
1340 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1341 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
1342 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001343
1344 VkFenceCreateInfo fenceInfo = {};
1345 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1346 fenceInfo.pNext = NULL;
1347 fenceInfo.flags = 0;
1348
1349 ASSERT_NO_FATAL_FAILURE(InitState());
1350 ASSERT_NO_FATAL_FAILURE(InitViewport());
1351 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1352
Karl Schultz6addd812016-02-02 17:17:23 -07001353 // We luck out b/c by default the framework creates CB w/ the
1354 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001355 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001356 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
1357 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001358 EndCommandBuffer();
1359
1360 testFence.init(*m_device, fenceInfo);
1361
1362 // Bypass framework since it does the waits automatically
1363 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001364 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001365 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1366 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001367 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001368 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001369 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001370 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001371 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001372 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001373 submit_info.pSignalSemaphores = NULL;
1374
Karl Schultz6addd812016-02-02 17:17:23 -07001375 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
1376 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001377
Karl Schultz6addd812016-02-02 17:17:23 -07001378 // Cause validation error by re-submitting cmd buffer that should only be
1379 // submitted once
1380 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001381
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001382 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001383 FAIL() << "Did not receive Error 'CB (0xaddress) was created w/ "
1384 "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001385 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001386 }
1387}
1388
Karl Schultz6addd812016-02-02 17:17:23 -07001389TEST_F(VkLayerTest, BindPipelineNoRenderPass) {
Mark Lobodzinski74635932015-12-18 15:35:38 -07001390 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07001391 VkResult err;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001392
1393 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001394 "vkCmdBindPipeline: This call must be "
1395 "issued inside an active render pass");
Mark Lobodzinski74635932015-12-18 15:35:38 -07001396
1397 ASSERT_NO_FATAL_FAILURE(InitState());
1398 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1399
1400 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001401 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1402 ds_type_count.descriptorCount = 1;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001403
1404 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001405 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1406 ds_pool_ci.pNext = NULL;
1407 ds_pool_ci.maxSets = 1;
1408 ds_pool_ci.poolSizeCount = 1;
1409 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001410
1411 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001412 err =
1413 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Lobodzinski74635932015-12-18 15:35:38 -07001414 ASSERT_VK_SUCCESS(err);
1415
1416 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001417 dsl_binding.binding = 0;
1418 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1419 dsl_binding.descriptorCount = 1;
1420 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1421 dsl_binding.pImmutableSamplers = NULL;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001422
1423 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001424 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1425 ds_layout_ci.pNext = NULL;
1426 ds_layout_ci.bindingCount = 1;
1427 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001428
1429 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001430 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1431 &ds_layout);
Mark Lobodzinski74635932015-12-18 15:35:38 -07001432 ASSERT_VK_SUCCESS(err);
1433
1434 VkDescriptorSet descriptorSet;
1435 VkDescriptorSetAllocateInfo alloc_info = {};
1436 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001437 alloc_info.descriptorSetCount = 1;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001438 alloc_info.descriptorPool = ds_pool;
1439 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001440 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1441 &descriptorSet);
Mark Lobodzinski74635932015-12-18 15:35:38 -07001442 ASSERT_VK_SUCCESS(err);
1443 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001444 pipe_ms_state_ci.sType =
1445 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
1446 pipe_ms_state_ci.pNext = NULL;
1447 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
1448 pipe_ms_state_ci.sampleShadingEnable = 0;
1449 pipe_ms_state_ci.minSampleShading = 1.0;
1450 pipe_ms_state_ci.pSampleMask = NULL;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001451
1452 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001453 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1454 pipeline_layout_ci.pNext = NULL;
1455 pipeline_layout_ci.setLayoutCount = 1;
1456 pipeline_layout_ci.pSetLayouts = &ds_layout;
1457 VkPipelineLayout pipeline_layout;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001458
Karl Schultz6addd812016-02-02 17:17:23 -07001459 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1460 &pipeline_layout);
Mark Lobodzinski74635932015-12-18 15:35:38 -07001461 ASSERT_VK_SUCCESS(err);
1462
Karl Schultz6addd812016-02-02 17:17:23 -07001463 VkShaderObj vs(m_device, bindStateVertShaderText,
1464 VK_SHADER_STAGE_VERTEX_BIT, this);
1465 VkShaderObj fs(m_device, bindStateFragShaderText,
1466 VK_SHADER_STAGE_FRAGMENT_BIT,
1467 this); // TODO - We shouldn't need a fragment shader
1468 // but add it to be able to run on more devices
Mark Lobodzinski74635932015-12-18 15:35:38 -07001469 VkPipelineObj pipe(m_device);
1470 pipe.AddShader(&vs);
1471 pipe.AddShader(&fs);
1472 pipe.SetMSAA(&pipe_ms_state_ci);
1473 pipe.CreateVKPipeline(pipeline_layout, renderPass());
1474
1475 // Calls AllocateCommandBuffers
1476 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
1477 VkCommandBufferBeginInfo cmd_buf_info = {};
1478 memset(&cmd_buf_info, 0, sizeof(VkCommandBufferBeginInfo));
Jon Ashburnf19916e2016-01-11 13:12:43 -07001479 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
1480 memset(&cmd_buf_hinfo, 0, sizeof(VkCommandBufferInheritanceInfo));
Mark Lobodzinski74635932015-12-18 15:35:38 -07001481 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1482 cmd_buf_info.pNext = NULL;
1483 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001484 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001485
1486 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Karl Schultz6addd812016-02-02 17:17:23 -07001487 vkCmdBindPipeline(commandBuffer.GetBufferHandle(),
1488 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Lobodzinski74635932015-12-18 15:35:38 -07001489
1490 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001491 FAIL() << "Did not receive Error 'vkCmdBindPipeline: This call must be "
1492 "issued inside an active render pass'";
Mark Lobodzinski74635932015-12-18 15:35:38 -07001493 m_errorMonitor->DumpFailureMsgs();
1494 }
1495
1496 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1497 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1498 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1499}
1500
Karl Schultz6addd812016-02-02 17:17:23 -07001501TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001502 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07001503 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001504
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001505 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001506 "Unable to allocate 1 descriptors of "
1507 "type "
1508 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001509
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001510 ASSERT_NO_FATAL_FAILURE(InitState());
1511 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001512
Karl Schultz6addd812016-02-02 17:17:23 -07001513 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
1514 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001515 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001516 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
1517 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001518
1519 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001520 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1521 ds_pool_ci.pNext = NULL;
1522 ds_pool_ci.flags = 0;
1523 ds_pool_ci.maxSets = 1;
1524 ds_pool_ci.poolSizeCount = 1;
1525 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001526
1527 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001528 err =
1529 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001530 ASSERT_VK_SUCCESS(err);
1531
1532 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001533 dsl_binding.binding = 0;
1534 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1535 dsl_binding.descriptorCount = 1;
1536 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1537 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001538
1539 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001540 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1541 ds_layout_ci.pNext = NULL;
1542 ds_layout_ci.bindingCount = 1;
1543 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001544
1545 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001546 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1547 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001548 ASSERT_VK_SUCCESS(err);
1549
1550 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001551 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001552 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001553 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001554 alloc_info.descriptorPool = ds_pool;
1555 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001556 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1557 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001558
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001559 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001560 FAIL() << "Did not receive Error 'Unable to allocate 1 descriptors of "
1561 "type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001562 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001563 }
1564
Chia-I Wuf7458c52015-10-26 21:10:41 +08001565 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1566 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001567}
1568
Karl Schultz6addd812016-02-02 17:17:23 -07001569TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
1570 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06001571
Karl Schultz6addd812016-02-02 17:17:23 -07001572 m_errorMonitor->SetDesiredFailureMsg(
1573 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1574 "It is invalid to call vkFreeDescriptorSets() with a pool created "
1575 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001576
Tobin Ehlise735c692015-10-08 13:13:50 -06001577 ASSERT_NO_FATAL_FAILURE(InitState());
1578 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06001579
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001580 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001581 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1582 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06001583
1584 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001585 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1586 ds_pool_ci.pNext = NULL;
1587 ds_pool_ci.maxSets = 1;
1588 ds_pool_ci.poolSizeCount = 1;
1589 ds_pool_ci.flags = 0;
1590 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
1591 // app can only call vkResetDescriptorPool on this pool.;
1592 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06001593
1594 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001595 err =
1596 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06001597 ASSERT_VK_SUCCESS(err);
1598
1599 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001600 dsl_binding.binding = 0;
1601 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1602 dsl_binding.descriptorCount = 1;
1603 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1604 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06001605
1606 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001607 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1608 ds_layout_ci.pNext = NULL;
1609 ds_layout_ci.bindingCount = 1;
1610 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06001611
1612 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001613 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1614 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06001615 ASSERT_VK_SUCCESS(err);
1616
1617 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001618 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001619 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001620 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001621 alloc_info.descriptorPool = ds_pool;
1622 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001623 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1624 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06001625 ASSERT_VK_SUCCESS(err);
1626
1627 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001628 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001629 FAIL() << "Did not receive Error 'It is invalid to call "
1630 "vkFreeDescriptorSets() with a pool created with...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001631 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlise735c692015-10-08 13:13:50 -06001632 }
1633
Chia-I Wuf7458c52015-10-26 21:10:41 +08001634 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1635 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06001636}
1637
Karl Schultz6addd812016-02-02 17:17:23 -07001638TEST_F(VkLayerTest, InvalidDescriptorPool) {
1639 // TODO : Simple check for bad object should be added to ObjectTracker to
1640 // catch this case
1641 // The DS check for this is after driver has been called to validate DS
1642 // internal data struct
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001643 // Attempt to clear DS Pool with bad object
Karl Schultz6addd812016-02-02 17:17:23 -07001644 /*
1645 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1646 "Unable to find pool node for pool 0xbaad6001 specified in
1647 vkResetDescriptorPool() call");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001648
Karl Schultz6addd812016-02-02 17:17:23 -07001649 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
1650 vkResetDescriptorPool(device(), badPool);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001651
Karl Schultz6addd812016-02-02 17:17:23 -07001652 if (!m_errorMonitor->DesiredMsgFound()) {
1653 FAIL() << "Did not receive Error 'Unable to find pool node for pool
1654 0xbaad6001 specified in vkResetDescriptorPool() call'";
1655 m_errorMonitor->DumpFailureMsgs();
1656 }*/
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001657}
1658
Karl Schultz6addd812016-02-02 17:17:23 -07001659TEST_F(VkLayerTest, InvalidDescriptorSet) {
1660 // TODO : Simple check for bad object should be added to ObjectTracker to
1661 // catch this case
1662 // The DS check for this is after driver has been called to validate DS
1663 // internal data struct
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001664 // Create a valid cmd buffer
1665 // call vkCmdBindDescriptorSets w/ false DS
1666}
1667
Karl Schultz6addd812016-02-02 17:17:23 -07001668TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
1669 // TODO : Simple check for bad object should be added to ObjectTracker to
1670 // catch this case
1671 // The DS check for this is after driver has been called to validate DS
1672 // internal data struct
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001673}
1674
Karl Schultz6addd812016-02-02 17:17:23 -07001675TEST_F(VkLayerTest, InvalidPipeline) {
1676 // TODO : Simple check for bad object should be added to ObjectTracker to
1677 // catch this case
1678 // The DS check for this is after driver has been called to validate DS
1679 // internal data struct
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001680 // Create a valid cmd buffer
1681 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultz6addd812016-02-02 17:17:23 -07001682 //
1683 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1684 // "Attempt to bind Pipeline ");
1685 //
1686 // ASSERT_NO_FATAL_FAILURE(InitState());
1687 // VkCommandBufferObj commandBuffer(m_device);
1688 // BeginCommandBuffer();
1689 // VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
1690 // vkCmdBindPipeline(commandBuffer.GetBufferHandle(),
1691 // VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
1692 //
1693 // if (!m_errorMonitor->DesiredMsgFound()) {
1694 // FAIL() << "Did not receive Error 'Attempt to bind Pipeline
1695 // 0xbaadb1be that doesn't exist!'";
1696 // m_errorMonitor->DumpFailureMsgs();
1697 // }
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001698}
1699
Karl Schultz6addd812016-02-02 17:17:23 -07001700TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
1701 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
1702 // CommandBuffer
1703 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001704
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001705 // TODO: verify that this matches layer
1706 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARN_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001707 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001708
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001709 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06001710 ASSERT_NO_FATAL_FAILURE(InitViewport());
1711 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001712 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001713 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1714 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06001715
1716 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001717 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1718 ds_pool_ci.pNext = NULL;
1719 ds_pool_ci.maxSets = 1;
1720 ds_pool_ci.poolSizeCount = 1;
1721 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06001722
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001723 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001724 err =
1725 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001726 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001727
Tony Barboureb254902015-07-15 12:50:33 -06001728 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001729 dsl_binding.binding = 0;
1730 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1731 dsl_binding.descriptorCount = 1;
1732 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1733 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001734
Tony Barboureb254902015-07-15 12:50:33 -06001735 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001736 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1737 ds_layout_ci.pNext = NULL;
1738 ds_layout_ci.bindingCount = 1;
1739 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001740 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001741 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1742 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001743 ASSERT_VK_SUCCESS(err);
1744
1745 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001746 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001747 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001748 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001749 alloc_info.descriptorPool = ds_pool;
1750 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001751 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1752 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001753 ASSERT_VK_SUCCESS(err);
1754
Tony Barboureb254902015-07-15 12:50:33 -06001755 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001756 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1757 pipeline_layout_ci.pNext = NULL;
1758 pipeline_layout_ci.setLayoutCount = 1;
1759 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001760
1761 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001762 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1763 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001764 ASSERT_VK_SUCCESS(err);
1765
Karl Schultz6addd812016-02-02 17:17:23 -07001766 VkShaderObj vs(m_device, bindStateVertShaderText,
1767 VK_SHADER_STAGE_VERTEX_BIT, this);
1768 // TODO - We shouldn't need a fragment shader but add it to be able to run
1769 // on more devices
1770 VkShaderObj fs(m_device, bindStateFragShaderText,
1771 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001772
Tony Barbourc95e4ac2015-08-04 17:05:26 -06001773 VkPipelineObj pipe(m_device);
1774 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06001775 pipe.AddShader(&fs);
Tony Barbourc95e4ac2015-08-04 17:05:26 -06001776 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06001777
1778 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001779 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1780 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
1781 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1782 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1783 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001784
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001785 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001786 FAIL() << "Did not recieve Warning 'DS <blah> bound but it was never "
1787 "updated. You may want to either update it or not bind it.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001788 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06001789 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06001790
Chia-I Wuf7458c52015-10-26 21:10:41 +08001791 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1792 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1793 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06001794}
1795
Karl Schultz6addd812016-02-02 17:17:23 -07001796TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001797 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07001798 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001799
Karl Schultz6addd812016-02-02 17:17:23 -07001800 m_errorMonitor->SetDesiredFailureMsg(
1801 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001802 "Attempt to update descriptor with invalid bufferView ");
1803
1804 ASSERT_NO_FATAL_FAILURE(InitState());
1805 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001806 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1807 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001808
1809 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001810 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1811 ds_pool_ci.pNext = NULL;
1812 ds_pool_ci.maxSets = 1;
1813 ds_pool_ci.poolSizeCount = 1;
1814 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001815
1816 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001817 err =
1818 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001819 ASSERT_VK_SUCCESS(err);
1820
1821 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001822 dsl_binding.binding = 0;
1823 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1824 dsl_binding.descriptorCount = 1;
1825 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1826 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001827
1828 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001829 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1830 ds_layout_ci.pNext = NULL;
1831 ds_layout_ci.bindingCount = 1;
1832 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001833 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001834 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1835 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001836 ASSERT_VK_SUCCESS(err);
1837
1838 VkDescriptorSet descriptorSet;
1839 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001840 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001841 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001842 alloc_info.descriptorPool = ds_pool;
1843 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001844 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1845 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001846 ASSERT_VK_SUCCESS(err);
1847
Karl Schultz6addd812016-02-02 17:17:23 -07001848 VkBufferView view =
1849 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001850 VkWriteDescriptorSet descriptor_write;
1851 memset(&descriptor_write, 0, sizeof(descriptor_write));
1852 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1853 descriptor_write.dstSet = descriptorSet;
1854 descriptor_write.dstBinding = 0;
1855 descriptor_write.descriptorCount = 1;
1856 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1857 descriptor_write.pTexelBufferView = &view;
1858
1859 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1860
1861 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001862 FAIL() << "Did not receive Error 'Attempt to update descriptor with "
1863 "invalid bufferView'";
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001864 m_errorMonitor->DumpFailureMsgs();
1865 }
1866
1867 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1868 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1869}
1870
Karl Schultz6addd812016-02-02 17:17:23 -07001871TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
1872 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
1873 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07001874 // 1. No dynamicOffset supplied
1875 // 2. Too many dynamicOffsets supplied
1876 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07001877 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001879 " requires 1 dynamicOffsets, but only "
1880 "0 dynamicOffsets are left in "
1881 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001882
1883 ASSERT_NO_FATAL_FAILURE(InitState());
1884 ASSERT_NO_FATAL_FAILURE(InitViewport());
1885 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1886
1887 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001888 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
1889 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001890
1891 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001892 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1893 ds_pool_ci.pNext = NULL;
1894 ds_pool_ci.maxSets = 1;
1895 ds_pool_ci.poolSizeCount = 1;
1896 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001897
1898 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001899 err =
1900 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001901 ASSERT_VK_SUCCESS(err);
1902
1903 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001904 dsl_binding.binding = 0;
1905 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
1906 dsl_binding.descriptorCount = 1;
1907 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1908 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001909
1910 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001911 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1912 ds_layout_ci.pNext = NULL;
1913 ds_layout_ci.bindingCount = 1;
1914 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001915 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001916 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1917 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001918 ASSERT_VK_SUCCESS(err);
1919
1920 VkDescriptorSet descriptorSet;
1921 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001922 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001923 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001924 alloc_info.descriptorPool = ds_pool;
1925 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001926 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1927 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001928 ASSERT_VK_SUCCESS(err);
1929
1930 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001931 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1932 pipeline_layout_ci.pNext = NULL;
1933 pipeline_layout_ci.setLayoutCount = 1;
1934 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001935
1936 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001937 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1938 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001939 ASSERT_VK_SUCCESS(err);
1940
1941 // Create a buffer to update the descriptor with
1942 uint32_t qfi = 0;
1943 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001944 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1945 buffCI.size = 1024;
1946 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1947 buffCI.queueFamilyIndexCount = 1;
1948 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001949
1950 VkBuffer dyub;
1951 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
1952 ASSERT_VK_SUCCESS(err);
1953 // Correctly update descriptor to avoid "NOT_UPDATED" error
1954 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001955 buffInfo.buffer = dyub;
1956 buffInfo.offset = 0;
1957 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001958
1959 VkWriteDescriptorSet descriptor_write;
1960 memset(&descriptor_write, 0, sizeof(descriptor_write));
1961 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1962 descriptor_write.dstSet = descriptorSet;
1963 descriptor_write.dstBinding = 0;
1964 descriptor_write.descriptorCount = 1;
1965 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
1966 descriptor_write.pBufferInfo = &buffInfo;
1967
1968 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1969
1970 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001971 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1972 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1973 1, &descriptorSet, 0, NULL);
Tobin Ehlisf6585052015-12-17 11:48:42 -07001974 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001975 FAIL() << "Error received was not 'descriptorSet #0 (0x<ADDR>) "
1976 "requires 1 dynamicOffsets, but only 0 dynamicOffsets are "
1977 "left in pDynamicOffsets array...'";
Tobin Ehlisf6585052015-12-17 11:48:42 -07001978 m_errorMonitor->DumpFailureMsgs();
1979 }
1980 uint32_t pDynOff[2] = {512, 756};
1981 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07001982 m_errorMonitor->SetDesiredFailureMsg(
1983 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07001984 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07001985 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1986 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1987 1, &descriptorSet, 2, pDynOff);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001988 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001989 FAIL() << "Error received was not 'Attempting to bind 1 descriptorSets "
1990 "with 1 dynamic descriptors, but dynamicOffsetCount is 0...'";
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001991 m_errorMonitor->DumpFailureMsgs();
1992 }
Tobin Ehlisf6585052015-12-17 11:48:42 -07001993 // Finally cause error due to dynamicOffset being too big
Karl Schultz6addd812016-02-02 17:17:23 -07001994 m_errorMonitor->SetDesiredFailureMsg(
1995 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07001996 " from its update, this oversteps its buffer (");
1997 // Create PSO to be used for draw-time errors below
1998 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07001999 "#version 400\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002000 "#extension GL_ARB_separate_shader_objects: require\n"
2001 "#extension GL_ARB_shading_language_420pack: require\n"
2002 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07002003 "out gl_PerVertex { \n"
2004 " vec4 gl_Position;\n"
2005 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002006 "void main(){\n"
2007 " gl_Position = vec4(1);\n"
2008 "}\n";
2009 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07002010 "#version 400\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002011 "#extension GL_ARB_separate_shader_objects: require\n"
2012 "#extension GL_ARB_shading_language_420pack: require\n"
2013 "\n"
2014 "layout(location=0) out vec4 x;\n"
2015 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2016 "void main(){\n"
2017 " x = vec4(bar.y);\n"
2018 "}\n";
2019 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2020 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2021 VkPipelineObj pipe(m_device);
2022 pipe.AddShader(&vs);
2023 pipe.AddShader(&fs);
2024 pipe.AddColorAttachment();
2025 pipe.CreateVKPipeline(pipeline_layout, renderPass());
2026
Karl Schultz6addd812016-02-02 17:17:23 -07002027 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2028 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2029 // This update should succeed, but offset size of 512 will overstep buffer
2030 // /w range 1024 & size 1024
2031 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2032 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2033 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07002034 Draw(1, 0, 0, 0);
2035 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002036 FAIL() << "Error received was not 'VkDescriptorSet (0x<ADDR>) bound as "
2037 "set #0 has dynamic offset 512. Combined with offet 0 and "
2038 "range 1024 from its update, this oversteps...'";
Tobin Ehlisf6585052015-12-17 11:48:42 -07002039 m_errorMonitor->DumpFailureMsgs();
2040 }
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002041
2042 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2043 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2044}
2045
Karl Schultz6addd812016-02-02 17:17:23 -07002046TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07002047 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07002048 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002049
2050 ASSERT_NO_FATAL_FAILURE(InitState());
2051 ASSERT_NO_FATAL_FAILURE(InitViewport());
2052 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2053
2054 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
2055 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002056 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2057 ds_type_count[0].descriptorCount = 10;
2058 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
2059 ds_type_count[1].descriptorCount = 2;
2060 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
2061 ds_type_count[2].descriptorCount = 2;
2062 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
2063 ds_type_count[3].descriptorCount = 5;
2064 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
2065 // type
2066 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
2067 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
2068 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002069
2070 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002071 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2072 ds_pool_ci.pNext = NULL;
2073 ds_pool_ci.maxSets = 5;
2074 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
2075 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002076
2077 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002078 err =
2079 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002080 ASSERT_VK_SUCCESS(err);
2081
2082 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
2083 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002084 dsl_binding[0].binding = 0;
2085 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2086 dsl_binding[0].descriptorCount = 5;
2087 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
2088 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002089
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002090 // Create layout identical to set0 layout but w/ different stageFlags
2091 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002092 dsl_fs_stage_only.binding = 0;
2093 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2094 dsl_fs_stage_only.descriptorCount = 5;
2095 dsl_fs_stage_only.stageFlags =
2096 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
2097 // bind time
2098 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002099 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002100 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2101 ds_layout_ci.pNext = NULL;
2102 ds_layout_ci.bindingCount = 1;
2103 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002104 static const uint32_t NUM_LAYOUTS = 4;
2105 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002106 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002107 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
2108 // layout for error case
2109 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2110 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002111 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002112 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002113 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2114 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002115 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002116 dsl_binding[0].binding = 0;
2117 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002118 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002119 dsl_binding[1].binding = 1;
2120 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
2121 dsl_binding[1].descriptorCount = 2;
2122 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
2123 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002124 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002125 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07002126 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2127 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002128 ASSERT_VK_SUCCESS(err);
2129 dsl_binding[0].binding = 0;
2130 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002131 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002132 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07002133 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2134 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002135 ASSERT_VK_SUCCESS(err);
2136 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002137 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07002138 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2139 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002140 ASSERT_VK_SUCCESS(err);
2141
2142 static const uint32_t NUM_SETS = 4;
2143 VkDescriptorSet descriptorSet[NUM_SETS] = {};
2144 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002145 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002146 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002147 alloc_info.descriptorPool = ds_pool;
2148 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002149 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2150 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002151 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002152 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07002153 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002154 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002155 err =
2156 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002157 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002158
2159 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002160 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2161 pipeline_layout_ci.pNext = NULL;
2162 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
2163 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002164
2165 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002166 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2167 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002168 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002169 // Create pipelineLayout with only one setLayout
2170 pipeline_layout_ci.setLayoutCount = 1;
2171 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002172 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2173 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002174 ASSERT_VK_SUCCESS(err);
2175 // Create pipelineLayout with 2 descriptor setLayout at index 0
2176 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
2177 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07002178 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2179 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002180 ASSERT_VK_SUCCESS(err);
2181 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
2182 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
2183 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07002184 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2185 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002186 ASSERT_VK_SUCCESS(err);
2187 // Create pipelineLayout with UB type, but stageFlags for FS only
2188 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
2189 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002190 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2191 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002192 ASSERT_VK_SUCCESS(err);
2193 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
2194 VkDescriptorSetLayout pl_bad_s0[2] = {};
2195 pl_bad_s0[0] = ds_layout_fs_only;
2196 pl_bad_s0[1] = ds_layout[1];
2197 pipeline_layout_ci.setLayoutCount = 2;
2198 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
2199 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07002200 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2201 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002202 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002203
2204 // Create a buffer to update the descriptor with
2205 uint32_t qfi = 0;
2206 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002207 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2208 buffCI.size = 1024;
2209 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2210 buffCI.queueFamilyIndexCount = 1;
2211 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002212
2213 VkBuffer dyub;
2214 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2215 ASSERT_VK_SUCCESS(err);
2216 // Correctly update descriptor to avoid "NOT_UPDATED" error
2217 static const uint32_t NUM_BUFFS = 5;
2218 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002219 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07002220 buffInfo[i].buffer = dyub;
2221 buffInfo[i].offset = 0;
2222 buffInfo[i].range = 1024;
2223 }
Karl Schultz6addd812016-02-02 17:17:23 -07002224 VkImage image;
2225 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2226 const int32_t tex_width = 32;
2227 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002228 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002229 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2230 image_create_info.pNext = NULL;
2231 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2232 image_create_info.format = tex_format;
2233 image_create_info.extent.width = tex_width;
2234 image_create_info.extent.height = tex_height;
2235 image_create_info.extent.depth = 1;
2236 image_create_info.mipLevels = 1;
2237 image_create_info.arrayLayers = 1;
2238 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2239 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2240 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2241 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002242 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2243 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002244
Karl Schultz6addd812016-02-02 17:17:23 -07002245 VkMemoryRequirements memReqs;
2246 VkDeviceMemory imageMem;
2247 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002248 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002249 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2250 memAlloc.pNext = NULL;
2251 memAlloc.allocationSize = 0;
2252 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002253 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
2254 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002255 pass =
2256 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002257 ASSERT_TRUE(pass);
2258 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
2259 ASSERT_VK_SUCCESS(err);
2260 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
2261 ASSERT_VK_SUCCESS(err);
2262
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002263 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002264 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2265 image_view_create_info.image = image;
2266 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
2267 image_view_create_info.format = tex_format;
2268 image_view_create_info.subresourceRange.layerCount = 1;
2269 image_view_create_info.subresourceRange.baseMipLevel = 0;
2270 image_view_create_info.subresourceRange.levelCount = 1;
2271 image_view_create_info.subresourceRange.aspectMask =
2272 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002273
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002274 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07002275 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
2276 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002277 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002278 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002279 imageInfo[0].imageView = view;
2280 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2281 imageInfo[1].imageView = view;
2282 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002283 imageInfo[2].imageView = view;
2284 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2285 imageInfo[3].imageView = view;
2286 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002287
2288 static const uint32_t NUM_SET_UPDATES = 3;
2289 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
2290 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2291 descriptor_write[0].dstSet = descriptorSet[0];
2292 descriptor_write[0].dstBinding = 0;
2293 descriptor_write[0].descriptorCount = 5;
2294 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2295 descriptor_write[0].pBufferInfo = buffInfo;
2296 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2297 descriptor_write[1].dstSet = descriptorSet[1];
2298 descriptor_write[1].dstBinding = 0;
2299 descriptor_write[1].descriptorCount = 2;
2300 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
2301 descriptor_write[1].pImageInfo = imageInfo;
2302 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2303 descriptor_write[2].dstSet = descriptorSet[1];
2304 descriptor_write[2].dstBinding = 1;
2305 descriptor_write[2].descriptorCount = 2;
2306 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002307 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002308
2309 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002310
Tobin Ehlis88452832015-12-03 09:40:56 -07002311 // Create PSO to be used for draw-time errors below
2312 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07002313 "#version 400\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002314 "#extension GL_ARB_separate_shader_objects: require\n"
2315 "#extension GL_ARB_shading_language_420pack: require\n"
2316 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07002317 "out gl_PerVertex {\n"
2318 " vec4 gl_Position;\n"
2319 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002320 "void main(){\n"
2321 " gl_Position = vec4(1);\n"
2322 "}\n";
2323 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07002324 "#version 400\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002325 "#extension GL_ARB_separate_shader_objects: require\n"
2326 "#extension GL_ARB_shading_language_420pack: require\n"
2327 "\n"
2328 "layout(location=0) out vec4 x;\n"
2329 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2330 "void main(){\n"
2331 " x = vec4(bar.y);\n"
2332 "}\n";
2333 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2334 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002335 VkPipelineObj pipe(m_device);
2336 pipe.AddShader(&vs);
2337 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07002338 pipe.AddColorAttachment();
2339 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07002340
2341 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07002342
Karl Schultz6addd812016-02-02 17:17:23 -07002343 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2344 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2345 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
2346 // of PSO
2347 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
2348 // cmd_pipeline.c
2349 // due to the fact that cmd_alloc_dset_data() has not been called in
2350 // cmd_bind_graphics_pipeline()
2351 // TODO : Want to cause various binding incompatibility issues here to test
2352 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07002353 // First cause various verify_layout_compatibility() fails
2354 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002355 // verify_set_layout_compatibility fail cases:
2356 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07002357 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2358 " due to: invalid VkPipelineLayout ");
2359 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2360 VK_PIPELINE_BIND_POINT_GRAPHICS,
2361 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
2362 &descriptorSet[0], 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002363 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002364 FAIL() << "Did not receive correct error msg when attempting to bind "
2365 "descriptorSets with invalid VkPipelineLayout.";
Tobin Ehlis559c6382015-11-05 09:52:49 -07002366 m_errorMonitor->DumpFailureMsgs();
2367 }
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002368 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07002369 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2370 " attempting to bind set to index 1");
2371 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2372 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
2373 0, 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002374 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002375 FAIL() << "Did not receive correct error msg when attempting to bind "
2376 "descriptorSet to index 1 when pipelineLayout only has index "
2377 "0.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002378 m_errorMonitor->DumpFailureMsgs();
2379 }
2380 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07002381 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
2382 // descriptors
2383 m_errorMonitor->SetDesiredFailureMsg(
2384 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2385 ", but corresponding set being bound has 5 descriptors.");
2386 vkCmdBindDescriptorSets(
2387 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2388 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002389 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002390 FAIL() << "Did not receive correct error msg when attempting to bind "
2391 "descriptorSet w/ 5 descriptors to pipelineLayout with only "
2392 "2 descriptors.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002393 m_errorMonitor->DumpFailureMsgs();
2394 }
2395 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
2396 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07002397 m_errorMonitor->SetDesiredFailureMsg(
2398 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2399 " descriptor from pipelineLayout is type 'VK_DESCRIPTOR_TYPE_SAMPLER'");
2400 vkCmdBindDescriptorSets(
2401 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2402 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002403 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002404 FAIL() << "Did not receive correct error msg when attempting to bind "
2405 "UNIFORM_BUFFER descriptorSet to pipelineLayout with "
2406 "overlapping SAMPLER type.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002407 m_errorMonitor->DumpFailureMsgs();
2408 }
2409 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
2410 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07002411 m_errorMonitor->SetDesiredFailureMsg(
2412 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2413 " descriptor from pipelineLayout has stageFlags ");
2414 vkCmdBindDescriptorSets(
2415 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2416 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002417 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002418 FAIL() << "Did not receive correct error msg when attempting to bind "
2419 "UNIFORM_BUFFER descriptorSet with ALL stageFlags to "
2420 "pipelineLayout with FS-only stageFlags.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002421 m_errorMonitor->DumpFailureMsgs();
2422 }
2423 // Cause INFO messages due to disturbing previously bound Sets
2424 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07002425 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2426 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2427 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002428 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07002429 m_errorMonitor->SetDesiredFailureMsg(
2430 VK_DEBUG_REPORT_PERF_WARN_BIT_EXT,
2431 " previously bound as set #0 was disturbed ");
2432 vkCmdBindDescriptorSets(
2433 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2434 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002435 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002436 FAIL() << "Did not receive correct info msg when binding Set1 w/ "
2437 "pipelineLayout that should disturb Set0.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002438 m_errorMonitor->DumpFailureMsgs();
2439 }
Karl Schultz6addd812016-02-02 17:17:23 -07002440 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2441 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2442 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002443 // 2. Disturb set after last bound set
Karl Schultz6addd812016-02-02 17:17:23 -07002444 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERF_WARN_BIT_EXT,
2445 " newly bound as set #0 so set #1 and "
2446 "any subsequent sets were disturbed ");
2447 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2448 VK_PIPELINE_BIND_POINT_GRAPHICS,
2449 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002450 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002451 FAIL() << "Did not receive correct info msg when re-binding Set0 w/ "
2452 "pipelineLayout that should disturb Set1.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002453 m_errorMonitor->DumpFailureMsgs();
2454 }
Tobin Ehlis88452832015-12-03 09:40:56 -07002455 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07002456 // 1. Error due to not binding required set (we actually use same code as
2457 // above to disturb set0)
2458 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2459 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2460 2, &descriptorSet[0], 0, NULL);
2461 vkCmdBindDescriptorSets(
2462 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2463 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
2464 m_errorMonitor->SetDesiredFailureMsg(
2465 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2466 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07002467 Draw(1, 0, 0, 0);
2468 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002469 FAIL() << "Did not receive correct error msg when attempting draw "
2470 "requiring Set0 but Set0 is not bound.";
Tobin Ehlis88452832015-12-03 09:40:56 -07002471 m_errorMonitor->DumpFailureMsgs();
2472 }
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002473 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07002474 // 2. Error due to bound set not being compatible with PSO's
2475 // VkPipelineLayout (diff stageFlags in this case)
2476 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2477 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2478 2, &descriptorSet[0], 0, NULL);
2479 m_errorMonitor->SetDesiredFailureMsg(
2480 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2481 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07002482 Draw(1, 0, 0, 0);
2483 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002484 FAIL() << "Did not receive correct error msg when attempted draw where "
2485 "bound Set0 layout is not compatible PSO Set0 layout.";
Tobin Ehlis88452832015-12-03 09:40:56 -07002486 m_errorMonitor->DumpFailureMsgs();
2487 }
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002488 // Remaining clean-up
2489 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07002490 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002491 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
2492 }
2493 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
2494 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, descriptorSet);
2495 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002496 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2497 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2498}
Tobin Ehlis559c6382015-11-05 09:52:49 -07002499
Karl Schultz6addd812016-02-02 17:17:23 -07002500TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002501
Karl Schultz6addd812016-02-02 17:17:23 -07002502 m_errorMonitor->SetDesiredFailureMsg(
2503 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002504 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002505
2506 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002507 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002508 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002509 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002510
2511 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002512 FAIL() << "Did not recieve Error 'You must call vkBeginCommandBuffer() "
2513 "before this call to vkEndCommandBuffer()'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002514 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002515 }
2516}
2517
Karl Schultz6addd812016-02-02 17:17:23 -07002518TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
2519 VkResult err;
2520 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002521
Karl Schultz6addd812016-02-02 17:17:23 -07002522 m_errorMonitor->SetDesiredFailureMsg(
2523 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07002524 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002525
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002526 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002527
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002528 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002529 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06002530 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002531 cmd.commandPool = m_commandPool;
2532 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002533 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06002534
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002535 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06002536 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002537
2538 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002539 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07002540 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002541 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06002542 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07002543 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
2544 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002545 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002546
2547 // The error should be caught by validation of the BeginCommandBuffer call
2548 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
2549
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002550 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002551 FAIL() << "Did not receive Error 'vkBeginCommandBuffer(): Secondary "
2552 "Command Buffers (0x<ADDR>) must specify a valid renderpass "
2553 "parameter.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002554 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002555 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002556 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002557}
2558
Karl Schultz6addd812016-02-02 17:17:23 -07002559TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002560 // Cause error due to Begin while recording CB
2561 // Then cause 2 errors for attempting to reset CB w/o having
2562 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
2563 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002564 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002565 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002566
2567 ASSERT_NO_FATAL_FAILURE(InitState());
2568
2569 // Calls AllocateCommandBuffers
2570 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
2571
Karl Schultz6addd812016-02-02 17:17:23 -07002572 // Force the failure by setting the Renderpass and Framebuffer fields with
2573 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002574 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07002575 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002576 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2577 cmd_buf_info.pNext = NULL;
2578 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002579 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002580
2581 // Begin CB to transition to recording state
2582 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
2583 // Can't re-begin. This should trigger error
2584 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
2585 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002586 FAIL() << "Did not receive Error 'Cannot call Begin on CB (0x<ADDR>) "
2587 "in the RECORDING state...'";
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002588 m_errorMonitor->DumpFailureMsgs();
2589 }
Karl Schultz6addd812016-02-02 17:17:23 -07002590 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2591 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002592 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
2593 // Reset attempt will trigger error due to incorrect CommandPool state
2594 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
2595 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002596 FAIL() << "Did not receive Error 'Attempt to reset command buffer "
2597 "(0x<ADDR>) created from command pool...'";
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002598 m_errorMonitor->DumpFailureMsgs();
2599 }
Karl Schultz6addd812016-02-02 17:17:23 -07002600 m_errorMonitor->SetDesiredFailureMsg(
2601 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2602 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002603 // Transition CB to RECORDED state
2604 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
2605 // Now attempting to Begin will implicitly reset, which triggers error
2606 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
2607 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002608 FAIL() << "Did not receive Error 'Call to vkBeginCommandBuffer() on "
2609 "command buffer (0x<ADDR>) attempts to implicitly reset...'";
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002610 m_errorMonitor->DumpFailureMsgs();
2611 }
2612}
2613
Karl Schultz6addd812016-02-02 17:17:23 -07002614TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002615 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07002616 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002617
Karl Schultz6addd812016-02-02 17:17:23 -07002618 m_errorMonitor->SetDesiredFailureMsg(
2619 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002620 "Invalid Pipeline CreateInfo State: Vtx Shader required");
2621
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002622 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002623 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002624
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002625 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002626 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2627 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06002628
2629 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002630 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2631 ds_pool_ci.pNext = NULL;
2632 ds_pool_ci.maxSets = 1;
2633 ds_pool_ci.poolSizeCount = 1;
2634 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002635
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002636 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002637 err =
2638 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002639 ASSERT_VK_SUCCESS(err);
2640
Tony Barboureb254902015-07-15 12:50:33 -06002641 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002642 dsl_binding.binding = 0;
2643 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2644 dsl_binding.descriptorCount = 1;
2645 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2646 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002647
Tony Barboureb254902015-07-15 12:50:33 -06002648 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002649 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2650 ds_layout_ci.pNext = NULL;
2651 ds_layout_ci.bindingCount = 1;
2652 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06002653
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002654 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002655 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2656 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002657 ASSERT_VK_SUCCESS(err);
2658
2659 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002660 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002661 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002662 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002663 alloc_info.descriptorPool = ds_pool;
2664 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002665 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2666 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002667 ASSERT_VK_SUCCESS(err);
2668
Tony Barboureb254902015-07-15 12:50:33 -06002669 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002670 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2671 pipeline_layout_ci.setLayoutCount = 1;
2672 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002673
2674 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002675 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2676 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002677 ASSERT_VK_SUCCESS(err);
2678
Tobin Ehlise68360f2015-10-01 11:15:13 -06002679 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07002680 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06002681
2682 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002683 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
2684 vp_state_ci.scissorCount = 1;
2685 vp_state_ci.pScissors = &sc;
2686 vp_state_ci.viewportCount = 1;
2687 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002688
Tony Barboureb254902015-07-15 12:50:33 -06002689 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002690 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2691 gp_ci.pViewportState = &vp_state_ci;
2692 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2693 gp_ci.layout = pipeline_layout;
2694 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06002695
2696 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002697 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2698 pc_ci.initialDataSize = 0;
2699 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002700
2701 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06002702 VkPipelineCache pipelineCache;
2703
Karl Schultz6addd812016-02-02 17:17:23 -07002704 err =
2705 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06002706 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07002707 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2708 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002709
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002710 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002711 FAIL() << "Did not receive Error 'Invalid Pipeline CreateInfo State: "
2712 "Vtx Shader required'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002713 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002714 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06002715
Chia-I Wuf7458c52015-10-26 21:10:41 +08002716 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2717 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2718 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2719 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002720}
Tobin Ehlis912df022015-09-17 08:46:18 -06002721/*// TODO : This test should be good, but needs Tess support in compiler to run
2722TEST_F(VkLayerTest, InvalidPatchControlPoints)
2723{
2724 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06002725 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002726
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002727 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002728 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
2729primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002730
Tobin Ehlis912df022015-09-17 08:46:18 -06002731 ASSERT_NO_FATAL_FAILURE(InitState());
2732 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06002733
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002734 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06002735 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002736 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06002737
2738 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2739 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2740 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002741 ds_pool_ci.poolSizeCount = 1;
2742 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06002743
2744 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002745 err = vkCreateDescriptorPool(m_device->device(),
2746VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06002747 ASSERT_VK_SUCCESS(err);
2748
2749 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08002750 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06002751 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08002752 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06002753 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2754 dsl_binding.pImmutableSamplers = NULL;
2755
2756 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002757 ds_layout_ci.sType =
2758VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06002759 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002760 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002761 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06002762
2763 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002764 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2765&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06002766 ASSERT_VK_SUCCESS(err);
2767
2768 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07002769 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
2770VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06002771 ASSERT_VK_SUCCESS(err);
2772
2773 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002774 pipeline_layout_ci.sType =
2775VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06002776 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002777 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06002778 pipeline_layout_ci.pSetLayouts = &ds_layout;
2779
2780 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002781 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2782&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06002783 ASSERT_VK_SUCCESS(err);
2784
2785 VkPipelineShaderStageCreateInfo shaderStages[3];
2786 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
2787
Karl Schultz6addd812016-02-02 17:17:23 -07002788 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
2789this);
Tobin Ehlis912df022015-09-17 08:46:18 -06002790 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07002791 VkShaderObj
2792tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
2793this);
2794 VkShaderObj
2795te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
2796this);
Tobin Ehlis912df022015-09-17 08:46:18 -06002797
Karl Schultz6addd812016-02-02 17:17:23 -07002798 shaderStages[0].sType =
2799VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06002800 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06002801 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07002802 shaderStages[1].sType =
2803VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06002804 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06002805 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07002806 shaderStages[2].sType =
2807VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06002808 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06002809 shaderStages[2].shader = te.handle();
2810
2811 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002812 iaCI.sType =
2813VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08002814 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06002815
2816 VkPipelineTessellationStateCreateInfo tsCI = {};
2817 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
2818 tsCI.patchControlPoints = 0; // This will cause an error
2819
2820 VkGraphicsPipelineCreateInfo gp_ci = {};
2821 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2822 gp_ci.pNext = NULL;
2823 gp_ci.stageCount = 3;
2824 gp_ci.pStages = shaderStages;
2825 gp_ci.pVertexInputState = NULL;
2826 gp_ci.pInputAssemblyState = &iaCI;
2827 gp_ci.pTessellationState = &tsCI;
2828 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002829 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06002830 gp_ci.pMultisampleState = NULL;
2831 gp_ci.pDepthStencilState = NULL;
2832 gp_ci.pColorBlendState = NULL;
2833 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2834 gp_ci.layout = pipeline_layout;
2835 gp_ci.renderPass = renderPass();
2836
2837 VkPipelineCacheCreateInfo pc_ci = {};
2838 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2839 pc_ci.pNext = NULL;
2840 pc_ci.initialSize = 0;
2841 pc_ci.initialData = 0;
2842 pc_ci.maxSize = 0;
2843
2844 VkPipeline pipeline;
2845 VkPipelineCache pipelineCache;
2846
Karl Schultz6addd812016-02-02 17:17:23 -07002847 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
2848&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06002849 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07002850 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2851&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06002852
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002853 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002854 FAIL() << "Did not receive Error 'Invalid Pipeline CreateInfo State:
2855VK_PRIMITIVE_TOPOLOGY_PATCH primitive...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002856 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis912df022015-09-17 08:46:18 -06002857 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06002858
Chia-I Wuf7458c52015-10-26 21:10:41 +08002859 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2860 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2861 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2862 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06002863}
2864*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06002865// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07002866TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06002867 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07002868 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002869
Karl Schultz6addd812016-02-02 17:17:23 -07002870 m_errorMonitor->SetDesiredFailureMsg(
2871 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002872 "Gfx Pipeline viewport count (1) must match scissor count (0).");
2873
Tobin Ehlise68360f2015-10-01 11:15:13 -06002874 ASSERT_NO_FATAL_FAILURE(InitState());
2875 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06002876
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002877 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002878 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2879 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002880
2881 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002882 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2883 ds_pool_ci.maxSets = 1;
2884 ds_pool_ci.poolSizeCount = 1;
2885 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002886
2887 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002888 err =
2889 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002890 ASSERT_VK_SUCCESS(err);
2891
2892 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002893 dsl_binding.binding = 0;
2894 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2895 dsl_binding.descriptorCount = 1;
2896 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002897
2898 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002899 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2900 ds_layout_ci.bindingCount = 1;
2901 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002902
2903 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002904 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2905 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002906 ASSERT_VK_SUCCESS(err);
2907
2908 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002909 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002910 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002911 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002912 alloc_info.descriptorPool = ds_pool;
2913 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002914 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2915 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002916 ASSERT_VK_SUCCESS(err);
2917
2918 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002919 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2920 pipeline_layout_ci.setLayoutCount = 1;
2921 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002922
2923 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002924 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2925 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002926 ASSERT_VK_SUCCESS(err);
2927
2928 VkViewport vp = {}; // Just need dummy vp to point to
2929
2930 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002931 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
2932 vp_state_ci.scissorCount = 0;
2933 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
2934 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002935
Cody Northropeb3a6c12015-10-05 14:44:45 -06002936 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07002937 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06002938
Karl Schultz6addd812016-02-02 17:17:23 -07002939 VkShaderObj vs(m_device, bindStateVertShaderText,
2940 VK_SHADER_STAGE_VERTEX_BIT, this);
2941 VkShaderObj fs(m_device, bindStateFragShaderText,
2942 VK_SHADER_STAGE_FRAGMENT_BIT,
2943 this); // TODO - We shouldn't need a fragment shader
2944 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08002945 shaderStages[0] = vs.GetStageCreateInfo();
2946 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002947
2948 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002949 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2950 gp_ci.stageCount = 2;
2951 gp_ci.pStages = shaderStages;
2952 gp_ci.pViewportState = &vp_state_ci;
2953 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2954 gp_ci.layout = pipeline_layout;
2955 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002956
2957 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002958 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002959
2960 VkPipeline pipeline;
2961 VkPipelineCache pipelineCache;
2962
Karl Schultz6addd812016-02-02 17:17:23 -07002963 err =
2964 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002965 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07002966 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2967 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002968
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002969 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002970 FAIL() << "Did not receive Error 'Gfx Pipeline viewport count (1) must "
2971 "match scissor count (0).'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002972 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002973 }
2974
Chia-I Wuf7458c52015-10-26 21:10:41 +08002975 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2976 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2977 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2978 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002979}
Karl Schultz6addd812016-02-02 17:17:23 -07002980// Don't set viewport state in PSO. This is an error b/c we always need this
2981// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06002982// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07002983TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06002984 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07002985 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002986
Karl Schultz6addd812016-02-02 17:17:23 -07002987 m_errorMonitor->SetDesiredFailureMsg(
2988 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002989 "Gfx Pipeline pViewportState is null. Even if ");
2990
Tobin Ehlise68360f2015-10-01 11:15:13 -06002991 ASSERT_NO_FATAL_FAILURE(InitState());
2992 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06002993
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002994 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002995 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2996 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002997
2998 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002999 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3000 ds_pool_ci.maxSets = 1;
3001 ds_pool_ci.poolSizeCount = 1;
3002 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003003
3004 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003005 err =
3006 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003007 ASSERT_VK_SUCCESS(err);
3008
3009 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003010 dsl_binding.binding = 0;
3011 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3012 dsl_binding.descriptorCount = 1;
3013 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003014
3015 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003016 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3017 ds_layout_ci.bindingCount = 1;
3018 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003019
3020 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003021 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3022 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003023 ASSERT_VK_SUCCESS(err);
3024
3025 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003026 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003027 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003028 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003029 alloc_info.descriptorPool = ds_pool;
3030 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003031 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3032 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003033 ASSERT_VK_SUCCESS(err);
3034
3035 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003036 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3037 pipeline_layout_ci.setLayoutCount = 1;
3038 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003039
3040 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003041 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3042 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003043 ASSERT_VK_SUCCESS(err);
3044
3045 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
3046 // Set scissor as dynamic to avoid second error
3047 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003048 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3049 dyn_state_ci.dynamicStateCount = 1;
3050 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003051
Cody Northropeb3a6c12015-10-05 14:44:45 -06003052 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003053 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003054
Karl Schultz6addd812016-02-02 17:17:23 -07003055 VkShaderObj vs(m_device, bindStateVertShaderText,
3056 VK_SHADER_STAGE_VERTEX_BIT, this);
3057 VkShaderObj fs(m_device, bindStateFragShaderText,
3058 VK_SHADER_STAGE_FRAGMENT_BIT,
3059 this); // TODO - We shouldn't need a fragment shader
3060 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003061 shaderStages[0] = vs.GetStageCreateInfo();
3062 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003063
3064 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003065 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3066 gp_ci.stageCount = 2;
3067 gp_ci.pStages = shaderStages;
3068 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
3069 // should cause validation error
3070 gp_ci.pDynamicState = &dyn_state_ci;
3071 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3072 gp_ci.layout = pipeline_layout;
3073 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003074
3075 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003076 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003077
3078 VkPipeline pipeline;
3079 VkPipelineCache pipelineCache;
3080
Karl Schultz6addd812016-02-02 17:17:23 -07003081 err =
3082 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003083 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003084 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3085 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003086
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003087 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003088 FAIL() << "Did not receive Error 'Gfx Pipeline pViewportState is null. "
3089 "Even if...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003090 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003091 }
3092
Chia-I Wuf7458c52015-10-26 21:10:41 +08003093 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3094 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3095 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3096 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003097}
3098// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07003099// Then run second test where dynamic scissor count doesn't match PSO scissor
3100// count
3101TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
3102 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003103
Karl Schultz6addd812016-02-02 17:17:23 -07003104 m_errorMonitor->SetDesiredFailureMsg(
3105 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003106 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
3107
Tobin Ehlise68360f2015-10-01 11:15:13 -06003108 ASSERT_NO_FATAL_FAILURE(InitState());
3109 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003110
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003111 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003112 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3113 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003114
3115 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003116 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3117 ds_pool_ci.maxSets = 1;
3118 ds_pool_ci.poolSizeCount = 1;
3119 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003120
3121 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003122 err =
3123 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003124 ASSERT_VK_SUCCESS(err);
3125
3126 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003127 dsl_binding.binding = 0;
3128 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3129 dsl_binding.descriptorCount = 1;
3130 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003131
3132 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003133 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3134 ds_layout_ci.bindingCount = 1;
3135 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003136
3137 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003138 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3139 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003140 ASSERT_VK_SUCCESS(err);
3141
3142 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003143 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003144 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003145 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003146 alloc_info.descriptorPool = ds_pool;
3147 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003148 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3149 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003150 ASSERT_VK_SUCCESS(err);
3151
3152 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003153 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3154 pipeline_layout_ci.setLayoutCount = 1;
3155 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003156
3157 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003158 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3159 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003160 ASSERT_VK_SUCCESS(err);
3161
3162 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003163 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3164 vp_state_ci.viewportCount = 1;
3165 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
3166 vp_state_ci.scissorCount = 1;
3167 vp_state_ci.pScissors =
3168 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06003169
3170 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
3171 // Set scissor as dynamic to avoid that error
3172 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003173 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3174 dyn_state_ci.dynamicStateCount = 1;
3175 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003176
Cody Northropeb3a6c12015-10-05 14:44:45 -06003177 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003178 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003179
Karl Schultz6addd812016-02-02 17:17:23 -07003180 VkShaderObj vs(m_device, bindStateVertShaderText,
3181 VK_SHADER_STAGE_VERTEX_BIT, this);
3182 VkShaderObj fs(m_device, bindStateFragShaderText,
3183 VK_SHADER_STAGE_FRAGMENT_BIT,
3184 this); // TODO - We shouldn't need a fragment shader
3185 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003186 shaderStages[0] = vs.GetStageCreateInfo();
3187 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003188
Cody Northropf6622dc2015-10-06 10:33:21 -06003189 VkPipelineVertexInputStateCreateInfo vi_ci = {};
3190 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
3191 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003192 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06003193 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003194 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06003195 vi_ci.pVertexAttributeDescriptions = nullptr;
3196
3197 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
3198 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
3199 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
3200
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003201 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003202 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06003203 rs_ci.pNext = nullptr;
3204
3205 VkPipelineColorBlendStateCreateInfo cb_ci = {};
3206 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
3207 cb_ci.pNext = nullptr;
3208
Tobin Ehlise68360f2015-10-01 11:15:13 -06003209 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003210 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3211 gp_ci.stageCount = 2;
3212 gp_ci.pStages = shaderStages;
3213 gp_ci.pVertexInputState = &vi_ci;
3214 gp_ci.pInputAssemblyState = &ia_ci;
3215 gp_ci.pViewportState = &vp_state_ci;
3216 gp_ci.pRasterizationState = &rs_ci;
3217 gp_ci.pColorBlendState = &cb_ci;
3218 gp_ci.pDynamicState = &dyn_state_ci;
3219 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3220 gp_ci.layout = pipeline_layout;
3221 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003222
3223 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003224 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003225
3226 VkPipeline pipeline;
3227 VkPipelineCache pipelineCache;
3228
Karl Schultz6addd812016-02-02 17:17:23 -07003229 err =
3230 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003231 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003232 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3233 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003234
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003235 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003236 FAIL() << "Did not recieve Error 'Gfx Pipeline viewportCount is 1, but "
3237 "pViewports is NULL...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003238 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003239 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003240
Tobin Ehlisd332f282015-10-02 11:00:56 -06003241 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07003242 // First need to successfully create the PSO from above by setting
3243 // pViewports
3244 m_errorMonitor->SetDesiredFailureMsg(
3245 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3246 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
3247 "scissorCount is 1. These counts must match.");
3248
3249 VkViewport vp = {}; // Just need dummy vp to point to
3250 vp_state_ci.pViewports = &vp;
3251 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3252 &gp_ci, NULL, &pipeline);
3253 ASSERT_VK_SUCCESS(err);
3254 BeginCommandBuffer();
3255 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3256 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
3257 VkRect2D scissors[2] = {}; // don't care about data
3258 // Count of 2 doesn't match PSO count of 1
3259 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
3260 Draw(1, 0, 0, 0);
3261
3262 if (!m_errorMonitor->DesiredMsgFound()) {
3263 FAIL() << "Did not receive Error 'Dynamic scissorCount from "
3264 "vkCmdSetScissor() is 2, but PSO scissorCount is 1...'";
3265 m_errorMonitor->DumpFailureMsgs();
3266 }
3267
3268 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3269 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3270 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3271 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3272}
3273// Create PSO w/o non-zero scissorCount but no scissor data
3274// Then run second test where dynamic viewportCount doesn't match PSO
3275// viewportCount
3276TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
3277 VkResult err;
3278
3279 m_errorMonitor->SetDesiredFailureMsg(
3280 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3281 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
3282
3283 ASSERT_NO_FATAL_FAILURE(InitState());
3284 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3285
3286 VkDescriptorPoolSize ds_type_count = {};
3287 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3288 ds_type_count.descriptorCount = 1;
3289
3290 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3291 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3292 ds_pool_ci.maxSets = 1;
3293 ds_pool_ci.poolSizeCount = 1;
3294 ds_pool_ci.pPoolSizes = &ds_type_count;
3295
3296 VkDescriptorPool ds_pool;
3297 err =
3298 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
3299 ASSERT_VK_SUCCESS(err);
3300
3301 VkDescriptorSetLayoutBinding dsl_binding = {};
3302 dsl_binding.binding = 0;
3303 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3304 dsl_binding.descriptorCount = 1;
3305 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3306
3307 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3308 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3309 ds_layout_ci.bindingCount = 1;
3310 ds_layout_ci.pBindings = &dsl_binding;
3311
3312 VkDescriptorSetLayout ds_layout;
3313 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3314 &ds_layout);
3315 ASSERT_VK_SUCCESS(err);
3316
3317 VkDescriptorSet descriptorSet;
3318 VkDescriptorSetAllocateInfo alloc_info = {};
3319 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3320 alloc_info.descriptorSetCount = 1;
3321 alloc_info.descriptorPool = ds_pool;
3322 alloc_info.pSetLayouts = &ds_layout;
3323 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3324 &descriptorSet);
3325 ASSERT_VK_SUCCESS(err);
3326
3327 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3328 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3329 pipeline_layout_ci.setLayoutCount = 1;
3330 pipeline_layout_ci.pSetLayouts = &ds_layout;
3331
3332 VkPipelineLayout pipeline_layout;
3333 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3334 &pipeline_layout);
3335 ASSERT_VK_SUCCESS(err);
3336
3337 VkPipelineViewportStateCreateInfo vp_state_ci = {};
3338 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3339 vp_state_ci.scissorCount = 1;
3340 vp_state_ci.pScissors =
3341 NULL; // Null scissor w/ count of 1 should cause error
3342 vp_state_ci.viewportCount = 1;
3343 vp_state_ci.pViewports =
3344 NULL; // vp is dynamic (below) so this won't cause error
3345
3346 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
3347 // Set scissor as dynamic to avoid that error
3348 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
3349 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3350 dyn_state_ci.dynamicStateCount = 1;
3351 dyn_state_ci.pDynamicStates = &vp_state;
3352
3353 VkPipelineShaderStageCreateInfo shaderStages[2];
3354 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
3355
3356 VkShaderObj vs(m_device, bindStateVertShaderText,
3357 VK_SHADER_STAGE_VERTEX_BIT, this);
3358 VkShaderObj fs(m_device, bindStateFragShaderText,
3359 VK_SHADER_STAGE_FRAGMENT_BIT,
3360 this); // TODO - We shouldn't need a fragment shader
3361 // but add it to be able to run on more devices
3362 shaderStages[0] = vs.GetStageCreateInfo();
3363 shaderStages[1] = fs.GetStageCreateInfo();
3364
3365 VkPipelineVertexInputStateCreateInfo vi_ci = {};
3366 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
3367 vi_ci.pNext = nullptr;
3368 vi_ci.vertexBindingDescriptionCount = 0;
3369 vi_ci.pVertexBindingDescriptions = nullptr;
3370 vi_ci.vertexAttributeDescriptionCount = 0;
3371 vi_ci.pVertexAttributeDescriptions = nullptr;
3372
3373 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
3374 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
3375 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
3376
3377 VkPipelineRasterizationStateCreateInfo rs_ci = {};
3378 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3379 rs_ci.pNext = nullptr;
3380
3381 VkPipelineColorBlendStateCreateInfo cb_ci = {};
3382 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
3383 cb_ci.pNext = nullptr;
3384
3385 VkGraphicsPipelineCreateInfo gp_ci = {};
3386 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3387 gp_ci.stageCount = 2;
3388 gp_ci.pStages = shaderStages;
3389 gp_ci.pVertexInputState = &vi_ci;
3390 gp_ci.pInputAssemblyState = &ia_ci;
3391 gp_ci.pViewportState = &vp_state_ci;
3392 gp_ci.pRasterizationState = &rs_ci;
3393 gp_ci.pColorBlendState = &cb_ci;
3394 gp_ci.pDynamicState = &dyn_state_ci;
3395 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3396 gp_ci.layout = pipeline_layout;
3397 gp_ci.renderPass = renderPass();
3398
3399 VkPipelineCacheCreateInfo pc_ci = {};
3400 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3401
3402 VkPipeline pipeline;
3403 VkPipelineCache pipelineCache;
3404
3405 err =
3406 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
3407 ASSERT_VK_SUCCESS(err);
3408 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3409 &gp_ci, NULL, &pipeline);
3410
3411 if (!m_errorMonitor->DesiredMsgFound()) {
3412 FAIL() << "Did not recieve Error 'Gfx Pipeline scissorCount is 1, but "
3413 "pScissors is NULL...'";
3414 m_errorMonitor->DumpFailureMsgs();
3415 }
3416
3417 // Now hit second fail case where we set scissor w/ different count than PSO
3418 // First need to successfully create the PSO from above by setting
3419 // pViewports
3420 m_errorMonitor->SetDesiredFailureMsg(
3421 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3422 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
3423 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003424
Tobin Ehlisd332f282015-10-02 11:00:56 -06003425 VkRect2D sc = {}; // Just need dummy vp to point to
3426 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07003427 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3428 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06003429 ASSERT_VK_SUCCESS(err);
3430 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003431 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3432 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06003433 VkViewport viewports[2] = {}; // don't care about data
3434 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07003435 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06003436 Draw(1, 0, 0, 0);
3437
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003438 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003439 FAIL() << "Did not receive Error 'Dynamic viewportCount from "
3440 "vkCmdSetViewport() is 2, but PSO viewportCount is 1...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003441 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisd332f282015-10-02 11:00:56 -06003442 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06003443
Chia-I Wuf7458c52015-10-26 21:10:41 +08003444 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3445 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3446 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3447 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003448}
3449
Karl Schultz6addd812016-02-02 17:17:23 -07003450TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003451 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003452 m_errorMonitor->SetDesiredFailureMsg(
3453 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003454 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003455
3456 ASSERT_NO_FATAL_FAILURE(InitState());
3457 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003458
Tony Barbourfe3351b2015-07-28 10:17:20 -06003459 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003460 // Don't care about RenderPass handle b/c error should be flagged before
3461 // that
3462 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
3463 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003464
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003465 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003466 FAIL() << "Did not receive Error 'You cannot use a NULL RenderPass "
3467 "object in vkCmdBeginRenderPass()'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003468 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003469 }
3470}
3471
Karl Schultz6addd812016-02-02 17:17:23 -07003472TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003473 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003474 m_errorMonitor->SetDesiredFailureMsg(
3475 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003476 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003477
3478 ASSERT_NO_FATAL_FAILURE(InitState());
3479 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003480
Tony Barbourfe3351b2015-07-28 10:17:20 -06003481 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003482 // Just create a dummy Renderpass that's non-NULL so we can get to the
3483 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06003484 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003485 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
3486 rp_begin.pNext = NULL;
3487 rp_begin.renderPass = renderPass();
3488 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003489
Karl Schultz6addd812016-02-02 17:17:23 -07003490 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
3491 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003492
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003493 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003494 FAIL() << "Did not receive Error 'It is invalid to issue this call "
3495 "inside an active render pass...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003496 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003497 }
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003498}
3499
Karl Schultz6addd812016-02-02 17:17:23 -07003500TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003501 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07003502 m_errorMonitor->SetDesiredFailureMsg(
3503 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003504 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003505
3506 ASSERT_NO_FATAL_FAILURE(InitState());
3507 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003508
3509 // Renderpass is started here
3510 BeginCommandBuffer();
3511
3512 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003513 vk_testing::Buffer dstBuffer;
3514 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003515
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003516 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003517
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003518 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003519 FAIL() << "Did not receive Error 'It is invalid to issue this call "
3520 "inside an active render pass...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003521 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003522 }
3523}
3524
Karl Schultz6addd812016-02-02 17:17:23 -07003525TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003526 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07003527 m_errorMonitor->SetDesiredFailureMsg(
3528 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003529 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003530
3531 ASSERT_NO_FATAL_FAILURE(InitState());
3532 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003533
3534 // Renderpass is started here
3535 BeginCommandBuffer();
3536
3537 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003538 vk_testing::Buffer dstBuffer;
3539 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003540
Karl Schultz6addd812016-02-02 17:17:23 -07003541 VkDeviceSize dstOffset = 0;
3542 VkDeviceSize dataSize = 1024;
3543 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003544
Karl Schultz6addd812016-02-02 17:17:23 -07003545 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
3546 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003547
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003548 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003549 FAIL() << "Did not receive Error 'It is invalid to issue this call "
3550 "inside an active render pass...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003551 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003552 }
3553}
3554
Karl Schultz6addd812016-02-02 17:17:23 -07003555TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003556 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003557 m_errorMonitor->SetDesiredFailureMsg(
3558 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003559 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003560
3561 ASSERT_NO_FATAL_FAILURE(InitState());
3562 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003563
3564 // Renderpass is started here
3565 BeginCommandBuffer();
3566
Karl Schultz6addd812016-02-02 17:17:23 -07003567 VkClearColorValue clear_color = {0};
3568 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
3569 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3570 const int32_t tex_width = 32;
3571 const int32_t tex_height = 32;
3572 VkImageCreateInfo image_create_info = {};
3573 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3574 image_create_info.pNext = NULL;
3575 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3576 image_create_info.format = tex_format;
3577 image_create_info.extent.width = tex_width;
3578 image_create_info.extent.height = tex_height;
3579 image_create_info.extent.depth = 1;
3580 image_create_info.mipLevels = 1;
3581 image_create_info.arrayLayers = 1;
3582 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3583 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3584 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003585
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003586 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07003587 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
3588 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003589
Karl Schultz6addd812016-02-02 17:17:23 -07003590 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
3591 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003592
Karl Schultz6addd812016-02-02 17:17:23 -07003593 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
3594 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003595
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003596 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003597 FAIL() << "Did not receive Error 'It is invalid to issue this call "
3598 "inside an active render pass...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003599 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003600 }
3601}
3602
Karl Schultz6addd812016-02-02 17:17:23 -07003603TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003604 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003605 m_errorMonitor->SetDesiredFailureMsg(
3606 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003607 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003608
3609 ASSERT_NO_FATAL_FAILURE(InitState());
3610 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003611
3612 // Renderpass is started here
3613 BeginCommandBuffer();
3614
3615 VkClearDepthStencilValue clear_value = {0};
Karl Schultz6addd812016-02-02 17:17:23 -07003616 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
3617 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
3618 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3619 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
3620 image_create_info.extent.width = 64;
3621 image_create_info.extent.height = 64;
3622 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3623 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003624
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003625 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07003626 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
3627 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003628
Karl Schultz6addd812016-02-02 17:17:23 -07003629 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
3630 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003631
Karl Schultz6addd812016-02-02 17:17:23 -07003632 vkCmdClearDepthStencilImage(
3633 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
3634 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
3635 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003636
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003637 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003638 FAIL() << "Did not receive Error 'It is invalid to issue this call "
3639 "inside an active render pass...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003640 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003641 }
3642}
3643
Karl Schultz6addd812016-02-02 17:17:23 -07003644TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06003645 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003646 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003647
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003649 "vkCmdClearAttachments: This call "
3650 "must be issued inside an active "
3651 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003652
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003653 ASSERT_NO_FATAL_FAILURE(InitState());
3654 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003655
3656 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003657 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003658 ASSERT_VK_SUCCESS(err);
3659
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06003660 VkClearAttachment color_attachment;
3661 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3662 color_attachment.clearValue.color.float32[0] = 0;
3663 color_attachment.clearValue.color.float32[1] = 0;
3664 color_attachment.clearValue.color.float32[2] = 0;
3665 color_attachment.clearValue.color.float32[3] = 0;
3666 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07003667 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
3668 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
3669 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003670
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003671 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003672 FAIL() << "Did not receive Error 'vkCmdClearAttachments: This call "
3673 "must be issued inside an active render pass.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003674 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003675 }
3676}
3677
Karl Schultz6addd812016-02-02 17:17:23 -07003678TEST_F(VkLayerTest, InvalidDynamicStateObject) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003679 // Create a valid cmd buffer
3680 // call vkCmdBindDynamicStateObject w/ false DS Obj
Karl Schultz6addd812016-02-02 17:17:23 -07003681 // TODO : Simple check for bad object should be added to ObjectTracker to
3682 // catch this case
3683 // The DS check for this is after driver has been called to validate DS
3684 // internal data struct
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003685}
Tobin Ehlis1056d452015-05-27 14:55:35 -06003686
Karl Schultz6addd812016-02-02 17:17:23 -07003687TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003688 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003689 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003690
Karl Schultz6addd812016-02-02 17:17:23 -07003691 m_errorMonitor->SetDesiredFailureMsg(
3692 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003693 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
3694
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003695 ASSERT_NO_FATAL_FAILURE(InitState());
3696 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003697 uint32_t qfi = 0;
3698 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003699 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3700 buffCI.size = 1024;
3701 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
3702 buffCI.queueFamilyIndexCount = 1;
3703 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003704
3705 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003706 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003707 ASSERT_VK_SUCCESS(err);
3708
3709 BeginCommandBuffer();
3710 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003711 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3712 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003713 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07003714 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
3715 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003716
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003717 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003718 FAIL() << "Did not receive Error 'vkCmdBindIndexBuffer() offset (0x7) "
3719 "does not fall on ...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003720 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003721 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06003722
Chia-I Wuf7458c52015-10-26 21:10:41 +08003723 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003724}
3725
Karl Schultz6addd812016-02-02 17:17:23 -07003726TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
3727 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
3728 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003729
Karl Schultz6addd812016-02-02 17:17:23 -07003730 m_errorMonitor->SetDesiredFailureMsg(
3731 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003732 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003733
3734 ASSERT_NO_FATAL_FAILURE(InitState());
3735 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003736
3737 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003738 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003739 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
3740 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003741
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003742 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003743 FAIL() << "Did not receive Error 'vkCmdExecuteCommands() called w/ "
3744 "Primary Cmd Buffer '";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003745 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003746 }
3747}
3748
Karl Schultz6addd812016-02-02 17:17:23 -07003749TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003750 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07003751 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003752
Karl Schultz6addd812016-02-02 17:17:23 -07003753 m_errorMonitor->SetDesiredFailureMsg(
3754 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Write descriptor update has descriptor "
3755 "type VK_DESCRIPTOR_TYPE_SAMPLER that "
3756 "does not match ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003757
Tobin Ehlis3b780662015-05-28 12:11:26 -06003758 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07003759 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003760 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003761 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3762 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003763
3764 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003765 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3766 ds_pool_ci.pNext = NULL;
3767 ds_pool_ci.maxSets = 1;
3768 ds_pool_ci.poolSizeCount = 1;
3769 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06003770
Tobin Ehlis3b780662015-05-28 12:11:26 -06003771 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003772 err =
3773 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003774 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06003775 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003776 dsl_binding.binding = 0;
3777 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3778 dsl_binding.descriptorCount = 1;
3779 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3780 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003781
Tony Barboureb254902015-07-15 12:50:33 -06003782 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003783 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3784 ds_layout_ci.pNext = NULL;
3785 ds_layout_ci.bindingCount = 1;
3786 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003787
Tobin Ehlis3b780662015-05-28 12:11:26 -06003788 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003789 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3790 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003791 ASSERT_VK_SUCCESS(err);
3792
3793 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003794 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003795 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003796 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003797 alloc_info.descriptorPool = ds_pool;
3798 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003799 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3800 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003801 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003802
Tony Barboureb254902015-07-15 12:50:33 -06003803 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003804 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3805 sampler_ci.pNext = NULL;
3806 sampler_ci.magFilter = VK_FILTER_NEAREST;
3807 sampler_ci.minFilter = VK_FILTER_NEAREST;
3808 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3809 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3810 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3811 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3812 sampler_ci.mipLodBias = 1.0;
3813 sampler_ci.anisotropyEnable = VK_FALSE;
3814 sampler_ci.maxAnisotropy = 1;
3815 sampler_ci.compareEnable = VK_FALSE;
3816 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3817 sampler_ci.minLod = 1.0;
3818 sampler_ci.maxLod = 1.0;
3819 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3820 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Mark Lobodzinski52ac6582015-09-01 15:42:56 -06003821
Tobin Ehlis3b780662015-05-28 12:11:26 -06003822 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003823 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003824 ASSERT_VK_SUCCESS(err);
3825
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003826 VkDescriptorImageInfo info = {};
3827 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003828
3829 VkWriteDescriptorSet descriptor_write;
3830 memset(&descriptor_write, 0, sizeof(descriptor_write));
3831 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003832 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003833 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003834 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003835 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003836 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003837
3838 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3839
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003840 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003841 FAIL() << "Did not receive Error 'Write descriptor update has "
3842 "descriptor type VK_DESCRIPTOR_TYPE_SAMPLER that does not "
3843 "match...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003844 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis3b780662015-05-28 12:11:26 -06003845 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06003846
Chia-I Wuf7458c52015-10-26 21:10:41 +08003847 vkDestroySampler(m_device->device(), sampler, NULL);
3848 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3849 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003850}
3851
Karl Schultz6addd812016-02-02 17:17:23 -07003852TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003853 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07003854 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003855
Karl Schultz6addd812016-02-02 17:17:23 -07003856 m_errorMonitor->SetDesiredFailureMsg(
3857 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Descriptor update type of "
3858 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET "
3859 "is out of bounds for matching binding");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003860
Tobin Ehlis3b780662015-05-28 12:11:26 -06003861 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07003862 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003863 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003864 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3865 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003866
3867 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003868 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3869 ds_pool_ci.pNext = NULL;
3870 ds_pool_ci.maxSets = 1;
3871 ds_pool_ci.poolSizeCount = 1;
3872 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06003873
Tobin Ehlis3b780662015-05-28 12:11:26 -06003874 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003875 err =
3876 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003877 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003878
Tony Barboureb254902015-07-15 12:50:33 -06003879 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003880 dsl_binding.binding = 0;
3881 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3882 dsl_binding.descriptorCount = 1;
3883 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3884 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06003885
3886 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003887 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3888 ds_layout_ci.pNext = NULL;
3889 ds_layout_ci.bindingCount = 1;
3890 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003891
Tobin Ehlis3b780662015-05-28 12:11:26 -06003892 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003893 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3894 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003895 ASSERT_VK_SUCCESS(err);
3896
3897 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003898 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003899 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003900 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003901 alloc_info.descriptorPool = ds_pool;
3902 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003903 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3904 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003905 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003906
Tony Barboureb254902015-07-15 12:50:33 -06003907 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003908 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3909 sampler_ci.pNext = NULL;
3910 sampler_ci.magFilter = VK_FILTER_NEAREST;
3911 sampler_ci.minFilter = VK_FILTER_NEAREST;
3912 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3913 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3914 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3915 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3916 sampler_ci.mipLodBias = 1.0;
3917 sampler_ci.anisotropyEnable = VK_FALSE;
3918 sampler_ci.maxAnisotropy = 1;
3919 sampler_ci.compareEnable = VK_FALSE;
3920 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3921 sampler_ci.minLod = 1.0;
3922 sampler_ci.maxLod = 1.0;
3923 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3924 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06003925
Tobin Ehlis3b780662015-05-28 12:11:26 -06003926 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003927 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003928 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003929
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003930 VkDescriptorImageInfo info = {};
3931 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003932
3933 VkWriteDescriptorSet descriptor_write;
3934 memset(&descriptor_write, 0, sizeof(descriptor_write));
3935 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003936 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07003937 descriptor_write.dstArrayElement =
3938 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08003939 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003940 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003941 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003942 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003943
3944 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3945
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003946 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003947 FAIL() << "Did not receive Error 'Descriptor update type of "
3948 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET is out of bounds for "
3949 "matching binding...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003950 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis3b780662015-05-28 12:11:26 -06003951 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06003952
Chia-I Wuf7458c52015-10-26 21:10:41 +08003953 vkDestroySampler(m_device->device(), sampler, NULL);
3954 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3955 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003956}
3957
Karl Schultz6addd812016-02-02 17:17:23 -07003958TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
3959 // Create layout w/ count of 1 and attempt update to that layout w/ binding
3960 // index 2
3961 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003962
Karl Schultz6addd812016-02-02 17:17:23 -07003963 m_errorMonitor->SetDesiredFailureMsg(
3964 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003965 " does not have binding to match update binding ");
3966
Tobin Ehlis3b780662015-05-28 12:11:26 -06003967 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07003968 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003969 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003970 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3971 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003972
3973 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003974 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3975 ds_pool_ci.pNext = NULL;
3976 ds_pool_ci.maxSets = 1;
3977 ds_pool_ci.poolSizeCount = 1;
3978 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06003979
Tobin Ehlis3b780662015-05-28 12:11:26 -06003980 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003981 err =
3982 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003983 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003984
Tony Barboureb254902015-07-15 12:50:33 -06003985 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003986 dsl_binding.binding = 0;
3987 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3988 dsl_binding.descriptorCount = 1;
3989 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3990 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06003991
3992 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003993 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3994 ds_layout_ci.pNext = NULL;
3995 ds_layout_ci.bindingCount = 1;
3996 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003997 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003998 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3999 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004000 ASSERT_VK_SUCCESS(err);
4001
4002 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004003 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004004 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004005 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004006 alloc_info.descriptorPool = ds_pool;
4007 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004008 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4009 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004010 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004011
Tony Barboureb254902015-07-15 12:50:33 -06004012 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004013 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4014 sampler_ci.pNext = NULL;
4015 sampler_ci.magFilter = VK_FILTER_NEAREST;
4016 sampler_ci.minFilter = VK_FILTER_NEAREST;
4017 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4018 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4019 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4020 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4021 sampler_ci.mipLodBias = 1.0;
4022 sampler_ci.anisotropyEnable = VK_FALSE;
4023 sampler_ci.maxAnisotropy = 1;
4024 sampler_ci.compareEnable = VK_FALSE;
4025 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4026 sampler_ci.minLod = 1.0;
4027 sampler_ci.maxLod = 1.0;
4028 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4029 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06004030
Tobin Ehlis3b780662015-05-28 12:11:26 -06004031 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004032 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004033 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004034
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004035 VkDescriptorImageInfo info = {};
4036 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004037
4038 VkWriteDescriptorSet descriptor_write;
4039 memset(&descriptor_write, 0, sizeof(descriptor_write));
4040 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004041 descriptor_write.dstSet = descriptorSet;
4042 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004043 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004044 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004045 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004046 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004047
4048 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4049
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004050 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004051 FAIL() << "Did not receive Error 'Descriptor Set <blah> does not have "
4052 "binding to match update binding '";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004053 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis3b780662015-05-28 12:11:26 -06004054 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06004055
Chia-I Wuf7458c52015-10-26 21:10:41 +08004056 vkDestroySampler(m_device->device(), sampler, NULL);
4057 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4058 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004059}
4060
Karl Schultz6addd812016-02-02 17:17:23 -07004061TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
4062 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
4063 // types
4064 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004065
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004066 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004067 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004068
Tobin Ehlis3b780662015-05-28 12:11:26 -06004069 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004070
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004071 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004072 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4073 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004074
4075 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004076 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4077 ds_pool_ci.pNext = NULL;
4078 ds_pool_ci.maxSets = 1;
4079 ds_pool_ci.poolSizeCount = 1;
4080 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004081
Tobin Ehlis3b780662015-05-28 12:11:26 -06004082 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004083 err =
4084 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004085 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06004086 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004087 dsl_binding.binding = 0;
4088 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4089 dsl_binding.descriptorCount = 1;
4090 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4091 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004092
Tony Barboureb254902015-07-15 12:50:33 -06004093 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004094 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4095 ds_layout_ci.pNext = NULL;
4096 ds_layout_ci.bindingCount = 1;
4097 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004098
Tobin Ehlis3b780662015-05-28 12:11:26 -06004099 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004100 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4101 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004102 ASSERT_VK_SUCCESS(err);
4103
4104 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004105 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004106 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004107 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004108 alloc_info.descriptorPool = ds_pool;
4109 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004110 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4111 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004112 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004113
Tony Barboureb254902015-07-15 12:50:33 -06004114 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004115 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4116 sampler_ci.pNext = NULL;
4117 sampler_ci.magFilter = VK_FILTER_NEAREST;
4118 sampler_ci.minFilter = VK_FILTER_NEAREST;
4119 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4120 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4121 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4122 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4123 sampler_ci.mipLodBias = 1.0;
4124 sampler_ci.anisotropyEnable = VK_FALSE;
4125 sampler_ci.maxAnisotropy = 1;
4126 sampler_ci.compareEnable = VK_FALSE;
4127 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4128 sampler_ci.minLod = 1.0;
4129 sampler_ci.maxLod = 1.0;
4130 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4131 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004132 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004133 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004134 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004135
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004136 VkDescriptorImageInfo info = {};
4137 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004138
4139 VkWriteDescriptorSet descriptor_write;
4140 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07004141 descriptor_write.sType =
4142 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004143 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004144 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004145 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004146 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004147 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004148
4149 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4150
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004151 if (!m_errorMonitor->DesiredMsgFound()) {
4152 FAIL() << "Did not receive Error 'Unexpected UPDATE struct of type '";
4153 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis3b780662015-05-28 12:11:26 -06004154 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06004155
Chia-I Wuf7458c52015-10-26 21:10:41 +08004156 vkDestroySampler(m_device->device(), sampler, NULL);
4157 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4158 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004159}
4160
Karl Schultz6addd812016-02-02 17:17:23 -07004161TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004162 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07004163 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004164
Karl Schultz6addd812016-02-02 17:17:23 -07004165 m_errorMonitor->SetDesiredFailureMsg(
4166 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004167 "Attempt to update descriptor with invalid sampler 0xbaadbeef");
4168
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004169 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004170 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
4171 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004172 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004173 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
4174 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004175
4176 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004177 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4178 ds_pool_ci.pNext = NULL;
4179 ds_pool_ci.maxSets = 1;
4180 ds_pool_ci.poolSizeCount = 1;
4181 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004182
4183 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004184 err =
4185 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004186 ASSERT_VK_SUCCESS(err);
4187
4188 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004189 dsl_binding.binding = 0;
4190 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4191 dsl_binding.descriptorCount = 1;
4192 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4193 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004194
4195 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004196 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4197 ds_layout_ci.pNext = NULL;
4198 ds_layout_ci.bindingCount = 1;
4199 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004200 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004201 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4202 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004203 ASSERT_VK_SUCCESS(err);
4204
4205 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004206 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004207 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004208 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004209 alloc_info.descriptorPool = ds_pool;
4210 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004211 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4212 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004213 ASSERT_VK_SUCCESS(err);
4214
Karl Schultz6addd812016-02-02 17:17:23 -07004215 VkSampler sampler =
4216 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004217
4218 VkDescriptorImageInfo descriptor_info;
4219 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
4220 descriptor_info.sampler = sampler;
4221
4222 VkWriteDescriptorSet descriptor_write;
4223 memset(&descriptor_write, 0, sizeof(descriptor_write));
4224 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004225 descriptor_write.dstSet = descriptorSet;
4226 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004227 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004228 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4229 descriptor_write.pImageInfo = &descriptor_info;
4230
4231 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4232
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004233 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004234 FAIL() << "Did not receive Error 'Attempt to update descriptor with "
4235 "invalid sampler...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004236 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004237 }
4238
Chia-I Wuf7458c52015-10-26 21:10:41 +08004239 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4240 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004241}
4242
Karl Schultz6addd812016-02-02 17:17:23 -07004243TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
4244 // Create a single combined Image/Sampler descriptor and send it an invalid
4245 // imageView
4246 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004247
Karl Schultz6addd812016-02-02 17:17:23 -07004248 m_errorMonitor->SetDesiredFailureMsg(
4249 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004250 "Attempt to update descriptor with invalid imageView 0xbaadbeef");
4251
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004252 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004253 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004254 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4255 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004256
4257 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004258 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4259 ds_pool_ci.pNext = NULL;
4260 ds_pool_ci.maxSets = 1;
4261 ds_pool_ci.poolSizeCount = 1;
4262 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004263
4264 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004265 err =
4266 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004267 ASSERT_VK_SUCCESS(err);
4268
4269 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004270 dsl_binding.binding = 0;
4271 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4272 dsl_binding.descriptorCount = 1;
4273 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4274 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004275
4276 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004277 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4278 ds_layout_ci.pNext = NULL;
4279 ds_layout_ci.bindingCount = 1;
4280 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004281 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004282 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4283 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004284 ASSERT_VK_SUCCESS(err);
4285
4286 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004287 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004288 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004289 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004290 alloc_info.descriptorPool = ds_pool;
4291 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004292 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4293 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004294 ASSERT_VK_SUCCESS(err);
4295
4296 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004297 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4298 sampler_ci.pNext = NULL;
4299 sampler_ci.magFilter = VK_FILTER_NEAREST;
4300 sampler_ci.minFilter = VK_FILTER_NEAREST;
4301 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4302 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4303 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4304 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4305 sampler_ci.mipLodBias = 1.0;
4306 sampler_ci.anisotropyEnable = VK_FALSE;
4307 sampler_ci.maxAnisotropy = 1;
4308 sampler_ci.compareEnable = VK_FALSE;
4309 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4310 sampler_ci.minLod = 1.0;
4311 sampler_ci.maxLod = 1.0;
4312 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4313 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004314
4315 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004316 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004317 ASSERT_VK_SUCCESS(err);
4318
Karl Schultz6addd812016-02-02 17:17:23 -07004319 VkImageView view =
4320 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004321
4322 VkDescriptorImageInfo descriptor_info;
4323 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
4324 descriptor_info.sampler = sampler;
4325 descriptor_info.imageView = view;
4326
4327 VkWriteDescriptorSet descriptor_write;
4328 memset(&descriptor_write, 0, sizeof(descriptor_write));
4329 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004330 descriptor_write.dstSet = descriptorSet;
4331 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004332 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004333 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4334 descriptor_write.pImageInfo = &descriptor_info;
4335
4336 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4337
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004338 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004339 FAIL() << "Did not receive Error 'Attempt to update descriptor with "
4340 "invalid imageView...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004341 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004342 }
4343
Chia-I Wuf7458c52015-10-26 21:10:41 +08004344 vkDestroySampler(m_device->device(), sampler, NULL);
4345 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4346 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004347}
4348
Karl Schultz6addd812016-02-02 17:17:23 -07004349TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
4350 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
4351 // into the other
4352 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004353
Karl Schultz6addd812016-02-02 17:17:23 -07004354 m_errorMonitor->SetDesiredFailureMsg(
4355 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Copy descriptor update index 0, update "
4356 "count #1, has src update descriptor "
4357 "type VK_DESCRIPTOR_TYPE_SAMPLER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004358
Tobin Ehlis04356f92015-10-27 16:35:27 -06004359 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004360 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004361 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004362 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4363 ds_type_count[0].descriptorCount = 1;
4364 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
4365 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004366
4367 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004368 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4369 ds_pool_ci.pNext = NULL;
4370 ds_pool_ci.maxSets = 1;
4371 ds_pool_ci.poolSizeCount = 2;
4372 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004373
4374 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004375 err =
4376 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004377 ASSERT_VK_SUCCESS(err);
4378 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004379 dsl_binding[0].binding = 0;
4380 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4381 dsl_binding[0].descriptorCount = 1;
4382 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4383 dsl_binding[0].pImmutableSamplers = NULL;
4384 dsl_binding[1].binding = 1;
4385 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4386 dsl_binding[1].descriptorCount = 1;
4387 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
4388 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004389
4390 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004391 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4392 ds_layout_ci.pNext = NULL;
4393 ds_layout_ci.bindingCount = 2;
4394 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004395
4396 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004397 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4398 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004399 ASSERT_VK_SUCCESS(err);
4400
4401 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004402 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004403 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004404 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004405 alloc_info.descriptorPool = ds_pool;
4406 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004407 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4408 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004409 ASSERT_VK_SUCCESS(err);
4410
4411 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004412 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4413 sampler_ci.pNext = NULL;
4414 sampler_ci.magFilter = VK_FILTER_NEAREST;
4415 sampler_ci.minFilter = VK_FILTER_NEAREST;
4416 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4417 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4418 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4419 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4420 sampler_ci.mipLodBias = 1.0;
4421 sampler_ci.anisotropyEnable = VK_FALSE;
4422 sampler_ci.maxAnisotropy = 1;
4423 sampler_ci.compareEnable = VK_FALSE;
4424 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4425 sampler_ci.minLod = 1.0;
4426 sampler_ci.maxLod = 1.0;
4427 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4428 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004429
4430 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004431 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004432 ASSERT_VK_SUCCESS(err);
4433
4434 VkDescriptorImageInfo info = {};
4435 info.sampler = sampler;
4436
4437 VkWriteDescriptorSet descriptor_write;
4438 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
4439 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004440 descriptor_write.dstSet = descriptorSet;
4441 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08004442 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004443 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4444 descriptor_write.pImageInfo = &info;
4445 // This write update should succeed
4446 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4447 // Now perform a copy update that fails due to type mismatch
4448 VkCopyDescriptorSet copy_ds_update;
4449 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
4450 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
4451 copy_ds_update.srcSet = descriptorSet;
4452 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004453 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004454 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08004455 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06004456 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
4457
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004458 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004459 FAIL() << "Did not receive Error 'Copy descriptor update index 0, "
4460 "update count #1, has src update descriptor "
4461 "type_DESCRIPTOR_TYPE_SAMPLER'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004462 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis04356f92015-10-27 16:35:27 -06004463 }
4464 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07004465 m_errorMonitor->SetDesiredFailureMsg(
4466 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004467 "Copy descriptor update 0 has srcBinding 3 which is out of bounds ");
Tobin Ehlis04356f92015-10-27 16:35:27 -06004468 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
4469 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
4470 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004471 copy_ds_update.srcBinding =
4472 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004473 copy_ds_update.dstSet = descriptorSet;
4474 copy_ds_update.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004475 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06004476 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
4477
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004478 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004479 FAIL() << "Did not receive Error 'Copy descriptor update 0 has "
4480 "srcBinding 3 which is out of bounds...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004481 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis04356f92015-10-27 16:35:27 -06004482 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004483
Tobin Ehlis04356f92015-10-27 16:35:27 -06004484 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07004485 m_errorMonitor->SetDesiredFailureMsg(
4486 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004487 "Copy descriptor src update is out of bounds for matching binding 1 ");
4488
Tobin Ehlis04356f92015-10-27 16:35:27 -06004489 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
4490 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
4491 copy_ds_update.srcSet = descriptorSet;
4492 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004493 copy_ds_update.dstSet = descriptorSet;
4494 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004495 copy_ds_update.descriptorCount =
4496 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06004497 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
4498
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004499 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004500 FAIL() << "Did not receive Error 'Copy descriptor src update is out of "
4501 "bounds for matching binding 1...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004502 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis04356f92015-10-27 16:35:27 -06004503 }
4504
Chia-I Wuf7458c52015-10-26 21:10:41 +08004505 vkDestroySampler(m_device->device(), sampler, NULL);
4506 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4507 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004508}
4509
Karl Schultz6addd812016-02-02 17:17:23 -07004510TEST_F(VkLayerTest, NumSamplesMismatch) {
4511 // Create CommandBuffer where MSAA samples doesn't match RenderPass
4512 // sampleCount
4513 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004514
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004516 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004517
Tobin Ehlis3b780662015-05-28 12:11:26 -06004518 ASSERT_NO_FATAL_FAILURE(InitState());
4519 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004520 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06004521 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004522 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004523
4524 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004525 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4526 ds_pool_ci.pNext = NULL;
4527 ds_pool_ci.maxSets = 1;
4528 ds_pool_ci.poolSizeCount = 1;
4529 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004530
Tobin Ehlis3b780662015-05-28 12:11:26 -06004531 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004532 err =
4533 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004534 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004535
Tony Barboureb254902015-07-15 12:50:33 -06004536 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08004537 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06004538 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08004539 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004540 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4541 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004542
Tony Barboureb254902015-07-15 12:50:33 -06004543 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4544 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4545 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004546 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004547 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004548
Tobin Ehlis3b780662015-05-28 12:11:26 -06004549 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004550 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4551 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004552 ASSERT_VK_SUCCESS(err);
4553
4554 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004555 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004556 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004557 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004558 alloc_info.descriptorPool = ds_pool;
4559 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004560 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4561 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004562 ASSERT_VK_SUCCESS(err);
4563
Tony Barboureb254902015-07-15 12:50:33 -06004564 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004565 pipe_ms_state_ci.sType =
4566 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4567 pipe_ms_state_ci.pNext = NULL;
4568 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
4569 pipe_ms_state_ci.sampleShadingEnable = 0;
4570 pipe_ms_state_ci.minSampleShading = 1.0;
4571 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004572
Tony Barboureb254902015-07-15 12:50:33 -06004573 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004574 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4575 pipeline_layout_ci.pNext = NULL;
4576 pipeline_layout_ci.setLayoutCount = 1;
4577 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004578
4579 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004580 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4581 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004582 ASSERT_VK_SUCCESS(err);
4583
Karl Schultz6addd812016-02-02 17:17:23 -07004584 VkShaderObj vs(m_device, bindStateVertShaderText,
4585 VK_SHADER_STAGE_VERTEX_BIT, this);
4586 VkShaderObj fs(m_device, bindStateFragShaderText,
4587 VK_SHADER_STAGE_FRAGMENT_BIT,
4588 this); // TODO - We shouldn't need a fragment shader
4589 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004590 VkPipelineObj pipe(m_device);
4591 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06004592 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004593 pipe.SetMSAA(&pipe_ms_state_ci);
4594 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06004595
Tony Barbourfe3351b2015-07-28 10:17:20 -06004596 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004597 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4598 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06004599
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004600 if (!m_errorMonitor->DesiredMsgFound()) {
4601 FAIL() << "Did not recieve Error 'Num samples mismatch!...'";
4602 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis3b780662015-05-28 12:11:26 -06004603 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06004604
Chia-I Wuf7458c52015-10-26 21:10:41 +08004605 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4606 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4607 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004608}
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004609
Karl Schultz6addd812016-02-02 17:17:23 -07004610TEST_F(VkLayerTest, ClearCmdNoDraw) {
4611 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
4612 // to issuing a Draw
4613 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004614
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004615 // TODO: verify that this matches layer
Karl Schultz6addd812016-02-02 17:17:23 -07004616 m_errorMonitor->SetDesiredFailureMsg(
4617 VK_DEBUG_REPORT_WARN_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004618 "vkCmdClearAttachments() issued on CB object ");
4619
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004620 ASSERT_NO_FATAL_FAILURE(InitState());
4621 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06004622
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004623 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004624 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4625 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004626
4627 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004628 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4629 ds_pool_ci.pNext = NULL;
4630 ds_pool_ci.maxSets = 1;
4631 ds_pool_ci.poolSizeCount = 1;
4632 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004633
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004634 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004635 err =
4636 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004637 ASSERT_VK_SUCCESS(err);
4638
Tony Barboureb254902015-07-15 12:50:33 -06004639 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004640 dsl_binding.binding = 0;
4641 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4642 dsl_binding.descriptorCount = 1;
4643 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4644 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004645
Tony Barboureb254902015-07-15 12:50:33 -06004646 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004647 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4648 ds_layout_ci.pNext = NULL;
4649 ds_layout_ci.bindingCount = 1;
4650 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004651
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004652 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004653 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4654 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004655 ASSERT_VK_SUCCESS(err);
4656
4657 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004658 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004659 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004660 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004661 alloc_info.descriptorPool = ds_pool;
4662 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004663 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4664 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004665 ASSERT_VK_SUCCESS(err);
4666
Tony Barboureb254902015-07-15 12:50:33 -06004667 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004668 pipe_ms_state_ci.sType =
4669 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4670 pipe_ms_state_ci.pNext = NULL;
4671 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
4672 pipe_ms_state_ci.sampleShadingEnable = 0;
4673 pipe_ms_state_ci.minSampleShading = 1.0;
4674 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004675
Tony Barboureb254902015-07-15 12:50:33 -06004676 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004677 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4678 pipeline_layout_ci.pNext = NULL;
4679 pipeline_layout_ci.setLayoutCount = 1;
4680 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004681
4682 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004683 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4684 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004685 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004686
Karl Schultz6addd812016-02-02 17:17:23 -07004687 VkShaderObj vs(m_device, bindStateVertShaderText,
4688 VK_SHADER_STAGE_VERTEX_BIT, this);
4689 // TODO - We shouldn't need a fragment shader but add it to be able to run
4690 // on more devices
4691 VkShaderObj fs(m_device, bindStateFragShaderText,
4692 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004693
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004694 VkPipelineObj pipe(m_device);
4695 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06004696 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004697 pipe.SetMSAA(&pipe_ms_state_ci);
4698 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06004699
4700 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004701
Karl Schultz6addd812016-02-02 17:17:23 -07004702 // Main thing we care about for this test is that the VkImage obj we're
4703 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004704 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004705 VkClearAttachment color_attachment;
4706 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4707 color_attachment.clearValue.color.float32[0] = 1.0;
4708 color_attachment.clearValue.color.float32[1] = 1.0;
4709 color_attachment.clearValue.color.float32[2] = 1.0;
4710 color_attachment.clearValue.color.float32[3] = 1.0;
4711 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004712 VkClearRect clear_rect = {
4713 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004714
Karl Schultz6addd812016-02-02 17:17:23 -07004715 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
4716 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004717
4718 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004719 FAIL() << "Did not receive Error 'vkCommandClearAttachments() issued "
4720 "on CB object...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004721 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004722 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06004723
Chia-I Wuf7458c52015-10-26 21:10:41 +08004724 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4725 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4726 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004727}
4728
Karl Schultz6addd812016-02-02 17:17:23 -07004729TEST_F(VkLayerTest, VtxBufferBadIndex) {
4730 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004731
Karl Schultz6addd812016-02-02 17:17:23 -07004732 m_errorMonitor->SetDesiredFailureMsg(
4733 VK_DEBUG_REPORT_PERF_WARN_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07004734 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004735
Tobin Ehlis502480b2015-06-24 15:53:07 -06004736 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06004737 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06004738 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06004739
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004740 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004741 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4742 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004743
4744 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004745 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4746 ds_pool_ci.pNext = NULL;
4747 ds_pool_ci.maxSets = 1;
4748 ds_pool_ci.poolSizeCount = 1;
4749 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004750
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004751 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004752 err =
4753 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004754 ASSERT_VK_SUCCESS(err);
4755
Tony Barboureb254902015-07-15 12:50:33 -06004756 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004757 dsl_binding.binding = 0;
4758 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4759 dsl_binding.descriptorCount = 1;
4760 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4761 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004762
Tony Barboureb254902015-07-15 12:50:33 -06004763 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004764 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4765 ds_layout_ci.pNext = NULL;
4766 ds_layout_ci.bindingCount = 1;
4767 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004768
Tobin Ehlis502480b2015-06-24 15:53:07 -06004769 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004770 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4771 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004772 ASSERT_VK_SUCCESS(err);
4773
4774 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004775 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004776 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004777 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004778 alloc_info.descriptorPool = ds_pool;
4779 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004780 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4781 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004782 ASSERT_VK_SUCCESS(err);
4783
Tony Barboureb254902015-07-15 12:50:33 -06004784 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004785 pipe_ms_state_ci.sType =
4786 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4787 pipe_ms_state_ci.pNext = NULL;
4788 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
4789 pipe_ms_state_ci.sampleShadingEnable = 0;
4790 pipe_ms_state_ci.minSampleShading = 1.0;
4791 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004792
Tony Barboureb254902015-07-15 12:50:33 -06004793 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004794 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4795 pipeline_layout_ci.pNext = NULL;
4796 pipeline_layout_ci.setLayoutCount = 1;
4797 pipeline_layout_ci.pSetLayouts = &ds_layout;
4798 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004799
Karl Schultz6addd812016-02-02 17:17:23 -07004800 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4801 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004802 ASSERT_VK_SUCCESS(err);
4803
Karl Schultz6addd812016-02-02 17:17:23 -07004804 VkShaderObj vs(m_device, bindStateVertShaderText,
4805 VK_SHADER_STAGE_VERTEX_BIT, this);
4806 VkShaderObj fs(m_device, bindStateFragShaderText,
4807 VK_SHADER_STAGE_FRAGMENT_BIT,
4808 this); // TODO - We shouldn't need a fragment shader
4809 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004810 VkPipelineObj pipe(m_device);
4811 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06004812 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004813 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004814 pipe.SetViewport(m_viewports);
4815 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004816 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06004817
4818 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004819 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4820 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06004821 // Don't care about actual data, just need to get to draw to flag error
4822 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07004823 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
4824 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06004825 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06004826 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004827
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004828 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004829 FAIL() << "Did not receive Error 'Vtx Buffer Index 0 was bound, but no "
4830 "vtx buffers are attached to PSO.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004831 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis502480b2015-06-24 15:53:07 -06004832 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06004833
Chia-I Wuf7458c52015-10-26 21:10:41 +08004834 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4835 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4836 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004837}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004838#endif // DRAW_STATE_TESTS
4839
Tobin Ehlis0788f522015-05-26 16:11:58 -06004840#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06004841#if GTEST_IS_THREADSAFE
4842struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004843 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004844 VkEvent event;
4845 bool bailout;
4846};
4847
Karl Schultz6addd812016-02-02 17:17:23 -07004848extern "C" void *AddToCommandBuffer(void *arg) {
4849 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004850
Karl Schultz6addd812016-02-02 17:17:23 -07004851 for (int i = 0; i < 10000; i++) {
4852 vkCmdSetEvent(data->commandBuffer, data->event,
4853 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004854 if (data->bailout) {
4855 break;
4856 }
4857 }
4858 return NULL;
4859}
4860
Karl Schultz6addd812016-02-02 17:17:23 -07004861TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06004862 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004863
Karl Schultz6addd812016-02-02 17:17:23 -07004864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4865 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004866
Mike Stroyanaccf7692015-05-12 16:00:45 -06004867 ASSERT_NO_FATAL_FAILURE(InitState());
4868 ASSERT_NO_FATAL_FAILURE(InitViewport());
4869 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4870
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004871 // Calls AllocateCommandBuffers
4872 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06004873
4874 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004875 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004876
4877 VkEventCreateInfo event_info;
4878 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004879 VkResult err;
4880
4881 memset(&event_info, 0, sizeof(event_info));
4882 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4883
Chia-I Wuf7458c52015-10-26 21:10:41 +08004884 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004885 ASSERT_VK_SUCCESS(err);
4886
Mike Stroyanaccf7692015-05-12 16:00:45 -06004887 err = vkResetEvent(device(), event);
4888 ASSERT_VK_SUCCESS(err);
4889
4890 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004891 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004892 data.event = event;
4893 data.bailout = false;
4894 m_errorMonitor->SetBailout(&data.bailout);
4895 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06004896 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004897 // Add many entries to command buffer from this thread at the same time.
4898 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06004899
Mike Stroyan4268d1f2015-07-13 14:45:35 -06004900 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004901 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004902
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004903 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004904 FAIL() << "Did not receive Error 'THREADING ERROR' from using one "
4905 "VkCommandBufferObj in two threads";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004906 m_errorMonitor->DumpFailureMsgs();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004907 }
4908
Chia-I Wuf7458c52015-10-26 21:10:41 +08004909 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004910}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004911#endif // GTEST_IS_THREADSAFE
4912#endif // THREADING_TESTS
4913
Chris Forbes9f7ff632015-05-25 11:13:08 +12004914#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07004915TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004916 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004917 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004918
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004919 ASSERT_NO_FATAL_FAILURE(InitState());
4920 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4921
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004922 VkShaderModule module;
4923 VkShaderModuleCreateInfo moduleCreateInfo;
4924 struct icd_spv_header spv;
4925
4926 spv.magic = ICD_SPV_MAGIC;
4927 spv.version = ICD_SPV_VERSION;
4928 spv.gen_magic = 0;
4929
4930 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
4931 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07004932 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004933 moduleCreateInfo.codeSize = 4;
4934 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004935 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004936
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004937 if (!m_errorMonitor->DesiredMsgFound()) {
4938 FAIL() << "Did not recieive Error 'Shader is not SPIR-V'";
4939 m_errorMonitor->DumpFailureMsgs();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004940 }
4941}
4942
Karl Schultz6addd812016-02-02 17:17:23 -07004943TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004945 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004946
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004947 ASSERT_NO_FATAL_FAILURE(InitState());
4948 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4949
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004950 VkShaderModule module;
4951 VkShaderModuleCreateInfo moduleCreateInfo;
4952 struct icd_spv_header spv;
4953
4954 spv.magic = ~ICD_SPV_MAGIC;
4955 spv.version = ICD_SPV_VERSION;
4956 spv.gen_magic = 0;
4957
4958 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
4959 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07004960 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004961 moduleCreateInfo.codeSize = sizeof(spv) + 10;
4962 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004963 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004964
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004965 if (!m_errorMonitor->DesiredMsgFound()) {
4966 FAIL() << "Did not recieive Error 'Shader is not SPIR-V'";
4967 m_errorMonitor->DumpFailureMsgs();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004968 }
4969}
4970
Karl Schultz6addd812016-02-02 17:17:23 -07004971TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004972 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004973 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004974
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004975 ASSERT_NO_FATAL_FAILURE(InitState());
4976 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4977
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004978 VkShaderModule module;
4979 VkShaderModuleCreateInfo moduleCreateInfo;
4980 struct icd_spv_header spv;
4981
4982 spv.magic = ICD_SPV_MAGIC;
4983 spv.version = ~ICD_SPV_VERSION;
4984 spv.gen_magic = 0;
4985
4986 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
4987 moduleCreateInfo.pNext = NULL;
4988
Karl Schultz6addd812016-02-02 17:17:23 -07004989 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004990 moduleCreateInfo.codeSize = sizeof(spv) + 10;
4991 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004992 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004993
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004994 if (!m_errorMonitor->DesiredMsgFound()) {
4995 FAIL() << "Did not recieive Error 'Shader is not SPIR-V'";
4996 m_errorMonitor->DumpFailureMsgs();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004997 }
4998}
4999
Karl Schultz6addd812016-02-02 17:17:23 -07005000TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005001 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERF_WARN_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005002 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005003
Chris Forbes9f7ff632015-05-25 11:13:08 +12005004 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005005 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12005006
5007 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005008 "#version 400\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005009 "#extension GL_ARB_separate_shader_objects: require\n"
5010 "#extension GL_ARB_shading_language_420pack: require\n"
5011 "\n"
5012 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07005013 "out gl_PerVertex {\n"
5014 " vec4 gl_Position;\n"
5015 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005016 "void main(){\n"
5017 " gl_Position = vec4(1);\n"
5018 " x = 0;\n"
5019 "}\n";
5020 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005021 "#version 400\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005022 "#extension GL_ARB_separate_shader_objects: require\n"
5023 "#extension GL_ARB_shading_language_420pack: require\n"
5024 "\n"
5025 "layout(location=0) out vec4 color;\n"
5026 "void main(){\n"
5027 " color = vec4(1);\n"
5028 "}\n";
5029
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005030 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5031 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12005032
5033 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005034 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12005035 pipe.AddShader(&vs);
5036 pipe.AddShader(&fs);
5037
Chris Forbes9f7ff632015-05-25 11:13:08 +12005038 VkDescriptorSetObj descriptorSet(m_device);
5039 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005040 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12005041
Tony Barbour5781e8f2015-08-04 16:23:11 -06005042 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12005043
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005044 if (!m_errorMonitor->DesiredMsgFound()) {
5045 FAIL() << "Did not receive Warning 'not consumed by fragment shader'";
5046 m_errorMonitor->DumpFailureMsgs();
Chris Forbes9f7ff632015-05-25 11:13:08 +12005047 }
5048}
Chris Forbes9f7ff632015-05-25 11:13:08 +12005049
Karl Schultz6addd812016-02-02 17:17:23 -07005050TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005051 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005052 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005053
Chris Forbes59cb88d2015-05-25 11:13:13 +12005054 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005055 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12005056
5057 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005058 "#version 400\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005059 "#extension GL_ARB_separate_shader_objects: require\n"
5060 "#extension GL_ARB_shading_language_420pack: require\n"
5061 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005062 "out gl_PerVertex {\n"
5063 " vec4 gl_Position;\n"
5064 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005065 "void main(){\n"
5066 " gl_Position = vec4(1);\n"
5067 "}\n";
5068 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005069 "#version 400\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005070 "#extension GL_ARB_separate_shader_objects: require\n"
5071 "#extension GL_ARB_shading_language_420pack: require\n"
5072 "\n"
5073 "layout(location=0) in float x;\n"
5074 "layout(location=0) out vec4 color;\n"
5075 "void main(){\n"
5076 " color = vec4(x);\n"
5077 "}\n";
5078
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005079 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5080 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12005081
5082 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005083 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12005084 pipe.AddShader(&vs);
5085 pipe.AddShader(&fs);
5086
Chris Forbes59cb88d2015-05-25 11:13:13 +12005087 VkDescriptorSetObj descriptorSet(m_device);
5088 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005089 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12005090
Tony Barbour5781e8f2015-08-04 16:23:11 -06005091 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12005092
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005093 if (!m_errorMonitor->DesiredMsgFound()) {
5094 FAIL() << "Did not receive Error 'not written by vertex shader'";
5095 m_errorMonitor->DumpFailureMsgs();
Chris Forbes59cb88d2015-05-25 11:13:13 +12005096 }
5097}
5098
Karl Schultz6addd812016-02-02 17:17:23 -07005099TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13005100 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005101 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13005102
5103 ASSERT_NO_FATAL_FAILURE(InitState());
5104 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5105
5106 char const *vsSource =
5107 "#version 400\n"
5108 "#extension GL_ARB_separate_shader_objects: require\n"
5109 "#extension GL_ARB_shading_language_420pack: require\n"
5110 "\n"
5111 "out gl_PerVertex {\n"
5112 " vec4 gl_Position;\n"
5113 "};\n"
5114 "void main(){\n"
5115 " gl_Position = vec4(1);\n"
5116 "}\n";
5117 char const *fsSource =
5118 "#version 450\n"
5119 "#extension GL_ARB_separate_shader_objects: require\n"
5120 "#extension GL_ARB_shading_language_420pack: require\n"
5121 "\n"
5122 "in block { layout(location=0) float x; } ins;\n"
5123 "layout(location=0) out vec4 color;\n"
5124 "void main(){\n"
5125 " color = vec4(ins.x);\n"
5126 "}\n";
5127
5128 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5129 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5130
5131 VkPipelineObj pipe(m_device);
5132 pipe.AddColorAttachment();
5133 pipe.AddShader(&vs);
5134 pipe.AddShader(&fs);
5135
5136 VkDescriptorSetObj descriptorSet(m_device);
5137 descriptorSet.AppendDummy();
5138 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5139
5140 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5141
5142 if (!m_errorMonitor->DesiredMsgFound()) {
5143 FAIL() << "Did not receive Error 'not written by vertex shader'";
5144 m_errorMonitor->DumpFailureMsgs();
5145 }
5146}
5147
Karl Schultz6addd812016-02-02 17:17:23 -07005148TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13005149 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005150 "Type mismatch on location 0: 'ptr to "
5151 "output arr[2] of float32' vs 'ptr to "
5152 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13005153
5154 ASSERT_NO_FATAL_FAILURE(InitState());
5155 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5156
5157 char const *vsSource =
5158 "#version 400\n"
5159 "#extension GL_ARB_separate_shader_objects: require\n"
5160 "#extension GL_ARB_shading_language_420pack: require\n"
5161 "\n"
5162 "layout(location=0) out float x[2];\n"
5163 "out gl_PerVertex {\n"
5164 " vec4 gl_Position;\n"
5165 "};\n"
5166 "void main(){\n"
5167 " x[0] = 0; x[1] = 0;\n"
5168 " gl_Position = vec4(1);\n"
5169 "}\n";
5170 char const *fsSource =
5171 "#version 400\n"
5172 "#extension GL_ARB_separate_shader_objects: require\n"
5173 "#extension GL_ARB_shading_language_420pack: require\n"
5174 "\n"
5175 "layout(location=0) in float x[3];\n"
5176 "layout(location=0) out vec4 color;\n"
5177 "void main(){\n"
5178 " color = vec4(x[0] + x[1] + x[2]);\n"
5179 "}\n";
5180
5181 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5182 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5183
5184 VkPipelineObj pipe(m_device);
5185 pipe.AddColorAttachment();
5186 pipe.AddShader(&vs);
5187 pipe.AddShader(&fs);
5188
5189 VkDescriptorSetObj descriptorSet(m_device);
5190 descriptorSet.AppendDummy();
5191 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5192
5193 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5194
5195 if (!m_errorMonitor->DesiredMsgFound()) {
5196 m_errorMonitor->DumpFailureMsgs();
Karl Schultz6addd812016-02-02 17:17:23 -07005197 FAIL() << "Did not receive Error 'Type mismatch on location 0: 'ptr to "
5198 "output arr[2] of float32' vs 'ptr to input arr[3] of "
5199 "float32''";
Chris Forbes0036fd12016-01-26 14:19:49 +13005200 }
5201}
5202
Karl Schultz6addd812016-02-02 17:17:23 -07005203TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005205 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005206
Chris Forbesb56af562015-05-25 11:13:17 +12005207 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005208 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12005209
5210 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005211 "#version 400\n"
Chris Forbesb56af562015-05-25 11:13:17 +12005212 "#extension GL_ARB_separate_shader_objects: require\n"
5213 "#extension GL_ARB_shading_language_420pack: require\n"
5214 "\n"
5215 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07005216 "out gl_PerVertex {\n"
5217 " vec4 gl_Position;\n"
5218 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12005219 "void main(){\n"
5220 " x = 0;\n"
5221 " gl_Position = vec4(1);\n"
5222 "}\n";
5223 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005224 "#version 400\n"
Chris Forbesb56af562015-05-25 11:13:17 +12005225 "#extension GL_ARB_separate_shader_objects: require\n"
5226 "#extension GL_ARB_shading_language_420pack: require\n"
5227 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005228 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12005229 "layout(location=0) out vec4 color;\n"
5230 "void main(){\n"
5231 " color = vec4(x);\n"
5232 "}\n";
5233
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005234 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5235 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12005236
5237 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005238 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12005239 pipe.AddShader(&vs);
5240 pipe.AddShader(&fs);
5241
Chris Forbesb56af562015-05-25 11:13:17 +12005242 VkDescriptorSetObj descriptorSet(m_device);
5243 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005244 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12005245
Tony Barbour5781e8f2015-08-04 16:23:11 -06005246 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12005247
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005248 if (!m_errorMonitor->DesiredMsgFound()) {
5249 FAIL() << "Did not receive Error 'Type mismatch on location 0'";
5250 m_errorMonitor->DumpFailureMsgs();
Chris Forbesb56af562015-05-25 11:13:17 +12005251 }
5252}
5253
Karl Schultz6addd812016-02-02 17:17:23 -07005254TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13005255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005256 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13005257
5258 ASSERT_NO_FATAL_FAILURE(InitState());
5259 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5260
5261 char const *vsSource =
5262 "#version 450\n"
5263 "#extension GL_ARB_separate_shader_objects: require\n"
5264 "#extension GL_ARB_shading_language_420pack: require\n"
5265 "\n"
5266 "out block { layout(location=0) int x; } outs;\n"
5267 "out gl_PerVertex {\n"
5268 " vec4 gl_Position;\n"
5269 "};\n"
5270 "void main(){\n"
5271 " outs.x = 0;\n"
5272 " gl_Position = vec4(1);\n"
5273 "}\n";
5274 char const *fsSource =
5275 "#version 450\n"
5276 "#extension GL_ARB_separate_shader_objects: require\n"
5277 "#extension GL_ARB_shading_language_420pack: require\n"
5278 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005279 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13005280 "layout(location=0) out vec4 color;\n"
5281 "void main(){\n"
5282 " color = vec4(ins.x);\n"
5283 "}\n";
5284
5285 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5286 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5287
5288 VkPipelineObj pipe(m_device);
5289 pipe.AddColorAttachment();
5290 pipe.AddShader(&vs);
5291 pipe.AddShader(&fs);
5292
5293 VkDescriptorSetObj descriptorSet(m_device);
5294 descriptorSet.AppendDummy();
5295 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5296
5297 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5298
5299 if (!m_errorMonitor->DesiredMsgFound()) {
5300 FAIL() << "Did not receive Error 'Type mismatch on location 0'";
5301 m_errorMonitor->DumpFailureMsgs();
5302 }
5303}
5304
Karl Schultz6addd812016-02-02 17:17:23 -07005305TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERF_WARN_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005307 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005308
Chris Forbesde136e02015-05-25 11:13:28 +12005309 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005310 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12005311
5312 VkVertexInputBindingDescription input_binding;
5313 memset(&input_binding, 0, sizeof(input_binding));
5314
5315 VkVertexInputAttributeDescription input_attrib;
5316 memset(&input_attrib, 0, sizeof(input_attrib));
5317 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5318
5319 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005320 "#version 400\n"
Chris Forbesde136e02015-05-25 11:13:28 +12005321 "#extension GL_ARB_separate_shader_objects: require\n"
5322 "#extension GL_ARB_shading_language_420pack: require\n"
5323 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005324 "out gl_PerVertex {\n"
5325 " vec4 gl_Position;\n"
5326 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12005327 "void main(){\n"
5328 " gl_Position = vec4(1);\n"
5329 "}\n";
5330 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005331 "#version 400\n"
Chris Forbesde136e02015-05-25 11:13:28 +12005332 "#extension GL_ARB_separate_shader_objects: require\n"
5333 "#extension GL_ARB_shading_language_420pack: require\n"
5334 "\n"
5335 "layout(location=0) out vec4 color;\n"
5336 "void main(){\n"
5337 " color = vec4(1);\n"
5338 "}\n";
5339
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005340 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5341 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12005342
5343 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005344 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12005345 pipe.AddShader(&vs);
5346 pipe.AddShader(&fs);
5347
5348 pipe.AddVertexInputBindings(&input_binding, 1);
5349 pipe.AddVertexInputAttribs(&input_attrib, 1);
5350
Chris Forbesde136e02015-05-25 11:13:28 +12005351 VkDescriptorSetObj descriptorSet(m_device);
5352 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005353 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12005354
Tony Barbour5781e8f2015-08-04 16:23:11 -06005355 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12005356
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005357 if (!m_errorMonitor->DesiredMsgFound()) {
5358 FAIL() << "Did not receive Warning 'location 0 not consumed by VS'";
5359 m_errorMonitor->DumpFailureMsgs();
Chris Forbesde136e02015-05-25 11:13:28 +12005360 }
5361}
5362
Karl Schultz6addd812016-02-02 17:17:23 -07005363TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Chris Forbes7d83cd52016-01-15 11:32:03 +13005364 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERF_WARN_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005365 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13005366
5367 ASSERT_NO_FATAL_FAILURE(InitState());
5368 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5369
5370 VkVertexInputBindingDescription input_binding;
5371 memset(&input_binding, 0, sizeof(input_binding));
5372
5373 VkVertexInputAttributeDescription input_attrib;
5374 memset(&input_attrib, 0, sizeof(input_attrib));
5375 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5376
5377 char const *vsSource =
5378 "#version 400\n"
5379 "#extension GL_ARB_separate_shader_objects: require\n"
5380 "#extension GL_ARB_shading_language_420pack: require\n"
5381 "\n"
5382 "layout(location=1) in float x;\n"
5383 "out gl_PerVertex {\n"
5384 " vec4 gl_Position;\n"
5385 "};\n"
5386 "void main(){\n"
5387 " gl_Position = vec4(x);\n"
5388 "}\n";
5389 char const *fsSource =
5390 "#version 400\n"
5391 "#extension GL_ARB_separate_shader_objects: require\n"
5392 "#extension GL_ARB_shading_language_420pack: require\n"
5393 "\n"
5394 "layout(location=0) out vec4 color;\n"
5395 "void main(){\n"
5396 " color = vec4(1);\n"
5397 "}\n";
5398
5399 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5400 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5401
5402 VkPipelineObj pipe(m_device);
5403 pipe.AddColorAttachment();
5404 pipe.AddShader(&vs);
5405 pipe.AddShader(&fs);
5406
5407 pipe.AddVertexInputBindings(&input_binding, 1);
5408 pipe.AddVertexInputAttribs(&input_attrib, 1);
5409
5410 VkDescriptorSetObj descriptorSet(m_device);
5411 descriptorSet.AppendDummy();
5412 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5413
5414 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5415
5416 if (!m_errorMonitor->DesiredMsgFound()) {
5417 m_errorMonitor->DumpFailureMsgs();
5418 FAIL() << "Did not receive Warning 'location 0 not consumed by VS'";
5419 }
5420}
5421
Karl Schultz6addd812016-02-02 17:17:23 -07005422TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
5423 m_errorMonitor->SetDesiredFailureMsg(
5424 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005425 "VS consumes input at location 0 but not provided");
5426
Chris Forbes62e8e502015-05-25 11:13:29 +12005427 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12005429
5430 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005431 "#version 400\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12005432 "#extension GL_ARB_separate_shader_objects: require\n"
5433 "#extension GL_ARB_shading_language_420pack: require\n"
5434 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005435 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07005436 "out gl_PerVertex {\n"
5437 " vec4 gl_Position;\n"
5438 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12005439 "void main(){\n"
5440 " gl_Position = x;\n"
5441 "}\n";
5442 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005443 "#version 400\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12005444 "#extension GL_ARB_separate_shader_objects: require\n"
5445 "#extension GL_ARB_shading_language_420pack: require\n"
5446 "\n"
5447 "layout(location=0) out vec4 color;\n"
5448 "void main(){\n"
5449 " color = vec4(1);\n"
5450 "}\n";
5451
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005452 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5453 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12005454
5455 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005456 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12005457 pipe.AddShader(&vs);
5458 pipe.AddShader(&fs);
5459
Chris Forbes62e8e502015-05-25 11:13:29 +12005460 VkDescriptorSetObj descriptorSet(m_device);
5461 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005462 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12005463
Tony Barbour5781e8f2015-08-04 16:23:11 -06005464 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12005465
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005466 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005467 FAIL() << "Did not receive Error 'VS consumes input at location 0 but "
5468 "not provided'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005469 m_errorMonitor->DumpFailureMsgs();
Chris Forbes62e8e502015-05-25 11:13:29 +12005470 }
5471}
5472
Karl Schultz6addd812016-02-02 17:17:23 -07005473TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
5474 m_errorMonitor->SetDesiredFailureMsg(
5475 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005476 "location 0 does not match VS input type");
5477
Chris Forbesc97d98e2015-05-25 11:13:31 +12005478 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005479 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12005480
5481 VkVertexInputBindingDescription input_binding;
5482 memset(&input_binding, 0, sizeof(input_binding));
5483
5484 VkVertexInputAttributeDescription input_attrib;
5485 memset(&input_attrib, 0, sizeof(input_attrib));
5486 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5487
5488 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005489 "#version 400\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12005490 "#extension GL_ARB_separate_shader_objects: require\n"
5491 "#extension GL_ARB_shading_language_420pack: require\n"
5492 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005493 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07005494 "out gl_PerVertex {\n"
5495 " vec4 gl_Position;\n"
5496 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12005497 "void main(){\n"
5498 " gl_Position = vec4(x);\n"
5499 "}\n";
5500 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005501 "#version 400\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12005502 "#extension GL_ARB_separate_shader_objects: require\n"
5503 "#extension GL_ARB_shading_language_420pack: require\n"
5504 "\n"
5505 "layout(location=0) out vec4 color;\n"
5506 "void main(){\n"
5507 " color = vec4(1);\n"
5508 "}\n";
5509
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005510 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5511 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12005512
5513 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005514 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12005515 pipe.AddShader(&vs);
5516 pipe.AddShader(&fs);
5517
5518 pipe.AddVertexInputBindings(&input_binding, 1);
5519 pipe.AddVertexInputAttribs(&input_attrib, 1);
5520
Chris Forbesc97d98e2015-05-25 11:13:31 +12005521 VkDescriptorSetObj descriptorSet(m_device);
5522 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005523 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12005524
Tony Barbour5781e8f2015-08-04 16:23:11 -06005525 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12005526
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005527 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005528 FAIL() << "Did not receive Error 'location 0 does not match VS input "
5529 "type'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005530 m_errorMonitor->DumpFailureMsgs();
Chris Forbesc97d98e2015-05-25 11:13:31 +12005531 }
5532}
5533
Karl Schultz6addd812016-02-02 17:17:23 -07005534TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes2682b242015-11-24 11:13:14 +13005535 m_errorMonitor->SetDesiredFailureMsg(~0u, "");
5536
5537 ASSERT_NO_FATAL_FAILURE(InitState());
5538 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5539
5540 VkVertexInputBindingDescription input_binding;
5541 memset(&input_binding, 0, sizeof(input_binding));
5542
5543 VkVertexInputAttributeDescription input_attribs[2];
5544 memset(input_attribs, 0, sizeof(input_attribs));
5545
5546 for (int i = 0; i < 2; i++) {
5547 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
5548 input_attribs[i].location = i;
5549 }
5550
5551 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005552 "#version 400\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005553 "#extension GL_ARB_separate_shader_objects: require\n"
5554 "#extension GL_ARB_shading_language_420pack: require\n"
5555 "\n"
5556 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07005557 "out gl_PerVertex {\n"
5558 " vec4 gl_Position;\n"
5559 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005560 "void main(){\n"
5561 " gl_Position = x[0] + x[1];\n"
5562 "}\n";
5563 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005564 "#version 400\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005565 "#extension GL_ARB_separate_shader_objects: require\n"
5566 "#extension GL_ARB_shading_language_420pack: require\n"
5567 "\n"
5568 "layout(location=0) out vec4 color;\n"
5569 "void main(){\n"
5570 " color = vec4(1);\n"
5571 "}\n";
5572
5573 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5574 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5575
5576 VkPipelineObj pipe(m_device);
5577 pipe.AddColorAttachment();
5578 pipe.AddShader(&vs);
5579 pipe.AddShader(&fs);
5580
5581 pipe.AddVertexInputBindings(&input_binding, 1);
5582 pipe.AddVertexInputAttribs(input_attribs, 2);
5583
5584 VkDescriptorSetObj descriptorSet(m_device);
5585 descriptorSet.AppendDummy();
5586 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5587
5588 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5589
5590 /* expect success */
5591 if (m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005592 FAIL() << "Expected to succeed but: "
5593 << m_errorMonitor->GetFailureMsg();
Chris Forbes2682b242015-11-24 11:13:14 +13005594 m_errorMonitor->DumpFailureMsgs();
5595 }
5596}
5597
5598/*
Karl Schultz6addd812016-02-02 17:17:23 -07005599 * Would work, but not supported by glslang! This is similar to the matrix case
5600above.
Chris Forbes2682b242015-11-24 11:13:14 +13005601 *
5602TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
5603{
5604 m_errorMonitor->SetDesiredFailureMsg(~0u, "");
5605
5606 ASSERT_NO_FATAL_FAILURE(InitState());
5607 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5608
5609 VkVertexInputBindingDescription input_binding;
5610 memset(&input_binding, 0, sizeof(input_binding));
5611
5612 VkVertexInputAttributeDescription input_attribs[2];
5613 memset(input_attribs, 0, sizeof(input_attribs));
5614
5615 for (int i = 0; i < 2; i++) {
5616 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
5617 input_attribs[i].location = i;
5618 }
5619
5620 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005621 "#version 400\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005622 "#extension GL_ARB_separate_shader_objects: require\n"
5623 "#extension GL_ARB_shading_language_420pack: require\n"
5624 "\n"
5625 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07005626 "out gl_PerVertex {\n"
5627 " vec4 gl_Position;\n"
5628 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005629 "void main(){\n"
5630 " gl_Position = x[0] + x[1];\n"
5631 "}\n";
5632 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005633 "#version 400\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005634 "#extension GL_ARB_separate_shader_objects: require\n"
5635 "#extension GL_ARB_shading_language_420pack: require\n"
5636 "\n"
5637 "layout(location=0) out vec4 color;\n"
5638 "void main(){\n"
5639 " color = vec4(1);\n"
5640 "}\n";
5641
5642 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5643 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5644
5645 VkPipelineObj pipe(m_device);
5646 pipe.AddColorAttachment();
5647 pipe.AddShader(&vs);
5648 pipe.AddShader(&fs);
5649
5650 pipe.AddVertexInputBindings(&input_binding, 1);
5651 pipe.AddVertexInputAttribs(input_attribs, 2);
5652
5653 VkDescriptorSetObj descriptorSet(m_device);
5654 descriptorSet.AppendDummy();
5655 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5656
5657 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5658
5659 if (m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005660 FAIL() << "Expected to succeed but: " <<
5661m_errorMonitor->GetFailureMsg();
Chris Forbes2682b242015-11-24 11:13:14 +13005662 m_errorMonitor->DumpFailureMsgs();
5663 }
5664}
5665*/
5666
Karl Schultz6addd812016-02-02 17:17:23 -07005667TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
5668 m_errorMonitor->SetDesiredFailureMsg(
5669 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005670 "Duplicate vertex input binding descriptions for binding 0");
5671
Chris Forbes280ba2c2015-06-12 11:16:41 +12005672 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005673 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12005674
5675 /* Two binding descriptions for binding 0 */
5676 VkVertexInputBindingDescription input_bindings[2];
5677 memset(input_bindings, 0, sizeof(input_bindings));
5678
5679 VkVertexInputAttributeDescription input_attrib;
5680 memset(&input_attrib, 0, sizeof(input_attrib));
5681 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5682
5683 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005684 "#version 400\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12005685 "#extension GL_ARB_separate_shader_objects: require\n"
5686 "#extension GL_ARB_shading_language_420pack: require\n"
5687 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005688 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07005689 "out gl_PerVertex {\n"
5690 " vec4 gl_Position;\n"
5691 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12005692 "void main(){\n"
5693 " gl_Position = vec4(x);\n"
5694 "}\n";
5695 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005696 "#version 400\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12005697 "#extension GL_ARB_separate_shader_objects: require\n"
5698 "#extension GL_ARB_shading_language_420pack: require\n"
5699 "\n"
5700 "layout(location=0) out vec4 color;\n"
5701 "void main(){\n"
5702 " color = vec4(1);\n"
5703 "}\n";
5704
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005705 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5706 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12005707
5708 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005709 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12005710 pipe.AddShader(&vs);
5711 pipe.AddShader(&fs);
5712
5713 pipe.AddVertexInputBindings(input_bindings, 2);
5714 pipe.AddVertexInputAttribs(&input_attrib, 1);
5715
Chris Forbes280ba2c2015-06-12 11:16:41 +12005716 VkDescriptorSetObj descriptorSet(m_device);
5717 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005718 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12005719
Tony Barbour5781e8f2015-08-04 16:23:11 -06005720 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12005721
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005722 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005723 FAIL() << "Did not receive Error 'Duplicate vertex input binding "
5724 "descriptions for binding 0'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005725 m_errorMonitor->DumpFailureMsgs();
Chris Forbes280ba2c2015-06-12 11:16:41 +12005726 }
5727}
Chris Forbes8f68b562015-05-25 11:13:32 +12005728
Karl Schultz6addd812016-02-02 17:17:23 -07005729TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005731 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005732
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005733 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005734
5735 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005736 "#version 400\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005737 "#extension GL_ARB_separate_shader_objects: require\n"
5738 "#extension GL_ARB_shading_language_420pack: require\n"
5739 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005740 "out gl_PerVertex {\n"
5741 " vec4 gl_Position;\n"
5742 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005743 "void main(){\n"
5744 " gl_Position = vec4(1);\n"
5745 "}\n";
5746 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005747 "#version 400\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005748 "#extension GL_ARB_separate_shader_objects: require\n"
5749 "#extension GL_ARB_shading_language_420pack: require\n"
5750 "\n"
5751 "void main(){\n"
5752 "}\n";
5753
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005754 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5755 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005756
5757 VkPipelineObj pipe(m_device);
5758 pipe.AddShader(&vs);
5759 pipe.AddShader(&fs);
5760
Chia-I Wu08accc62015-07-07 11:50:03 +08005761 /* set up CB 0, not written */
5762 pipe.AddColorAttachment();
5763 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005764
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005765 VkDescriptorSetObj descriptorSet(m_device);
5766 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005767 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005768
Tony Barbour5781e8f2015-08-04 16:23:11 -06005769 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005770
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005771 if (!m_errorMonitor->DesiredMsgFound()) {
5772 FAIL() << "Did not receive Error 'Attachment 0 not written by FS'";
5773 m_errorMonitor->DumpFailureMsgs();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005774 }
5775}
5776
Karl Schultz6addd812016-02-02 17:17:23 -07005777TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005778 // TODO: verify that this matches layer
Karl Schultz6addd812016-02-02 17:17:23 -07005779 m_errorMonitor->SetDesiredFailureMsg(
5780 VK_DEBUG_REPORT_WARN_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005781 "FS writes to output location 1 with no matching attachment");
5782
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005783 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005784
5785 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005786 "#version 400\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005787 "#extension GL_ARB_separate_shader_objects: require\n"
5788 "#extension GL_ARB_shading_language_420pack: require\n"
5789 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005790 "out gl_PerVertex {\n"
5791 " vec4 gl_Position;\n"
5792 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005793 "void main(){\n"
5794 " gl_Position = vec4(1);\n"
5795 "}\n";
5796 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005797 "#version 400\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005798 "#extension GL_ARB_separate_shader_objects: require\n"
5799 "#extension GL_ARB_shading_language_420pack: require\n"
5800 "\n"
5801 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005802 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005803 "void main(){\n"
5804 " x = vec4(1);\n"
5805 " y = vec4(1);\n"
5806 "}\n";
5807
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005808 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5809 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005810
5811 VkPipelineObj pipe(m_device);
5812 pipe.AddShader(&vs);
5813 pipe.AddShader(&fs);
5814
Chia-I Wu08accc62015-07-07 11:50:03 +08005815 /* set up CB 0, not written */
5816 pipe.AddColorAttachment();
5817 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005818 /* FS writes CB 1, but we don't configure it */
5819
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005820 VkDescriptorSetObj descriptorSet(m_device);
5821 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005822 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005823
Tony Barbour5781e8f2015-08-04 16:23:11 -06005824 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005825
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005826 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005827 FAIL() << "Did not receive Error 'FS writes to output location 1 with "
5828 "no matching attachment'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005829 m_errorMonitor->DumpFailureMsgs();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005830 }
5831}
5832
Karl Schultz6addd812016-02-02 17:17:23 -07005833TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005835 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005836
Chris Forbesa36d69e2015-05-25 11:13:44 +12005837 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12005838
5839 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005840 "#version 400\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12005841 "#extension GL_ARB_separate_shader_objects: require\n"
5842 "#extension GL_ARB_shading_language_420pack: require\n"
5843 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005844 "out gl_PerVertex {\n"
5845 " vec4 gl_Position;\n"
5846 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12005847 "void main(){\n"
5848 " gl_Position = vec4(1);\n"
5849 "}\n";
5850 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005851 "#version 400\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12005852 "#extension GL_ARB_separate_shader_objects: require\n"
5853 "#extension GL_ARB_shading_language_420pack: require\n"
5854 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005855 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12005856 "void main(){\n"
5857 " x = ivec4(1);\n"
5858 "}\n";
5859
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005860 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5861 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12005862
5863 VkPipelineObj pipe(m_device);
5864 pipe.AddShader(&vs);
5865 pipe.AddShader(&fs);
5866
Chia-I Wu08accc62015-07-07 11:50:03 +08005867 /* set up CB 0; type is UNORM by default */
5868 pipe.AddColorAttachment();
5869 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12005870
Chris Forbesa36d69e2015-05-25 11:13:44 +12005871 VkDescriptorSetObj descriptorSet(m_device);
5872 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005873 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12005874
Tony Barbour5781e8f2015-08-04 16:23:11 -06005875 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12005876
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005877 if (!m_errorMonitor->DesiredMsgFound()) {
5878 FAIL() << "Did not receive Error 'does not match FS output type'";
5879 m_errorMonitor->DumpFailureMsgs();
Chris Forbesa36d69e2015-05-25 11:13:44 +12005880 }
5881}
Chris Forbes7b1b8932015-06-05 14:43:36 +12005882
Karl Schultz6addd812016-02-02 17:17:23 -07005883TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005885 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005886
Chris Forbes556c76c2015-08-14 12:04:59 +12005887 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12005888
5889 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005890 "#version 400\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12005891 "#extension GL_ARB_separate_shader_objects: require\n"
5892 "#extension GL_ARB_shading_language_420pack: require\n"
5893 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005894 "out gl_PerVertex {\n"
5895 " vec4 gl_Position;\n"
5896 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12005897 "void main(){\n"
5898 " gl_Position = vec4(1);\n"
5899 "}\n";
5900 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005901 "#version 400\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12005902 "#extension GL_ARB_separate_shader_objects: require\n"
5903 "#extension GL_ARB_shading_language_420pack: require\n"
5904 "\n"
5905 "layout(location=0) out vec4 x;\n"
5906 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5907 "void main(){\n"
5908 " x = vec4(bar.y);\n"
5909 "}\n";
5910
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005911 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5912 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12005913
Chris Forbes556c76c2015-08-14 12:04:59 +12005914 VkPipelineObj pipe(m_device);
5915 pipe.AddShader(&vs);
5916 pipe.AddShader(&fs);
5917
5918 /* set up CB 0; type is UNORM by default */
5919 pipe.AddColorAttachment();
5920 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5921
5922 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005923 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12005924
5925 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5926
5927 /* should have generated an error -- pipeline layout does not
5928 * provide a uniform buffer in 0.0
5929 */
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005930 if (!m_errorMonitor->DesiredMsgFound()) {
5931 FAIL() << "Did not receive Error 'not declared in pipeline layout'";
5932 m_errorMonitor->DumpFailureMsgs();
Chris Forbes556c76c2015-08-14 12:04:59 +12005933 }
5934}
5935
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005936#endif // SHADER_CHECKER_TESTS
5937
5938#if DEVICE_LIMITS_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07005939TEST_F(VkLayerTest, CreateImageLimitsViolationWidth) {
5940 m_errorMonitor->SetDesiredFailureMsg(
5941 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005942 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06005943
5944 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06005945
5946 // Create an image
5947 VkImage image;
5948
Karl Schultz6addd812016-02-02 17:17:23 -07005949 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5950 const int32_t tex_width = 32;
5951 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06005952
5953 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005954 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5955 image_create_info.pNext = NULL;
5956 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5957 image_create_info.format = tex_format;
5958 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06005959 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07005960 image_create_info.extent.depth = 1;
5961 image_create_info.mipLevels = 1;
5962 image_create_info.arrayLayers = 1;
5963 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5964 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
5965 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5966 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06005967
5968 // Introduce error by sending down a bogus width extent
5969 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005970 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06005971
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005972 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005973 FAIL() << "Did not receive Error 'CreateImage extents exceed allowable "
5974 "limits for format'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005975 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06005976 }
5977}
5978
Karl Schultz6addd812016-02-02 17:17:23 -07005979TEST_F(VkLayerTest, UpdateBufferAlignment) {
5980 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06005981
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005983 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005984
Mike Stroyana3082432015-09-25 13:39:21 -06005985 ASSERT_NO_FATAL_FAILURE(InitState());
5986
5987 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
5988 vk_testing::Buffer buffer;
5989 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
5990
5991 BeginCommandBuffer();
5992 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005993 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005994 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005995 FAIL() << "Did not receive Error 'vkCommandUpdateBuffer parameter, "
5996 "VkDeviceSize dstOffset, is not a multiple of 4'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005997 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06005998 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005999
Mike Stroyana3082432015-09-25 13:39:21 -06006000 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006001 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006002 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006003
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006004 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006005
6006 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006007 FAIL() << "Did not receive Error 'vkCommandUpdateBuffer parameter, "
6008 "VkDeviceSize dataSize, is not a multiple of 4'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006009 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006010 }
6011 EndCommandBuffer();
6012}
6013
Karl Schultz6addd812016-02-02 17:17:23 -07006014TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006015 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006016 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06006017
6018 ASSERT_NO_FATAL_FAILURE(InitState());
6019
6020 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
6021 vk_testing::Buffer buffer;
6022 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
6023
6024 BeginCommandBuffer();
6025 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006026 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006027 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006028 FAIL() << "Did not receive Error 'vkCommandFillBuffer parameter, "
6029 "VkDeviceSize dstOffset, is not a multiple of 4'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006030 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006031 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006032
Mike Stroyana3082432015-09-25 13:39:21 -06006033 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006034 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006035 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006036
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006037 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006038
6039 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006040 FAIL() << "Did not receive Error 'vkCommandFillBuffer parameter, "
6041 "VkDeviceSize size, is not a multiple of 4'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006042 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006043 }
6044 EndCommandBuffer();
6045}
6046
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006047#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12006048
Tobin Ehliscde08892015-09-22 10:11:37 -06006049#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006050TEST_F(VkLayerTest, InvalidImageView) {
6051 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06006052
Karl Schultz6addd812016-02-02 17:17:23 -07006053 m_errorMonitor->SetDesiredFailureMsg(
6054 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006055 "vkCreateImageView called with baseMipLevel 10 ");
6056
Tobin Ehliscde08892015-09-22 10:11:37 -06006057 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06006058
Mike Stroyana3082432015-09-25 13:39:21 -06006059 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07006060 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06006061
Karl Schultz6addd812016-02-02 17:17:23 -07006062 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6063 const int32_t tex_width = 32;
6064 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06006065
6066 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006067 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6068 image_create_info.pNext = NULL;
6069 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6070 image_create_info.format = tex_format;
6071 image_create_info.extent.width = tex_width;
6072 image_create_info.extent.height = tex_height;
6073 image_create_info.extent.depth = 1;
6074 image_create_info.mipLevels = 1;
6075 image_create_info.arrayLayers = 1;
6076 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6077 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6078 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6079 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06006080
Chia-I Wuf7458c52015-10-26 21:10:41 +08006081 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06006082 ASSERT_VK_SUCCESS(err);
6083
6084 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006085 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6086 image_view_create_info.image = image;
6087 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6088 image_view_create_info.format = tex_format;
6089 image_view_create_info.subresourceRange.layerCount = 1;
6090 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
6091 image_view_create_info.subresourceRange.levelCount = 1;
6092 image_view_create_info.subresourceRange.aspectMask =
6093 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06006094
6095 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07006096 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
6097 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06006098
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006099 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006100 FAIL() << "Did not receive Error 'vkCreateImageView called with "
6101 "baseMipLevel 10...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006102 m_errorMonitor->DumpFailureMsgs();
Tobin Ehliscde08892015-09-22 10:11:37 -06006103 }
6104}
Mike Stroyana3082432015-09-25 13:39:21 -06006105
Karl Schultz6addd812016-02-02 17:17:23 -07006106TEST_F(VkLayerTest, InvalidImageViewAspect) {
6107 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006108
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006109 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006110 "vkCreateImageView: Color image "
6111 "formats must have ONLY the "
6112 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006113
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006114 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006115
6116 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07006117 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006118
Karl Schultz6addd812016-02-02 17:17:23 -07006119 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6120 const int32_t tex_width = 32;
6121 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006122
6123 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006124 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6125 image_create_info.pNext = NULL;
6126 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6127 image_create_info.format = tex_format;
6128 image_create_info.extent.width = tex_width;
6129 image_create_info.extent.height = tex_height;
6130 image_create_info.extent.depth = 1;
6131 image_create_info.mipLevels = 1;
6132 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6133 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6134 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6135 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006136
Chia-I Wuf7458c52015-10-26 21:10:41 +08006137 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006138 ASSERT_VK_SUCCESS(err);
6139
6140 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006141 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6142 image_view_create_info.image = image;
6143 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6144 image_view_create_info.format = tex_format;
6145 image_view_create_info.subresourceRange.baseMipLevel = 0;
6146 image_view_create_info.subresourceRange.levelCount = 1;
6147 // Cause an error by setting an invalid image aspect
6148 image_view_create_info.subresourceRange.aspectMask =
6149 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006150
6151 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07006152 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
6153 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006154
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006155 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006156 FAIL() << "Did not receive Error 'VkCreateImageView: Color image "
6157 "formats must have ...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006158 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006159 }
6160}
6161
Karl Schultz6addd812016-02-02 17:17:23 -07006162TEST_F(VkLayerTest, CopyImageTypeMismatch) {
6163 VkResult err;
6164 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006165
Karl Schultz6addd812016-02-02 17:17:23 -07006166 m_errorMonitor->SetDesiredFailureMsg(
6167 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006168 "vkCmdCopyImage called with unmatched source and dest image types");
6169
Mike Stroyana3082432015-09-25 13:39:21 -06006170 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006171
6172 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006173 VkImage srcImage;
6174 VkImage dstImage;
6175 VkDeviceMemory srcMem;
6176 VkDeviceMemory destMem;
6177 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006178
6179 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006180 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6181 image_create_info.pNext = NULL;
6182 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6183 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6184 image_create_info.extent.width = 32;
6185 image_create_info.extent.height = 32;
6186 image_create_info.extent.depth = 1;
6187 image_create_info.mipLevels = 1;
6188 image_create_info.arrayLayers = 1;
6189 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6190 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6191 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6192 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006193
Karl Schultz6addd812016-02-02 17:17:23 -07006194 err =
6195 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006196 ASSERT_VK_SUCCESS(err);
6197
Karl Schultz6addd812016-02-02 17:17:23 -07006198 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6199 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006200
Karl Schultz6addd812016-02-02 17:17:23 -07006201 err =
6202 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006203 ASSERT_VK_SUCCESS(err);
6204
6205 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006206 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006207 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6208 memAlloc.pNext = NULL;
6209 memAlloc.allocationSize = 0;
6210 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006211
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006212 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006213 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006214 pass =
6215 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006216 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006217 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006218 ASSERT_VK_SUCCESS(err);
6219
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006220 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006221 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006222 pass =
6223 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006224 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006225 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006226 ASSERT_VK_SUCCESS(err);
6227
6228 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6229 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006230 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006231 ASSERT_VK_SUCCESS(err);
6232
6233 BeginCommandBuffer();
6234 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006235 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006236 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006237 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006238 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006239 copyRegion.srcOffset.x = 0;
6240 copyRegion.srcOffset.y = 0;
6241 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006242 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006243 copyRegion.dstSubresource.mipLevel = 0;
6244 copyRegion.dstSubresource.baseArrayLayer = 0;
6245 copyRegion.dstSubresource.layerCount = 0;
6246 copyRegion.dstOffset.x = 0;
6247 copyRegion.dstOffset.y = 0;
6248 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006249 copyRegion.extent.width = 1;
6250 copyRegion.extent.height = 1;
6251 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006252 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6253 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006254 EndCommandBuffer();
6255
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006256 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006257 FAIL() << "Did not receive Error 'vkCmdCopyImage called with unmatched "
6258 "source and dest image types'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006259 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006260 }
6261
Chia-I Wuf7458c52015-10-26 21:10:41 +08006262 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006263 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006264 vkFreeMemory(m_device->device(), srcMem, NULL);
6265 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006266}
6267
Karl Schultz6addd812016-02-02 17:17:23 -07006268TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
6269 // TODO : Create two images with different format sizes and vkCmdCopyImage
6270 // between them
Mike Stroyana3082432015-09-25 13:39:21 -06006271}
6272
Karl Schultz6addd812016-02-02 17:17:23 -07006273TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
6274 VkResult err;
6275 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006276
Karl Schultz6addd812016-02-02 17:17:23 -07006277 m_errorMonitor->SetDesiredFailureMsg(
6278 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006279 "vkCmdCopyImage called with unmatched source and dest image types");
6280
Mike Stroyana3082432015-09-25 13:39:21 -06006281 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006282
6283 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006284 VkImage srcImage;
6285 VkImage dstImage;
6286 VkDeviceMemory srcMem;
6287 VkDeviceMemory destMem;
6288 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006289
6290 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006291 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6292 image_create_info.pNext = NULL;
6293 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6294 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6295 image_create_info.extent.width = 32;
6296 image_create_info.extent.height = 32;
6297 image_create_info.extent.depth = 1;
6298 image_create_info.mipLevels = 1;
6299 image_create_info.arrayLayers = 1;
6300 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6301 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6302 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6303 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006304
Karl Schultz6addd812016-02-02 17:17:23 -07006305 err =
6306 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006307 ASSERT_VK_SUCCESS(err);
6308
Karl Schultz6addd812016-02-02 17:17:23 -07006309 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6310 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6311 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006312
Karl Schultz6addd812016-02-02 17:17:23 -07006313 err =
6314 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006315 ASSERT_VK_SUCCESS(err);
6316
6317 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006318 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006319 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6320 memAlloc.pNext = NULL;
6321 memAlloc.allocationSize = 0;
6322 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006323
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006324 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006325 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006326 pass =
6327 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006328 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006329 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006330 ASSERT_VK_SUCCESS(err);
6331
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006332 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006333 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006334 pass =
6335 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006336 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006337 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006338 ASSERT_VK_SUCCESS(err);
6339
6340 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6341 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006342 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006343 ASSERT_VK_SUCCESS(err);
6344
6345 BeginCommandBuffer();
6346 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006347 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006348 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006349 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006350 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006351 copyRegion.srcOffset.x = 0;
6352 copyRegion.srcOffset.y = 0;
6353 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006354 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006355 copyRegion.dstSubresource.mipLevel = 0;
6356 copyRegion.dstSubresource.baseArrayLayer = 0;
6357 copyRegion.dstSubresource.layerCount = 0;
6358 copyRegion.dstOffset.x = 0;
6359 copyRegion.dstOffset.y = 0;
6360 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006361 copyRegion.extent.width = 1;
6362 copyRegion.extent.height = 1;
6363 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006364 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6365 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006366 EndCommandBuffer();
6367
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006368 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006369 FAIL() << "Did not receive Error 'vkCmdCopyImage called with unmatched "
6370 "source and dest image types'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006371 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006372 }
6373
Chia-I Wuf7458c52015-10-26 21:10:41 +08006374 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006375 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006376 vkFreeMemory(m_device->device(), srcMem, NULL);
6377 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006378}
6379
Karl Schultz6addd812016-02-02 17:17:23 -07006380TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
6381 VkResult err;
6382 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006383
Karl Schultz6addd812016-02-02 17:17:23 -07006384 m_errorMonitor->SetDesiredFailureMsg(
6385 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006386 "vkCmdResolveImage called with source sample count less than 2.");
6387
Mike Stroyana3082432015-09-25 13:39:21 -06006388 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006389
6390 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07006391 VkImage srcImage;
6392 VkImage dstImage;
6393 VkDeviceMemory srcMem;
6394 VkDeviceMemory destMem;
6395 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006396
6397 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006398 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6399 image_create_info.pNext = NULL;
6400 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6401 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6402 image_create_info.extent.width = 32;
6403 image_create_info.extent.height = 1;
6404 image_create_info.extent.depth = 1;
6405 image_create_info.mipLevels = 1;
6406 image_create_info.arrayLayers = 1;
6407 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6408 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6409 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6410 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006411
Karl Schultz6addd812016-02-02 17:17:23 -07006412 err =
6413 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006414 ASSERT_VK_SUCCESS(err);
6415
Karl Schultz6addd812016-02-02 17:17:23 -07006416 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6417 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006418
Karl Schultz6addd812016-02-02 17:17:23 -07006419 err =
6420 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006421 ASSERT_VK_SUCCESS(err);
6422
6423 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006424 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006425 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6426 memAlloc.pNext = NULL;
6427 memAlloc.allocationSize = 0;
6428 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006429
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006430 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006431 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006432 pass =
6433 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006434 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006435 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006436 ASSERT_VK_SUCCESS(err);
6437
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006438 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006439 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006440 pass =
6441 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006442 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006443 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006444 ASSERT_VK_SUCCESS(err);
6445
6446 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6447 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006448 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006449 ASSERT_VK_SUCCESS(err);
6450
6451 BeginCommandBuffer();
6452 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006453 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6454 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006455 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006456 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006457 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006458 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006459 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006460 resolveRegion.srcOffset.x = 0;
6461 resolveRegion.srcOffset.y = 0;
6462 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006463 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006464 resolveRegion.dstSubresource.mipLevel = 0;
6465 resolveRegion.dstSubresource.baseArrayLayer = 0;
6466 resolveRegion.dstSubresource.layerCount = 0;
6467 resolveRegion.dstOffset.x = 0;
6468 resolveRegion.dstOffset.y = 0;
6469 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006470 resolveRegion.extent.width = 1;
6471 resolveRegion.extent.height = 1;
6472 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006473 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6474 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006475 EndCommandBuffer();
6476
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006477 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006478 FAIL() << "Did not receive Error 'vkCmdResolveImage called with source "
6479 "sample count less than 2.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006480 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006481 }
6482
Chia-I Wuf7458c52015-10-26 21:10:41 +08006483 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006484 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006485 vkFreeMemory(m_device->device(), srcMem, NULL);
6486 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006487}
6488
Karl Schultz6addd812016-02-02 17:17:23 -07006489TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
6490 VkResult err;
6491 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006492
Karl Schultz6addd812016-02-02 17:17:23 -07006493 m_errorMonitor->SetDesiredFailureMsg(
6494 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006495 "vkCmdResolveImage called with dest sample count greater than 1.");
6496
Mike Stroyana3082432015-09-25 13:39:21 -06006497 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006498
6499 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07006500 VkImage srcImage;
6501 VkImage dstImage;
6502 VkDeviceMemory srcMem;
6503 VkDeviceMemory destMem;
6504 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006505
6506 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006507 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6508 image_create_info.pNext = NULL;
6509 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6510 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6511 image_create_info.extent.width = 32;
6512 image_create_info.extent.height = 1;
6513 image_create_info.extent.depth = 1;
6514 image_create_info.mipLevels = 1;
6515 image_create_info.arrayLayers = 1;
6516 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6517 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6518 // Note: Some implementations expect color attachment usage for any
6519 // multisample surface
6520 image_create_info.usage =
6521 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6522 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006523
Karl Schultz6addd812016-02-02 17:17:23 -07006524 err =
6525 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006526 ASSERT_VK_SUCCESS(err);
6527
Karl Schultz6addd812016-02-02 17:17:23 -07006528 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6529 // Note: Some implementations expect color attachment usage for any
6530 // multisample surface
6531 image_create_info.usage =
6532 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006533
Karl Schultz6addd812016-02-02 17:17:23 -07006534 err =
6535 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006536 ASSERT_VK_SUCCESS(err);
6537
6538 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006539 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006540 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6541 memAlloc.pNext = NULL;
6542 memAlloc.allocationSize = 0;
6543 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006544
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006545 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006546 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006547 pass =
6548 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006549 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006550 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006551 ASSERT_VK_SUCCESS(err);
6552
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006553 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006554 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006555 pass =
6556 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006557 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006558 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006559 ASSERT_VK_SUCCESS(err);
6560
6561 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6562 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006563 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006564 ASSERT_VK_SUCCESS(err);
6565
6566 BeginCommandBuffer();
6567 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006568 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6569 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006570 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006571 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006572 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006573 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006574 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006575 resolveRegion.srcOffset.x = 0;
6576 resolveRegion.srcOffset.y = 0;
6577 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006578 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006579 resolveRegion.dstSubresource.mipLevel = 0;
6580 resolveRegion.dstSubresource.baseArrayLayer = 0;
6581 resolveRegion.dstSubresource.layerCount = 0;
6582 resolveRegion.dstOffset.x = 0;
6583 resolveRegion.dstOffset.y = 0;
6584 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006585 resolveRegion.extent.width = 1;
6586 resolveRegion.extent.height = 1;
6587 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006588 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6589 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006590 EndCommandBuffer();
6591
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006592 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006593 FAIL() << "Did not receive Error 'vkCmdResolveImage called with dest "
6594 "sample count greater than 1.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006595 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006596 }
6597
Chia-I Wuf7458c52015-10-26 21:10:41 +08006598 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006599 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006600 vkFreeMemory(m_device->device(), srcMem, NULL);
6601 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006602}
6603
Karl Schultz6addd812016-02-02 17:17:23 -07006604TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
6605 VkResult err;
6606 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006607
Karl Schultz6addd812016-02-02 17:17:23 -07006608 m_errorMonitor->SetDesiredFailureMsg(
6609 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006610 "vkCmdResolveImage called with unmatched source and dest formats.");
6611
Mike Stroyana3082432015-09-25 13:39:21 -06006612 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006613
6614 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006615 VkImage srcImage;
6616 VkImage dstImage;
6617 VkDeviceMemory srcMem;
6618 VkDeviceMemory destMem;
6619 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006620
6621 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006622 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6623 image_create_info.pNext = NULL;
6624 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6625 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6626 image_create_info.extent.width = 32;
6627 image_create_info.extent.height = 1;
6628 image_create_info.extent.depth = 1;
6629 image_create_info.mipLevels = 1;
6630 image_create_info.arrayLayers = 1;
6631 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6632 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6633 // Note: Some implementations expect color attachment usage for any
6634 // multisample surface
6635 image_create_info.usage =
6636 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6637 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006638
Karl Schultz6addd812016-02-02 17:17:23 -07006639 err =
6640 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006641 ASSERT_VK_SUCCESS(err);
6642
Karl Schultz6addd812016-02-02 17:17:23 -07006643 // Set format to something other than source image
6644 image_create_info.format = VK_FORMAT_R32_SFLOAT;
6645 // Note: Some implementations expect color attachment usage for any
6646 // multisample surface
6647 image_create_info.usage =
6648 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6649 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006650
Karl Schultz6addd812016-02-02 17:17:23 -07006651 err =
6652 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006653 ASSERT_VK_SUCCESS(err);
6654
6655 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006656 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006657 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6658 memAlloc.pNext = NULL;
6659 memAlloc.allocationSize = 0;
6660 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006661
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006662 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006663 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006664 pass =
6665 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006666 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006667 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006668 ASSERT_VK_SUCCESS(err);
6669
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006670 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006671 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006672 pass =
6673 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006674 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006675 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006676 ASSERT_VK_SUCCESS(err);
6677
6678 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6679 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006680 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006681 ASSERT_VK_SUCCESS(err);
6682
6683 BeginCommandBuffer();
6684 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006685 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6686 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006687 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006688 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006689 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006690 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006691 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006692 resolveRegion.srcOffset.x = 0;
6693 resolveRegion.srcOffset.y = 0;
6694 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006695 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006696 resolveRegion.dstSubresource.mipLevel = 0;
6697 resolveRegion.dstSubresource.baseArrayLayer = 0;
6698 resolveRegion.dstSubresource.layerCount = 0;
6699 resolveRegion.dstOffset.x = 0;
6700 resolveRegion.dstOffset.y = 0;
6701 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006702 resolveRegion.extent.width = 1;
6703 resolveRegion.extent.height = 1;
6704 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006705 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6706 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006707 EndCommandBuffer();
6708
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006709 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006710 FAIL() << "Did not receive Error 'vkCmdResolveImage called with "
6711 "unmatched source and dest formats.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006712 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006713 }
6714
Chia-I Wuf7458c52015-10-26 21:10:41 +08006715 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006716 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006717 vkFreeMemory(m_device->device(), srcMem, NULL);
6718 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006719}
6720
Karl Schultz6addd812016-02-02 17:17:23 -07006721TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
6722 VkResult err;
6723 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006724
Karl Schultz6addd812016-02-02 17:17:23 -07006725 m_errorMonitor->SetDesiredFailureMsg(
6726 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006727 "vkCmdResolveImage called with unmatched source and dest image types.");
6728
Mike Stroyana3082432015-09-25 13:39:21 -06006729 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006730
6731 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006732 VkImage srcImage;
6733 VkImage dstImage;
6734 VkDeviceMemory srcMem;
6735 VkDeviceMemory destMem;
6736 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006737
6738 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006739 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6740 image_create_info.pNext = NULL;
6741 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6742 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6743 image_create_info.extent.width = 32;
6744 image_create_info.extent.height = 1;
6745 image_create_info.extent.depth = 1;
6746 image_create_info.mipLevels = 1;
6747 image_create_info.arrayLayers = 1;
6748 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6749 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6750 // Note: Some implementations expect color attachment usage for any
6751 // multisample surface
6752 image_create_info.usage =
6753 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6754 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006755
Karl Schultz6addd812016-02-02 17:17:23 -07006756 err =
6757 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006758 ASSERT_VK_SUCCESS(err);
6759
Karl Schultz6addd812016-02-02 17:17:23 -07006760 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6761 // Note: Some implementations expect color attachment usage for any
6762 // multisample surface
6763 image_create_info.usage =
6764 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6765 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006766
Karl Schultz6addd812016-02-02 17:17:23 -07006767 err =
6768 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006769 ASSERT_VK_SUCCESS(err);
6770
6771 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006772 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006773 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6774 memAlloc.pNext = NULL;
6775 memAlloc.allocationSize = 0;
6776 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006777
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006778 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006779 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006780 pass =
6781 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006782 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006783 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006784 ASSERT_VK_SUCCESS(err);
6785
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006786 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006787 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006788 pass =
6789 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006790 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006791 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006792 ASSERT_VK_SUCCESS(err);
6793
6794 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6795 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006796 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006797 ASSERT_VK_SUCCESS(err);
6798
6799 BeginCommandBuffer();
6800 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006801 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6802 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006803 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006804 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006805 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006806 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006807 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006808 resolveRegion.srcOffset.x = 0;
6809 resolveRegion.srcOffset.y = 0;
6810 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006811 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006812 resolveRegion.dstSubresource.mipLevel = 0;
6813 resolveRegion.dstSubresource.baseArrayLayer = 0;
6814 resolveRegion.dstSubresource.layerCount = 0;
6815 resolveRegion.dstOffset.x = 0;
6816 resolveRegion.dstOffset.y = 0;
6817 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006818 resolveRegion.extent.width = 1;
6819 resolveRegion.extent.height = 1;
6820 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006821 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6822 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006823 EndCommandBuffer();
6824
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006825 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006826 FAIL() << "Did not receive Error 'vkCmdResolveImage called with "
6827 "unmatched source and dest image types.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006828 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006829 }
6830
Chia-I Wuf7458c52015-10-26 21:10:41 +08006831 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006832 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006833 vkFreeMemory(m_device->device(), srcMem, NULL);
6834 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006835}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006836
Karl Schultz6addd812016-02-02 17:17:23 -07006837TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006838 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07006839 // to using a DS format, then cause it to hit error due to COLOR_BIT not
6840 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006841 // The image format check comes 2nd in validation so we trigger it first,
6842 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07006843 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006844
Karl Schultz6addd812016-02-02 17:17:23 -07006845 m_errorMonitor->SetDesiredFailureMsg(
6846 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006847 "Combination depth/stencil image formats can have only the ");
6848
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006849 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006850
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006851 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006852 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
6853 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006854
6855 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006856 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6857 ds_pool_ci.pNext = NULL;
6858 ds_pool_ci.maxSets = 1;
6859 ds_pool_ci.poolSizeCount = 1;
6860 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006861
6862 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006863 err =
6864 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006865 ASSERT_VK_SUCCESS(err);
6866
6867 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006868 dsl_binding.binding = 0;
6869 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
6870 dsl_binding.descriptorCount = 1;
6871 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6872 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006873
6874 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006875 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6876 ds_layout_ci.pNext = NULL;
6877 ds_layout_ci.bindingCount = 1;
6878 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006879 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006880 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6881 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006882 ASSERT_VK_SUCCESS(err);
6883
6884 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006885 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006886 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006887 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006888 alloc_info.descriptorPool = ds_pool;
6889 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006890 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6891 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006892 ASSERT_VK_SUCCESS(err);
6893
Karl Schultz6addd812016-02-02 17:17:23 -07006894 VkImage image_bad;
6895 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006896 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07006897 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006898 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07006899 const int32_t tex_width = 32;
6900 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006901
6902 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006903 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6904 image_create_info.pNext = NULL;
6905 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6906 image_create_info.format = tex_format_bad;
6907 image_create_info.extent.width = tex_width;
6908 image_create_info.extent.height = tex_height;
6909 image_create_info.extent.depth = 1;
6910 image_create_info.mipLevels = 1;
6911 image_create_info.arrayLayers = 1;
6912 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6913 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6914 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
6915 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
6916 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006917
Karl Schultz6addd812016-02-02 17:17:23 -07006918 err =
6919 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006920 ASSERT_VK_SUCCESS(err);
6921 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07006922 image_create_info.usage =
6923 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6924 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
6925 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006926 ASSERT_VK_SUCCESS(err);
6927
6928 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006929 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6930 image_view_create_info.image = image_bad;
6931 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6932 image_view_create_info.format = tex_format_bad;
6933 image_view_create_info.subresourceRange.baseArrayLayer = 0;
6934 image_view_create_info.subresourceRange.baseMipLevel = 0;
6935 image_view_create_info.subresourceRange.layerCount = 1;
6936 image_view_create_info.subresourceRange.levelCount = 1;
6937 image_view_create_info.subresourceRange.aspectMask =
6938 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006939
6940 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07006941 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
6942 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006943
6944 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006945 FAIL() << "Did not receive Error 'Combination depth-stencil image "
6946 "formats can have only the....'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006947 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006948 }
6949
Chia-I Wuf7458c52015-10-26 21:10:41 +08006950 vkDestroyImage(m_device->device(), image_bad, NULL);
6951 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006952 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6953 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006954}
Tobin Ehliscde08892015-09-22 10:11:37 -06006955#endif // IMAGE_TESTS
6956
Tony Barbour300a6082015-04-07 13:44:53 -06006957int main(int argc, char **argv) {
6958 int result;
6959
6960 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06006961 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06006962
6963 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
6964
6965 result = RUN_ALL_TESTS();
6966
Tony Barbour6918cd52015-04-09 12:58:51 -06006967 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06006968 return result;
6969}