blob: 41feb92105a12a13062011d67fc8bdc929de57d6 [file] [log] [blame]
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001#include <vulkan.h>
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002#include "vk_debug_report_lunarg.h"
Tony Barbour30486ea2015-04-07 13:44:53 -06003#include "gtest-1.7.0/include/gtest/gtest.h"
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06004#include "vkrenderframework.h"
Tobin Ehlis56d204a2015-07-03 10:15:26 -06005#include "vk_layer_config.h"
Tony Barbour30486ea2015-04-07 13:44:53 -06006
Mark Lobodzinski5f25be42015-05-14 15:08:13 -05007#define GLM_FORCE_RADIANS
8#include "glm/glm.hpp"
9#include <glm/gtc/matrix_transform.hpp>
10
Tobin Ehlis57e6a612015-05-26 16:11:58 -060011#define MEM_TRACKER_TESTS 1
12#define OBJ_TRACKER_TESTS 1
13#define DRAW_STATE_TESTS 1
14#define THREADING_TESTS 1
Chris Forbes5af3bf22015-05-25 11:13:08 +120015#define SHADER_CHECKER_TESTS 1
Tobin Ehlis57e6a612015-05-26 16:11:58 -060016
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050017//--------------------------------------------------------------------------------------
18// Mesh and VertexFormat Data
19//--------------------------------------------------------------------------------------
20struct Vertex
21{
22 float posX, posY, posZ, posW; // Position data
23 float r, g, b, a; // Color
24};
25
26#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
27
28typedef enum _BsoFailSelect {
29 BsoFailNone = 0x00000000,
30 BsoFailRaster = 0x00000001,
31 BsoFailViewport = 0x00000002,
32 BsoFailColorBlend = 0x00000004,
33 BsoFailDepthStencil = 0x00000008,
34} BsoFailSelect;
35
36struct vktriangle_vs_uniform {
37 // Must start with MVP
38 float mvp[4][4];
39 float position[3][4];
40 float color[3][4];
41};
42
Mark Lobodzinski6bbdff12015-06-02 09:41:30 -050043static const char bindStateVertShaderText[] =
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050044 "#version 130\n"
45 "vec2 vertices[3];\n"
46 "void main() {\n"
47 " vertices[0] = vec2(-1.0, -1.0);\n"
48 " vertices[1] = vec2( 1.0, -1.0);\n"
49 " vertices[2] = vec2( 0.0, 1.0);\n"
50 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
51 "}\n";
52
Mark Lobodzinski6bbdff12015-06-02 09:41:30 -050053static const char bindStateFragShaderText[] =
Cody Northrop74a2d2c2015-06-16 17:32:04 -060054 "#version 140\n"
55 "#extension GL_ARB_separate_shader_objects: require\n"
56 "#extension GL_ARB_shading_language_420pack: require\n"
57 "\n"
58 "layout(location = 0) out vec4 uFragColor;\n"
59 "void main(){\n"
60 " uFragColor = vec4(0,1,0,1);\n"
61 "}\n";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050062
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060063static void myDbgFunc(
64 VkFlags msgFlags,
65 VkObjectType objType,
66 VkObject srcObject,
67 size_t location,
68 int32_t msgCode,
69 const char* pLayerPrefix,
70 const char* pMsg,
71 void* pUserData);
Tony Barbour30486ea2015-04-07 13:44:53 -060072
73class ErrorMonitor {
74public:
Tony Barbour0c1bdc62015-04-29 17:34:29 -060075 ErrorMonitor()
Tony Barbour30486ea2015-04-07 13:44:53 -060076 {
Mike Stroyan09aae812015-05-12 16:00:45 -060077 pthread_mutexattr_t attr;
78 pthread_mutexattr_init(&attr);
79 pthread_mutex_init(&m_mutex, &attr);
80 pthread_mutex_lock(&m_mutex);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060081 m_msgFlags = VK_DBG_REPORT_INFO_BIT;
Mike Stroyan09aae812015-05-12 16:00:45 -060082 m_bailout = NULL;
83 pthread_mutex_unlock(&m_mutex);
Tony Barbour30486ea2015-04-07 13:44:53 -060084 }
85 void ClearState()
86 {
Mike Stroyan09aae812015-05-12 16:00:45 -060087 pthread_mutex_lock(&m_mutex);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060088 m_msgFlags = VK_DBG_REPORT_INFO_BIT;
Tony Barbour30486ea2015-04-07 13:44:53 -060089 m_msgString.clear();
Mike Stroyan09aae812015-05-12 16:00:45 -060090 pthread_mutex_unlock(&m_mutex);
Tony Barbour30486ea2015-04-07 13:44:53 -060091 }
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060092 VkFlags GetState(std::string *msgString)
Tony Barbour30486ea2015-04-07 13:44:53 -060093 {
Mike Stroyan09aae812015-05-12 16:00:45 -060094 pthread_mutex_lock(&m_mutex);
Tony Barbour30486ea2015-04-07 13:44:53 -060095 *msgString = m_msgString;
Mike Stroyan09aae812015-05-12 16:00:45 -060096 pthread_mutex_unlock(&m_mutex);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060097 return m_msgFlags;
Tony Barbour30486ea2015-04-07 13:44:53 -060098 }
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060099 void SetState(VkFlags msgFlags, const char *msgString)
Tony Barbour30486ea2015-04-07 13:44:53 -0600100 {
Mike Stroyan09aae812015-05-12 16:00:45 -0600101 pthread_mutex_lock(&m_mutex);
102 if (m_bailout != NULL) {
103 *m_bailout = true;
104 }
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600105 m_msgFlags = msgFlags;
Tony Barbour8508b8e2015-04-09 10:48:04 -0600106 m_msgString.reserve(strlen(msgString));
107 m_msgString = msgString;
Mike Stroyan09aae812015-05-12 16:00:45 -0600108 pthread_mutex_unlock(&m_mutex);
109 }
110 void SetBailout(bool *bailout)
111 {
112 m_bailout = bailout;
Tony Barbour30486ea2015-04-07 13:44:53 -0600113 }
114
115private:
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600116 VkFlags m_msgFlags;
Mike Stroyan09aae812015-05-12 16:00:45 -0600117 std::string m_msgString;
118 pthread_mutex_t m_mutex;
119 bool* m_bailout;
Tony Barbour30486ea2015-04-07 13:44:53 -0600120};
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500121
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600122static void myDbgFunc(
123 VkFlags msgFlags,
124 VkObjectType objType,
125 VkObject srcObject,
126 size_t location,
127 int32_t msgCode,
128 const char* pLayerPrefix,
129 const char* pMsg,
130 void* pUserData)
Tony Barbour30486ea2015-04-07 13:44:53 -0600131{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600132 if (msgFlags & (VK_DBG_REPORT_WARN_BIT | VK_DBG_REPORT_ERROR_BIT)) {
Tony Barbour8508b8e2015-04-09 10:48:04 -0600133 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600134 errMonitor->SetState(msgFlags, pMsg);
Tony Barbour8508b8e2015-04-09 10:48:04 -0600135 }
Tony Barbour30486ea2015-04-07 13:44:53 -0600136}
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500137
Tony Barbour01999182015-04-09 12:58:51 -0600138class VkLayerTest : public VkRenderFramework
Tony Barbour30486ea2015-04-07 13:44:53 -0600139{
140public:
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600141 VkResult BeginCommandBuffer(VkCommandBufferObj &cmdBuffer);
142 VkResult EndCommandBuffer(VkCommandBufferObj &cmdBuffer);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500143 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
144 void GenericDrawPreparation(VkCommandBufferObj *cmdBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask);
Tony Barbour30486ea2015-04-07 13:44:53 -0600145
146protected:
Tony Barbour01999182015-04-09 12:58:51 -0600147 VkMemoryRefManager m_memoryRefManager;
148 ErrorMonitor *m_errorMonitor;
Tony Barbour30486ea2015-04-07 13:44:53 -0600149
150 virtual void SetUp() {
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600151 std::vector<const char *> instance_layer_names;
152 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600153 std::vector<const char *> instance_extension_names;
154 std::vector<const char *> device_extension_names;
Tony Barbour950ebc02015-04-23 12:55:36 -0600155
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600156 instance_extension_names.push_back(DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterde53c5b2015-06-16 15:59:11 -0600157 /*
158 * Since CreateDbgMsgCallback is an instance level extension call
159 * any extension / layer that utilizes that feature also needs
160 * to be enabled at create instance time.
161 */
Mike Stroyaned254572015-06-17 16:32:06 -0600162 // Use Threading layer first to protect others from ThreadCmdBufferCollision test
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600163 instance_layer_names.push_back("Threading");
164 instance_layer_names.push_back("ObjectTracker");
165 instance_layer_names.push_back("MemTracker");
166 instance_layer_names.push_back("DrawState");
167 instance_layer_names.push_back("ShaderChecker");
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600168
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600169 device_layer_names.push_back("Threading");
170 device_layer_names.push_back("ObjectTracker");
171 device_layer_names.push_back("MemTracker");
172 device_layer_names.push_back("DrawState");
173 device_layer_names.push_back("ShaderChecker");
Tony Barbour30486ea2015-04-07 13:44:53 -0600174
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600175 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour30486ea2015-04-07 13:44:53 -0600176 this->app_info.pNext = NULL;
177 this->app_info.pAppName = "layer_tests";
178 this->app_info.appVersion = 1;
179 this->app_info.pEngineName = "unittest";
180 this->app_info.engineVersion = 1;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600181 this->app_info.apiVersion = VK_API_VERSION;
Tony Barbour30486ea2015-04-07 13:44:53 -0600182
Tony Barbour0c1bdc62015-04-29 17:34:29 -0600183 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600184 InitFramework(instance_layer_names, device_layer_names,
185 instance_extension_names, device_extension_names,
186 myDbgFunc, m_errorMonitor);
Tony Barbour30486ea2015-04-07 13:44:53 -0600187 }
188
189 virtual void TearDown() {
190 // Clean up resources before we reset
Tony Barbour30486ea2015-04-07 13:44:53 -0600191 ShutdownFramework();
Tony Barbour8508b8e2015-04-09 10:48:04 -0600192 delete m_errorMonitor;
Tony Barbour30486ea2015-04-07 13:44:53 -0600193 }
194};
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500195
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600196VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &cmdBuffer)
Tony Barbour30486ea2015-04-07 13:44:53 -0600197{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600198 VkResult result;
Tony Barbour30486ea2015-04-07 13:44:53 -0600199
200 result = cmdBuffer.BeginCommandBuffer();
201
202 /*
203 * For render test all drawing happens in a single render pass
204 * on a single command buffer.
205 */
Chris Forbesfe133ef2015-06-16 14:05:59 +1200206 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wuc278df82015-07-07 11:50:03 +0800207 cmdBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour30486ea2015-04-07 13:44:53 -0600208 }
209
210 return result;
211}
212
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600213VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &cmdBuffer)
Tony Barbour30486ea2015-04-07 13:44:53 -0600214{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600215 VkResult result;
Tony Barbour30486ea2015-04-07 13:44:53 -0600216
Chris Forbesfe133ef2015-06-16 14:05:59 +1200217 if (renderPass()) {
Chia-I Wu88eaa3b2015-06-26 15:34:39 +0800218 cmdBuffer.EndRenderPass();
Chris Forbesfe133ef2015-06-16 14:05:59 +1200219 }
Tony Barbour30486ea2015-04-07 13:44:53 -0600220
221 result = cmdBuffer.EndCommandBuffer();
222
223 return result;
224}
225
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500226void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask)
227{
228 // Create identity matrix
229 int i;
230 struct vktriangle_vs_uniform data;
231
232 glm::mat4 Projection = glm::mat4(1.0f);
233 glm::mat4 View = glm::mat4(1.0f);
234 glm::mat4 Model = glm::mat4(1.0f);
235 glm::mat4 MVP = Projection * View * Model;
236 const int matrixSize = sizeof(MVP);
237 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
238
239 memcpy(&data.mvp, &MVP[0][0], matrixSize);
240
241 static const Vertex tri_data[] =
242 {
243 { XYZ1( -1, -1, 0 ), XYZ1( 1.f, 0.f, 0.f ) },
244 { XYZ1( 1, -1, 0 ), XYZ1( 0.f, 1.f, 0.f ) },
245 { XYZ1( 0, 1, 0 ), XYZ1( 0.f, 0.f, 1.f ) },
246 };
247
248 for (i=0; i<3; i++) {
249 data.position[i][0] = tri_data[i].posX;
250 data.position[i][1] = tri_data[i].posY;
251 data.position[i][2] = tri_data[i].posZ;
252 data.position[i][3] = tri_data[i].posW;
253 data.color[i][0] = tri_data[i].r;
254 data.color[i][1] = tri_data[i].g;
255 data.color[i][2] = tri_data[i].b;
256 data.color[i][3] = tri_data[i].a;
257 }
258
259 ASSERT_NO_FATAL_FAILURE(InitState());
260 ASSERT_NO_FATAL_FAILURE(InitViewport());
261
262 VkConstantBufferObj constantBuffer(m_device, bufSize*2, sizeof(float), (const void*) &data);
263
264 VkShaderObj vs(m_device,vertShaderText,VK_SHADER_STAGE_VERTEX, this);
265 VkShaderObj ps(m_device,fragShaderText, VK_SHADER_STAGE_FRAGMENT, this);
266
267 VkPipelineObj pipelineobj(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +0800268 pipelineobj.AddColorAttachment();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500269 pipelineobj.AddShader(&vs);
270 pipelineobj.AddShader(&ps);
271
272 VkDescriptorSetObj descriptorSet(m_device);
273 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
274
275 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
276 VkCommandBufferObj cmdBuffer(m_device);
277 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
278
279 ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
280
281 GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet, failMask);
282
283 // render triangle
284 cmdBuffer.Draw(0, 3, 0, 1);
285
286 // finalize recording of the command buffer
287 EndCommandBuffer(cmdBuffer);
288
289 cmdBuffer.QueueCommandBuffer();
290}
291
292void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *cmdBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask)
293{
294 if (m_depthStencil->Initialized()) {
295 cmdBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
296 } else {
297 cmdBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
298 }
299
300 cmdBuffer->PrepareAttachments();
301 if ((failMask & BsoFailRaster) != BsoFailRaster) {
302 cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_RASTER, m_stateRaster);
303 }
304 if ((failMask & BsoFailViewport) != BsoFailViewport) {
305 cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_VIEWPORT, m_stateViewport);
306 }
307 if ((failMask & BsoFailColorBlend) != BsoFailColorBlend) {
308 cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_COLOR_BLEND, m_colorBlend);
309 }
310 if ((failMask & BsoFailDepthStencil) != BsoFailDepthStencil) {
311 cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_DEPTH_STENCIL, m_stateDepthStencil);
312 }
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600313 // Make sure depthWriteEnable is set so that DepthStencil fail test will work correctly
314 VkStencilOpState stencil = {
315 .stencilFailOp = VK_STENCIL_OP_KEEP,
316 .stencilPassOp = VK_STENCIL_OP_KEEP,
317 .stencilDepthFailOp = VK_STENCIL_OP_KEEP,
318 .stencilCompareOp = VK_COMPARE_OP_NEVER
319 };
320 VkPipelineDsStateCreateInfo ds_ci = {
321 .sType = VK_STRUCTURE_TYPE_PIPELINE_DS_STATE_CREATE_INFO,
322 .pNext = NULL,
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600323 .depthTestEnable = VK_FALSE,
324 .depthWriteEnable = VK_TRUE,
325 .depthCompareOp = VK_COMPARE_OP_NEVER,
326 .depthBoundsEnable = VK_FALSE,
327 .stencilTestEnable = VK_FALSE,
328 .front = stencil,
329 .back = stencil
330 };
331 pipelineobj.SetDepthStencil(&ds_ci);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500332 descriptorSet.CreateVKDescriptorSet(cmdBuffer);
Chia-I Wuc278df82015-07-07 11:50:03 +0800333 pipelineobj.CreateVKPipeline(descriptorSet, renderPass());
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500334 cmdBuffer->BindPipeline(pipelineobj);
335 cmdBuffer->BindDescriptorSet(descriptorSet);
336}
337
338// ********************************************************************************************************************
339// ********************************************************************************************************************
340// ********************************************************************************************************************
341// ********************************************************************************************************************
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600342#if MEM_TRACKER_TESTS
Mark Lobodzinski81078192015-05-19 10:28:29 -0500343TEST_F(VkLayerTest, CallResetCmdBufferBeforeCompletion)
344{
345 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600346 VkFlags msgFlags;
Mark Lobodzinski81078192015-05-19 10:28:29 -0500347 std::string msgString;
348
349 VkFenceCreateInfo fenceInfo = {};
350 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
351 fenceInfo.pNext = NULL;
352 fenceInfo.flags = 0;
353
354 ASSERT_NO_FATAL_FAILURE(InitState());
355 ASSERT_NO_FATAL_FAILURE(InitViewport());
356 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
357
358 VkCommandBufferObj cmdBuffer(m_device);
359 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
360
361 BeginCommandBuffer(cmdBuffer);
362 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
363 EndCommandBuffer(cmdBuffer);
364
365 testFence.init(*m_device, fenceInfo);
366
367 // Bypass framework since it does the waits automatically
368 VkResult err = VK_SUCCESS;
Chia-I Wua4992342015-07-03 11:45:55 +0800369 err = vkQueueSubmit( m_device->m_queue, 1, &cmdBuffer.obj(), testFence.handle());
Mark Lobodzinski81078192015-05-19 10:28:29 -0500370 ASSERT_VK_SUCCESS( err );
371
372 m_errorMonitor->ClearState();
373 // Introduce failure by calling begin again before checking fence
374 vkResetCommandBuffer(cmdBuffer.obj());
375
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600376 msgFlags = m_errorMonitor->GetState(&msgString);
377 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an err after calling ResetCommandBuffer on an active Command Buffer";
Mark Lobodzinski81078192015-05-19 10:28:29 -0500378 if (!strstr(msgString.c_str(),"Resetting CB")) {
379 FAIL() << "Error received was not 'Resetting CB (0xaddress) before it has completed. You must check CB flag before'";
380 }
381}
382
383TEST_F(VkLayerTest, CallBeginCmdBufferBeforeCompletion)
384{
385 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600386 VkFlags msgFlags;
Mark Lobodzinski81078192015-05-19 10:28:29 -0500387 std::string msgString;
388
389 VkFenceCreateInfo fenceInfo = {};
390 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
391 fenceInfo.pNext = NULL;
392 fenceInfo.flags = 0;
393
394 ASSERT_NO_FATAL_FAILURE(InitState());
395 ASSERT_NO_FATAL_FAILURE(InitViewport());
396 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
397
398 VkCommandBufferObj cmdBuffer(m_device);
399 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
400
401 BeginCommandBuffer(cmdBuffer);
402 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
403 EndCommandBuffer(cmdBuffer);
404
405 testFence.init(*m_device, fenceInfo);
406
407 // Bypass framework since it does the waits automatically
408 VkResult err = VK_SUCCESS;
Chia-I Wua4992342015-07-03 11:45:55 +0800409 err = vkQueueSubmit( m_device->m_queue, 1, &cmdBuffer.obj(), testFence.handle());
Mark Lobodzinski81078192015-05-19 10:28:29 -0500410 ASSERT_VK_SUCCESS( err );
411
412 m_errorMonitor->ClearState();
413 // Introduce failure by calling begin again before checking fence
414 BeginCommandBuffer(cmdBuffer);
415
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600416 msgFlags = m_errorMonitor->GetState(&msgString);
417 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an err after calling BeginCommandBuffer on an active Command Buffer";
Mark Lobodzinski81078192015-05-19 10:28:29 -0500418 if (!strstr(msgString.c_str(),"Calling vkBeginCommandBuffer() on active CB")) {
419 FAIL() << "Error received was not 'Calling vkBeginCommandBuffer() on an active CB (0xaddress) before it has completed'";
420 }
421}
422
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500423TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit)
424{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600425 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500426 std::string msgString;
427 VkResult err;
428
429 ASSERT_NO_FATAL_FAILURE(InitState());
430 m_errorMonitor->ClearState();
431
432 // Create an image, allocate memory, free it, and then try to bind it
433 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500434 VkDeviceMemory mem;
435 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500436
437 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
438 const int32_t tex_width = 32;
439 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500440
441 const VkImageCreateInfo image_create_info = {
442 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
443 .pNext = NULL,
444 .imageType = VK_IMAGE_TYPE_2D,
445 .format = tex_format,
446 .extent = { tex_width, tex_height, 1 },
447 .mipLevels = 1,
448 .arraySize = 1,
449 .samples = 1,
450 .tiling = VK_IMAGE_TILING_LINEAR,
451 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
452 .flags = 0,
453 };
454 VkMemoryAllocInfo mem_alloc = {
455 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
456 .pNext = NULL,
457 .allocationSize = 0,
458 // Introduce failure, do NOT set memProps to VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Mark Lobodzinski72346292015-07-02 16:49:40 -0600459 .memoryTypeIndex = 1,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500460 };
461
462 err = vkCreateImage(m_device->device(), &image_create_info, &image);
463 ASSERT_VK_SUCCESS(err);
464
Tony Barbour426b9052015-06-24 16:06:58 -0600465 err = vkGetObjectMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500466 VK_OBJECT_TYPE_IMAGE,
467 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500468 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500469 ASSERT_VK_SUCCESS(err);
470
Mark Lobodzinski23182612015-05-29 09:32:35 -0500471 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500472
473 // allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500474 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500475 ASSERT_VK_SUCCESS(err);
476
477 // Try to bind free memory that has been freed
Mark Lobodzinski23182612015-05-29 09:32:35 -0500478 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500479 ASSERT_VK_SUCCESS(err);
480
481 // Map memory as if to initialize the image
482 void *mappedAddress = NULL;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500483 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, &mappedAddress);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500484
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600485 msgFlags = m_errorMonitor->GetState(&msgString);
486 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error while tring to map memory not visible to CPU";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500487 if (!strstr(msgString.c_str(),"Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT")) {
488 FAIL() << "Error received did not match expected error message from vkMapMemory in MemTracker";
489 }
490}
491
492TEST_F(VkLayerTest, BindInvalidMemory)
493{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600494 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500495 std::string msgString;
496 VkResult err;
497
498 ASSERT_NO_FATAL_FAILURE(InitState());
499 m_errorMonitor->ClearState();
500
501 // Create an image, allocate memory, free it, and then try to bind it
502 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500503 VkDeviceMemory mem;
504 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500505
506 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
507 const int32_t tex_width = 32;
508 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500509
510 const VkImageCreateInfo image_create_info = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600511 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
512 .pNext = NULL,
513 .imageType = VK_IMAGE_TYPE_2D,
514 .format = tex_format,
515 .extent = { tex_width, tex_height, 1 },
516 .mipLevels = 1,
517 .arraySize = 1,
518 .samples = 1,
519 .tiling = VK_IMAGE_TILING_LINEAR,
520 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
521 .flags = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500522 };
523 VkMemoryAllocInfo mem_alloc = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600524 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
525 .pNext = NULL,
526 .allocationSize = 0,
527 .memoryTypeIndex = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500528 };
529
530 err = vkCreateImage(m_device->device(), &image_create_info, &image);
531 ASSERT_VK_SUCCESS(err);
532
Tony Barbour426b9052015-06-24 16:06:58 -0600533 err = vkGetObjectMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500534 VK_OBJECT_TYPE_IMAGE,
535 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500536 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500537 ASSERT_VK_SUCCESS(err);
538
Mark Lobodzinski23182612015-05-29 09:32:35 -0500539 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500540
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800541 err = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinski72346292015-07-02 16:49:40 -0600542 ASSERT_VK_SUCCESS(err);
543
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500544 // allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500545 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500546 ASSERT_VK_SUCCESS(err);
547
548 // Introduce validation failure, free memory before binding
Mark Lobodzinski23182612015-05-29 09:32:35 -0500549 vkFreeMemory(m_device->device(), mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500550 ASSERT_VK_SUCCESS(err);
551
552 // Try to bind free memory that has been freed
Mark Lobodzinski23182612015-05-29 09:32:35 -0500553 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500554 ASSERT_VK_SUCCESS(err);
555
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600556 msgFlags = m_errorMonitor->GetState(&msgString);
557 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error while tring to bind a freed memory object";
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500558 if (!strstr(msgString.c_str(),"couldn't find info for mem obj")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500559 FAIL() << "Error received did not match expected error message from BindObjectMemory in MemTracker";
560 }
561}
562
563TEST_F(VkLayerTest, FreeBoundMemory)
564{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600565 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500566 std::string msgString;
567 VkResult err;
568
569 ASSERT_NO_FATAL_FAILURE(InitState());
570 m_errorMonitor->ClearState();
571
572 // Create an image, allocate memory, free it, and then try to bind it
573 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500574 VkDeviceMemory mem;
575 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500576
577 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
578 const int32_t tex_width = 32;
579 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500580
581 const VkImageCreateInfo image_create_info = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600582 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
583 .pNext = NULL,
584 .imageType = VK_IMAGE_TYPE_2D,
585 .format = tex_format,
586 .extent = { tex_width, tex_height, 1 },
587 .mipLevels = 1,
588 .arraySize = 1,
589 .samples = 1,
590 .tiling = VK_IMAGE_TILING_LINEAR,
591 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
592 .flags = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500593 };
594 VkMemoryAllocInfo mem_alloc = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600595 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
596 .pNext = NULL,
597 .allocationSize = 0,
598 .memoryTypeIndex = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500599 };
600
601 err = vkCreateImage(m_device->device(), &image_create_info, &image);
602 ASSERT_VK_SUCCESS(err);
603
Tony Barbour426b9052015-06-24 16:06:58 -0600604 err = vkGetObjectMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500605 VK_OBJECT_TYPE_IMAGE,
606 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500607 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500608 ASSERT_VK_SUCCESS(err);
609
Mark Lobodzinski23182612015-05-29 09:32:35 -0500610 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500611
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800612 err = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinski72346292015-07-02 16:49:40 -0600613 ASSERT_VK_SUCCESS(err);
614
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500615 // allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500616 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500617 ASSERT_VK_SUCCESS(err);
618
619 // Bind memory to Image object
Mark Lobodzinski23182612015-05-29 09:32:35 -0500620 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500621 ASSERT_VK_SUCCESS(err);
622
623 // Introduce validation failure, free memory while still bound to object
Mark Lobodzinski23182612015-05-29 09:32:35 -0500624 vkFreeMemory(m_device->device(), mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500625 ASSERT_VK_SUCCESS(err);
626
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600627 msgFlags = m_errorMonitor->GetState(&msgString);
Courtney Goeltzenleuchter7dc4c8b2015-06-13 21:48:47 -0600628 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an warning while tring to free bound memory";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500629 if (!strstr(msgString.c_str(),"Freeing memory object while it still has references")) {
630 FAIL() << "Warning received did not match expected message from freeMemObjInfo in MemTracker";
631 }
632}
633
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500634TEST_F(VkLayerTest, RebindMemory)
635{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600636 VkFlags msgFlags;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500637 std::string msgString;
638 VkResult err;
639
640 ASSERT_NO_FATAL_FAILURE(InitState());
641 m_errorMonitor->ClearState();
642
643 // Create an image, allocate memory, free it, and then try to bind it
644 VkImage image;
645 VkDeviceMemory mem1;
646 VkDeviceMemory mem2;
647 VkMemoryRequirements mem_reqs;
648
649 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
650 const int32_t tex_width = 32;
651 const int32_t tex_height = 32;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500652
653 const VkImageCreateInfo image_create_info = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600654 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
655 .pNext = NULL,
656 .imageType = VK_IMAGE_TYPE_2D,
657 .format = tex_format,
658 .extent = { tex_width, tex_height, 1 },
659 .mipLevels = 1,
660 .arraySize = 1,
661 .samples = 1,
662 .tiling = VK_IMAGE_TILING_LINEAR,
663 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
664 .flags = 0,
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500665 };
666 VkMemoryAllocInfo mem_alloc = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600667 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
668 .pNext = NULL,
669 .allocationSize = 0,
670 .memoryTypeIndex = 0,
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500671 };
672
673 err = vkCreateImage(m_device->device(), &image_create_info, &image);
674 ASSERT_VK_SUCCESS(err);
675
Tony Barbour426b9052015-06-24 16:06:58 -0600676 err = vkGetObjectMemoryRequirements(m_device->device(),
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500677 VK_OBJECT_TYPE_IMAGE,
678 image,
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500679 &mem_reqs);
680 ASSERT_VK_SUCCESS(err);
681
682 mem_alloc.allocationSize = mem_reqs.size;
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800683 err = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinski72346292015-07-02 16:49:40 -0600684 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500685
686 // allocate 2 memory objects
687 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem1);
688 ASSERT_VK_SUCCESS(err);
689 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem2);
690 ASSERT_VK_SUCCESS(err);
691
692 // Bind first memory object to Image object
693 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem1, 0);
694 ASSERT_VK_SUCCESS(err);
695
696 // Introduce validation failure, try to bind a different memory object to the same image object
697 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem2, 0);
698 ASSERT_VK_SUCCESS(err);
699
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600700 msgFlags = m_errorMonitor->GetState(&msgString);
701 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error while tring to rebind an object";
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500702 if (!strstr(msgString.c_str(),"which has already been bound to mem object")) {
703 FAIL() << "Error received did not match expected message when rebinding memory to an object";
704 }
705}
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500706
707TEST_F(VkLayerTest, BindMemoryToDestroyedObject)
708{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600709 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500710 std::string msgString;
711 VkResult err;
712
713 ASSERT_NO_FATAL_FAILURE(InitState());
714 m_errorMonitor->ClearState();
715
716 // Create an image object, allocate memory, destroy the object and then try to bind it
717 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500718 VkDeviceMemory mem;
719 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500720
721 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
722 const int32_t tex_width = 32;
723 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500724
725 const VkImageCreateInfo image_create_info = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600726 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
727 .pNext = NULL,
728 .imageType = VK_IMAGE_TYPE_2D,
729 .format = tex_format,
730 .extent = { tex_width, tex_height, 1 },
731 .mipLevels = 1,
732 .arraySize = 1,
733 .samples = 1,
734 .tiling = VK_IMAGE_TILING_LINEAR,
735 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
736 .flags = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500737 };
738 VkMemoryAllocInfo mem_alloc = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600739 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
740 .pNext = NULL,
741 .allocationSize = 0,
742 .memoryTypeIndex = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500743 };
744
745 err = vkCreateImage(m_device->device(), &image_create_info, &image);
746 ASSERT_VK_SUCCESS(err);
747
Tony Barbour426b9052015-06-24 16:06:58 -0600748 err = vkGetObjectMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500749 VK_OBJECT_TYPE_IMAGE,
750 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500751 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500752 ASSERT_VK_SUCCESS(err);
753
Mark Lobodzinski23182612015-05-29 09:32:35 -0500754 mem_alloc.allocationSize = mem_reqs.size;
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800755 err = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinski72346292015-07-02 16:49:40 -0600756 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500757
758 // Allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500759 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500760 ASSERT_VK_SUCCESS(err);
761
762 // Introduce validation failure, destroy Image object before binding
763 vkDestroyObject(m_device->device(), VK_OBJECT_TYPE_IMAGE, image);
764 ASSERT_VK_SUCCESS(err);
765
766 // Now Try to bind memory to this destroyted object
Mark Lobodzinski23182612015-05-29 09:32:35 -0500767 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500768 ASSERT_VK_SUCCESS(err);
769
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600770 msgFlags = m_errorMonitor->GetState(&msgString);
771 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error while binding memory to a destroyed object";
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500772 if (!strstr(msgString.c_str(),"that's not in global list")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500773 FAIL() << "Error received did not match expected error message from updateObjectBinding in MemTracker";
774 }
775}
776
Tony Barbour8508b8e2015-04-09 10:48:04 -0600777TEST_F(VkLayerTest, SubmitSignaledFence)
Tony Barbour30486ea2015-04-07 13:44:53 -0600778{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600779 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600780 VkFlags msgFlags;
Tony Barbour30486ea2015-04-07 13:44:53 -0600781 std::string msgString;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600782
783 VkFenceCreateInfo fenceInfo = {};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600784 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
785 fenceInfo.pNext = NULL;
786 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour30486ea2015-04-07 13:44:53 -0600787
Tony Barbour30486ea2015-04-07 13:44:53 -0600788 ASSERT_NO_FATAL_FAILURE(InitState());
789 ASSERT_NO_FATAL_FAILURE(InitViewport());
790 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
791
Tony Barbour01999182015-04-09 12:58:51 -0600792 VkCommandBufferObj cmdBuffer(m_device);
Tony Barbour30486ea2015-04-07 13:44:53 -0600793 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
794
Tony Barbour8508b8e2015-04-09 10:48:04 -0600795 BeginCommandBuffer(cmdBuffer);
Tony Barbour30486ea2015-04-07 13:44:53 -0600796 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour8508b8e2015-04-09 10:48:04 -0600797 EndCommandBuffer(cmdBuffer);
Tony Barbour30486ea2015-04-07 13:44:53 -0600798
799 testFence.init(*m_device, fenceInfo);
800 m_errorMonitor->ClearState();
Chia-I Wua4992342015-07-03 11:45:55 +0800801 cmdBuffer.QueueCommandBuffer(testFence.handle());
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600802 msgFlags = m_errorMonitor->GetState(&msgString);
803 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an err from using a fence in SIGNALED state in call to vkQueueSubmit";
Tony Barbour8508b8e2015-04-09 10:48:04 -0600804 if (!strstr(msgString.c_str(),"submitted in SIGNALED state. Fences must be reset before being submitted")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500805 FAIL() << "Error received was not 'VkQueueSubmit with fence in SIGNALED_STATE'";
Tony Barbour8508b8e2015-04-09 10:48:04 -0600806 }
807
808}
809
810TEST_F(VkLayerTest, ResetUnsignaledFence)
811{
812 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600813 VkFlags msgFlags;
Tony Barbour8508b8e2015-04-09 10:48:04 -0600814 std::string msgString;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600815 VkFenceCreateInfo fenceInfo = {};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600816 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
817 fenceInfo.pNext = NULL;
818
Tony Barbour8508b8e2015-04-09 10:48:04 -0600819 ASSERT_NO_FATAL_FAILURE(InitState());
820 testFence.init(*m_device, fenceInfo);
821 m_errorMonitor->ClearState();
Chia-I Wua4992342015-07-03 11:45:55 +0800822 VkFence fences[1] = {testFence.handle()};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600823 vkResetFences(m_device->device(), 1, fences);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600824 msgFlags = m_errorMonitor->GetState(&msgString);
825 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from submitting fence with UNSIGNALED state to vkResetFences";
Tony Barbour01999182015-04-09 12:58:51 -0600826 if (!strstr(msgString.c_str(),"submitted to VkResetFences in UNSIGNALED STATE")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500827 FAIL() << "Error received was not 'VkResetFences with fence in UNSIGNALED_STATE'";
Tony Barbour8508b8e2015-04-09 10:48:04 -0600828 }
Tony Barbour30486ea2015-04-07 13:44:53 -0600829
830}
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600831
Chia-I Wuc278df82015-07-07 11:50:03 +0800832/* TODO: Update for changes due to bug-14075 tiling across render passes */
833#if 0
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600834TEST_F(VkLayerTest, InvalidUsageBits)
835{
836 // Initiate Draw w/o a PSO bound
837 VkFlags msgFlags;
838 std::string msgString;
839
840 ASSERT_NO_FATAL_FAILURE(InitState());
841 m_errorMonitor->ClearState();
842 VkCommandBufferObj cmdBuffer(m_device);
843 BeginCommandBuffer(cmdBuffer);
844
845 const VkExtent3D e3d = {
846 .width = 128,
847 .height = 128,
848 .depth = 1,
849 };
850 const VkImageCreateInfo ici = {
851 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
852 .pNext = NULL,
853 .imageType = VK_IMAGE_TYPE_2D,
854 .format = VK_FORMAT_D32_SFLOAT_S8_UINT,
855 .extent = e3d,
856 .mipLevels = 1,
857 .arraySize = 1,
858 .samples = 1,
859 .tiling = VK_IMAGE_TILING_LINEAR,
860 .usage = 0, // Not setting VK_IMAGE_USAGE_DEPTH_STENCIL_BIT
861 .flags = 0,
862 };
863
864 VkImage dsi;
865 vkCreateImage(m_device->device(), &ici, &dsi);
866 VkDepthStencilView dsv;
867 const VkDepthStencilViewCreateInfo dsvci = {
868 .sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO,
869 .pNext = NULL,
870 .image = dsi,
871 .mipLevel = 0,
872 .baseArraySlice = 0,
873 .arraySize = 1,
874 .flags = 0,
875 };
876 vkCreateDepthStencilView(m_device->device(), &dsvci, &dsv);
877 msgFlags = m_errorMonitor->GetState(&msgString);
878 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after attempting to create DSView w/ image lacking USAGE_DS_BIT flag";
879 if (!strstr(msgString.c_str(),"Invalid usage flag for image ")) {
880 FAIL() << "Error received was not 'Invalid usage flag for image...'";
881 }
882}
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600883#endif
Chia-I Wuc278df82015-07-07 11:50:03 +0800884#endif
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600885#if OBJ_TRACKER_TESTS
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500886TEST_F(VkLayerTest, RasterStateNotBound)
887{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600888 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500889 std::string msgString;
Tobin Ehlis254eca02015-06-25 15:46:59 -0600890 ASSERT_NO_FATAL_FAILURE(InitState());
891 m_errorMonitor->ClearState();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500892 TEST_DESCRIPTION("Simple Draw Call that validates failure when a raster state object is not bound beforehand");
893
894 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailRaster);
895
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600896 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600897 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from Not Binding a Raster State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500898 if (!strstr(msgString.c_str(),"Raster object not bound to this command buffer")) {
899 FAIL() << "Error received was not 'Raster object not bound to this command buffer'";
900 }
901}
902
903TEST_F(VkLayerTest, ViewportStateNotBound)
904{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600905 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500906 std::string msgString;
Tobin Ehlis254eca02015-06-25 15:46:59 -0600907 ASSERT_NO_FATAL_FAILURE(InitState());
908 m_errorMonitor->ClearState();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500909 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport state object is not bound beforehand");
910
911 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
912
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600913 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600914 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from Not Binding a Viewport State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500915 if (!strstr(msgString.c_str(),"Viewport object not bound to this command buffer")) {
916 FAIL() << "Error received was not 'Viewport object not bound to this command buffer'";
917 }
918}
919
920TEST_F(VkLayerTest, ColorBlendStateNotBound)
921{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600922 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500923 std::string msgString;
Tobin Ehlis254eca02015-06-25 15:46:59 -0600924 ASSERT_NO_FATAL_FAILURE(InitState());
925 m_errorMonitor->ClearState();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500926 TEST_DESCRIPTION("Simple Draw Call that validates failure when a color-blend state object is not bound beforehand");
927
928 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailColorBlend);
929
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600930 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600931 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from Not Binding a ColorBlend State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500932 if (!strstr(msgString.c_str(),"Color-blend object not bound to this command buffer")) {
933 FAIL() << "Error received was not 'Color-blend object not bound to this command buffer'";
934 }
935}
936
937TEST_F(VkLayerTest, DepthStencilStateNotBound)
938{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600939 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500940 std::string msgString;
Tobin Ehlis254eca02015-06-25 15:46:59 -0600941 ASSERT_NO_FATAL_FAILURE(InitState());
942 m_errorMonitor->ClearState();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500943 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth-stencil state object is not bound beforehand");
944
945 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthStencil);
946
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600947 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600948 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from Not Binding a DepthStencil State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500949 if (!strstr(msgString.c_str(),"Depth-stencil object not bound to this command buffer")) {
950 FAIL() << "Error received was not 'Depth-stencil object not bound to this command buffer'";
951 }
Tony Barbourdb686622015-05-06 09:35:56 -0600952}
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600953#endif
954#if DRAW_STATE_TESTS
Tobin Ehlise4076782015-06-24 15:53:07 -0600955TEST_F(VkLayerTest, BindPipelineNoRenderPass)
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600956{
957 // Initiate Draw w/o a PSO bound
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600958 VkFlags msgFlags;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600959 std::string msgString;
960
961 ASSERT_NO_FATAL_FAILURE(InitState());
962 m_errorMonitor->ClearState();
963 VkCommandBufferObj cmdBuffer(m_device);
964 BeginCommandBuffer(cmdBuffer);
965 VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
966 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600967 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlise4076782015-06-24 15:53:07 -0600968 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding pipeline to CmdBuffer w/o active RenderPass";
969 if (!strstr(msgString.c_str(),"Incorrectly binding graphics pipeline ")) {
970 FAIL() << "Error received was not 'Incorrectly binding graphics pipeline (0xbaadb1be) without an active RenderPass'";
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600971 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600972}
973
974TEST_F(VkLayerTest, InvalidDescriptorPool)
975{
976 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
977 // The DS check for this is after driver has been called to validate DS internal data struct
978 // Attempt to clear DS Pool with bad object
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600979/* VkFlags msgFlags;
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600980 std::string msgString;
981 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
982 vkResetDescriptorPool(device(), badPool);
983
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600984 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600985 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from Resetting an invalid DescriptorPool Object";
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600986 if (!strstr(msgString.c_str(),"Unable to find pool node for pool 0xbaad6001 specified in vkResetDescriptorPool() call")) {
987 FAIL() << "Error received was note 'Unable to find pool node for pool 0xbaad6001 specified in vkResetDescriptorPool() call'";
988 }*/
989}
990
991TEST_F(VkLayerTest, InvalidDescriptorSet)
992{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600993 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
994 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600995 // Create a valid cmd buffer
996 // call vkCmdBindDescriptorSets w/ false DS
997}
998
999TEST_F(VkLayerTest, InvalidDescriptorSetLayout)
1000{
1001 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
1002 // The DS check for this is after driver has been called to validate DS internal data struct
1003}
1004
1005TEST_F(VkLayerTest, InvalidPipeline)
1006{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001007 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
1008 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001009 // Create a valid cmd buffer
1010 // call vkCmdBindPipeline w/ false Pipeline
Tobin Ehlise4076782015-06-24 15:53:07 -06001011// VkFlags msgFlags;
1012// std::string msgString;
1013//
1014// ASSERT_NO_FATAL_FAILURE(InitState());
1015// m_errorMonitor->ClearState();
1016// VkCommandBufferObj cmdBuffer(m_device);
1017// BeginCommandBuffer(cmdBuffer);
1018// VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
1019// vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
1020// msgFlags = m_errorMonitor->GetState(&msgString);
1021// ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding invalid pipeline to CmdBuffer";
1022// if (!strstr(msgString.c_str(),"Attempt to bind Pipeline ")) {
1023// FAIL() << "Error received was not 'Attempt to bind Pipeline 0xbaadb1be that doesn't exist!'";
1024// }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001025}
1026
Tobin Ehlis254eca02015-06-25 15:46:59 -06001027TEST_F(VkLayerTest, DescriptorSetNotUpdated)
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001028{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001029 // Create and update CmdBuffer then call QueueSubmit w/o calling End on CmdBuffer
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001030 VkFlags msgFlags;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001031 std::string msgString;
1032 VkResult err;
1033
1034 ASSERT_NO_FATAL_FAILURE(InitState());
1035 m_errorMonitor->ClearState();
1036 VkCommandBufferObj cmdBuffer(m_device);
1037 const VkDescriptorTypeCount ds_type_count = {
1038 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1039 .count = 1,
1040 };
1041 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1042 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1043 .pNext = NULL,
1044 .count = 1,
1045 .pTypeCount = &ds_type_count,
1046 };
1047 VkDescriptorPool ds_pool;
1048 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1049 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001050
1051 const VkDescriptorSetLayoutBinding dsl_binding = {
1052 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001053 .arraySize = 1,
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001054 .stageFlags = VK_SHADER_STAGE_ALL,
1055 .pImmutableSamplers = NULL,
1056 };
1057
1058 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1059 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1060 .pNext = NULL,
1061 .count = 1,
1062 .pBinding = &dsl_binding,
1063 };
1064 VkDescriptorSetLayout ds_layout;
1065 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1066 ASSERT_VK_SUCCESS(err);
1067
1068 VkDescriptorSet descriptorSet;
1069 uint32_t ds_count = 0;
1070 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1071 ASSERT_VK_SUCCESS(err);
1072
1073 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1074 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1075 .pNext = NULL,
1076 .descriptorSetCount = 1,
1077 .pSetLayouts = &ds_layout,
1078 };
1079
1080 VkPipelineLayout pipeline_layout;
1081 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1082 ASSERT_VK_SUCCESS(err);
1083
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06001084 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001085
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001086 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1087 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1088 .pNext = NULL,
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001089 .stage = VK_SHADER_STAGE_VERTEX,
Chia-I Wub48eddb2015-07-03 11:49:42 +08001090 .shader = vs.handle(),
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001091 .linkConstBufferCount = 0,
1092 .pLinkConstBufferInfo = NULL,
1093 .pSpecializationInfo = NULL,
1094 };
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001095 const VkGraphicsPipelineCreateInfo gp_ci = {
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001096 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1097 .pNext = NULL,
1098 .stageCount = 1,
1099 .pStages = &pipe_vs_ci,
1100 .pVertexInputState = NULL,
1101 .pIaState = NULL,
1102 .pTessState = NULL,
1103 .pVpState = NULL,
1104 .pRsState = NULL,
1105 .pMsState = NULL,
1106 .pDsState = NULL,
1107 .pCbState = NULL,
1108 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1109 .layout = pipeline_layout,
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001110 };
Jon Ashburn0d60d272015-07-09 15:02:25 -06001111 const VkPipelineCacheCreateInfo pc_ci = {
1112 .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
1113 .pNext = NULL,
1114 .initialSize = 0,
1115 .initialData = 0,
1116 .maxSize = 0,
1117 };
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001118
1119 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06001120 VkPipelineCache pipelineCache;
1121
1122 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
1123 ASSERT_VK_SUCCESS(err);
1124 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001125 ASSERT_VK_SUCCESS(err);
Tobin Ehlis254eca02015-06-25 15:46:59 -06001126 ASSERT_NO_FATAL_FAILURE(InitState());
1127 ASSERT_NO_FATAL_FAILURE(InitViewport());
1128 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1129 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1130 BeginCommandBuffer(cmdBuffer);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001131 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinskia65c4632015-06-15 13:21:21 -06001132 vkCmdBindDescriptorSets(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001133
Tobin Ehlis254eca02015-06-25 15:46:59 -06001134 msgFlags = m_errorMonitor->GetState(&msgString);
1135 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT) << "Did not warn after binding a DescriptorSet that was never updated.";
1136 if (!strstr(msgString.c_str()," bound but it was never updated. ")) {
1137 FAIL() << "Error received was not 'DS <blah> bound but it was never updated. You may want to either update it or not bind it.'";
1138 }
1139}
1140
1141TEST_F(VkLayerTest, NoBeginCmdBuffer)
1142{
1143 VkFlags msgFlags;
1144 std::string msgString;
1145
1146 ASSERT_NO_FATAL_FAILURE(InitState());
1147 m_errorMonitor->ClearState();
1148 VkCommandBufferObj cmdBuffer(m_device);
1149 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
1150 vkEndCommandBuffer(cmdBuffer.GetBufferHandle());
1151 msgFlags = m_errorMonitor->GetState(&msgString);
1152 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after ending a CmdBuffer w/o calling BeginCommandBuffer()";
1153 if (!strstr(msgString.c_str(),"You must call vkBeginCommandBuffer() before this call to ")) {
1154 FAIL() << "Error received was not 'You must call vkBeginCommandBuffer() before this call to vkEndCommandBuffer()'";
1155 }
1156}
1157
1158TEST_F(VkLayerTest, InvalidPipelineCreateState)
1159{
1160 // Attempt to Create Gfx Pipeline w/o a VS
1161 VkFlags msgFlags;
1162 std::string msgString;
1163 VkResult err;
1164
1165 ASSERT_NO_FATAL_FAILURE(InitState());
1166 m_errorMonitor->ClearState();
1167 VkCommandBufferObj cmdBuffer(m_device);
1168 const VkDescriptorTypeCount ds_type_count = {
1169 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1170 .count = 1,
1171 };
1172 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1173 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1174 .pNext = NULL,
1175 .count = 1,
1176 .pTypeCount = &ds_type_count,
1177 };
1178 VkDescriptorPool ds_pool;
1179 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1180 ASSERT_VK_SUCCESS(err);
1181
1182 const VkDescriptorSetLayoutBinding dsl_binding = {
1183 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1184 .arraySize = 1,
1185 .stageFlags = VK_SHADER_STAGE_ALL,
1186 .pImmutableSamplers = NULL,
1187 };
1188
1189 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1190 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1191 .pNext = NULL,
1192 .count = 1,
1193 .pBinding = &dsl_binding,
1194 };
1195 VkDescriptorSetLayout ds_layout;
1196 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1197 ASSERT_VK_SUCCESS(err);
1198
1199 VkDescriptorSet descriptorSet;
1200 uint32_t ds_count = 0;
1201 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1202 ASSERT_VK_SUCCESS(err);
1203
1204 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1205 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1206 .pNext = NULL,
1207 .descriptorSetCount = 1,
1208 .pSetLayouts = &ds_layout,
1209 };
1210
1211 VkPipelineLayout pipeline_layout;
1212 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1213 ASSERT_VK_SUCCESS(err);
1214
1215 const VkGraphicsPipelineCreateInfo gp_ci = {
1216 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1217 .pNext = NULL,
1218 .stageCount = 0,
1219 .pStages = NULL, // Creating Gfx Pipeline w/o VS is a violation
1220 .pVertexInputState = NULL,
1221 .pIaState = NULL,
1222 .pTessState = NULL,
1223 .pVpState = NULL,
1224 .pRsState = NULL,
1225 .pMsState = NULL,
1226 .pDsState = NULL,
1227 .pCbState = NULL,
1228 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1229 .layout = pipeline_layout,
1230 };
Jon Ashburn0d60d272015-07-09 15:02:25 -06001231 const VkPipelineCacheCreateInfo pc_ci = {
1232 .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
1233 .pNext = NULL,
1234 .initialSize = 0,
1235 .initialData = 0,
1236 .maxSize = 0,
1237 };
Tobin Ehlis254eca02015-06-25 15:46:59 -06001238
1239 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06001240 VkPipelineCache pipelineCache;
1241
1242 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
1243 ASSERT_VK_SUCCESS(err);
1244 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001245
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001246 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis254eca02015-06-25 15:46:59 -06001247 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after creating Gfx Pipeline w/o VS.";
1248 if (!strstr(msgString.c_str(),"Invalid Pipeline CreateInfo State: Vtx Shader required")) {
1249 FAIL() << "Error received was not 'Invalid Pipeline CreateInfo State: Vtx Shader required'";
1250 }
1251}
1252
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06001253TEST_F(VkLayerTest, NullRenderPass)
1254{
1255 // Bind a NULL RenderPass
1256 VkFlags msgFlags;
1257 std::string msgString;
1258
1259 ASSERT_NO_FATAL_FAILURE(InitState());
1260 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1261 m_errorMonitor->ClearState();
1262 VkCommandBufferObj cmdBuffer(m_device);
1263
1264 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1265 BeginCommandBuffer(cmdBuffer);
1266 // Don't care about RenderPass handle b/c error should be flagged before that
Chia-I Wuc278df82015-07-07 11:50:03 +08001267 vkCmdBeginRenderPass(cmdBuffer.GetBufferHandle(), NULL, VK_RENDER_PASS_CONTENTS_INLINE);
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06001268
1269 msgFlags = m_errorMonitor->GetState(&msgString);
1270 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding NULL RenderPass.";
1271 if (!strstr(msgString.c_str(),"You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()")) {
1272 FAIL() << "Error received was not 'You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()'";
1273 }
1274}
1275
Tobin Ehlis254eca02015-06-25 15:46:59 -06001276TEST_F(VkLayerTest, RenderPassWithinRenderPass)
1277{
1278 // Bind a BeginRenderPass within an active RenderPass
1279 VkFlags msgFlags;
1280 std::string msgString;
1281
1282 ASSERT_NO_FATAL_FAILURE(InitState());
1283 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1284 m_errorMonitor->ClearState();
1285 VkCommandBufferObj cmdBuffer(m_device);
1286
1287 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1288 BeginCommandBuffer(cmdBuffer);
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06001289 // Just create a dummy Renderpass that's non-NULL so we can get to the proper error
Chia-I Wuc278df82015-07-07 11:50:03 +08001290 const VkRenderPassBeginInfo rp_begin = {
1291 .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
1292 .pNext = NULL,
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06001293 .renderPass = (VkRenderPass) 0xc001d00d,
1294 .framebuffer = NULL
1295 };
Chia-I Wuc278df82015-07-07 11:50:03 +08001296 vkCmdBeginRenderPass(cmdBuffer.GetBufferHandle(), &rp_begin, VK_RENDER_PASS_CONTENTS_INLINE);
Tobin Ehlis254eca02015-06-25 15:46:59 -06001297
1298 msgFlags = m_errorMonitor->GetState(&msgString);
1299 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding RenderPass w/i an active RenderPass.";
1300 if (!strstr(msgString.c_str(),"Cannot call vkCmdBeginRenderPass() during an active RenderPass ")) {
1301 FAIL() << "Error received was not 'Cannot call vkCmdBeginRenderPass() during an active RenderPass...'";
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001302 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001303}
1304
1305TEST_F(VkLayerTest, InvalidDynamicStateObject)
1306{
1307 // Create a valid cmd buffer
1308 // call vkCmdBindDynamicStateObject w/ false DS Obj
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001309 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
1310 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001311}
Tobin Ehlis201b1ba2015-05-27 14:55:35 -06001312
Tobin Ehlise4076782015-06-24 15:53:07 -06001313TEST_F(VkLayerTest, VtxBufferNoRenderPass)
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001314{
1315 // Bind VBO out-of-bounds for given PSO
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001316 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001317 std::string msgString;
1318 VkResult err;
1319
1320 ASSERT_NO_FATAL_FAILURE(InitState());
1321 m_errorMonitor->ClearState();
1322 VkCommandBufferObj cmdBuffer(m_device);
1323 const VkDescriptorTypeCount ds_type_count = {
1324 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1325 .count = 1,
1326 };
1327 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1328 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1329 .pNext = NULL,
1330 .count = 1,
1331 .pTypeCount = &ds_type_count,
1332 };
1333 VkDescriptorPool ds_pool;
1334 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1335 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001336
1337 const VkDescriptorSetLayoutBinding dsl_binding = {
1338 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001339 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001340 .stageFlags = VK_SHADER_STAGE_ALL,
1341 .pImmutableSamplers = NULL,
1342 };
1343
1344 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1345 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1346 .pNext = NULL,
1347 .count = 1,
1348 .pBinding = &dsl_binding,
1349 };
1350 VkDescriptorSetLayout ds_layout;
1351 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1352 ASSERT_VK_SUCCESS(err);
1353
1354 VkDescriptorSet descriptorSet;
1355 uint32_t ds_count = 0;
1356 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1357 ASSERT_VK_SUCCESS(err);
1358
1359 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1360 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1361 .pNext = NULL,
1362 .descriptorSetCount = 1,
1363 .pSetLayouts = &ds_layout,
1364 };
1365
1366 VkPipelineLayout pipeline_layout;
1367 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1368 ASSERT_VK_SUCCESS(err);
1369
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06001370 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001371
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001372 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1373 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1374 .pNext = NULL,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001375 .stage = VK_SHADER_STAGE_VERTEX,
Chia-I Wub48eddb2015-07-03 11:49:42 +08001376 .shader = vs.handle(),
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001377 .linkConstBufferCount = 0,
1378 .pLinkConstBufferInfo = NULL,
1379 .pSpecializationInfo = NULL,
1380 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001381 const VkGraphicsPipelineCreateInfo gp_ci = {
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001382 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1383 .pNext = NULL,
1384 .stageCount = 1,
1385 .pStages = &pipe_vs_ci,
1386 .pVertexInputState = NULL,
1387 .pIaState = NULL,
1388 .pTessState = NULL,
1389 .pVpState = NULL,
1390 .pRsState = NULL,
1391 .pMsState = NULL,
1392 .pDsState = NULL,
1393 .pCbState = NULL,
1394 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1395 .layout = pipeline_layout,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001396 };
Jon Ashburn0d60d272015-07-09 15:02:25 -06001397 const VkPipelineCacheCreateInfo pc_ci = {
1398 .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
1399 .pNext = NULL,
1400 .initialSize = 0,
1401 .initialData = 0,
1402 .maxSize = 0,
1403 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001404
1405 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06001406 VkPipelineCache pipelineCache;
1407
1408 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
1409 ASSERT_VK_SUCCESS(err);
1410 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001411 ASSERT_VK_SUCCESS(err);
1412
1413 err= cmdBuffer.BeginCommandBuffer();
1414 ASSERT_VK_SUCCESS(err);
1415 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1416 // Should error before calling to driver so don't care about actual data
1417 vkCmdBindVertexBuffers(cmdBuffer.GetBufferHandle(), 0, 1, NULL, NULL);
1418
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001419 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlise4076782015-06-24 15:53:07 -06001420 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after vkCmdBindVertexBuffers() w/o active RenderPass.";
1421 if (!strstr(msgString.c_str(),"Incorrect call to vkCmdBindVertexBuffers() without an active RenderPass.")) {
1422 FAIL() << "Error received was not 'Incorrect call to vkCmdBindVertexBuffers() without an active RenderPass.'";
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001423 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001424}
1425
1426TEST_F(VkLayerTest, DSTypeMismatch)
1427{
1428 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001429 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001430 std::string msgString;
1431 VkResult err;
1432
1433 ASSERT_NO_FATAL_FAILURE(InitState());
1434 m_errorMonitor->ClearState();
1435 //VkDescriptorSetObj descriptorSet(m_device);
1436 const VkDescriptorTypeCount ds_type_count = {
1437 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1438 .count = 1,
1439 };
1440 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1441 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1442 .pNext = NULL,
1443 .count = 1,
1444 .pTypeCount = &ds_type_count,
1445 };
1446 VkDescriptorPool ds_pool;
1447 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1448 ASSERT_VK_SUCCESS(err);
1449 const VkDescriptorSetLayoutBinding dsl_binding = {
1450 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001451 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001452 .stageFlags = VK_SHADER_STAGE_ALL,
1453 .pImmutableSamplers = NULL,
1454 };
1455
1456 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1457 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1458 .pNext = NULL,
1459 .count = 1,
1460 .pBinding = &dsl_binding,
1461 };
1462 VkDescriptorSetLayout ds_layout;
1463 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1464 ASSERT_VK_SUCCESS(err);
1465
1466 VkDescriptorSet descriptorSet;
1467 uint32_t ds_count = 0;
1468 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1469 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001470
1471 const VkSamplerCreateInfo sampler_ci = {
1472 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1473 .pNext = NULL,
1474 .magFilter = VK_TEX_FILTER_NEAREST,
1475 .minFilter = VK_TEX_FILTER_NEAREST,
1476 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1477 .addressU = VK_TEX_ADDRESS_CLAMP,
1478 .addressV = VK_TEX_ADDRESS_CLAMP,
1479 .addressW = VK_TEX_ADDRESS_CLAMP,
1480 .mipLodBias = 1.0,
1481 .maxAnisotropy = 1,
1482 .compareOp = VK_COMPARE_OP_NEVER,
1483 .minLod = 1.0,
1484 .maxLod = 1.0,
Tony Barbour2c4e7c72015-06-25 16:56:44 -06001485 .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001486 };
1487 VkSampler sampler;
1488 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1489 ASSERT_VK_SUCCESS(err);
1490
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001491 VkDescriptorInfo descriptor_info;
1492 memset(&descriptor_info, 0, sizeof(descriptor_info));
1493 descriptor_info.sampler = sampler;
1494
1495 VkWriteDescriptorSet descriptor_write;
1496 memset(&descriptor_write, 0, sizeof(descriptor_write));
1497 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1498 descriptor_write.destSet = descriptorSet;
1499 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001500 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001501 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1502 descriptor_write.pDescriptors = &descriptor_info;
1503
1504 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1505
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001506 msgFlags = m_errorMonitor->GetState(&msgString);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001507 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after updating BUFFER Descriptor w/ incorrect type of SAMPLER.";
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001508 if (!strstr(msgString.c_str(),"Descriptor update type of VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET does not match ")) {
1509 FAIL() << "Error received was not 'Descriptor update type of VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET does not match overlapping binding type!'";
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001510 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001511}
1512
1513TEST_F(VkLayerTest, DSUpdateOutOfBounds)
1514{
1515 // For overlapping Update, have arrayIndex exceed that of layout
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001516 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001517 std::string msgString;
1518 VkResult err;
1519
1520 ASSERT_NO_FATAL_FAILURE(InitState());
1521 m_errorMonitor->ClearState();
1522 //VkDescriptorSetObj descriptorSet(m_device);
1523 const VkDescriptorTypeCount ds_type_count = {
1524 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1525 .count = 1,
1526 };
1527 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1528 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1529 .pNext = NULL,
1530 .count = 1,
1531 .pTypeCount = &ds_type_count,
1532 };
1533 VkDescriptorPool ds_pool;
1534 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1535 ASSERT_VK_SUCCESS(err);
1536 const VkDescriptorSetLayoutBinding dsl_binding = {
1537 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001538 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001539 .stageFlags = VK_SHADER_STAGE_ALL,
1540 .pImmutableSamplers = NULL,
1541 };
1542
1543 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1544 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1545 .pNext = NULL,
1546 .count = 1,
1547 .pBinding = &dsl_binding,
1548 };
1549 VkDescriptorSetLayout ds_layout;
1550 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1551 ASSERT_VK_SUCCESS(err);
1552
1553 VkDescriptorSet descriptorSet;
1554 uint32_t ds_count = 0;
1555 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1556 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001557
1558 const VkSamplerCreateInfo sampler_ci = {
1559 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1560 .pNext = NULL,
1561 .magFilter = VK_TEX_FILTER_NEAREST,
1562 .minFilter = VK_TEX_FILTER_NEAREST,
1563 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1564 .addressU = VK_TEX_ADDRESS_CLAMP,
1565 .addressV = VK_TEX_ADDRESS_CLAMP,
1566 .addressW = VK_TEX_ADDRESS_CLAMP,
1567 .mipLodBias = 1.0,
1568 .maxAnisotropy = 1,
1569 .compareOp = VK_COMPARE_OP_NEVER,
1570 .minLod = 1.0,
1571 .maxLod = 1.0,
Tony Barbour2c4e7c72015-06-25 16:56:44 -06001572 .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001573 };
1574 VkSampler sampler;
1575 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1576 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001577
1578 VkDescriptorInfo descriptor_info;
1579 memset(&descriptor_info, 0, sizeof(descriptor_info));
1580 descriptor_info.sampler = sampler;
1581
1582 VkWriteDescriptorSet descriptor_write;
1583 memset(&descriptor_write, 0, sizeof(descriptor_write));
1584 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1585 descriptor_write.destSet = descriptorSet;
1586 descriptor_write.destArrayElement = 1; /* This index out of bounds for the update */
1587 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001588 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001589 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1590 descriptor_write.pDescriptors = &descriptor_info;
1591
1592 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1593
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001594 msgFlags = m_errorMonitor->GetState(&msgString);
1595 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after updating Descriptor w/ index out of bounds.";
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001596 if (!strstr(msgString.c_str(),"Descriptor update type of VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET is out of bounds for matching binding")) {
1597 FAIL() << "Error received was not 'Descriptor update type of VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET is out of bounds for matching binding...'";
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001598 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001599}
1600
1601TEST_F(VkLayerTest, InvalidDSUpdateIndex)
1602{
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001603 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001604 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001605 std::string msgString;
1606 VkResult err;
1607
1608 ASSERT_NO_FATAL_FAILURE(InitState());
1609 m_errorMonitor->ClearState();
1610 //VkDescriptorSetObj descriptorSet(m_device);
1611 const VkDescriptorTypeCount ds_type_count = {
1612 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1613 .count = 1,
1614 };
1615 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1616 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1617 .pNext = NULL,
1618 .count = 1,
1619 .pTypeCount = &ds_type_count,
1620 };
1621 VkDescriptorPool ds_pool;
1622 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1623 ASSERT_VK_SUCCESS(err);
1624 const VkDescriptorSetLayoutBinding dsl_binding = {
1625 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001626 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001627 .stageFlags = VK_SHADER_STAGE_ALL,
1628 .pImmutableSamplers = NULL,
1629 };
1630
1631 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1632 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1633 .pNext = NULL,
1634 .count = 1,
1635 .pBinding = &dsl_binding,
1636 };
1637 VkDescriptorSetLayout ds_layout;
1638 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1639 ASSERT_VK_SUCCESS(err);
1640
1641 VkDescriptorSet descriptorSet;
1642 uint32_t ds_count = 0;
1643 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1644 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001645
1646 const VkSamplerCreateInfo sampler_ci = {
1647 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1648 .pNext = NULL,
1649 .magFilter = VK_TEX_FILTER_NEAREST,
1650 .minFilter = VK_TEX_FILTER_NEAREST,
1651 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1652 .addressU = VK_TEX_ADDRESS_CLAMP,
1653 .addressV = VK_TEX_ADDRESS_CLAMP,
1654 .addressW = VK_TEX_ADDRESS_CLAMP,
1655 .mipLodBias = 1.0,
1656 .maxAnisotropy = 1,
1657 .compareOp = VK_COMPARE_OP_NEVER,
1658 .minLod = 1.0,
1659 .maxLod = 1.0,
Tony Barbour2c4e7c72015-06-25 16:56:44 -06001660 .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001661 };
1662 VkSampler sampler;
1663 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1664 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001665
1666 VkDescriptorInfo descriptor_info;
1667 memset(&descriptor_info, 0, sizeof(descriptor_info));
1668 descriptor_info.sampler = sampler;
1669
1670 VkWriteDescriptorSet descriptor_write;
1671 memset(&descriptor_write, 0, sizeof(descriptor_write));
1672 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1673 descriptor_write.destSet = descriptorSet;
1674 descriptor_write.destBinding = 2;
1675 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001676 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001677 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1678 descriptor_write.pDescriptors = &descriptor_info;
1679
1680 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1681
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001682 msgFlags = m_errorMonitor->GetState(&msgString);
1683 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after updating Descriptor w/ count too large for layout.";
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001684 if (!strstr(msgString.c_str()," does not have binding to match update binding ")) {
1685 FAIL() << "Error received was not 'Descriptor Set <blah> does not have binding to match update binding '";
1686 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001687}
1688
1689TEST_F(VkLayerTest, InvalidDSUpdateStruct)
1690{
1691 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_* types
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001692 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001693 std::string msgString;
1694 VkResult err;
1695
1696 ASSERT_NO_FATAL_FAILURE(InitState());
1697 m_errorMonitor->ClearState();
1698 //VkDescriptorSetObj descriptorSet(m_device);
1699 const VkDescriptorTypeCount ds_type_count = {
1700 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1701 .count = 1,
1702 };
1703 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1704 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1705 .pNext = NULL,
1706 .count = 1,
1707 .pTypeCount = &ds_type_count,
1708 };
1709 VkDescriptorPool ds_pool;
1710 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1711 ASSERT_VK_SUCCESS(err);
1712 const VkDescriptorSetLayoutBinding dsl_binding = {
1713 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001714 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001715 .stageFlags = VK_SHADER_STAGE_ALL,
1716 .pImmutableSamplers = NULL,
1717 };
1718
1719 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1720 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1721 .pNext = NULL,
1722 .count = 1,
1723 .pBinding = &dsl_binding,
1724 };
1725 VkDescriptorSetLayout ds_layout;
1726 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1727 ASSERT_VK_SUCCESS(err);
1728
1729 VkDescriptorSet descriptorSet;
1730 uint32_t ds_count = 0;
1731 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1732 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001733
1734 const VkSamplerCreateInfo sampler_ci = {
1735 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1736 .pNext = NULL,
1737 .magFilter = VK_TEX_FILTER_NEAREST,
1738 .minFilter = VK_TEX_FILTER_NEAREST,
1739 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1740 .addressU = VK_TEX_ADDRESS_CLAMP,
1741 .addressV = VK_TEX_ADDRESS_CLAMP,
1742 .addressW = VK_TEX_ADDRESS_CLAMP,
1743 .mipLodBias = 1.0,
1744 .maxAnisotropy = 1,
1745 .compareOp = VK_COMPARE_OP_NEVER,
1746 .minLod = 1.0,
1747 .maxLod = 1.0,
Tony Barbour2c4e7c72015-06-25 16:56:44 -06001748 .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001749 };
1750 VkSampler sampler;
1751 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1752 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001753
1754
1755 VkDescriptorInfo descriptor_info;
1756 memset(&descriptor_info, 0, sizeof(descriptor_info));
1757 descriptor_info.sampler = sampler;
1758
1759 VkWriteDescriptorSet descriptor_write;
1760 memset(&descriptor_write, 0, sizeof(descriptor_write));
1761 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
1762 descriptor_write.destSet = descriptorSet;
1763 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001764 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001765 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1766 descriptor_write.pDescriptors = &descriptor_info;
1767
1768 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1769
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001770 msgFlags = m_errorMonitor->GetState(&msgString);
1771 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after updating Descriptor w/ invalid struct type.";
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001772 if (!strstr(msgString.c_str(),"Unexpected UPDATE struct of type ")) {
1773 FAIL() << "Error received was not 'Unexpected UPDATE struct of type '";
1774 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001775}
1776
1777TEST_F(VkLayerTest, NumSamplesMismatch)
1778{
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001779 // Create CmdBuffer where MSAA samples doesn't match RenderPass sampleCount
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001780 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001781 std::string msgString;
1782 VkResult err;
1783
1784 ASSERT_NO_FATAL_FAILURE(InitState());
1785 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1786 m_errorMonitor->ClearState();
1787 VkCommandBufferObj cmdBuffer(m_device);
1788 const VkDescriptorTypeCount ds_type_count = {
1789 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1790 .count = 1,
1791 };
1792 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1793 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1794 .pNext = NULL,
1795 .count = 1,
1796 .pTypeCount = &ds_type_count,
1797 };
1798 VkDescriptorPool ds_pool;
1799 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1800 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001801
1802 const VkDescriptorSetLayoutBinding dsl_binding = {
1803 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001804 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001805 .stageFlags = VK_SHADER_STAGE_ALL,
1806 .pImmutableSamplers = NULL,
1807 };
1808
1809 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1810 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1811 .pNext = NULL,
1812 .count = 1,
1813 .pBinding = &dsl_binding,
1814 };
1815 VkDescriptorSetLayout ds_layout;
1816 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1817 ASSERT_VK_SUCCESS(err);
1818
1819 VkDescriptorSet descriptorSet;
1820 uint32_t ds_count = 0;
1821 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1822 ASSERT_VK_SUCCESS(err);
1823
1824 const VkPipelineMsStateCreateInfo pipe_ms_state_ci = {
1825 .sType = VK_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO,
1826 .pNext = NULL,
Tony Barboure094edf2015-06-26 10:18:34 -06001827 .rasterSamples = 4,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001828 .multisampleEnable = 1,
1829 .sampleShadingEnable = 0,
1830 .minSampleShading = 1.0,
1831 .sampleMask = 15,
1832 };
1833
1834 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1835 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1836 .pNext = NULL,
1837 .descriptorSetCount = 1,
1838 .pSetLayouts = &ds_layout,
1839 };
1840
1841 VkPipelineLayout pipeline_layout;
1842 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1843 ASSERT_VK_SUCCESS(err);
1844
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06001845 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001846
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001847 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1848 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1849 .pNext = NULL,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001850 .stage = VK_SHADER_STAGE_VERTEX,
Chia-I Wub48eddb2015-07-03 11:49:42 +08001851 .shader = vs.handle(),
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001852 .linkConstBufferCount = 0,
1853 .pLinkConstBufferInfo = NULL,
1854 .pSpecializationInfo = NULL,
1855 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001856 const VkGraphicsPipelineCreateInfo gp_ci = {
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001857 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1858 .pNext = NULL,
1859 .stageCount = 1,
1860 .pStages = &pipe_vs_ci,
1861 .pVertexInputState = NULL,
1862 .pIaState = NULL,
1863 .pTessState = NULL,
1864 .pVpState = NULL,
1865 .pRsState = NULL,
1866 .pMsState = &pipe_ms_state_ci,
1867 .pDsState = NULL,
1868 .pCbState = NULL,
1869 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1870 .layout = pipeline_layout,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001871 };
Jon Ashburn0d60d272015-07-09 15:02:25 -06001872 const VkPipelineCacheCreateInfo pc_ci = {
1873 .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
1874 .pNext = NULL,
1875 .initialSize = 0,
1876 .initialData = 0,
1877 .maxSize = 0,
1878 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001879
1880 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06001881 VkPipelineCache pipelineCache;
1882
1883 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
1884 ASSERT_VK_SUCCESS(err);
1885 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001886 ASSERT_VK_SUCCESS(err);
1887
1888 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1889 BeginCommandBuffer(cmdBuffer);
1890 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1891
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001892 msgFlags = m_errorMonitor->GetState(&msgString);
1893 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding RenderPass w/ mismatched MSAA from PSO.";
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001894 if (!strstr(msgString.c_str(),"Num samples mismatch! ")) {
1895 FAIL() << "Error received was not 'Num samples mismatch!...'";
1896 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001897}
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06001898
Tobin Ehlise4076782015-06-24 15:53:07 -06001899TEST_F(VkLayerTest, PipelineNotBound)
1900{
1901 VkFlags msgFlags;
1902 std::string msgString;
1903 VkResult err;
1904
1905 ASSERT_NO_FATAL_FAILURE(InitState());
1906 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1907 m_errorMonitor->ClearState();
1908 VkCommandBufferObj cmdBuffer(m_device);
1909 const VkDescriptorTypeCount ds_type_count = {
1910 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1911 .count = 1,
1912 };
1913 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1914 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1915 .pNext = NULL,
1916 .count = 1,
1917 .pTypeCount = &ds_type_count,
1918 };
1919 VkDescriptorPool ds_pool;
1920 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1921 ASSERT_VK_SUCCESS(err);
1922
1923 const VkDescriptorSetLayoutBinding dsl_binding = {
1924 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1925 .arraySize = 1,
1926 .stageFlags = VK_SHADER_STAGE_ALL,
1927 .pImmutableSamplers = NULL,
1928 };
1929
1930 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1931 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1932 .pNext = NULL,
1933 .count = 1,
1934 .pBinding = &dsl_binding,
1935 };
1936 VkDescriptorSetLayout ds_layout;
1937 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1938 ASSERT_VK_SUCCESS(err);
1939
1940 VkDescriptorSet descriptorSet;
1941 uint32_t ds_count = 0;
1942 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1943 ASSERT_VK_SUCCESS(err);
1944
1945 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1946 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1947 .pNext = NULL,
1948 .descriptorSetCount = 1,
1949 .pSetLayouts = &ds_layout,
1950 };
1951
1952 VkPipelineLayout pipeline_layout;
1953 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1954 ASSERT_VK_SUCCESS(err);
1955
Tobin Ehlise4076782015-06-24 15:53:07 -06001956 VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
1957 //err = vkCreateGraphicsPipeline(m_device->device(), &gp_ci, &pipeline);
1958 ASSERT_VK_SUCCESS(err);
1959
1960 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1961 BeginCommandBuffer(cmdBuffer);
1962 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
1963
1964 msgFlags = m_errorMonitor->GetState(&msgString);
1965 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding invalid pipeline to CmdBuffer";
1966 if (!strstr(msgString.c_str(),"Attempt to bind Pipeline ")) {
1967 FAIL() << "Error received was not 'Attempt to bind Pipeline 0xbaadb1be that doesn't exist!'";
1968 }
1969}
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06001970
1971TEST_F(VkLayerTest, ClearCmdNoDraw)
1972{
1973 // Create CmdBuffer where we add ClearCmd for FB Color attachment prior to issuing a Draw
1974 VkFlags msgFlags;
1975 std::string msgString;
1976 VkResult err;
1977
1978 ASSERT_NO_FATAL_FAILURE(InitState());
1979 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1980 m_errorMonitor->ClearState();
1981 VkCommandBufferObj cmdBuffer(m_device);
1982 const VkDescriptorTypeCount ds_type_count = {
1983 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1984 .count = 1,
1985 };
1986 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1987 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1988 .pNext = NULL,
1989 .count = 1,
1990 .pTypeCount = &ds_type_count,
1991 };
1992 VkDescriptorPool ds_pool;
1993 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1994 ASSERT_VK_SUCCESS(err);
1995
1996 const VkDescriptorSetLayoutBinding dsl_binding = {
1997 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1998 .arraySize = 1,
1999 .stageFlags = VK_SHADER_STAGE_ALL,
2000 .pImmutableSamplers = NULL,
2001 };
2002
2003 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
2004 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
2005 .pNext = NULL,
2006 .count = 1,
2007 .pBinding = &dsl_binding,
2008 };
2009 VkDescriptorSetLayout ds_layout;
2010 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
2011 ASSERT_VK_SUCCESS(err);
2012
2013 VkDescriptorSet descriptorSet;
2014 uint32_t ds_count = 0;
2015 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
2016 ASSERT_VK_SUCCESS(err);
2017
2018 const VkPipelineMsStateCreateInfo pipe_ms_state_ci = {
2019 .sType = VK_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO,
2020 .pNext = NULL,
2021 .rasterSamples = 4,
2022 .multisampleEnable = 1,
2023 .sampleShadingEnable = 0,
2024 .minSampleShading = 1.0,
2025 .sampleMask = 15,
2026 };
2027
2028 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
2029 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
2030 .pNext = NULL,
2031 .descriptorSetCount = 1,
2032 .pSetLayouts = &ds_layout,
2033 };
2034
2035 VkPipelineLayout pipeline_layout;
2036 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
2037 ASSERT_VK_SUCCESS(err);
2038
2039 size_t shader_len = strlen(bindStateVertShaderText);
2040 size_t codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
2041 void* pCode = malloc(codeSize);
2042
2043 /* try version 0 first: VkShaderStage followed by GLSL */
2044 ((uint32_t *) pCode)[0] = ICD_SPV_MAGIC;
2045 ((uint32_t *) pCode)[1] = 0;
2046 ((uint32_t *) pCode)[2] = VK_SHADER_STAGE_VERTEX;
2047 memcpy(((uint32_t *) pCode + 3), bindStateVertShaderText, shader_len + 1);
2048
2049 const VkShaderModuleCreateInfo smci = {
2050 .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
2051 .pNext = NULL,
2052 .codeSize = codeSize,
2053 .pCode = pCode,
2054 .flags = 0,
2055 };
2056 VkShaderModule vksm;
2057 err = vkCreateShaderModule(m_device->device(), &smci, &vksm);
2058 ASSERT_VK_SUCCESS(err);
2059 const VkShaderCreateInfo vs_ci = {
2060 .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
2061 .pNext = NULL,
2062 .module = vksm,
2063 .pName = "main",
2064 .flags = 0,
2065 };
2066 VkShader vs;
2067 err = vkCreateShader(m_device->device(), &vs_ci, &vs);
2068 ASSERT_VK_SUCCESS(err);
2069
2070 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
2071 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
2072 .pNext = NULL,
2073 .stage = VK_SHADER_STAGE_VERTEX,
2074 .shader = vs,
2075 .linkConstBufferCount = 0,
2076 .pLinkConstBufferInfo = NULL,
2077 .pSpecializationInfo = NULL,
2078 };
2079 const VkGraphicsPipelineCreateInfo gp_ci = {
2080 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
2081 .pNext = NULL,
2082 .stageCount = 1,
2083 .pStages = &pipe_vs_ci,
2084 .pVertexInputState = NULL,
2085 .pIaState = NULL,
2086 .pTessState = NULL,
2087 .pVpState = NULL,
2088 .pRsState = NULL,
2089 .pMsState = &pipe_ms_state_ci,
2090 .pDsState = NULL,
2091 .pCbState = NULL,
2092 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
2093 .layout = pipeline_layout,
2094 };
Jon Ashburn0d60d272015-07-09 15:02:25 -06002095 const VkPipelineCacheCreateInfo pc_ci = {
2096 .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
2097 .pNext = NULL,
2098 .initialSize = 0,
2099 .initialData = 0,
2100 .maxSize = 0,
2101 };
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06002102
2103 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06002104 VkPipelineCache pipelineCache;
2105
2106 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
2107 ASSERT_VK_SUCCESS(err);
2108 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06002109 ASSERT_VK_SUCCESS(err);
2110
2111 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
2112 BeginCommandBuffer(cmdBuffer);
2113
2114 m_errorMonitor->ClearState();
2115 // Main thing we care about for this test is that the VkImage obj we're clearing matches Color Attachment of FB
2116 // Also pass down other dummy params to keep driver and paramchecker happy
2117 VkClearColorValue cCV;
2118 cCV.f32[0] = 1.0;
2119 cCV.f32[1] = 1.0;
2120 cCV.f32[2] = 1.0;
2121 cCV.f32[3] = 1.0;
2122
2123 vkCmdClearColorAttachment(cmdBuffer.GetBufferHandle(), 0, (VkImageLayout)NULL, &cCV, 0, NULL);
2124 msgFlags = m_errorMonitor->GetState(&msgString);
2125 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT) << "Did not receive error after issuing Clear Cmd on FB color attachment prior to Draw Cmd.";
2126 if (!strstr(msgString.c_str(),"vkCmdClearColorAttachment() issued on CB object ")) {
2127 FAIL() << "Error received was not 'vkCmdClearColorAttachment() issued on CB object...'";
2128 }
2129}
2130
Tobin Ehlise4076782015-06-24 15:53:07 -06002131TEST_F(VkLayerTest, VtxBufferBadIndex)
2132{
2133 // Create CmdBuffer where MSAA samples doesn't match RenderPass sampleCount
2134 VkFlags msgFlags;
2135 std::string msgString;
2136 VkResult err;
2137
2138 ASSERT_NO_FATAL_FAILURE(InitState());
2139 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2140 m_errorMonitor->ClearState();
2141 VkCommandBufferObj cmdBuffer(m_device);
2142 const VkDescriptorTypeCount ds_type_count = {
2143 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
2144 .count = 1,
2145 };
2146 const VkDescriptorPoolCreateInfo ds_pool_ci = {
2147 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
2148 .pNext = NULL,
2149 .count = 1,
2150 .pTypeCount = &ds_type_count,
2151 };
2152 VkDescriptorPool ds_pool;
2153 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
2154 ASSERT_VK_SUCCESS(err);
2155
2156 const VkDescriptorSetLayoutBinding dsl_binding = {
2157 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
2158 .arraySize = 1,
2159 .stageFlags = VK_SHADER_STAGE_ALL,
2160 .pImmutableSamplers = NULL,
2161 };
2162
2163 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
2164 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
2165 .pNext = NULL,
2166 .count = 1,
2167 .pBinding = &dsl_binding,
2168 };
2169 VkDescriptorSetLayout ds_layout;
2170 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
2171 ASSERT_VK_SUCCESS(err);
2172
2173 VkDescriptorSet descriptorSet;
2174 uint32_t ds_count = 0;
2175 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
2176 ASSERT_VK_SUCCESS(err);
2177
2178 const VkPipelineMsStateCreateInfo pipe_ms_state_ci = {
2179 .sType = VK_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO,
2180 .pNext = NULL,
Tony Barboure094edf2015-06-26 10:18:34 -06002181 .rasterSamples = 1,
Tobin Ehlise4076782015-06-24 15:53:07 -06002182 .multisampleEnable = 1,
2183 .sampleShadingEnable = 0,
2184 .minSampleShading = 1.0,
2185 .sampleMask = 15,
2186 };
2187
2188 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
2189 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
2190 .pNext = NULL,
2191 .descriptorSetCount = 1,
2192 .pSetLayouts = &ds_layout,
2193 };
2194
2195 VkPipelineLayout pipeline_layout;
2196 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
2197 ASSERT_VK_SUCCESS(err);
2198
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06002199 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
Tobin Ehlise4076782015-06-24 15:53:07 -06002200
2201 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
2202 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
2203 .pNext = NULL,
2204 .stage = VK_SHADER_STAGE_VERTEX,
Chia-I Wub48eddb2015-07-03 11:49:42 +08002205 .shader = vs.handle(),
Tobin Ehlise4076782015-06-24 15:53:07 -06002206 .linkConstBufferCount = 0,
2207 .pLinkConstBufferInfo = NULL,
2208 .pSpecializationInfo = NULL,
2209 };
2210 const VkGraphicsPipelineCreateInfo gp_ci = {
2211 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
2212 .pNext = NULL,
2213 .stageCount = 1,
2214 .pStages = &pipe_vs_ci,
2215 .pVertexInputState = NULL,
2216 .pIaState = NULL,
2217 .pTessState = NULL,
2218 .pVpState = NULL,
2219 .pRsState = NULL,
2220 .pMsState = &pipe_ms_state_ci,
2221 .pDsState = NULL,
2222 .pCbState = NULL,
2223 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
2224 .layout = pipeline_layout,
2225 };
2226
Courtney Goeltzenleuchtercdf5e832015-07-10 09:21:02 -06002227 VkPipelineCacheCreateInfo pipelineCache;
2228 VkPipelineCache pipeline_cache;
2229
2230 memset(&pipelineCache, 0, sizeof(pipelineCache));
2231 pipelineCache.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2232 err = vkCreatePipelineCache(m_device->device(), &pipelineCache, &pipeline_cache);
2233
Tobin Ehlise4076782015-06-24 15:53:07 -06002234 VkPipeline pipeline;
Courtney Goeltzenleuchtercdf5e832015-07-10 09:21:02 -06002235 err = vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &gp_ci, &pipeline);
Tobin Ehlise4076782015-06-24 15:53:07 -06002236 ASSERT_VK_SUCCESS(err);
2237
2238 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
2239 BeginCommandBuffer(cmdBuffer);
2240 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2241 // Should error before calling to driver so don't care about actual data
2242 vkCmdBindVertexBuffers(cmdBuffer.GetBufferHandle(), 0, 1, NULL, NULL);
2243
2244 msgFlags = m_errorMonitor->GetState(&msgString);
2245 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding Vtx Buffer w/o VBO attached to PSO.";
2246 if (!strstr(msgString.c_str(),"Vtx Buffer Index 0 was bound, but no vtx buffers are attached to PSO.")) {
2247 FAIL() << "Error received was not 'Vtx Buffer Index 0 was bound, but no vtx buffers are attached to PSO.'";
2248 }
2249}
Tobin Ehlis57e6a612015-05-26 16:11:58 -06002250#endif
2251#if THREADING_TESTS
Mike Stroyan09aae812015-05-12 16:00:45 -06002252#if GTEST_IS_THREADSAFE
2253struct thread_data_struct {
2254 VkCmdBuffer cmdBuffer;
2255 VkEvent event;
2256 bool bailout;
2257};
2258
2259extern "C" void *AddToCommandBuffer(void *arg)
2260{
2261 struct thread_data_struct *data = (struct thread_data_struct *) arg;
2262 std::string msgString;
2263
2264 for (int i = 0; i<10000; i++) {
Tony Barbourc2e987e2015-06-29 16:20:35 -06002265 vkCmdSetEvent(data->cmdBuffer, data->event, VK_PIPELINE_STAGE_ALL_GPU_COMMANDS);
Mike Stroyan09aae812015-05-12 16:00:45 -06002266 if (data->bailout) {
2267 break;
2268 }
2269 }
2270 return NULL;
2271}
2272
2273TEST_F(VkLayerTest, ThreadCmdBufferCollision)
2274{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002275 VkFlags msgFlags;
Mike Stroyan09aae812015-05-12 16:00:45 -06002276 std::string msgString;
2277 pthread_t thread;
2278 pthread_attr_t thread_attr;
2279
2280 ASSERT_NO_FATAL_FAILURE(InitState());
2281 ASSERT_NO_FATAL_FAILURE(InitViewport());
2282 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2283
2284 VkCommandBufferObj cmdBuffer(m_device);
2285
2286 m_errorMonitor->ClearState();
2287 pthread_attr_init(&thread_attr);
2288 BeginCommandBuffer(cmdBuffer);
2289
2290 VkEventCreateInfo event_info;
2291 VkEvent event;
2292 VkMemoryRequirements mem_req;
Mike Stroyan09aae812015-05-12 16:00:45 -06002293 VkResult err;
2294
2295 memset(&event_info, 0, sizeof(event_info));
2296 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
2297
2298 err = vkCreateEvent(device(), &event_info, &event);
2299 ASSERT_VK_SUCCESS(err);
2300
Tony Barbour426b9052015-06-24 16:06:58 -06002301 err = vkGetObjectMemoryRequirements(device(), VK_OBJECT_TYPE_EVENT, event, &mem_req);
Mike Stroyan09aae812015-05-12 16:00:45 -06002302 ASSERT_VK_SUCCESS(err);
2303
2304 VkMemoryAllocInfo mem_info;
2305 VkDeviceMemory event_mem;
2306
Mike Stroyan09aae812015-05-12 16:00:45 -06002307 memset(&mem_info, 0, sizeof(mem_info));
2308 mem_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
2309 mem_info.allocationSize = mem_req.size;
Mark Lobodzinski72346292015-07-02 16:49:40 -06002310 mem_info.memoryTypeIndex = 0;
2311
Chia-I Wuf5fb1092015-07-03 10:32:05 +08002312 err = m_device->phy().set_memory_type(mem_req.memoryTypeBits, &mem_info, 0);
Mark Lobodzinski72346292015-07-02 16:49:40 -06002313 ASSERT_VK_SUCCESS(err);
2314
Mike Stroyan09aae812015-05-12 16:00:45 -06002315 err = vkAllocMemory(device(), &mem_info, &event_mem);
2316 ASSERT_VK_SUCCESS(err);
2317
Mark Lobodzinski23182612015-05-29 09:32:35 -05002318 err = vkBindObjectMemory(device(), VK_OBJECT_TYPE_EVENT, event, event_mem, 0);
Mike Stroyan09aae812015-05-12 16:00:45 -06002319 ASSERT_VK_SUCCESS(err);
2320
2321 err = vkResetEvent(device(), event);
2322 ASSERT_VK_SUCCESS(err);
2323
2324 struct thread_data_struct data;
2325 data.cmdBuffer = cmdBuffer.obj();
2326 data.event = event;
2327 data.bailout = false;
2328 m_errorMonitor->SetBailout(&data.bailout);
2329 // Add many entries to command buffer from another thread.
2330 pthread_create(&thread, &thread_attr, AddToCommandBuffer, (void *)&data);
2331 // Add many entries to command buffer from this thread at the same time.
2332 AddToCommandBuffer(&data);
2333 pthread_join(thread, NULL);
2334 EndCommandBuffer(cmdBuffer);
2335
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002336 msgFlags = m_errorMonitor->GetState(&msgString);
Mike Stroyaned254572015-06-17 16:32:06 -06002337 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an err from using one VkCommandBufferObj in two threads";
Mike Stroyan09aae812015-05-12 16:00:45 -06002338 if (!strstr(msgString.c_str(),"THREADING ERROR")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -05002339 FAIL() << "Error received was not 'THREADING ERROR'";
Mike Stroyan09aae812015-05-12 16:00:45 -06002340 }
2341
2342}
2343#endif
Tobin Ehlis57e6a612015-05-26 16:11:58 -06002344#endif
Chris Forbes5af3bf22015-05-25 11:13:08 +12002345#if SHADER_CHECKER_TESTS
2346TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed)
2347{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002348 VkFlags msgFlags;
Chris Forbes5af3bf22015-05-25 11:13:08 +12002349 std::string msgString;
2350 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002351 ScopedUseGlsl useGlsl(false);
Chris Forbes5af3bf22015-05-25 11:13:08 +12002352
2353 char const *vsSource =
2354 "#version 140\n"
2355 "#extension GL_ARB_separate_shader_objects: require\n"
2356 "#extension GL_ARB_shading_language_420pack: require\n"
2357 "\n"
2358 "layout(location=0) out float x;\n"
2359 "void main(){\n"
2360 " gl_Position = vec4(1);\n"
2361 " x = 0;\n"
2362 "}\n";
2363 char const *fsSource =
2364 "#version 140\n"
2365 "#extension GL_ARB_separate_shader_objects: require\n"
2366 "#extension GL_ARB_shading_language_420pack: require\n"
2367 "\n"
2368 "layout(location=0) out vec4 color;\n"
2369 "void main(){\n"
2370 " color = vec4(1);\n"
2371 "}\n";
2372
2373 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2374 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2375
2376 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002377 pipe.AddColorAttachment();
Chris Forbes5af3bf22015-05-25 11:13:08 +12002378 pipe.AddShader(&vs);
2379 pipe.AddShader(&fs);
2380
2381 VkCommandBufferObj dummyCmd(m_device);
2382 VkDescriptorSetObj descriptorSet(m_device);
2383 descriptorSet.AppendDummy();
2384 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2385
2386 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002387 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes5af3bf22015-05-25 11:13:08 +12002388
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002389 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes5af3bf22015-05-25 11:13:08 +12002390
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002391 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes5af3bf22015-05-25 11:13:08 +12002392 if (!strstr(msgString.c_str(),"not consumed by fragment shader")) {
2393 FAIL() << "Incorrect warning: " << msgString;
2394 }
2395}
Chris Forbes5af3bf22015-05-25 11:13:08 +12002396
Chris Forbes3c10b852015-05-25 11:13:13 +12002397TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided)
2398{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002399 VkFlags msgFlags;
Chris Forbes3c10b852015-05-25 11:13:13 +12002400 std::string msgString;
2401 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002402 ScopedUseGlsl useGlsl(false);
Chris Forbes3c10b852015-05-25 11:13:13 +12002403
2404 char const *vsSource =
2405 "#version 140\n"
2406 "#extension GL_ARB_separate_shader_objects: require\n"
2407 "#extension GL_ARB_shading_language_420pack: require\n"
2408 "\n"
2409 "void main(){\n"
2410 " gl_Position = vec4(1);\n"
2411 "}\n";
2412 char const *fsSource =
2413 "#version 140\n"
2414 "#extension GL_ARB_separate_shader_objects: require\n"
2415 "#extension GL_ARB_shading_language_420pack: require\n"
2416 "\n"
2417 "layout(location=0) in float x;\n"
2418 "layout(location=0) out vec4 color;\n"
2419 "void main(){\n"
2420 " color = vec4(x);\n"
2421 "}\n";
2422
2423 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2424 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2425
2426 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002427 pipe.AddColorAttachment();
Chris Forbes3c10b852015-05-25 11:13:13 +12002428 pipe.AddShader(&vs);
2429 pipe.AddShader(&fs);
2430
2431 VkCommandBufferObj dummyCmd(m_device);
2432 VkDescriptorSetObj descriptorSet(m_device);
2433 descriptorSet.AppendDummy();
2434 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2435
2436 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002437 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes3c10b852015-05-25 11:13:13 +12002438
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002439 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes3c10b852015-05-25 11:13:13 +12002440
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002441 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes3c10b852015-05-25 11:13:13 +12002442 if (!strstr(msgString.c_str(),"not written by vertex shader")) {
2443 FAIL() << "Incorrect error: " << msgString;
2444 }
2445}
2446
Chris Forbescc281692015-05-25 11:13:17 +12002447TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch)
2448{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002449 VkFlags msgFlags;
Chris Forbescc281692015-05-25 11:13:17 +12002450 std::string msgString;
2451 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002452 ScopedUseGlsl useGlsl(false);
Chris Forbescc281692015-05-25 11:13:17 +12002453
2454 char const *vsSource =
2455 "#version 140\n"
2456 "#extension GL_ARB_separate_shader_objects: require\n"
2457 "#extension GL_ARB_shading_language_420pack: require\n"
2458 "\n"
2459 "layout(location=0) out int x;\n"
2460 "void main(){\n"
2461 " x = 0;\n"
2462 " gl_Position = vec4(1);\n"
2463 "}\n";
2464 char const *fsSource =
2465 "#version 140\n"
2466 "#extension GL_ARB_separate_shader_objects: require\n"
2467 "#extension GL_ARB_shading_language_420pack: require\n"
2468 "\n"
2469 "layout(location=0) in float x;\n" /* VS writes int */
2470 "layout(location=0) out vec4 color;\n"
2471 "void main(){\n"
2472 " color = vec4(x);\n"
2473 "}\n";
2474
2475 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2476 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2477
2478 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002479 pipe.AddColorAttachment();
Chris Forbescc281692015-05-25 11:13:17 +12002480 pipe.AddShader(&vs);
2481 pipe.AddShader(&fs);
2482
2483 VkCommandBufferObj dummyCmd(m_device);
2484 VkDescriptorSetObj descriptorSet(m_device);
2485 descriptorSet.AppendDummy();
2486 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2487
2488 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002489 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbescc281692015-05-25 11:13:17 +12002490
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002491 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbescc281692015-05-25 11:13:17 +12002492
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002493 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbescc281692015-05-25 11:13:17 +12002494 if (!strstr(msgString.c_str(),"Type mismatch on location 0")) {
2495 FAIL() << "Incorrect error: " << msgString;
2496 }
2497}
2498
Chris Forbes8291c052015-05-25 11:13:28 +12002499TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed)
2500{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002501 VkFlags msgFlags;
Chris Forbes8291c052015-05-25 11:13:28 +12002502 std::string msgString;
2503 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002504 ScopedUseGlsl useGlsl(false);
Chris Forbes8291c052015-05-25 11:13:28 +12002505
2506 VkVertexInputBindingDescription input_binding;
2507 memset(&input_binding, 0, sizeof(input_binding));
2508
2509 VkVertexInputAttributeDescription input_attrib;
2510 memset(&input_attrib, 0, sizeof(input_attrib));
2511 input_attrib.format = VK_FORMAT_R32_SFLOAT;
2512
2513 char const *vsSource =
2514 "#version 140\n"
2515 "#extension GL_ARB_separate_shader_objects: require\n"
2516 "#extension GL_ARB_shading_language_420pack: require\n"
2517 "\n"
2518 "void main(){\n"
2519 " gl_Position = vec4(1);\n"
2520 "}\n";
2521 char const *fsSource =
2522 "#version 140\n"
2523 "#extension GL_ARB_separate_shader_objects: require\n"
2524 "#extension GL_ARB_shading_language_420pack: require\n"
2525 "\n"
2526 "layout(location=0) out vec4 color;\n"
2527 "void main(){\n"
2528 " color = vec4(1);\n"
2529 "}\n";
2530
2531 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2532 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2533
2534 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002535 pipe.AddColorAttachment();
Chris Forbes8291c052015-05-25 11:13:28 +12002536 pipe.AddShader(&vs);
2537 pipe.AddShader(&fs);
2538
2539 pipe.AddVertexInputBindings(&input_binding, 1);
2540 pipe.AddVertexInputAttribs(&input_attrib, 1);
2541
2542 VkCommandBufferObj dummyCmd(m_device);
2543 VkDescriptorSetObj descriptorSet(m_device);
2544 descriptorSet.AppendDummy();
2545 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2546
2547 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002548 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes8291c052015-05-25 11:13:28 +12002549
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002550 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes8291c052015-05-25 11:13:28 +12002551
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002552 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes8291c052015-05-25 11:13:28 +12002553 if (!strstr(msgString.c_str(),"location 0 not consumed by VS")) {
2554 FAIL() << "Incorrect warning: " << msgString;
2555 }
2556}
2557
Chris Forbes37367e62015-05-25 11:13:29 +12002558TEST_F(VkLayerTest, CreatePipelineAttribNotProvided)
2559{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002560 VkFlags msgFlags;
Chris Forbes37367e62015-05-25 11:13:29 +12002561 std::string msgString;
2562 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002563 ScopedUseGlsl useGlsl(false);
Chris Forbes37367e62015-05-25 11:13:29 +12002564
2565 char const *vsSource =
2566 "#version 140\n"
2567 "#extension GL_ARB_separate_shader_objects: require\n"
2568 "#extension GL_ARB_shading_language_420pack: require\n"
2569 "\n"
2570 "layout(location=0) in vec4 x;\n" /* not provided */
2571 "void main(){\n"
2572 " gl_Position = x;\n"
2573 "}\n";
2574 char const *fsSource =
2575 "#version 140\n"
2576 "#extension GL_ARB_separate_shader_objects: require\n"
2577 "#extension GL_ARB_shading_language_420pack: require\n"
2578 "\n"
2579 "layout(location=0) out vec4 color;\n"
2580 "void main(){\n"
2581 " color = vec4(1);\n"
2582 "}\n";
2583
2584 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2585 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2586
2587 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002588 pipe.AddColorAttachment();
Chris Forbes37367e62015-05-25 11:13:29 +12002589 pipe.AddShader(&vs);
2590 pipe.AddShader(&fs);
2591
2592 VkCommandBufferObj dummyCmd(m_device);
2593 VkDescriptorSetObj descriptorSet(m_device);
2594 descriptorSet.AppendDummy();
2595 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2596
2597 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002598 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes37367e62015-05-25 11:13:29 +12002599
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002600 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes37367e62015-05-25 11:13:29 +12002601
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002602 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes37367e62015-05-25 11:13:29 +12002603 if (!strstr(msgString.c_str(),"VS consumes input at location 0 but not provided")) {
2604 FAIL() << "Incorrect warning: " << msgString;
2605 }
2606}
2607
Chris Forbesa4b02322015-05-25 11:13:31 +12002608TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch)
2609{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002610 VkFlags msgFlags;
Chris Forbesa4b02322015-05-25 11:13:31 +12002611 std::string msgString;
2612 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002613 ScopedUseGlsl useGlsl(false);
Chris Forbesa4b02322015-05-25 11:13:31 +12002614
2615 VkVertexInputBindingDescription input_binding;
2616 memset(&input_binding, 0, sizeof(input_binding));
2617
2618 VkVertexInputAttributeDescription input_attrib;
2619 memset(&input_attrib, 0, sizeof(input_attrib));
2620 input_attrib.format = VK_FORMAT_R32_SFLOAT;
2621
2622 char const *vsSource =
2623 "#version 140\n"
2624 "#extension GL_ARB_separate_shader_objects: require\n"
2625 "#extension GL_ARB_shading_language_420pack: require\n"
2626 "\n"
2627 "layout(location=0) in int x;\n" /* attrib provided float */
2628 "void main(){\n"
2629 " gl_Position = vec4(x);\n"
2630 "}\n";
2631 char const *fsSource =
2632 "#version 140\n"
2633 "#extension GL_ARB_separate_shader_objects: require\n"
2634 "#extension GL_ARB_shading_language_420pack: require\n"
2635 "\n"
2636 "layout(location=0) out vec4 color;\n"
2637 "void main(){\n"
2638 " color = vec4(1);\n"
2639 "}\n";
2640
2641 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2642 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2643
2644 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002645 pipe.AddColorAttachment();
Chris Forbesa4b02322015-05-25 11:13:31 +12002646 pipe.AddShader(&vs);
2647 pipe.AddShader(&fs);
2648
2649 pipe.AddVertexInputBindings(&input_binding, 1);
2650 pipe.AddVertexInputAttribs(&input_attrib, 1);
2651
2652 VkCommandBufferObj dummyCmd(m_device);
2653 VkDescriptorSetObj descriptorSet(m_device);
2654 descriptorSet.AppendDummy();
2655 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2656
2657 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002658 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbesa4b02322015-05-25 11:13:31 +12002659
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002660 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbesa4b02322015-05-25 11:13:31 +12002661
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002662 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbesa4b02322015-05-25 11:13:31 +12002663 if (!strstr(msgString.c_str(),"location 0 does not match VS input type")) {
2664 FAIL() << "Incorrect error: " << msgString;
2665 }
2666}
2667
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002668TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict)
2669{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002670 VkFlags msgFlags;
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002671 std::string msgString;
2672 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002673 ScopedUseGlsl useGlsl(false);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002674
2675 /* Two binding descriptions for binding 0 */
2676 VkVertexInputBindingDescription input_bindings[2];
2677 memset(input_bindings, 0, sizeof(input_bindings));
2678
2679 VkVertexInputAttributeDescription input_attrib;
2680 memset(&input_attrib, 0, sizeof(input_attrib));
2681 input_attrib.format = VK_FORMAT_R32_SFLOAT;
2682
2683 char const *vsSource =
2684 "#version 140\n"
2685 "#extension GL_ARB_separate_shader_objects: require\n"
2686 "#extension GL_ARB_shading_language_420pack: require\n"
2687 "\n"
2688 "layout(location=0) in float x;\n" /* attrib provided float */
2689 "void main(){\n"
2690 " gl_Position = vec4(x);\n"
2691 "}\n";
2692 char const *fsSource =
2693 "#version 140\n"
2694 "#extension GL_ARB_separate_shader_objects: require\n"
2695 "#extension GL_ARB_shading_language_420pack: require\n"
2696 "\n"
2697 "layout(location=0) out vec4 color;\n"
2698 "void main(){\n"
2699 " color = vec4(1);\n"
2700 "}\n";
2701
2702 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2703 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2704
2705 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002706 pipe.AddColorAttachment();
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002707 pipe.AddShader(&vs);
2708 pipe.AddShader(&fs);
2709
2710 pipe.AddVertexInputBindings(input_bindings, 2);
2711 pipe.AddVertexInputAttribs(&input_attrib, 1);
2712
2713 VkCommandBufferObj dummyCmd(m_device);
2714 VkDescriptorSetObj descriptorSet(m_device);
2715 descriptorSet.AppendDummy();
2716 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2717
2718 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002719 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002720
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002721 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002722
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002723 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002724 if (!strstr(msgString.c_str(),"Duplicate vertex input binding descriptions for binding 0")) {
2725 FAIL() << "Incorrect error: " << msgString;
2726 }
2727}
Chris Forbes4c948702015-05-25 11:13:32 +12002728
Chris Forbesc12ef122015-05-25 11:13:40 +12002729/* TODO: would be nice to test the mixed broadcast & custom case, but the GLSL->SPV compiler
2730 * rejects it. */
2731
2732TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten)
2733{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002734 VkFlags msgFlags;
Chris Forbesc12ef122015-05-25 11:13:40 +12002735 std::string msgString;
2736 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002737 ScopedUseGlsl useGlsl(false);
Chris Forbesc12ef122015-05-25 11:13:40 +12002738
2739 char const *vsSource =
2740 "#version 140\n"
2741 "#extension GL_ARB_separate_shader_objects: require\n"
2742 "#extension GL_ARB_shading_language_420pack: require\n"
2743 "\n"
2744 "void main(){\n"
2745 " gl_Position = vec4(1);\n"
2746 "}\n";
2747 char const *fsSource =
2748 "#version 140\n"
2749 "#extension GL_ARB_separate_shader_objects: require\n"
2750 "#extension GL_ARB_shading_language_420pack: require\n"
2751 "\n"
2752 "void main(){\n"
2753 "}\n";
2754
2755 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2756 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2757
2758 VkPipelineObj pipe(m_device);
2759 pipe.AddShader(&vs);
2760 pipe.AddShader(&fs);
2761
Chia-I Wuc278df82015-07-07 11:50:03 +08002762 /* set up CB 0, not written */
2763 pipe.AddColorAttachment();
2764 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc12ef122015-05-25 11:13:40 +12002765
2766 VkCommandBufferObj dummyCmd(m_device);
2767 VkDescriptorSetObj descriptorSet(m_device);
2768 descriptorSet.AppendDummy();
2769 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2770
2771 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002772 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbesc12ef122015-05-25 11:13:40 +12002773
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002774 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbesc12ef122015-05-25 11:13:40 +12002775
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002776 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbesc12ef122015-05-25 11:13:40 +12002777 if (!strstr(msgString.c_str(),"Attachment 0 not written by FS")) {
2778 FAIL() << "Incorrect error: " << msgString;
2779 }
2780}
2781
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002782TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed)
2783{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002784 VkFlags msgFlags;
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002785 std::string msgString;
2786 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002787 ScopedUseGlsl useGlsl(false);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002788
2789 char const *vsSource =
2790 "#version 140\n"
2791 "#extension GL_ARB_separate_shader_objects: require\n"
2792 "#extension GL_ARB_shading_language_420pack: require\n"
2793 "\n"
2794 "void main(){\n"
2795 " gl_Position = vec4(1);\n"
2796 "}\n";
2797 char const *fsSource =
2798 "#version 140\n"
2799 "#extension GL_ARB_separate_shader_objects: require\n"
2800 "#extension GL_ARB_shading_language_420pack: require\n"
2801 "\n"
2802 "layout(location=0) out vec4 x;\n"
2803 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
2804 "void main(){\n"
2805 " x = vec4(1);\n"
2806 " y = vec4(1);\n"
2807 "}\n";
2808
2809 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2810 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2811
2812 VkPipelineObj pipe(m_device);
2813 pipe.AddShader(&vs);
2814 pipe.AddShader(&fs);
2815
Chia-I Wuc278df82015-07-07 11:50:03 +08002816 /* set up CB 0, not written */
2817 pipe.AddColorAttachment();
2818 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002819 /* FS writes CB 1, but we don't configure it */
2820
2821 VkCommandBufferObj dummyCmd(m_device);
2822 VkDescriptorSetObj descriptorSet(m_device);
2823 descriptorSet.AppendDummy();
2824 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2825
2826 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002827 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002828
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002829 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002830
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002831 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002832 if (!strstr(msgString.c_str(),"FS writes to output location 1 with no matching attachment")) {
2833 FAIL() << "Incorrect warning: " << msgString;
2834 }
2835}
2836
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002837TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch)
2838{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002839 VkFlags msgFlags;
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002840 std::string msgString;
2841 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002842 ScopedUseGlsl useGlsl(false);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002843
2844 char const *vsSource =
2845 "#version 140\n"
2846 "#extension GL_ARB_separate_shader_objects: require\n"
2847 "#extension GL_ARB_shading_language_420pack: require\n"
2848 "\n"
2849 "void main(){\n"
2850 " gl_Position = vec4(1);\n"
2851 "}\n";
2852 char const *fsSource =
2853 "#version 140\n"
2854 "#extension GL_ARB_separate_shader_objects: require\n"
2855 "#extension GL_ARB_shading_language_420pack: require\n"
2856 "\n"
2857 "layout(location=0) out ivec4 x;\n" /* not UNORM */
2858 "void main(){\n"
2859 " x = ivec4(1);\n"
2860 "}\n";
2861
2862 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2863 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2864
2865 VkPipelineObj pipe(m_device);
2866 pipe.AddShader(&vs);
2867 pipe.AddShader(&fs);
2868
Chia-I Wuc278df82015-07-07 11:50:03 +08002869 /* set up CB 0; type is UNORM by default */
2870 pipe.AddColorAttachment();
2871 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002872
2873 VkCommandBufferObj dummyCmd(m_device);
2874 VkDescriptorSetObj descriptorSet(m_device);
2875 descriptorSet.AppendDummy();
2876 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2877
2878 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002879 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002880
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002881 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002882
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002883 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002884 if (!strstr(msgString.c_str(),"does not match FS output type")) {
2885 FAIL() << "Incorrect error: " << msgString;
2886 }
2887}
Chris Forbesc2050732015-06-05 14:43:36 +12002888
2889TEST_F(VkLayerTest, CreatePipelineNonSpirvShader)
2890{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002891 VkFlags msgFlags;
Chris Forbesc2050732015-06-05 14:43:36 +12002892 std::string msgString;
2893 ASSERT_NO_FATAL_FAILURE(InitState());
2894 /* Intentionally provided GLSL rather than compiling to SPIRV first */
Cody Northrop1cfbd172015-06-03 16:49:20 -06002895 ScopedUseGlsl useGlsl(true);
Chris Forbesc2050732015-06-05 14:43:36 +12002896
2897 char const *vsSource =
2898 "#version 140\n"
2899 "#extension GL_ARB_separate_shader_objects: require\n"
2900 "#extension GL_ARB_shading_language_420pack: require\n"
2901 "\n"
2902 "void main(){\n"
2903 " gl_Position = vec4(1);\n"
2904 "}\n";
2905 char const *fsSource =
2906 "#version 140\n"
2907 "#extension GL_ARB_separate_shader_objects: require\n"
2908 "#extension GL_ARB_shading_language_420pack: require\n"
2909 "\n"
2910 "layout(location=0) out vec4 x;\n"
2911 "void main(){\n"
2912 " x = vec4(1);\n"
2913 "}\n";
2914
2915 m_errorMonitor->ClearState();
2916
2917 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2918 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2919
2920
2921 VkPipelineObj pipe(m_device);
2922 pipe.AddShader(&vs);
2923 pipe.AddShader(&fs);
2924
Chia-I Wuc278df82015-07-07 11:50:03 +08002925 /* set up CB 0; type is UNORM by default */
2926 pipe.AddColorAttachment();
2927 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc2050732015-06-05 14:43:36 +12002928
2929 VkCommandBufferObj dummyCmd(m_device);
2930 VkDescriptorSetObj descriptorSet(m_device);
2931 descriptorSet.AppendDummy();
2932 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2933
Chia-I Wuc278df82015-07-07 11:50:03 +08002934 VkResult res = pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbesc2050732015-06-05 14:43:36 +12002935 /* pipeline creation should have succeeded */
2936 ASSERT_EQ(VK_SUCCESS, res);
2937
2938 /* should have emitted a warning: the shader is not SPIRV, so we're
2939 * not going to be able to analyze it */
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002940 msgFlags = m_errorMonitor->GetState(&msgString);
2941 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbesc2050732015-06-05 14:43:36 +12002942 if (!strstr(msgString.c_str(),"is not SPIR-V")) {
2943 FAIL() << "Incorrect warning: " << msgString;
2944 }
2945}
Chris Forbes01c9db72015-06-04 09:25:25 +12002946#endif
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002947
Tony Barbour30486ea2015-04-07 13:44:53 -06002948int main(int argc, char **argv) {
2949 int result;
2950
2951 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour01999182015-04-09 12:58:51 -06002952 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour30486ea2015-04-07 13:44:53 -06002953
2954 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
2955
2956 result = RUN_ALL_TESTS();
2957
Tony Barbour01999182015-04-09 12:58:51 -06002958 VkTestFramework::Finish();
Tony Barbour30486ea2015-04-07 13:44:53 -06002959 return result;
2960}