blob: 5fd1b0d395f32fd5e953b3011ffc48de4a2be2b3 [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"
Mark Lobodzinskia910dc82015-05-14 14:30:48 -05005#include "layers_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 Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600151 std::vector<const char *> instance_extension_names;
152 std::vector<const char *> device_extension_names;
Tony Barbour950ebc02015-04-23 12:55:36 -0600153
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600154 instance_extension_names.push_back(DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterde53c5b2015-06-16 15:59:11 -0600155 /*
156 * Since CreateDbgMsgCallback is an instance level extension call
157 * any extension / layer that utilizes that feature also needs
158 * to be enabled at create instance time.
159 */
Mike Stroyaned254572015-06-17 16:32:06 -0600160 // Use Threading layer first to protect others from ThreadCmdBufferCollision test
161 instance_extension_names.push_back("Threading");
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600162 instance_extension_names.push_back("MemTracker");
Courtney Goeltzenleuchtereb518dc2015-06-13 21:41:00 -0600163 instance_extension_names.push_back("DrawState");
164 instance_extension_names.push_back("ObjectTracker");
Courtney Goeltzenleuchterde53c5b2015-06-16 15:59:11 -0600165 instance_extension_names.push_back("ShaderChecker");
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600166
Mike Stroyaned254572015-06-17 16:32:06 -0600167 device_extension_names.push_back("Threading");
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600168 device_extension_names.push_back("MemTracker");
Jon Ashburn64716542015-06-15 12:21:02 -0600169 device_extension_names.push_back("DrawState");
Courtney Goeltzenleuchtereb518dc2015-06-13 21:41:00 -0600170 device_extension_names.push_back("ObjectTracker");
Courtney Goeltzenleuchterde53c5b2015-06-16 15:59:11 -0600171 device_extension_names.push_back("ShaderChecker");
Tony Barbour30486ea2015-04-07 13:44:53 -0600172
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600173 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour30486ea2015-04-07 13:44:53 -0600174 this->app_info.pNext = NULL;
175 this->app_info.pAppName = "layer_tests";
176 this->app_info.appVersion = 1;
177 this->app_info.pEngineName = "unittest";
178 this->app_info.engineVersion = 1;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600179 this->app_info.apiVersion = VK_API_VERSION;
Tony Barbour30486ea2015-04-07 13:44:53 -0600180
Tony Barbour0c1bdc62015-04-29 17:34:29 -0600181 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600182 InitFramework(instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour30486ea2015-04-07 13:44:53 -0600183 }
184
185 virtual void TearDown() {
186 // Clean up resources before we reset
Tony Barbour30486ea2015-04-07 13:44:53 -0600187 ShutdownFramework();
Tony Barbour8508b8e2015-04-09 10:48:04 -0600188 delete m_errorMonitor;
Tony Barbour30486ea2015-04-07 13:44:53 -0600189 }
190};
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500191
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600192VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &cmdBuffer)
Tony Barbour30486ea2015-04-07 13:44:53 -0600193{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600194 VkResult result;
Tony Barbour30486ea2015-04-07 13:44:53 -0600195
196 result = cmdBuffer.BeginCommandBuffer();
197
198 /*
199 * For render test all drawing happens in a single render pass
200 * on a single command buffer.
201 */
Chris Forbesfe133ef2015-06-16 14:05:59 +1200202 if (VK_SUCCESS == result && renderPass()) {
Tony Barbour30486ea2015-04-07 13:44:53 -0600203 cmdBuffer.BeginRenderPass(renderPass(), framebuffer());
204 }
205
206 return result;
207}
208
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600209VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &cmdBuffer)
Tony Barbour30486ea2015-04-07 13:44:53 -0600210{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600211 VkResult result;
Tony Barbour30486ea2015-04-07 13:44:53 -0600212
Chris Forbesfe133ef2015-06-16 14:05:59 +1200213 if (renderPass()) {
214 cmdBuffer.EndRenderPass(renderPass());
215 }
Tony Barbour30486ea2015-04-07 13:44:53 -0600216
217 result = cmdBuffer.EndCommandBuffer();
218
219 return result;
220}
221
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500222void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask)
223{
224 // Create identity matrix
225 int i;
226 struct vktriangle_vs_uniform data;
227
228 glm::mat4 Projection = glm::mat4(1.0f);
229 glm::mat4 View = glm::mat4(1.0f);
230 glm::mat4 Model = glm::mat4(1.0f);
231 glm::mat4 MVP = Projection * View * Model;
232 const int matrixSize = sizeof(MVP);
233 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
234
235 memcpy(&data.mvp, &MVP[0][0], matrixSize);
236
237 static const Vertex tri_data[] =
238 {
239 { XYZ1( -1, -1, 0 ), XYZ1( 1.f, 0.f, 0.f ) },
240 { XYZ1( 1, -1, 0 ), XYZ1( 0.f, 1.f, 0.f ) },
241 { XYZ1( 0, 1, 0 ), XYZ1( 0.f, 0.f, 1.f ) },
242 };
243
244 for (i=0; i<3; i++) {
245 data.position[i][0] = tri_data[i].posX;
246 data.position[i][1] = tri_data[i].posY;
247 data.position[i][2] = tri_data[i].posZ;
248 data.position[i][3] = tri_data[i].posW;
249 data.color[i][0] = tri_data[i].r;
250 data.color[i][1] = tri_data[i].g;
251 data.color[i][2] = tri_data[i].b;
252 data.color[i][3] = tri_data[i].a;
253 }
254
255 ASSERT_NO_FATAL_FAILURE(InitState());
256 ASSERT_NO_FATAL_FAILURE(InitViewport());
257
258 VkConstantBufferObj constantBuffer(m_device, bufSize*2, sizeof(float), (const void*) &data);
259
260 VkShaderObj vs(m_device,vertShaderText,VK_SHADER_STAGE_VERTEX, this);
261 VkShaderObj ps(m_device,fragShaderText, VK_SHADER_STAGE_FRAGMENT, this);
262
263 VkPipelineObj pipelineobj(m_device);
264 pipelineobj.AddShader(&vs);
265 pipelineobj.AddShader(&ps);
266
267 VkDescriptorSetObj descriptorSet(m_device);
268 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
269
270 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
271 VkCommandBufferObj cmdBuffer(m_device);
272 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
273
274 ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
275
276 GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet, failMask);
277
278 // render triangle
279 cmdBuffer.Draw(0, 3, 0, 1);
280
281 // finalize recording of the command buffer
282 EndCommandBuffer(cmdBuffer);
283
284 cmdBuffer.QueueCommandBuffer();
285}
286
287void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *cmdBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask)
288{
289 if (m_depthStencil->Initialized()) {
290 cmdBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
291 } else {
292 cmdBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
293 }
294
295 cmdBuffer->PrepareAttachments();
296 if ((failMask & BsoFailRaster) != BsoFailRaster) {
297 cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_RASTER, m_stateRaster);
298 }
299 if ((failMask & BsoFailViewport) != BsoFailViewport) {
300 cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_VIEWPORT, m_stateViewport);
301 }
302 if ((failMask & BsoFailColorBlend) != BsoFailColorBlend) {
303 cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_COLOR_BLEND, m_colorBlend);
304 }
305 if ((failMask & BsoFailDepthStencil) != BsoFailDepthStencil) {
306 cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_DEPTH_STENCIL, m_stateDepthStencil);
307 }
308 descriptorSet.CreateVKDescriptorSet(cmdBuffer);
309 pipelineobj.CreateVKPipeline(descriptorSet);
310 cmdBuffer->BindPipeline(pipelineobj);
311 cmdBuffer->BindDescriptorSet(descriptorSet);
312}
313
314// ********************************************************************************************************************
315// ********************************************************************************************************************
316// ********************************************************************************************************************
317// ********************************************************************************************************************
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600318#if MEM_TRACKER_TESTS
Mark Lobodzinski81078192015-05-19 10:28:29 -0500319TEST_F(VkLayerTest, CallResetCmdBufferBeforeCompletion)
320{
321 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600322 VkFlags msgFlags;
Mark Lobodzinski81078192015-05-19 10:28:29 -0500323 std::string msgString;
324
325 VkFenceCreateInfo fenceInfo = {};
326 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
327 fenceInfo.pNext = NULL;
328 fenceInfo.flags = 0;
329
330 ASSERT_NO_FATAL_FAILURE(InitState());
331 ASSERT_NO_FATAL_FAILURE(InitViewport());
332 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
333
334 VkCommandBufferObj cmdBuffer(m_device);
335 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
336
337 BeginCommandBuffer(cmdBuffer);
338 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
339 EndCommandBuffer(cmdBuffer);
340
341 testFence.init(*m_device, fenceInfo);
342
343 // Bypass framework since it does the waits automatically
344 VkResult err = VK_SUCCESS;
345 err = vkQueueSubmit( m_device->m_queue, 1, &cmdBuffer.obj(), testFence.obj());
346 ASSERT_VK_SUCCESS( err );
347
348 m_errorMonitor->ClearState();
349 // Introduce failure by calling begin again before checking fence
350 vkResetCommandBuffer(cmdBuffer.obj());
351
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600352 msgFlags = m_errorMonitor->GetState(&msgString);
353 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 -0500354 if (!strstr(msgString.c_str(),"Resetting CB")) {
355 FAIL() << "Error received was not 'Resetting CB (0xaddress) before it has completed. You must check CB flag before'";
356 }
357}
358
359TEST_F(VkLayerTest, CallBeginCmdBufferBeforeCompletion)
360{
361 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600362 VkFlags msgFlags;
Mark Lobodzinski81078192015-05-19 10:28:29 -0500363 std::string msgString;
364
365 VkFenceCreateInfo fenceInfo = {};
366 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
367 fenceInfo.pNext = NULL;
368 fenceInfo.flags = 0;
369
370 ASSERT_NO_FATAL_FAILURE(InitState());
371 ASSERT_NO_FATAL_FAILURE(InitViewport());
372 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
373
374 VkCommandBufferObj cmdBuffer(m_device);
375 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
376
377 BeginCommandBuffer(cmdBuffer);
378 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
379 EndCommandBuffer(cmdBuffer);
380
381 testFence.init(*m_device, fenceInfo);
382
383 // Bypass framework since it does the waits automatically
384 VkResult err = VK_SUCCESS;
385 err = vkQueueSubmit( m_device->m_queue, 1, &cmdBuffer.obj(), testFence.obj());
386 ASSERT_VK_SUCCESS( err );
387
388 m_errorMonitor->ClearState();
389 // Introduce failure by calling begin again before checking fence
390 BeginCommandBuffer(cmdBuffer);
391
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600392 msgFlags = m_errorMonitor->GetState(&msgString);
393 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 -0500394 if (!strstr(msgString.c_str(),"Calling vkBeginCommandBuffer() on active CB")) {
395 FAIL() << "Error received was not 'Calling vkBeginCommandBuffer() on an active CB (0xaddress) before it has completed'";
396 }
397}
398
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500399TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit)
400{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600401 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500402 std::string msgString;
403 VkResult err;
404
405 ASSERT_NO_FATAL_FAILURE(InitState());
406 m_errorMonitor->ClearState();
407
408 // Create an image, allocate memory, free it, and then try to bind it
409 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500410 VkDeviceMemory mem;
411 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500412
413 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
414 const int32_t tex_width = 32;
415 const int32_t tex_height = 32;
416 size_t mem_reqs_size = sizeof(VkMemoryRequirements);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500417
418 const VkImageCreateInfo image_create_info = {
419 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
420 .pNext = NULL,
421 .imageType = VK_IMAGE_TYPE_2D,
422 .format = tex_format,
423 .extent = { tex_width, tex_height, 1 },
424 .mipLevels = 1,
425 .arraySize = 1,
426 .samples = 1,
427 .tiling = VK_IMAGE_TILING_LINEAR,
428 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
429 .flags = 0,
430 };
431 VkMemoryAllocInfo mem_alloc = {
432 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
433 .pNext = NULL,
434 .allocationSize = 0,
435 // Introduce failure, do NOT set memProps to VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
436 .memProps = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500437 };
438
439 err = vkCreateImage(m_device->device(), &image_create_info, &image);
440 ASSERT_VK_SUCCESS(err);
441
442 err = vkGetObjectInfo(m_device->device(),
443 VK_OBJECT_TYPE_IMAGE,
444 image,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500445 VK_OBJECT_INFO_TYPE_MEMORY_REQUIREMENTS,
446 &mem_reqs_size,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500447 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500448 ASSERT_VK_SUCCESS(err);
449
Mark Lobodzinski23182612015-05-29 09:32:35 -0500450 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500451
452 // allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500453 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500454 ASSERT_VK_SUCCESS(err);
455
456 // Try to bind free memory that has been freed
Mark Lobodzinski23182612015-05-29 09:32:35 -0500457 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500458 ASSERT_VK_SUCCESS(err);
459
460 // Map memory as if to initialize the image
461 void *mappedAddress = NULL;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500462 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, &mappedAddress);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500463
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600464 msgFlags = m_errorMonitor->GetState(&msgString);
465 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 -0500466 if (!strstr(msgString.c_str(),"Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT")) {
467 FAIL() << "Error received did not match expected error message from vkMapMemory in MemTracker";
468 }
469}
470
471TEST_F(VkLayerTest, BindInvalidMemory)
472{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600473 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500474 std::string msgString;
475 VkResult err;
476
477 ASSERT_NO_FATAL_FAILURE(InitState());
478 m_errorMonitor->ClearState();
479
480 // Create an image, allocate memory, free it, and then try to bind it
481 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500482 VkDeviceMemory mem;
483 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500484
485 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
486 const int32_t tex_width = 32;
487 const int32_t tex_height = 32;
488 size_t mem_reqs_size = sizeof(VkMemoryRequirements);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500489
490 const VkImageCreateInfo image_create_info = {
491 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
492 .pNext = NULL,
493 .imageType = VK_IMAGE_TYPE_2D,
494 .format = tex_format,
495 .extent = { tex_width, tex_height, 1 },
496 .mipLevels = 1,
497 .arraySize = 1,
498 .samples = 1,
499 .tiling = VK_IMAGE_TILING_LINEAR,
500 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
501 .flags = 0,
502 };
503 VkMemoryAllocInfo mem_alloc = {
504 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
505 .pNext = NULL,
506 .allocationSize = 0,
507 .memProps = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500508 };
509
510 err = vkCreateImage(m_device->device(), &image_create_info, &image);
511 ASSERT_VK_SUCCESS(err);
512
513 err = vkGetObjectInfo(m_device->device(),
514 VK_OBJECT_TYPE_IMAGE,
515 image,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500516 VK_OBJECT_INFO_TYPE_MEMORY_REQUIREMENTS,
517 &mem_reqs_size,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500518 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500519 ASSERT_VK_SUCCESS(err);
520
Mark Lobodzinski23182612015-05-29 09:32:35 -0500521 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500522
523 // allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500524 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500525 ASSERT_VK_SUCCESS(err);
526
527 // Introduce validation failure, free memory before binding
Mark Lobodzinski23182612015-05-29 09:32:35 -0500528 vkFreeMemory(m_device->device(), mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500529 ASSERT_VK_SUCCESS(err);
530
531 // Try to bind free memory that has been freed
Mark Lobodzinski23182612015-05-29 09:32:35 -0500532 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500533 ASSERT_VK_SUCCESS(err);
534
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600535 msgFlags = m_errorMonitor->GetState(&msgString);
536 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 -0500537 if (!strstr(msgString.c_str(),"couldn't find info for mem obj")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500538 FAIL() << "Error received did not match expected error message from BindObjectMemory in MemTracker";
539 }
540}
541
542TEST_F(VkLayerTest, FreeBoundMemory)
543{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600544 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500545 std::string msgString;
546 VkResult err;
547
548 ASSERT_NO_FATAL_FAILURE(InitState());
549 m_errorMonitor->ClearState();
550
551 // Create an image, allocate memory, free it, and then try to bind it
552 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500553 VkDeviceMemory mem;
554 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500555
556 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
557 const int32_t tex_width = 32;
558 const int32_t tex_height = 32;
559 size_t mem_reqs_size = sizeof(VkMemoryRequirements);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500560
561 const VkImageCreateInfo image_create_info = {
562 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
563 .pNext = NULL,
564 .imageType = VK_IMAGE_TYPE_2D,
565 .format = tex_format,
566 .extent = { tex_width, tex_height, 1 },
567 .mipLevels = 1,
568 .arraySize = 1,
569 .samples = 1,
570 .tiling = VK_IMAGE_TILING_LINEAR,
571 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
572 .flags = 0,
573 };
574 VkMemoryAllocInfo mem_alloc = {
575 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
576 .pNext = NULL,
577 .allocationSize = 0,
578 .memProps = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500579 };
580
581 err = vkCreateImage(m_device->device(), &image_create_info, &image);
582 ASSERT_VK_SUCCESS(err);
583
584 err = vkGetObjectInfo(m_device->device(),
585 VK_OBJECT_TYPE_IMAGE,
586 image,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500587 VK_OBJECT_INFO_TYPE_MEMORY_REQUIREMENTS,
588 &mem_reqs_size,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500589 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500590 ASSERT_VK_SUCCESS(err);
591
Mark Lobodzinski23182612015-05-29 09:32:35 -0500592 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500593
594 // allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500595 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500596 ASSERT_VK_SUCCESS(err);
597
598 // Bind memory to Image object
Mark Lobodzinski23182612015-05-29 09:32:35 -0500599 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500600 ASSERT_VK_SUCCESS(err);
601
602 // Introduce validation failure, free memory while still bound to object
Mark Lobodzinski23182612015-05-29 09:32:35 -0500603 vkFreeMemory(m_device->device(), mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500604 ASSERT_VK_SUCCESS(err);
605
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600606 msgFlags = m_errorMonitor->GetState(&msgString);
Courtney Goeltzenleuchter7dc4c8b2015-06-13 21:48:47 -0600607 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 -0500608 if (!strstr(msgString.c_str(),"Freeing memory object while it still has references")) {
609 FAIL() << "Warning received did not match expected message from freeMemObjInfo in MemTracker";
610 }
611}
612
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500613TEST_F(VkLayerTest, RebindMemory)
614{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600615 VkFlags msgFlags;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500616 std::string msgString;
617 VkResult err;
618
619 ASSERT_NO_FATAL_FAILURE(InitState());
620 m_errorMonitor->ClearState();
621
622 // Create an image, allocate memory, free it, and then try to bind it
623 VkImage image;
624 VkDeviceMemory mem1;
625 VkDeviceMemory mem2;
626 VkMemoryRequirements mem_reqs;
627
628 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
629 const int32_t tex_width = 32;
630 const int32_t tex_height = 32;
631 size_t mem_reqs_size = sizeof(VkMemoryRequirements);
632
633 const VkImageCreateInfo image_create_info = {
634 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
635 .pNext = NULL,
636 .imageType = VK_IMAGE_TYPE_2D,
637 .format = tex_format,
638 .extent = { tex_width, tex_height, 1 },
639 .mipLevels = 1,
640 .arraySize = 1,
641 .samples = 1,
642 .tiling = VK_IMAGE_TILING_LINEAR,
643 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
644 .flags = 0,
645 };
646 VkMemoryAllocInfo mem_alloc = {
647 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
648 .pNext = NULL,
649 .allocationSize = 0,
650 .memProps = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500651 };
652
653 err = vkCreateImage(m_device->device(), &image_create_info, &image);
654 ASSERT_VK_SUCCESS(err);
655
656 err = vkGetObjectInfo(m_device->device(),
657 VK_OBJECT_TYPE_IMAGE,
658 image,
659 VK_OBJECT_INFO_TYPE_MEMORY_REQUIREMENTS,
660 &mem_reqs_size,
661 &mem_reqs);
662 ASSERT_VK_SUCCESS(err);
663
664 mem_alloc.allocationSize = mem_reqs.size;
665
666 // allocate 2 memory objects
667 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem1);
668 ASSERT_VK_SUCCESS(err);
669 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem2);
670 ASSERT_VK_SUCCESS(err);
671
672 // Bind first memory object to Image object
673 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem1, 0);
674 ASSERT_VK_SUCCESS(err);
675
676 // Introduce validation failure, try to bind a different memory object to the same image object
677 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem2, 0);
678 ASSERT_VK_SUCCESS(err);
679
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600680 msgFlags = m_errorMonitor->GetState(&msgString);
681 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 -0500682 if (!strstr(msgString.c_str(),"which has already been bound to mem object")) {
683 FAIL() << "Error received did not match expected message when rebinding memory to an object";
684 }
685}
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500686
687TEST_F(VkLayerTest, BindMemoryToDestroyedObject)
688{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600689 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500690 std::string msgString;
691 VkResult err;
692
693 ASSERT_NO_FATAL_FAILURE(InitState());
694 m_errorMonitor->ClearState();
695
696 // Create an image object, allocate memory, destroy the object and then try to bind it
697 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500698 VkDeviceMemory mem;
699 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500700
701 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
702 const int32_t tex_width = 32;
703 const int32_t tex_height = 32;
704 size_t mem_reqs_size = sizeof(VkMemoryRequirements);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500705
706 const VkImageCreateInfo image_create_info = {
707 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
708 .pNext = NULL,
709 .imageType = VK_IMAGE_TYPE_2D,
710 .format = tex_format,
711 .extent = { tex_width, tex_height, 1 },
712 .mipLevels = 1,
713 .arraySize = 1,
714 .samples = 1,
715 .tiling = VK_IMAGE_TILING_LINEAR,
716 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
717 .flags = 0,
718 };
719 VkMemoryAllocInfo mem_alloc = {
720 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
721 .pNext = NULL,
722 .allocationSize = 0,
723 .memProps = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500724 };
725
726 err = vkCreateImage(m_device->device(), &image_create_info, &image);
727 ASSERT_VK_SUCCESS(err);
728
729 err = vkGetObjectInfo(m_device->device(),
730 VK_OBJECT_TYPE_IMAGE,
731 image,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500732 VK_OBJECT_INFO_TYPE_MEMORY_REQUIREMENTS,
733 &mem_reqs_size,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500734 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500735 ASSERT_VK_SUCCESS(err);
736
Mark Lobodzinski23182612015-05-29 09:32:35 -0500737 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500738
739 // Allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500740 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500741 ASSERT_VK_SUCCESS(err);
742
743 // Introduce validation failure, destroy Image object before binding
744 vkDestroyObject(m_device->device(), VK_OBJECT_TYPE_IMAGE, image);
745 ASSERT_VK_SUCCESS(err);
746
747 // Now Try to bind memory to this destroyted object
Mark Lobodzinski23182612015-05-29 09:32:35 -0500748 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500749 ASSERT_VK_SUCCESS(err);
750
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600751 msgFlags = m_errorMonitor->GetState(&msgString);
752 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 -0500753 if (!strstr(msgString.c_str(),"that's not in global list")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500754 FAIL() << "Error received did not match expected error message from updateObjectBinding in MemTracker";
755 }
756}
757
Tony Barbour8508b8e2015-04-09 10:48:04 -0600758TEST_F(VkLayerTest, SubmitSignaledFence)
Tony Barbour30486ea2015-04-07 13:44:53 -0600759{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600760 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600761 VkFlags msgFlags;
Tony Barbour30486ea2015-04-07 13:44:53 -0600762 std::string msgString;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600763
764 VkFenceCreateInfo fenceInfo = {};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600765 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
766 fenceInfo.pNext = NULL;
767 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour30486ea2015-04-07 13:44:53 -0600768
Tony Barbour30486ea2015-04-07 13:44:53 -0600769 ASSERT_NO_FATAL_FAILURE(InitState());
770 ASSERT_NO_FATAL_FAILURE(InitViewport());
771 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
772
Tony Barbour01999182015-04-09 12:58:51 -0600773 VkCommandBufferObj cmdBuffer(m_device);
Tony Barbour30486ea2015-04-07 13:44:53 -0600774 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
775
Tony Barbour8508b8e2015-04-09 10:48:04 -0600776 BeginCommandBuffer(cmdBuffer);
Tony Barbour30486ea2015-04-07 13:44:53 -0600777 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour8508b8e2015-04-09 10:48:04 -0600778 EndCommandBuffer(cmdBuffer);
Tony Barbour30486ea2015-04-07 13:44:53 -0600779
780 testFence.init(*m_device, fenceInfo);
781 m_errorMonitor->ClearState();
Tony Barbour8508b8e2015-04-09 10:48:04 -0600782 cmdBuffer.QueueCommandBuffer(testFence.obj());
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600783 msgFlags = m_errorMonitor->GetState(&msgString);
784 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 -0600785 if (!strstr(msgString.c_str(),"submitted in SIGNALED state. Fences must be reset before being submitted")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500786 FAIL() << "Error received was not 'VkQueueSubmit with fence in SIGNALED_STATE'";
Tony Barbour8508b8e2015-04-09 10:48:04 -0600787 }
788
789}
790
791TEST_F(VkLayerTest, ResetUnsignaledFence)
792{
793 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600794 VkFlags msgFlags;
Tony Barbour8508b8e2015-04-09 10:48:04 -0600795 std::string msgString;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600796 VkFenceCreateInfo fenceInfo = {};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600797 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
798 fenceInfo.pNext = NULL;
799
Tony Barbour8508b8e2015-04-09 10:48:04 -0600800 ASSERT_NO_FATAL_FAILURE(InitState());
801 testFence.init(*m_device, fenceInfo);
802 m_errorMonitor->ClearState();
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600803 VkFence fences[1] = {testFence.obj()};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600804 vkResetFences(m_device->device(), 1, fences);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600805 msgFlags = m_errorMonitor->GetState(&msgString);
806 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 -0600807 if (!strstr(msgString.c_str(),"submitted to VkResetFences in UNSIGNALED STATE")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500808 FAIL() << "Error received was not 'VkResetFences with fence in UNSIGNALED_STATE'";
Tony Barbour8508b8e2015-04-09 10:48:04 -0600809 }
Tony Barbour30486ea2015-04-07 13:44:53 -0600810
811}
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600812#endif
813#if OBJECT_TRACKER_TESTS
Tony Barbour54cdd192015-04-22 15:12:07 -0600814
Tony Barbourdb686622015-05-06 09:35:56 -0600815TEST_F(VkLayerTest, GetObjectInfoMismatchedType)
816{
817 VkEventCreateInfo event_info;
818 VkEvent event;
819 VkMemoryRequirements mem_req;
820 size_t data_size = sizeof(mem_req);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600821 VkFlags msgFlags;
Tony Barbourdb686622015-05-06 09:35:56 -0600822 std::string msgString;
823 VkResult err;
824
825 ASSERT_NO_FATAL_FAILURE(InitState());
826 memset(&event_info, 0, sizeof(event_info));
827 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
828
829 err = vkCreateEvent(device(), &event_info, &event);
830 ASSERT_VK_SUCCESS(err);
831 m_errorMonitor->ClearState();
832 err = vkGetObjectInfo(device(), VK_OBJECT_TYPE_IMAGE, event, VK_OBJECT_INFO_TYPE_MEMORY_REQUIREMENTS,
833 &data_size, &mem_req);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600834 msgFlags = m_errorMonitor->GetState(&msgString);
835 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from mismatched types in vkGetObjectInfo";
Tony Barbourdb686622015-05-06 09:35:56 -0600836 if (!strstr(msgString.c_str(),"does not match designated type")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500837 FAIL() << "Error received was not 'does not match designated type'";
Tony Barbourdb686622015-05-06 09:35:56 -0600838 }
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500839}
Tony Barbourdb686622015-05-06 09:35:56 -0600840
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500841TEST_F(VkLayerTest, RasterStateNotBound)
842{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600843 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500844 std::string msgString;
845
846 TEST_DESCRIPTION("Simple Draw Call that validates failure when a raster state object is not bound beforehand");
847
848 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailRaster);
849
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600850 msgFlags = m_errorMonitor->GetState(&msgString);
851 ASSERT_EQ(msgFlags, VK_DBG_MSG_ERROR) << "Did not receive an error from Not Binding a Raster State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500852 if (!strstr(msgString.c_str(),"Raster object not bound to this command buffer")) {
853 FAIL() << "Error received was not 'Raster object not bound to this command buffer'";
854 }
855}
856
857TEST_F(VkLayerTest, ViewportStateNotBound)
858{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600859 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500860 std::string msgString;
861 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport state object is not bound beforehand");
862
863 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
864
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600865 msgFlags = m_errorMonitor->GetState(&msgString);
866 ASSERT_EQ(msgFlags, VK_DBG_MSG_ERROR) << "Did not receive an error from Not Binding a Viewport State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500867 if (!strstr(msgString.c_str(),"Viewport object not bound to this command buffer")) {
868 FAIL() << "Error received was not 'Viewport object not bound to this command buffer'";
869 }
870}
871
872TEST_F(VkLayerTest, ColorBlendStateNotBound)
873{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600874 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500875 std::string msgString;
876
877 TEST_DESCRIPTION("Simple Draw Call that validates failure when a color-blend state object is not bound beforehand");
878
879 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailColorBlend);
880
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600881 msgFlags = m_errorMonitor->GetState(&msgString);
882 ASSERT_EQ(msgFlags, VK_DBG_MSG_ERROR) << "Did not receive an error from Not Binding a ColorBlend State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500883 if (!strstr(msgString.c_str(),"Color-blend object not bound to this command buffer")) {
884 FAIL() << "Error received was not 'Color-blend object not bound to this command buffer'";
885 }
886}
887
888TEST_F(VkLayerTest, DepthStencilStateNotBound)
889{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600890 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500891 std::string msgString;
892
893 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth-stencil state object is not bound beforehand");
894
895 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthStencil);
896
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600897 msgFlags = m_errorMonitor->GetState(&msgString);
898 ASSERT_EQ(msgFlags, VK_DBG_MSG_ERROR) << "Did not receive an error from Not Binding a DepthStencil State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500899 if (!strstr(msgString.c_str(),"Depth-stencil object not bound to this command buffer")) {
900 FAIL() << "Error received was not 'Depth-stencil object not bound to this command buffer'";
901 }
Tony Barbourdb686622015-05-06 09:35:56 -0600902}
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600903#endif
904#if DRAW_STATE_TESTS
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600905TEST_F(VkLayerTest, PipelineNotBound)
906{
907 // Initiate Draw w/o a PSO bound
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600908 VkFlags msgFlags;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600909 std::string msgString;
910
911 ASSERT_NO_FATAL_FAILURE(InitState());
912 m_errorMonitor->ClearState();
913 VkCommandBufferObj cmdBuffer(m_device);
914 BeginCommandBuffer(cmdBuffer);
915 VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
916 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600917 msgFlags = m_errorMonitor->GetState(&msgString);
918 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding invalid pipeline to CmdBuffer";
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600919 if (!strstr(msgString.c_str(),"Attempt to bind Pipeline ")) {
920 FAIL() << "Error received was not 'Attempt to bind Pipeline 0xbaadb1be that doesn't exist!'";
921 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600922}
923
924TEST_F(VkLayerTest, InvalidDescriptorPool)
925{
926 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
927 // The DS check for this is after driver has been called to validate DS internal data struct
928 // Attempt to clear DS Pool with bad object
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600929/* VkFlags msgFlags;
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600930 std::string msgString;
931 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
932 vkResetDescriptorPool(device(), badPool);
933
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600934 msgFlags = m_errorMonitor->GetState(&msgString);
935 ASSERT_EQ(msgFlags, VK_DBG_MSG_ERROR) << "Did not receive an error from Resetting an invalid DescriptorPool Object";
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600936 if (!strstr(msgString.c_str(),"Unable to find pool node for pool 0xbaad6001 specified in vkResetDescriptorPool() call")) {
937 FAIL() << "Error received was note 'Unable to find pool node for pool 0xbaad6001 specified in vkResetDescriptorPool() call'";
938 }*/
939}
940
941TEST_F(VkLayerTest, InvalidDescriptorSet)
942{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600943 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
944 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600945 // Create a valid cmd buffer
946 // call vkCmdBindDescriptorSets w/ false DS
947}
948
949TEST_F(VkLayerTest, InvalidDescriptorSetLayout)
950{
951 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
952 // The DS check for this is after driver has been called to validate DS internal data struct
953}
954
955TEST_F(VkLayerTest, InvalidPipeline)
956{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600957 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
958 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600959 // Create a valid cmd buffer
960 // call vkCmdBindPipeline w/ false Pipeline
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600961 VkFlags msgFlags;
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600962 std::string msgString;
963
964 ASSERT_NO_FATAL_FAILURE(InitState());
965 m_errorMonitor->ClearState();
966 VkCommandBufferObj cmdBuffer(m_device);
967 BeginCommandBuffer(cmdBuffer);
968 VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
969 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600970 msgFlags = m_errorMonitor->GetState(&msgString);
971 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding invalid pipeline to CmdBuffer";
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600972 if (!strstr(msgString.c_str(),"Attempt to bind Pipeline ")) {
973 FAIL() << "Error received was not 'Attempt to bind Pipeline 0xbaadb1be that doesn't exist!'";
974 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600975}
976
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600977TEST_F(VkLayerTest, NoEndCmdBuffer)
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600978{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600979 // Create and update CmdBuffer then call QueueSubmit w/o calling End on CmdBuffer
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600980 VkFlags msgFlags;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600981 std::string msgString;
982 VkResult err;
983
984 ASSERT_NO_FATAL_FAILURE(InitState());
985 m_errorMonitor->ClearState();
986 VkCommandBufferObj cmdBuffer(m_device);
987 const VkDescriptorTypeCount ds_type_count = {
988 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
989 .count = 1,
990 };
991 const VkDescriptorPoolCreateInfo ds_pool_ci = {
992 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
993 .pNext = NULL,
994 .count = 1,
995 .pTypeCount = &ds_type_count,
996 };
997 VkDescriptorPool ds_pool;
998 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
999 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001000
1001 const VkDescriptorSetLayoutBinding dsl_binding = {
1002 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001003 .arraySize = 1,
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001004 .stageFlags = VK_SHADER_STAGE_ALL,
1005 .pImmutableSamplers = NULL,
1006 };
1007
1008 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1009 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1010 .pNext = NULL,
1011 .count = 1,
1012 .pBinding = &dsl_binding,
1013 };
1014 VkDescriptorSetLayout ds_layout;
1015 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1016 ASSERT_VK_SUCCESS(err);
1017
1018 VkDescriptorSet descriptorSet;
1019 uint32_t ds_count = 0;
1020 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1021 ASSERT_VK_SUCCESS(err);
1022
1023 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1024 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1025 .pNext = NULL,
1026 .descriptorSetCount = 1,
1027 .pSetLayouts = &ds_layout,
1028 };
1029
1030 VkPipelineLayout pipeline_layout;
1031 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1032 ASSERT_VK_SUCCESS(err);
1033
1034 size_t shader_len = strlen(bindStateVertShaderText);
1035 size_t codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
1036 void* pCode = malloc(codeSize);
1037
1038 /* try version 0 first: VkShaderStage followed by GLSL */
1039 ((uint32_t *) pCode)[0] = ICD_SPV_MAGIC;
1040 ((uint32_t *) pCode)[1] = 0;
1041 ((uint32_t *) pCode)[2] = VK_SHADER_STAGE_VERTEX;
1042 memcpy(((uint32_t *) pCode + 3), bindStateVertShaderText, shader_len + 1);
1043
1044 const VkShaderCreateInfo vs_ci = {
1045 .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
1046 .pNext = NULL,
Courtney Goeltzenleuchter1d723102015-06-18 21:49:59 -06001047 .module = VK_NULL_HANDLE,
1048 .name = "main",
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001049 .codeSize = codeSize,
1050 .pCode = pCode,
1051 .flags = 0,
1052 };
1053 VkShader vs;
1054 err = vkCreateShader(m_device->device(), &vs_ci, &vs);
1055 ASSERT_VK_SUCCESS(err);
1056
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001057 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1058 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1059 .pNext = NULL,
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001060 .stage = VK_SHADER_STAGE_VERTEX,
1061 .shader = vs,
1062 .linkConstBufferCount = 0,
1063 .pLinkConstBufferInfo = NULL,
1064 .pSpecializationInfo = NULL,
1065 };
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001066 const VkGraphicsPipelineCreateInfo gp_ci = {
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001067 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1068 .pNext = NULL,
1069 .stageCount = 1,
1070 .pStages = &pipe_vs_ci,
1071 .pVertexInputState = NULL,
1072 .pIaState = NULL,
1073 .pTessState = NULL,
1074 .pVpState = NULL,
1075 .pRsState = NULL,
1076 .pMsState = NULL,
1077 .pDsState = NULL,
1078 .pCbState = NULL,
1079 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1080 .layout = pipeline_layout,
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001081 };
1082
1083 VkPipeline pipeline;
1084 err = vkCreateGraphicsPipeline(m_device->device(), &gp_ci, &pipeline);
1085 ASSERT_VK_SUCCESS(err);
1086
1087 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinskia65c4632015-06-15 13:21:21 -06001088 vkCmdBindDescriptorSets(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001089
1090 VkCmdBuffer localCmdBuffer = cmdBuffer.GetBufferHandle();
1091 m_device->get_device_queue();
1092 vkQueueSubmit(m_device->m_queue, 1, &localCmdBuffer, NULL);
1093
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001094 msgFlags = m_errorMonitor->GetState(&msgString);
1095 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after vkEndDescriptorPoolUpdate() w/o first calling vkBeginDescriptorPoolUpdate().";
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001096 if (!strstr(msgString.c_str(),"You must call vkEndCommandBuffer() on CB ")) {
1097 FAIL() << "Error received was not 'You must call vkEndCommandBuffer() on CB <0xblah> before this call to vkQueueSubmit()!'";
1098 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001099}
1100
1101TEST_F(VkLayerTest, InvalidDynamicStateObject)
1102{
1103 // Create a valid cmd buffer
1104 // call vkCmdBindDynamicStateObject w/ false DS Obj
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001105 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
1106 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001107}
Tobin Ehlis201b1ba2015-05-27 14:55:35 -06001108
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001109TEST_F(VkLayerTest, VtxBufferBadIndex)
1110{
1111 // Bind VBO out-of-bounds for given PSO
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001112 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001113 std::string msgString;
1114 VkResult err;
1115
1116 ASSERT_NO_FATAL_FAILURE(InitState());
1117 m_errorMonitor->ClearState();
1118 VkCommandBufferObj cmdBuffer(m_device);
1119 const VkDescriptorTypeCount ds_type_count = {
1120 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1121 .count = 1,
1122 };
1123 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1124 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1125 .pNext = NULL,
1126 .count = 1,
1127 .pTypeCount = &ds_type_count,
1128 };
1129 VkDescriptorPool ds_pool;
1130 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1131 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001132
1133 const VkDescriptorSetLayoutBinding dsl_binding = {
1134 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001135 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001136 .stageFlags = VK_SHADER_STAGE_ALL,
1137 .pImmutableSamplers = NULL,
1138 };
1139
1140 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1141 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1142 .pNext = NULL,
1143 .count = 1,
1144 .pBinding = &dsl_binding,
1145 };
1146 VkDescriptorSetLayout ds_layout;
1147 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1148 ASSERT_VK_SUCCESS(err);
1149
1150 VkDescriptorSet descriptorSet;
1151 uint32_t ds_count = 0;
1152 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1153 ASSERT_VK_SUCCESS(err);
1154
1155 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1156 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1157 .pNext = NULL,
1158 .descriptorSetCount = 1,
1159 .pSetLayouts = &ds_layout,
1160 };
1161
1162 VkPipelineLayout pipeline_layout;
1163 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1164 ASSERT_VK_SUCCESS(err);
1165
1166 size_t shader_len = strlen(bindStateVertShaderText);
1167 size_t codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
1168 void* pCode = malloc(codeSize);
1169
1170 /* try version 0 first: VkShaderStage followed by GLSL */
1171 ((uint32_t *) pCode)[0] = ICD_SPV_MAGIC;
1172 ((uint32_t *) pCode)[1] = 0;
1173 ((uint32_t *) pCode)[2] = VK_SHADER_STAGE_VERTEX;
1174 memcpy(((uint32_t *) pCode + 3), bindStateVertShaderText, shader_len + 1);
1175
1176 const VkShaderCreateInfo vs_ci = {
1177 .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
1178 .pNext = NULL,
Courtney Goeltzenleuchter1d723102015-06-18 21:49:59 -06001179 .module = VK_NULL_HANDLE,
1180 .name = "main",
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001181 .codeSize = codeSize,
1182 .pCode = pCode,
1183 .flags = 0,
1184 };
1185 VkShader vs;
1186 err = vkCreateShader(m_device->device(), &vs_ci, &vs);
1187
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001188 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1189 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1190 .pNext = NULL,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001191 .stage = VK_SHADER_STAGE_VERTEX,
1192 .shader = vs,
1193 .linkConstBufferCount = 0,
1194 .pLinkConstBufferInfo = NULL,
1195 .pSpecializationInfo = NULL,
1196 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001197 const VkGraphicsPipelineCreateInfo gp_ci = {
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001198 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1199 .pNext = NULL,
1200 .stageCount = 1,
1201 .pStages = &pipe_vs_ci,
1202 .pVertexInputState = NULL,
1203 .pIaState = NULL,
1204 .pTessState = NULL,
1205 .pVpState = NULL,
1206 .pRsState = NULL,
1207 .pMsState = NULL,
1208 .pDsState = NULL,
1209 .pCbState = NULL,
1210 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1211 .layout = pipeline_layout,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001212 };
1213
1214 VkPipeline pipeline;
1215 err = vkCreateGraphicsPipeline(m_device->device(), &gp_ci, &pipeline);
1216 ASSERT_VK_SUCCESS(err);
1217
1218 err= cmdBuffer.BeginCommandBuffer();
1219 ASSERT_VK_SUCCESS(err);
1220 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1221 // Should error before calling to driver so don't care about actual data
1222 vkCmdBindVertexBuffers(cmdBuffer.GetBufferHandle(), 0, 1, NULL, NULL);
1223
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001224 msgFlags = m_errorMonitor->GetState(&msgString);
1225 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after vkCmdBindVertexBuffers() w/o any Vtx Inputs in PSO.";
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001226 if (!strstr(msgString.c_str(),"Vtx Buffer Index 0 was bound, but no vtx buffers are attached to PSO.")) {
1227 FAIL() << "Error received was not 'Vtx Buffer Index 0 was bound, but no vtx buffers are attached to PSO.'";
1228 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001229}
1230
1231TEST_F(VkLayerTest, DSTypeMismatch)
1232{
1233 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001234 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001235 std::string msgString;
1236 VkResult err;
1237
1238 ASSERT_NO_FATAL_FAILURE(InitState());
1239 m_errorMonitor->ClearState();
1240 //VkDescriptorSetObj descriptorSet(m_device);
1241 const VkDescriptorTypeCount ds_type_count = {
1242 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1243 .count = 1,
1244 };
1245 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1246 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1247 .pNext = NULL,
1248 .count = 1,
1249 .pTypeCount = &ds_type_count,
1250 };
1251 VkDescriptorPool ds_pool;
1252 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1253 ASSERT_VK_SUCCESS(err);
1254 const VkDescriptorSetLayoutBinding dsl_binding = {
1255 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001256 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001257 .stageFlags = VK_SHADER_STAGE_ALL,
1258 .pImmutableSamplers = NULL,
1259 };
1260
1261 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1262 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1263 .pNext = NULL,
1264 .count = 1,
1265 .pBinding = &dsl_binding,
1266 };
1267 VkDescriptorSetLayout ds_layout;
1268 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1269 ASSERT_VK_SUCCESS(err);
1270
1271 VkDescriptorSet descriptorSet;
1272 uint32_t ds_count = 0;
1273 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1274 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001275
1276 const VkSamplerCreateInfo sampler_ci = {
1277 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1278 .pNext = NULL,
1279 .magFilter = VK_TEX_FILTER_NEAREST,
1280 .minFilter = VK_TEX_FILTER_NEAREST,
1281 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1282 .addressU = VK_TEX_ADDRESS_CLAMP,
1283 .addressV = VK_TEX_ADDRESS_CLAMP,
1284 .addressW = VK_TEX_ADDRESS_CLAMP,
1285 .mipLodBias = 1.0,
1286 .maxAnisotropy = 1,
1287 .compareOp = VK_COMPARE_OP_NEVER,
1288 .minLod = 1.0,
1289 .maxLod = 1.0,
1290 .borderColor = VK_BORDER_COLOR_OPAQUE_WHITE,
1291 };
1292 VkSampler sampler;
1293 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1294 ASSERT_VK_SUCCESS(err);
1295
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001296 VkDescriptorInfo descriptor_info;
1297 memset(&descriptor_info, 0, sizeof(descriptor_info));
1298 descriptor_info.sampler = sampler;
1299
1300 VkWriteDescriptorSet descriptor_write;
1301 memset(&descriptor_write, 0, sizeof(descriptor_write));
1302 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1303 descriptor_write.destSet = descriptorSet;
1304 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001305 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001306 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1307 descriptor_write.pDescriptors = &descriptor_info;
1308
1309 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1310
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001311 msgFlags = m_errorMonitor->GetState(&msgString);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001312 std::cout << msgString << "\n";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001313 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 +08001314 if (!strstr(msgString.c_str(),"Descriptor update type of VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET does not match ")) {
1315 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 -06001316 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001317}
1318
1319TEST_F(VkLayerTest, DSUpdateOutOfBounds)
1320{
1321 // For overlapping Update, have arrayIndex exceed that of layout
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001322 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001323 std::string msgString;
1324 VkResult err;
1325
1326 ASSERT_NO_FATAL_FAILURE(InitState());
1327 m_errorMonitor->ClearState();
1328 //VkDescriptorSetObj descriptorSet(m_device);
1329 const VkDescriptorTypeCount ds_type_count = {
1330 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1331 .count = 1,
1332 };
1333 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1334 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1335 .pNext = NULL,
1336 .count = 1,
1337 .pTypeCount = &ds_type_count,
1338 };
1339 VkDescriptorPool ds_pool;
1340 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1341 ASSERT_VK_SUCCESS(err);
1342 const VkDescriptorSetLayoutBinding dsl_binding = {
1343 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001344 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001345 .stageFlags = VK_SHADER_STAGE_ALL,
1346 .pImmutableSamplers = NULL,
1347 };
1348
1349 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1350 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1351 .pNext = NULL,
1352 .count = 1,
1353 .pBinding = &dsl_binding,
1354 };
1355 VkDescriptorSetLayout ds_layout;
1356 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1357 ASSERT_VK_SUCCESS(err);
1358
1359 VkDescriptorSet descriptorSet;
1360 uint32_t ds_count = 0;
1361 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1362 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001363
1364 const VkSamplerCreateInfo sampler_ci = {
1365 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1366 .pNext = NULL,
1367 .magFilter = VK_TEX_FILTER_NEAREST,
1368 .minFilter = VK_TEX_FILTER_NEAREST,
1369 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1370 .addressU = VK_TEX_ADDRESS_CLAMP,
1371 .addressV = VK_TEX_ADDRESS_CLAMP,
1372 .addressW = VK_TEX_ADDRESS_CLAMP,
1373 .mipLodBias = 1.0,
1374 .maxAnisotropy = 1,
1375 .compareOp = VK_COMPARE_OP_NEVER,
1376 .minLod = 1.0,
1377 .maxLod = 1.0,
1378 .borderColor = VK_BORDER_COLOR_OPAQUE_WHITE,
1379 };
1380 VkSampler sampler;
1381 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1382 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001383
1384 VkDescriptorInfo descriptor_info;
1385 memset(&descriptor_info, 0, sizeof(descriptor_info));
1386 descriptor_info.sampler = sampler;
1387
1388 VkWriteDescriptorSet descriptor_write;
1389 memset(&descriptor_write, 0, sizeof(descriptor_write));
1390 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1391 descriptor_write.destSet = descriptorSet;
1392 descriptor_write.destArrayElement = 1; /* This index out of bounds for the update */
1393 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001394 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001395 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1396 descriptor_write.pDescriptors = &descriptor_info;
1397
1398 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1399
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001400 msgFlags = m_errorMonitor->GetState(&msgString);
1401 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 +08001402 if (!strstr(msgString.c_str(),"Descriptor update type of VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET is out of bounds for matching binding")) {
1403 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 -06001404 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001405}
1406
1407TEST_F(VkLayerTest, InvalidDSUpdateIndex)
1408{
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001409 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001410 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001411 std::string msgString;
1412 VkResult err;
1413
1414 ASSERT_NO_FATAL_FAILURE(InitState());
1415 m_errorMonitor->ClearState();
1416 //VkDescriptorSetObj descriptorSet(m_device);
1417 const VkDescriptorTypeCount ds_type_count = {
1418 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1419 .count = 1,
1420 };
1421 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1422 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1423 .pNext = NULL,
1424 .count = 1,
1425 .pTypeCount = &ds_type_count,
1426 };
1427 VkDescriptorPool ds_pool;
1428 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1429 ASSERT_VK_SUCCESS(err);
1430 const VkDescriptorSetLayoutBinding dsl_binding = {
1431 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001432 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001433 .stageFlags = VK_SHADER_STAGE_ALL,
1434 .pImmutableSamplers = NULL,
1435 };
1436
1437 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1438 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1439 .pNext = NULL,
1440 .count = 1,
1441 .pBinding = &dsl_binding,
1442 };
1443 VkDescriptorSetLayout ds_layout;
1444 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1445 ASSERT_VK_SUCCESS(err);
1446
1447 VkDescriptorSet descriptorSet;
1448 uint32_t ds_count = 0;
1449 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1450 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001451
1452 const VkSamplerCreateInfo sampler_ci = {
1453 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1454 .pNext = NULL,
1455 .magFilter = VK_TEX_FILTER_NEAREST,
1456 .minFilter = VK_TEX_FILTER_NEAREST,
1457 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1458 .addressU = VK_TEX_ADDRESS_CLAMP,
1459 .addressV = VK_TEX_ADDRESS_CLAMP,
1460 .addressW = VK_TEX_ADDRESS_CLAMP,
1461 .mipLodBias = 1.0,
1462 .maxAnisotropy = 1,
1463 .compareOp = VK_COMPARE_OP_NEVER,
1464 .minLod = 1.0,
1465 .maxLod = 1.0,
1466 .borderColor = VK_BORDER_COLOR_OPAQUE_WHITE,
1467 };
1468 VkSampler sampler;
1469 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1470 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001471
1472 VkDescriptorInfo descriptor_info;
1473 memset(&descriptor_info, 0, sizeof(descriptor_info));
1474 descriptor_info.sampler = sampler;
1475
1476 VkWriteDescriptorSet descriptor_write;
1477 memset(&descriptor_write, 0, sizeof(descriptor_write));
1478 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1479 descriptor_write.destSet = descriptorSet;
1480 descriptor_write.destBinding = 2;
1481 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001482 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001483 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1484 descriptor_write.pDescriptors = &descriptor_info;
1485
1486 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1487
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001488 msgFlags = m_errorMonitor->GetState(&msgString);
1489 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 -06001490 if (!strstr(msgString.c_str()," does not have binding to match update binding ")) {
1491 FAIL() << "Error received was not 'Descriptor Set <blah> does not have binding to match update binding '";
1492 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001493}
1494
1495TEST_F(VkLayerTest, InvalidDSUpdateStruct)
1496{
1497 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_* types
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001498 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001499 std::string msgString;
1500 VkResult err;
1501
1502 ASSERT_NO_FATAL_FAILURE(InitState());
1503 m_errorMonitor->ClearState();
1504 //VkDescriptorSetObj descriptorSet(m_device);
1505 const VkDescriptorTypeCount ds_type_count = {
1506 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1507 .count = 1,
1508 };
1509 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1510 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1511 .pNext = NULL,
1512 .count = 1,
1513 .pTypeCount = &ds_type_count,
1514 };
1515 VkDescriptorPool ds_pool;
1516 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1517 ASSERT_VK_SUCCESS(err);
1518 const VkDescriptorSetLayoutBinding dsl_binding = {
1519 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001520 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001521 .stageFlags = VK_SHADER_STAGE_ALL,
1522 .pImmutableSamplers = NULL,
1523 };
1524
1525 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1526 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1527 .pNext = NULL,
1528 .count = 1,
1529 .pBinding = &dsl_binding,
1530 };
1531 VkDescriptorSetLayout ds_layout;
1532 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1533 ASSERT_VK_SUCCESS(err);
1534
1535 VkDescriptorSet descriptorSet;
1536 uint32_t ds_count = 0;
1537 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1538 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001539
1540 const VkSamplerCreateInfo sampler_ci = {
1541 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1542 .pNext = NULL,
1543 .magFilter = VK_TEX_FILTER_NEAREST,
1544 .minFilter = VK_TEX_FILTER_NEAREST,
1545 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1546 .addressU = VK_TEX_ADDRESS_CLAMP,
1547 .addressV = VK_TEX_ADDRESS_CLAMP,
1548 .addressW = VK_TEX_ADDRESS_CLAMP,
1549 .mipLodBias = 1.0,
1550 .maxAnisotropy = 1,
1551 .compareOp = VK_COMPARE_OP_NEVER,
1552 .minLod = 1.0,
1553 .maxLod = 1.0,
1554 .borderColor = VK_BORDER_COLOR_OPAQUE_WHITE,
1555 };
1556 VkSampler sampler;
1557 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1558 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001559
1560
1561 VkDescriptorInfo descriptor_info;
1562 memset(&descriptor_info, 0, sizeof(descriptor_info));
1563 descriptor_info.sampler = sampler;
1564
1565 VkWriteDescriptorSet descriptor_write;
1566 memset(&descriptor_write, 0, sizeof(descriptor_write));
1567 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
1568 descriptor_write.destSet = descriptorSet;
1569 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001570 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001571 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1572 descriptor_write.pDescriptors = &descriptor_info;
1573
1574 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1575
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001576 msgFlags = m_errorMonitor->GetState(&msgString);
1577 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 -06001578 if (!strstr(msgString.c_str(),"Unexpected UPDATE struct of type ")) {
1579 FAIL() << "Error received was not 'Unexpected UPDATE struct of type '";
1580 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001581}
1582
1583TEST_F(VkLayerTest, NumSamplesMismatch)
1584{
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001585 // Create CmdBuffer where MSAA samples doesn't match RenderPass sampleCount
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001586 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001587 std::string msgString;
1588 VkResult err;
1589
1590 ASSERT_NO_FATAL_FAILURE(InitState());
1591 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1592 m_errorMonitor->ClearState();
1593 VkCommandBufferObj cmdBuffer(m_device);
1594 const VkDescriptorTypeCount ds_type_count = {
1595 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1596 .count = 1,
1597 };
1598 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1599 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1600 .pNext = NULL,
1601 .count = 1,
1602 .pTypeCount = &ds_type_count,
1603 };
1604 VkDescriptorPool ds_pool;
1605 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1606 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001607
1608 const VkDescriptorSetLayoutBinding dsl_binding = {
1609 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001610 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001611 .stageFlags = VK_SHADER_STAGE_ALL,
1612 .pImmutableSamplers = NULL,
1613 };
1614
1615 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1616 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1617 .pNext = NULL,
1618 .count = 1,
1619 .pBinding = &dsl_binding,
1620 };
1621 VkDescriptorSetLayout ds_layout;
1622 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1623 ASSERT_VK_SUCCESS(err);
1624
1625 VkDescriptorSet descriptorSet;
1626 uint32_t ds_count = 0;
1627 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1628 ASSERT_VK_SUCCESS(err);
1629
1630 const VkPipelineMsStateCreateInfo pipe_ms_state_ci = {
1631 .sType = VK_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO,
1632 .pNext = NULL,
Tony Barbourd1e95582015-06-03 12:30:49 -06001633 .samples = 4,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001634 .multisampleEnable = 1,
1635 .sampleShadingEnable = 0,
1636 .minSampleShading = 1.0,
1637 .sampleMask = 15,
1638 };
1639
1640 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1641 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1642 .pNext = NULL,
1643 .descriptorSetCount = 1,
1644 .pSetLayouts = &ds_layout,
1645 };
1646
1647 VkPipelineLayout pipeline_layout;
1648 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1649 ASSERT_VK_SUCCESS(err);
1650
1651 size_t shader_len = strlen(bindStateVertShaderText);
1652 size_t codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
1653 void* pCode = malloc(codeSize);
1654
1655 /* try version 0 first: VkShaderStage followed by GLSL */
1656 ((uint32_t *) pCode)[0] = ICD_SPV_MAGIC;
1657 ((uint32_t *) pCode)[1] = 0;
1658 ((uint32_t *) pCode)[2] = VK_SHADER_STAGE_VERTEX;
1659 memcpy(((uint32_t *) pCode + 3), bindStateVertShaderText, shader_len + 1);
1660
1661 const VkShaderCreateInfo vs_ci = {
1662 .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
1663 .pNext = NULL,
Courtney Goeltzenleuchter1d723102015-06-18 21:49:59 -06001664 .module = VK_NULL_HANDLE,
1665 .name = "main",
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001666 .codeSize = codeSize,
1667 .pCode = pCode,
1668 .flags = 0,
1669 };
1670 VkShader vs;
1671 err = vkCreateShader(m_device->device(), &vs_ci, &vs);
1672 ASSERT_VK_SUCCESS(err);
1673
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001674 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1675 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1676 .pNext = NULL,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001677 .stage = VK_SHADER_STAGE_VERTEX,
1678 .shader = vs,
1679 .linkConstBufferCount = 0,
1680 .pLinkConstBufferInfo = NULL,
1681 .pSpecializationInfo = NULL,
1682 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001683 const VkGraphicsPipelineCreateInfo gp_ci = {
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001684 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1685 .pNext = NULL,
1686 .stageCount = 1,
1687 .pStages = &pipe_vs_ci,
1688 .pVertexInputState = NULL,
1689 .pIaState = NULL,
1690 .pTessState = NULL,
1691 .pVpState = NULL,
1692 .pRsState = NULL,
1693 .pMsState = &pipe_ms_state_ci,
1694 .pDsState = NULL,
1695 .pCbState = NULL,
1696 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1697 .layout = pipeline_layout,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001698 };
1699
1700 VkPipeline pipeline;
1701 err = vkCreateGraphicsPipeline(m_device->device(), &gp_ci, &pipeline);
1702 ASSERT_VK_SUCCESS(err);
1703
1704 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1705 BeginCommandBuffer(cmdBuffer);
1706 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1707
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001708 msgFlags = m_errorMonitor->GetState(&msgString);
1709 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 -06001710 if (!strstr(msgString.c_str(),"Num samples mismatch! ")) {
1711 FAIL() << "Error received was not 'Num samples mismatch!...'";
1712 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001713}
Tobin Ehlis57e6a612015-05-26 16:11:58 -06001714#endif
1715#if THREADING_TESTS
Mike Stroyan09aae812015-05-12 16:00:45 -06001716#if GTEST_IS_THREADSAFE
1717struct thread_data_struct {
1718 VkCmdBuffer cmdBuffer;
1719 VkEvent event;
1720 bool bailout;
1721};
1722
1723extern "C" void *AddToCommandBuffer(void *arg)
1724{
1725 struct thread_data_struct *data = (struct thread_data_struct *) arg;
1726 std::string msgString;
1727
1728 for (int i = 0; i<10000; i++) {
1729 vkCmdSetEvent(data->cmdBuffer, data->event, VK_PIPE_EVENT_COMMANDS_COMPLETE);
1730 if (data->bailout) {
1731 break;
1732 }
1733 }
1734 return NULL;
1735}
1736
1737TEST_F(VkLayerTest, ThreadCmdBufferCollision)
1738{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001739 VkFlags msgFlags;
Mike Stroyan09aae812015-05-12 16:00:45 -06001740 std::string msgString;
1741 pthread_t thread;
1742 pthread_attr_t thread_attr;
1743
1744 ASSERT_NO_FATAL_FAILURE(InitState());
1745 ASSERT_NO_FATAL_FAILURE(InitViewport());
1746 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1747
1748 VkCommandBufferObj cmdBuffer(m_device);
1749
1750 m_errorMonitor->ClearState();
1751 pthread_attr_init(&thread_attr);
1752 BeginCommandBuffer(cmdBuffer);
1753
1754 VkEventCreateInfo event_info;
1755 VkEvent event;
1756 VkMemoryRequirements mem_req;
1757 size_t data_size = sizeof(mem_req);
1758 VkResult err;
1759
1760 memset(&event_info, 0, sizeof(event_info));
1761 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
1762
1763 err = vkCreateEvent(device(), &event_info, &event);
1764 ASSERT_VK_SUCCESS(err);
1765
1766 err = vkGetObjectInfo(device(), VK_OBJECT_TYPE_EVENT, event, VK_OBJECT_INFO_TYPE_MEMORY_REQUIREMENTS,
1767 &data_size, &mem_req);
1768 ASSERT_VK_SUCCESS(err);
1769
1770 VkMemoryAllocInfo mem_info;
1771 VkDeviceMemory event_mem;
1772
1773 ASSERT_NE(0, mem_req.size) << "vkGetObjectInfo (Event): Failed - expect events to require memory";
1774
1775 memset(&mem_info, 0, sizeof(mem_info));
1776 mem_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
1777 mem_info.allocationSize = mem_req.size;
Courtney Goeltzenleuchterb25c9b92015-06-18 17:01:41 -06001778 mem_info.memProps = 0;
Mike Stroyan09aae812015-05-12 16:00:45 -06001779 err = vkAllocMemory(device(), &mem_info, &event_mem);
1780 ASSERT_VK_SUCCESS(err);
1781
Mark Lobodzinski23182612015-05-29 09:32:35 -05001782 err = vkBindObjectMemory(device(), VK_OBJECT_TYPE_EVENT, event, event_mem, 0);
Mike Stroyan09aae812015-05-12 16:00:45 -06001783 ASSERT_VK_SUCCESS(err);
1784
1785 err = vkResetEvent(device(), event);
1786 ASSERT_VK_SUCCESS(err);
1787
1788 struct thread_data_struct data;
1789 data.cmdBuffer = cmdBuffer.obj();
1790 data.event = event;
1791 data.bailout = false;
1792 m_errorMonitor->SetBailout(&data.bailout);
1793 // Add many entries to command buffer from another thread.
1794 pthread_create(&thread, &thread_attr, AddToCommandBuffer, (void *)&data);
1795 // Add many entries to command buffer from this thread at the same time.
1796 AddToCommandBuffer(&data);
1797 pthread_join(thread, NULL);
1798 EndCommandBuffer(cmdBuffer);
1799
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001800 msgFlags = m_errorMonitor->GetState(&msgString);
Mike Stroyaned254572015-06-17 16:32:06 -06001801 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 -06001802 if (!strstr(msgString.c_str(),"THREADING ERROR")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -05001803 FAIL() << "Error received was not 'THREADING ERROR'";
Mike Stroyan09aae812015-05-12 16:00:45 -06001804 }
1805
1806}
1807#endif
Tobin Ehlis57e6a612015-05-26 16:11:58 -06001808#endif
Chris Forbes5af3bf22015-05-25 11:13:08 +12001809
1810#if SHADER_CHECKER_TESTS
1811TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed)
1812{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001813 VkFlags msgFlags;
Chris Forbes5af3bf22015-05-25 11:13:08 +12001814 std::string msgString;
1815 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06001816 ScopedUseGlsl useGlsl(false);
Chris Forbes5af3bf22015-05-25 11:13:08 +12001817
1818 char const *vsSource =
1819 "#version 140\n"
1820 "#extension GL_ARB_separate_shader_objects: require\n"
1821 "#extension GL_ARB_shading_language_420pack: require\n"
1822 "\n"
1823 "layout(location=0) out float x;\n"
1824 "void main(){\n"
1825 " gl_Position = vec4(1);\n"
1826 " x = 0;\n"
1827 "}\n";
1828 char const *fsSource =
1829 "#version 140\n"
1830 "#extension GL_ARB_separate_shader_objects: require\n"
1831 "#extension GL_ARB_shading_language_420pack: require\n"
1832 "\n"
1833 "layout(location=0) out vec4 color;\n"
1834 "void main(){\n"
1835 " color = vec4(1);\n"
1836 "}\n";
1837
1838 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
1839 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
1840
1841 VkPipelineObj pipe(m_device);
1842 pipe.AddShader(&vs);
1843 pipe.AddShader(&fs);
1844
1845 VkCommandBufferObj dummyCmd(m_device);
1846 VkDescriptorSetObj descriptorSet(m_device);
1847 descriptorSet.AppendDummy();
1848 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
1849
1850 m_errorMonitor->ClearState();
1851 pipe.CreateVKPipeline(descriptorSet);
1852
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001853 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes5af3bf22015-05-25 11:13:08 +12001854
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001855 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes5af3bf22015-05-25 11:13:08 +12001856 if (!strstr(msgString.c_str(),"not consumed by fragment shader")) {
1857 FAIL() << "Incorrect warning: " << msgString;
1858 }
1859}
Chris Forbes5af3bf22015-05-25 11:13:08 +12001860
Chris Forbes3c10b852015-05-25 11:13:13 +12001861TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided)
1862{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001863 VkFlags msgFlags;
Chris Forbes3c10b852015-05-25 11:13:13 +12001864 std::string msgString;
1865 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06001866 ScopedUseGlsl useGlsl(false);
Chris Forbes3c10b852015-05-25 11:13:13 +12001867
1868 char const *vsSource =
1869 "#version 140\n"
1870 "#extension GL_ARB_separate_shader_objects: require\n"
1871 "#extension GL_ARB_shading_language_420pack: require\n"
1872 "\n"
1873 "void main(){\n"
1874 " gl_Position = vec4(1);\n"
1875 "}\n";
1876 char const *fsSource =
1877 "#version 140\n"
1878 "#extension GL_ARB_separate_shader_objects: require\n"
1879 "#extension GL_ARB_shading_language_420pack: require\n"
1880 "\n"
1881 "layout(location=0) in float x;\n"
1882 "layout(location=0) out vec4 color;\n"
1883 "void main(){\n"
1884 " color = vec4(x);\n"
1885 "}\n";
1886
1887 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
1888 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
1889
1890 VkPipelineObj pipe(m_device);
1891 pipe.AddShader(&vs);
1892 pipe.AddShader(&fs);
1893
1894 VkCommandBufferObj dummyCmd(m_device);
1895 VkDescriptorSetObj descriptorSet(m_device);
1896 descriptorSet.AppendDummy();
1897 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
1898
1899 m_errorMonitor->ClearState();
1900 pipe.CreateVKPipeline(descriptorSet);
1901
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001902 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes3c10b852015-05-25 11:13:13 +12001903
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001904 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes3c10b852015-05-25 11:13:13 +12001905 if (!strstr(msgString.c_str(),"not written by vertex shader")) {
1906 FAIL() << "Incorrect error: " << msgString;
1907 }
1908}
1909
Chris Forbescc281692015-05-25 11:13:17 +12001910TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch)
1911{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001912 VkFlags msgFlags;
Chris Forbescc281692015-05-25 11:13:17 +12001913 std::string msgString;
1914 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06001915 ScopedUseGlsl useGlsl(false);
Chris Forbescc281692015-05-25 11:13:17 +12001916
1917 char const *vsSource =
1918 "#version 140\n"
1919 "#extension GL_ARB_separate_shader_objects: require\n"
1920 "#extension GL_ARB_shading_language_420pack: require\n"
1921 "\n"
1922 "layout(location=0) out int x;\n"
1923 "void main(){\n"
1924 " x = 0;\n"
1925 " gl_Position = vec4(1);\n"
1926 "}\n";
1927 char const *fsSource =
1928 "#version 140\n"
1929 "#extension GL_ARB_separate_shader_objects: require\n"
1930 "#extension GL_ARB_shading_language_420pack: require\n"
1931 "\n"
1932 "layout(location=0) in float x;\n" /* VS writes int */
1933 "layout(location=0) out vec4 color;\n"
1934 "void main(){\n"
1935 " color = vec4(x);\n"
1936 "}\n";
1937
1938 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
1939 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
1940
1941 VkPipelineObj pipe(m_device);
1942 pipe.AddShader(&vs);
1943 pipe.AddShader(&fs);
1944
1945 VkCommandBufferObj dummyCmd(m_device);
1946 VkDescriptorSetObj descriptorSet(m_device);
1947 descriptorSet.AppendDummy();
1948 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
1949
1950 m_errorMonitor->ClearState();
1951 pipe.CreateVKPipeline(descriptorSet);
1952
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001953 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbescc281692015-05-25 11:13:17 +12001954
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001955 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbescc281692015-05-25 11:13:17 +12001956 if (!strstr(msgString.c_str(),"Type mismatch on location 0")) {
1957 FAIL() << "Incorrect error: " << msgString;
1958 }
1959}
1960
Chris Forbes8291c052015-05-25 11:13:28 +12001961TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed)
1962{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001963 VkFlags msgFlags;
Chris Forbes8291c052015-05-25 11:13:28 +12001964 std::string msgString;
1965 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06001966 ScopedUseGlsl useGlsl(false);
Chris Forbes8291c052015-05-25 11:13:28 +12001967
1968 VkVertexInputBindingDescription input_binding;
1969 memset(&input_binding, 0, sizeof(input_binding));
1970
1971 VkVertexInputAttributeDescription input_attrib;
1972 memset(&input_attrib, 0, sizeof(input_attrib));
1973 input_attrib.format = VK_FORMAT_R32_SFLOAT;
1974
1975 char const *vsSource =
1976 "#version 140\n"
1977 "#extension GL_ARB_separate_shader_objects: require\n"
1978 "#extension GL_ARB_shading_language_420pack: require\n"
1979 "\n"
1980 "void main(){\n"
1981 " gl_Position = vec4(1);\n"
1982 "}\n";
1983 char const *fsSource =
1984 "#version 140\n"
1985 "#extension GL_ARB_separate_shader_objects: require\n"
1986 "#extension GL_ARB_shading_language_420pack: require\n"
1987 "\n"
1988 "layout(location=0) out vec4 color;\n"
1989 "void main(){\n"
1990 " color = vec4(1);\n"
1991 "}\n";
1992
1993 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
1994 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
1995
1996 VkPipelineObj pipe(m_device);
1997 pipe.AddShader(&vs);
1998 pipe.AddShader(&fs);
1999
2000 pipe.AddVertexInputBindings(&input_binding, 1);
2001 pipe.AddVertexInputAttribs(&input_attrib, 1);
2002
2003 VkCommandBufferObj dummyCmd(m_device);
2004 VkDescriptorSetObj descriptorSet(m_device);
2005 descriptorSet.AppendDummy();
2006 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2007
2008 m_errorMonitor->ClearState();
2009 pipe.CreateVKPipeline(descriptorSet);
2010
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002011 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes8291c052015-05-25 11:13:28 +12002012
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002013 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes8291c052015-05-25 11:13:28 +12002014 if (!strstr(msgString.c_str(),"location 0 not consumed by VS")) {
2015 FAIL() << "Incorrect warning: " << msgString;
2016 }
2017}
2018
Chris Forbes37367e62015-05-25 11:13:29 +12002019TEST_F(VkLayerTest, CreatePipelineAttribNotProvided)
2020{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002021 VkFlags msgFlags;
Chris Forbes37367e62015-05-25 11:13:29 +12002022 std::string msgString;
2023 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002024 ScopedUseGlsl useGlsl(false);
Chris Forbes37367e62015-05-25 11:13:29 +12002025
2026 char const *vsSource =
2027 "#version 140\n"
2028 "#extension GL_ARB_separate_shader_objects: require\n"
2029 "#extension GL_ARB_shading_language_420pack: require\n"
2030 "\n"
2031 "layout(location=0) in vec4 x;\n" /* not provided */
2032 "void main(){\n"
2033 " gl_Position = x;\n"
2034 "}\n";
2035 char const *fsSource =
2036 "#version 140\n"
2037 "#extension GL_ARB_separate_shader_objects: require\n"
2038 "#extension GL_ARB_shading_language_420pack: require\n"
2039 "\n"
2040 "layout(location=0) out vec4 color;\n"
2041 "void main(){\n"
2042 " color = vec4(1);\n"
2043 "}\n";
2044
2045 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2046 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2047
2048 VkPipelineObj pipe(m_device);
2049 pipe.AddShader(&vs);
2050 pipe.AddShader(&fs);
2051
2052 VkCommandBufferObj dummyCmd(m_device);
2053 VkDescriptorSetObj descriptorSet(m_device);
2054 descriptorSet.AppendDummy();
2055 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2056
2057 m_errorMonitor->ClearState();
2058 pipe.CreateVKPipeline(descriptorSet);
2059
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002060 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes37367e62015-05-25 11:13:29 +12002061
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002062 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes37367e62015-05-25 11:13:29 +12002063 if (!strstr(msgString.c_str(),"VS consumes input at location 0 but not provided")) {
2064 FAIL() << "Incorrect warning: " << msgString;
2065 }
2066}
2067
Chris Forbesa4b02322015-05-25 11:13:31 +12002068TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch)
2069{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002070 VkFlags msgFlags;
Chris Forbesa4b02322015-05-25 11:13:31 +12002071 std::string msgString;
2072 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002073 ScopedUseGlsl useGlsl(false);
Chris Forbesa4b02322015-05-25 11:13:31 +12002074
2075 VkVertexInputBindingDescription input_binding;
2076 memset(&input_binding, 0, sizeof(input_binding));
2077
2078 VkVertexInputAttributeDescription input_attrib;
2079 memset(&input_attrib, 0, sizeof(input_attrib));
2080 input_attrib.format = VK_FORMAT_R32_SFLOAT;
2081
2082 char const *vsSource =
2083 "#version 140\n"
2084 "#extension GL_ARB_separate_shader_objects: require\n"
2085 "#extension GL_ARB_shading_language_420pack: require\n"
2086 "\n"
2087 "layout(location=0) in int x;\n" /* attrib provided float */
2088 "void main(){\n"
2089 " gl_Position = vec4(x);\n"
2090 "}\n";
2091 char const *fsSource =
2092 "#version 140\n"
2093 "#extension GL_ARB_separate_shader_objects: require\n"
2094 "#extension GL_ARB_shading_language_420pack: require\n"
2095 "\n"
2096 "layout(location=0) out vec4 color;\n"
2097 "void main(){\n"
2098 " color = vec4(1);\n"
2099 "}\n";
2100
2101 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2102 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2103
2104 VkPipelineObj pipe(m_device);
2105 pipe.AddShader(&vs);
2106 pipe.AddShader(&fs);
2107
2108 pipe.AddVertexInputBindings(&input_binding, 1);
2109 pipe.AddVertexInputAttribs(&input_attrib, 1);
2110
2111 VkCommandBufferObj dummyCmd(m_device);
2112 VkDescriptorSetObj descriptorSet(m_device);
2113 descriptorSet.AppendDummy();
2114 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2115
2116 m_errorMonitor->ClearState();
2117 pipe.CreateVKPipeline(descriptorSet);
2118
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002119 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbesa4b02322015-05-25 11:13:31 +12002120
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002121 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbesa4b02322015-05-25 11:13:31 +12002122 if (!strstr(msgString.c_str(),"location 0 does not match VS input type")) {
2123 FAIL() << "Incorrect error: " << msgString;
2124 }
2125}
2126
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002127TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict)
2128{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002129 VkFlags msgFlags;
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002130 std::string msgString;
2131 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002132 ScopedUseGlsl useGlsl(false);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002133
2134 /* Two binding descriptions for binding 0 */
2135 VkVertexInputBindingDescription input_bindings[2];
2136 memset(input_bindings, 0, sizeof(input_bindings));
2137
2138 VkVertexInputAttributeDescription input_attrib;
2139 memset(&input_attrib, 0, sizeof(input_attrib));
2140 input_attrib.format = VK_FORMAT_R32_SFLOAT;
2141
2142 char const *vsSource =
2143 "#version 140\n"
2144 "#extension GL_ARB_separate_shader_objects: require\n"
2145 "#extension GL_ARB_shading_language_420pack: require\n"
2146 "\n"
2147 "layout(location=0) in float x;\n" /* attrib provided float */
2148 "void main(){\n"
2149 " gl_Position = vec4(x);\n"
2150 "}\n";
2151 char const *fsSource =
2152 "#version 140\n"
2153 "#extension GL_ARB_separate_shader_objects: require\n"
2154 "#extension GL_ARB_shading_language_420pack: require\n"
2155 "\n"
2156 "layout(location=0) out vec4 color;\n"
2157 "void main(){\n"
2158 " color = vec4(1);\n"
2159 "}\n";
2160
2161 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2162 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2163
2164 VkPipelineObj pipe(m_device);
2165 pipe.AddShader(&vs);
2166 pipe.AddShader(&fs);
2167
2168 pipe.AddVertexInputBindings(input_bindings, 2);
2169 pipe.AddVertexInputAttribs(&input_attrib, 1);
2170
2171 VkCommandBufferObj dummyCmd(m_device);
2172 VkDescriptorSetObj descriptorSet(m_device);
2173 descriptorSet.AppendDummy();
2174 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2175
2176 m_errorMonitor->ClearState();
2177 pipe.CreateVKPipeline(descriptorSet);
2178
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002179 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002180
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002181 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002182 if (!strstr(msgString.c_str(),"Duplicate vertex input binding descriptions for binding 0")) {
2183 FAIL() << "Incorrect error: " << msgString;
2184 }
2185}
Chris Forbes4c948702015-05-25 11:13:32 +12002186
Chris Forbesc12ef122015-05-25 11:13:40 +12002187/* TODO: would be nice to test the mixed broadcast & custom case, but the GLSL->SPV compiler
2188 * rejects it. */
2189
2190TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten)
2191{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002192 VkFlags msgFlags;
Chris Forbesc12ef122015-05-25 11:13:40 +12002193 std::string msgString;
2194 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002195 ScopedUseGlsl useGlsl(false);
Chris Forbesc12ef122015-05-25 11:13:40 +12002196
2197 char const *vsSource =
2198 "#version 140\n"
2199 "#extension GL_ARB_separate_shader_objects: require\n"
2200 "#extension GL_ARB_shading_language_420pack: require\n"
2201 "\n"
2202 "void main(){\n"
2203 " gl_Position = vec4(1);\n"
2204 "}\n";
2205 char const *fsSource =
2206 "#version 140\n"
2207 "#extension GL_ARB_separate_shader_objects: require\n"
2208 "#extension GL_ARB_shading_language_420pack: require\n"
2209 "\n"
2210 "void main(){\n"
2211 "}\n";
2212
2213 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2214 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2215
2216 VkPipelineObj pipe(m_device);
2217 pipe.AddShader(&vs);
2218 pipe.AddShader(&fs);
2219
2220 /* implicit CB 0 set up by the test framework, not written */
2221
2222 VkCommandBufferObj dummyCmd(m_device);
2223 VkDescriptorSetObj descriptorSet(m_device);
2224 descriptorSet.AppendDummy();
2225 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2226
2227 m_errorMonitor->ClearState();
2228 pipe.CreateVKPipeline(descriptorSet);
2229
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002230 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbesc12ef122015-05-25 11:13:40 +12002231
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002232 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbesc12ef122015-05-25 11:13:40 +12002233 if (!strstr(msgString.c_str(),"Attachment 0 not written by FS")) {
2234 FAIL() << "Incorrect error: " << msgString;
2235 }
2236}
2237
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002238TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed)
2239{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002240 VkFlags msgFlags;
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002241 std::string msgString;
2242 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002243 ScopedUseGlsl useGlsl(false);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002244
2245 char const *vsSource =
2246 "#version 140\n"
2247 "#extension GL_ARB_separate_shader_objects: require\n"
2248 "#extension GL_ARB_shading_language_420pack: require\n"
2249 "\n"
2250 "void main(){\n"
2251 " gl_Position = vec4(1);\n"
2252 "}\n";
2253 char const *fsSource =
2254 "#version 140\n"
2255 "#extension GL_ARB_separate_shader_objects: require\n"
2256 "#extension GL_ARB_shading_language_420pack: require\n"
2257 "\n"
2258 "layout(location=0) out vec4 x;\n"
2259 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
2260 "void main(){\n"
2261 " x = vec4(1);\n"
2262 " y = vec4(1);\n"
2263 "}\n";
2264
2265 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2266 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2267
2268 VkPipelineObj pipe(m_device);
2269 pipe.AddShader(&vs);
2270 pipe.AddShader(&fs);
2271
2272 /* implicit CB 0 set up by the test framework */
2273 /* FS writes CB 1, but we don't configure it */
2274
2275 VkCommandBufferObj dummyCmd(m_device);
2276 VkDescriptorSetObj descriptorSet(m_device);
2277 descriptorSet.AppendDummy();
2278 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2279
2280 m_errorMonitor->ClearState();
2281 pipe.CreateVKPipeline(descriptorSet);
2282
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002283 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002284
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002285 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002286 if (!strstr(msgString.c_str(),"FS writes to output location 1 with no matching attachment")) {
2287 FAIL() << "Incorrect warning: " << msgString;
2288 }
2289}
2290
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002291TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch)
2292{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002293 VkFlags msgFlags;
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002294 std::string msgString;
2295 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002296 ScopedUseGlsl useGlsl(false);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002297
2298 char const *vsSource =
2299 "#version 140\n"
2300 "#extension GL_ARB_separate_shader_objects: require\n"
2301 "#extension GL_ARB_shading_language_420pack: require\n"
2302 "\n"
2303 "void main(){\n"
2304 " gl_Position = vec4(1);\n"
2305 "}\n";
2306 char const *fsSource =
2307 "#version 140\n"
2308 "#extension GL_ARB_separate_shader_objects: require\n"
2309 "#extension GL_ARB_shading_language_420pack: require\n"
2310 "\n"
2311 "layout(location=0) out ivec4 x;\n" /* not UNORM */
2312 "void main(){\n"
2313 " x = ivec4(1);\n"
2314 "}\n";
2315
2316 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2317 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2318
2319 VkPipelineObj pipe(m_device);
2320 pipe.AddShader(&vs);
2321 pipe.AddShader(&fs);
2322
2323 /* implicit CB 0 set up by test framework, is UNORM. */
2324
2325 VkCommandBufferObj dummyCmd(m_device);
2326 VkDescriptorSetObj descriptorSet(m_device);
2327 descriptorSet.AppendDummy();
2328 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2329
2330 m_errorMonitor->ClearState();
2331 pipe.CreateVKPipeline(descriptorSet);
2332
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002333 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002334
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002335 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002336 if (!strstr(msgString.c_str(),"does not match FS output type")) {
2337 FAIL() << "Incorrect error: " << msgString;
2338 }
2339}
Chris Forbesc2050732015-06-05 14:43:36 +12002340
2341TEST_F(VkLayerTest, CreatePipelineNonSpirvShader)
2342{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002343 VkFlags msgFlags;
Chris Forbesc2050732015-06-05 14:43:36 +12002344 std::string msgString;
2345 ASSERT_NO_FATAL_FAILURE(InitState());
2346 /* Intentionally provided GLSL rather than compiling to SPIRV first */
Cody Northrop1cfbd172015-06-03 16:49:20 -06002347 ScopedUseGlsl useGlsl(true);
Chris Forbesc2050732015-06-05 14:43:36 +12002348
2349 char const *vsSource =
2350 "#version 140\n"
2351 "#extension GL_ARB_separate_shader_objects: require\n"
2352 "#extension GL_ARB_shading_language_420pack: require\n"
2353 "\n"
2354 "void main(){\n"
2355 " gl_Position = vec4(1);\n"
2356 "}\n";
2357 char const *fsSource =
2358 "#version 140\n"
2359 "#extension GL_ARB_separate_shader_objects: require\n"
2360 "#extension GL_ARB_shading_language_420pack: require\n"
2361 "\n"
2362 "layout(location=0) out vec4 x;\n"
2363 "void main(){\n"
2364 " x = vec4(1);\n"
2365 "}\n";
2366
2367 m_errorMonitor->ClearState();
2368
2369 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2370 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2371
2372
2373 VkPipelineObj pipe(m_device);
2374 pipe.AddShader(&vs);
2375 pipe.AddShader(&fs);
2376
2377 /* implicit CB 0 set up by test framework, is UNORM. */
2378
2379 VkCommandBufferObj dummyCmd(m_device);
2380 VkDescriptorSetObj descriptorSet(m_device);
2381 descriptorSet.AppendDummy();
2382 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2383
2384 VkResult res = pipe.CreateVKPipeline(descriptorSet);
2385 /* pipeline creation should have succeeded */
2386 ASSERT_EQ(VK_SUCCESS, res);
2387
2388 /* should have emitted a warning: the shader is not SPIRV, so we're
2389 * not going to be able to analyze it */
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002390 msgFlags = m_errorMonitor->GetState(&msgString);
2391 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbesc2050732015-06-05 14:43:36 +12002392 if (!strstr(msgString.c_str(),"is not SPIR-V")) {
2393 FAIL() << "Incorrect warning: " << msgString;
2394 }
2395}
Chris Forbes01c9db72015-06-04 09:25:25 +12002396#endif
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002397
Tony Barbour30486ea2015-04-07 13:44:53 -06002398int main(int argc, char **argv) {
2399 int result;
2400
2401 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour01999182015-04-09 12:58:51 -06002402 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour30486ea2015-04-07 13:44:53 -06002403
2404 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
2405
2406 result = RUN_ALL_TESTS();
2407
Tony Barbour01999182015-04-09 12:58:51 -06002408 VkTestFramework::Finish();
Tony Barbour30486ea2015-04-07 13:44:53 -06002409 return result;
2410}