blob: 0951f2127ed13b6bf6425b1f521da279a3a3932c [file] [log] [blame]
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001#include <vulkan.h>
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002#include "vk_debug_report_lunarg.h"
Tony Barbour30486ea2015-04-07 13:44:53 -06003#include "gtest-1.7.0/include/gtest/gtest.h"
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06004#include "vkrenderframework.h"
Tobin Ehlis56d204a2015-07-03 10:15:26 -06005#include "vk_layer_config.h"
Tony Barbour30486ea2015-04-07 13:44:53 -06006
Mark Lobodzinski5f25be42015-05-14 15:08:13 -05007#define GLM_FORCE_RADIANS
8#include "glm/glm.hpp"
9#include <glm/gtc/matrix_transform.hpp>
10
Tobin Ehlis57e6a612015-05-26 16:11:58 -060011#define MEM_TRACKER_TESTS 1
12#define OBJ_TRACKER_TESTS 1
13#define DRAW_STATE_TESTS 1
14#define THREADING_TESTS 1
Chris Forbes5af3bf22015-05-25 11:13:08 +120015#define SHADER_CHECKER_TESTS 1
Tobin Ehlis57e6a612015-05-26 16:11:58 -060016
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050017//--------------------------------------------------------------------------------------
18// Mesh and VertexFormat Data
19//--------------------------------------------------------------------------------------
20struct Vertex
21{
22 float posX, posY, posZ, posW; // Position data
23 float r, g, b, a; // Color
24};
25
26#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
27
28typedef enum _BsoFailSelect {
29 BsoFailNone = 0x00000000,
30 BsoFailRaster = 0x00000001,
31 BsoFailViewport = 0x00000002,
32 BsoFailColorBlend = 0x00000004,
33 BsoFailDepthStencil = 0x00000008,
34} BsoFailSelect;
35
36struct vktriangle_vs_uniform {
37 // Must start with MVP
38 float mvp[4][4];
39 float position[3][4];
40 float color[3][4];
41};
42
Mark Lobodzinski6bbdff12015-06-02 09:41:30 -050043static const char bindStateVertShaderText[] =
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050044 "#version 130\n"
45 "vec2 vertices[3];\n"
46 "void main() {\n"
47 " vertices[0] = vec2(-1.0, -1.0);\n"
48 " vertices[1] = vec2( 1.0, -1.0);\n"
49 " vertices[2] = vec2( 0.0, 1.0);\n"
50 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
51 "}\n";
52
Mark Lobodzinski6bbdff12015-06-02 09:41:30 -050053static const char bindStateFragShaderText[] =
Cody Northrop74a2d2c2015-06-16 17:32:04 -060054 "#version 140\n"
55 "#extension GL_ARB_separate_shader_objects: require\n"
56 "#extension GL_ARB_shading_language_420pack: require\n"
57 "\n"
58 "layout(location = 0) out vec4 uFragColor;\n"
59 "void main(){\n"
60 " uFragColor = vec4(0,1,0,1);\n"
61 "}\n";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050062
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060063static void myDbgFunc(
64 VkFlags msgFlags,
65 VkObjectType objType,
66 VkObject srcObject,
67 size_t location,
68 int32_t msgCode,
69 const char* pLayerPrefix,
70 const char* pMsg,
71 void* pUserData);
Tony Barbour30486ea2015-04-07 13:44:53 -060072
73class ErrorMonitor {
74public:
Tony Barbour0c1bdc62015-04-29 17:34:29 -060075 ErrorMonitor()
Tony Barbour30486ea2015-04-07 13:44:53 -060076 {
Mike Stroyan09aae812015-05-12 16:00:45 -060077 pthread_mutexattr_t attr;
78 pthread_mutexattr_init(&attr);
79 pthread_mutex_init(&m_mutex, &attr);
80 pthread_mutex_lock(&m_mutex);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060081 m_msgFlags = VK_DBG_REPORT_INFO_BIT;
Mike Stroyan09aae812015-05-12 16:00:45 -060082 m_bailout = NULL;
83 pthread_mutex_unlock(&m_mutex);
Tony Barbour30486ea2015-04-07 13:44:53 -060084 }
85 void ClearState()
86 {
Mike Stroyan09aae812015-05-12 16:00:45 -060087 pthread_mutex_lock(&m_mutex);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060088 m_msgFlags = VK_DBG_REPORT_INFO_BIT;
Tony Barbour30486ea2015-04-07 13:44:53 -060089 m_msgString.clear();
Mike Stroyan09aae812015-05-12 16:00:45 -060090 pthread_mutex_unlock(&m_mutex);
Tony Barbour30486ea2015-04-07 13:44:53 -060091 }
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060092 VkFlags GetState(std::string *msgString)
Tony Barbour30486ea2015-04-07 13:44:53 -060093 {
Mike Stroyan09aae812015-05-12 16:00:45 -060094 pthread_mutex_lock(&m_mutex);
Tony Barbour30486ea2015-04-07 13:44:53 -060095 *msgString = m_msgString;
Mike Stroyan09aae812015-05-12 16:00:45 -060096 pthread_mutex_unlock(&m_mutex);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060097 return m_msgFlags;
Tony Barbour30486ea2015-04-07 13:44:53 -060098 }
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060099 void SetState(VkFlags msgFlags, const char *msgString)
Tony Barbour30486ea2015-04-07 13:44:53 -0600100 {
Mike Stroyan09aae812015-05-12 16:00:45 -0600101 pthread_mutex_lock(&m_mutex);
102 if (m_bailout != NULL) {
103 *m_bailout = true;
104 }
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600105 m_msgFlags = msgFlags;
Tony Barbour8508b8e2015-04-09 10:48:04 -0600106 m_msgString.reserve(strlen(msgString));
107 m_msgString = msgString;
Mike Stroyan09aae812015-05-12 16:00:45 -0600108 pthread_mutex_unlock(&m_mutex);
109 }
110 void SetBailout(bool *bailout)
111 {
112 m_bailout = bailout;
Tony Barbour30486ea2015-04-07 13:44:53 -0600113 }
114
115private:
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600116 VkFlags m_msgFlags;
Mike Stroyan09aae812015-05-12 16:00:45 -0600117 std::string m_msgString;
118 pthread_mutex_t m_mutex;
119 bool* m_bailout;
Tony Barbour30486ea2015-04-07 13:44:53 -0600120};
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500121
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600122static void myDbgFunc(
123 VkFlags msgFlags,
124 VkObjectType objType,
125 VkObject srcObject,
126 size_t location,
127 int32_t msgCode,
128 const char* pLayerPrefix,
129 const char* pMsg,
130 void* pUserData)
Tony Barbour30486ea2015-04-07 13:44:53 -0600131{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600132 if (msgFlags & (VK_DBG_REPORT_WARN_BIT | VK_DBG_REPORT_ERROR_BIT)) {
Tony Barbour8508b8e2015-04-09 10:48:04 -0600133 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600134 errMonitor->SetState(msgFlags, pMsg);
Tony Barbour8508b8e2015-04-09 10:48:04 -0600135 }
Tony Barbour30486ea2015-04-07 13:44:53 -0600136}
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500137
Tony Barbour01999182015-04-09 12:58:51 -0600138class VkLayerTest : public VkRenderFramework
Tony Barbour30486ea2015-04-07 13:44:53 -0600139{
140public:
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600141 VkResult BeginCommandBuffer(VkCommandBufferObj &cmdBuffer);
142 VkResult EndCommandBuffer(VkCommandBufferObj &cmdBuffer);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500143 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
144 void GenericDrawPreparation(VkCommandBufferObj *cmdBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask);
Tony Barbour30486ea2015-04-07 13:44:53 -0600145
146protected:
Tony Barbour01999182015-04-09 12:58:51 -0600147 ErrorMonitor *m_errorMonitor;
Tony Barbour30486ea2015-04-07 13:44:53 -0600148
149 virtual void SetUp() {
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600150 std::vector<const char *> instance_layer_names;
151 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600152 std::vector<const char *> instance_extension_names;
153 std::vector<const char *> device_extension_names;
Tony Barbour950ebc02015-04-23 12:55:36 -0600154
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600155 instance_extension_names.push_back(DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterde53c5b2015-06-16 15:59:11 -0600156 /*
157 * Since CreateDbgMsgCallback is an instance level extension call
158 * any extension / layer that utilizes that feature also needs
159 * to be enabled at create instance time.
160 */
Mike Stroyaned254572015-06-17 16:32:06 -0600161 // Use Threading layer first to protect others from ThreadCmdBufferCollision test
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600162 instance_layer_names.push_back("Threading");
163 instance_layer_names.push_back("ObjectTracker");
164 instance_layer_names.push_back("MemTracker");
165 instance_layer_names.push_back("DrawState");
166 instance_layer_names.push_back("ShaderChecker");
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600167
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600168 device_layer_names.push_back("Threading");
169 device_layer_names.push_back("ObjectTracker");
170 device_layer_names.push_back("MemTracker");
171 device_layer_names.push_back("DrawState");
172 device_layer_names.push_back("ShaderChecker");
Tony Barbour30486ea2015-04-07 13:44:53 -0600173
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600174 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour30486ea2015-04-07 13:44:53 -0600175 this->app_info.pNext = NULL;
176 this->app_info.pAppName = "layer_tests";
177 this->app_info.appVersion = 1;
178 this->app_info.pEngineName = "unittest";
179 this->app_info.engineVersion = 1;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600180 this->app_info.apiVersion = VK_API_VERSION;
Tony Barbour30486ea2015-04-07 13:44:53 -0600181
Tony Barbour0c1bdc62015-04-29 17:34:29 -0600182 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600183 InitFramework(instance_layer_names, device_layer_names,
184 instance_extension_names, device_extension_names,
185 myDbgFunc, m_errorMonitor);
Tony Barbour30486ea2015-04-07 13:44:53 -0600186 }
187
188 virtual void TearDown() {
189 // Clean up resources before we reset
Tony Barbour30486ea2015-04-07 13:44:53 -0600190 ShutdownFramework();
Tony Barbour8508b8e2015-04-09 10:48:04 -0600191 delete m_errorMonitor;
Tony Barbour30486ea2015-04-07 13:44:53 -0600192 }
193};
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500194
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600195VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &cmdBuffer)
Tony Barbour30486ea2015-04-07 13:44:53 -0600196{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600197 VkResult result;
Tony Barbour30486ea2015-04-07 13:44:53 -0600198
199 result = cmdBuffer.BeginCommandBuffer();
200
201 /*
202 * For render test all drawing happens in a single render pass
203 * on a single command buffer.
204 */
Chris Forbesfe133ef2015-06-16 14:05:59 +1200205 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wuc278df82015-07-07 11:50:03 +0800206 cmdBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour30486ea2015-04-07 13:44:53 -0600207 }
208
209 return result;
210}
211
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600212VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &cmdBuffer)
Tony Barbour30486ea2015-04-07 13:44:53 -0600213{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600214 VkResult result;
Tony Barbour30486ea2015-04-07 13:44:53 -0600215
Chris Forbesfe133ef2015-06-16 14:05:59 +1200216 if (renderPass()) {
Chia-I Wu88eaa3b2015-06-26 15:34:39 +0800217 cmdBuffer.EndRenderPass();
Chris Forbesfe133ef2015-06-16 14:05:59 +1200218 }
Tony Barbour30486ea2015-04-07 13:44:53 -0600219
220 result = cmdBuffer.EndCommandBuffer();
221
222 return result;
223}
224
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500225void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask)
226{
227 // Create identity matrix
228 int i;
229 struct vktriangle_vs_uniform data;
230
231 glm::mat4 Projection = glm::mat4(1.0f);
232 glm::mat4 View = glm::mat4(1.0f);
233 glm::mat4 Model = glm::mat4(1.0f);
234 glm::mat4 MVP = Projection * View * Model;
235 const int matrixSize = sizeof(MVP);
236 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
237
238 memcpy(&data.mvp, &MVP[0][0], matrixSize);
239
240 static const Vertex tri_data[] =
241 {
242 { XYZ1( -1, -1, 0 ), XYZ1( 1.f, 0.f, 0.f ) },
243 { XYZ1( 1, -1, 0 ), XYZ1( 0.f, 1.f, 0.f ) },
244 { XYZ1( 0, 1, 0 ), XYZ1( 0.f, 0.f, 1.f ) },
245 };
246
247 for (i=0; i<3; i++) {
248 data.position[i][0] = tri_data[i].posX;
249 data.position[i][1] = tri_data[i].posY;
250 data.position[i][2] = tri_data[i].posZ;
251 data.position[i][3] = tri_data[i].posW;
252 data.color[i][0] = tri_data[i].r;
253 data.color[i][1] = tri_data[i].g;
254 data.color[i][2] = tri_data[i].b;
255 data.color[i][3] = tri_data[i].a;
256 }
257
258 ASSERT_NO_FATAL_FAILURE(InitState());
259 ASSERT_NO_FATAL_FAILURE(InitViewport());
260
261 VkConstantBufferObj constantBuffer(m_device, bufSize*2, sizeof(float), (const void*) &data);
262
263 VkShaderObj vs(m_device,vertShaderText,VK_SHADER_STAGE_VERTEX, this);
264 VkShaderObj ps(m_device,fragShaderText, VK_SHADER_STAGE_FRAGMENT, this);
265
266 VkPipelineObj pipelineobj(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +0800267 pipelineobj.AddColorAttachment();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500268 pipelineobj.AddShader(&vs);
269 pipelineobj.AddShader(&ps);
270
271 VkDescriptorSetObj descriptorSet(m_device);
272 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
273
274 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
275 VkCommandBufferObj cmdBuffer(m_device);
276 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
277
278 ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
279
280 GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet, failMask);
281
282 // render triangle
283 cmdBuffer.Draw(0, 3, 0, 1);
284
285 // finalize recording of the command buffer
286 EndCommandBuffer(cmdBuffer);
287
288 cmdBuffer.QueueCommandBuffer();
289}
290
291void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *cmdBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask)
292{
293 if (m_depthStencil->Initialized()) {
294 cmdBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
295 } else {
296 cmdBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
297 }
298
299 cmdBuffer->PrepareAttachments();
300 if ((failMask & BsoFailRaster) != BsoFailRaster) {
301 cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_RASTER, m_stateRaster);
302 }
303 if ((failMask & BsoFailViewport) != BsoFailViewport) {
304 cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_VIEWPORT, m_stateViewport);
305 }
306 if ((failMask & BsoFailColorBlend) != BsoFailColorBlend) {
307 cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_COLOR_BLEND, m_colorBlend);
308 }
309 if ((failMask & BsoFailDepthStencil) != BsoFailDepthStencil) {
310 cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_DEPTH_STENCIL, m_stateDepthStencil);
311 }
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600312 // Make sure depthWriteEnable is set so that DepthStencil fail test will work correctly
313 VkStencilOpState stencil = {
314 .stencilFailOp = VK_STENCIL_OP_KEEP,
315 .stencilPassOp = VK_STENCIL_OP_KEEP,
316 .stencilDepthFailOp = VK_STENCIL_OP_KEEP,
317 .stencilCompareOp = VK_COMPARE_OP_NEVER
318 };
319 VkPipelineDsStateCreateInfo ds_ci = {
320 .sType = VK_STRUCTURE_TYPE_PIPELINE_DS_STATE_CREATE_INFO,
321 .pNext = NULL,
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600322 .depthTestEnable = VK_FALSE,
323 .depthWriteEnable = VK_TRUE,
324 .depthCompareOp = VK_COMPARE_OP_NEVER,
325 .depthBoundsEnable = VK_FALSE,
326 .stencilTestEnable = VK_FALSE,
327 .front = stencil,
328 .back = stencil
329 };
330 pipelineobj.SetDepthStencil(&ds_ci);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500331 descriptorSet.CreateVKDescriptorSet(cmdBuffer);
Chia-I Wuc278df82015-07-07 11:50:03 +0800332 pipelineobj.CreateVKPipeline(descriptorSet, renderPass());
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500333 cmdBuffer->BindPipeline(pipelineobj);
334 cmdBuffer->BindDescriptorSet(descriptorSet);
335}
336
337// ********************************************************************************************************************
338// ********************************************************************************************************************
339// ********************************************************************************************************************
340// ********************************************************************************************************************
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600341#if MEM_TRACKER_TESTS
Mark Lobodzinski81078192015-05-19 10:28:29 -0500342TEST_F(VkLayerTest, CallResetCmdBufferBeforeCompletion)
343{
344 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600345 VkFlags msgFlags;
Mark Lobodzinski81078192015-05-19 10:28:29 -0500346 std::string msgString;
347
348 VkFenceCreateInfo fenceInfo = {};
349 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
350 fenceInfo.pNext = NULL;
351 fenceInfo.flags = 0;
352
353 ASSERT_NO_FATAL_FAILURE(InitState());
354 ASSERT_NO_FATAL_FAILURE(InitViewport());
355 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
356
357 VkCommandBufferObj cmdBuffer(m_device);
358 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
359
360 BeginCommandBuffer(cmdBuffer);
361 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
362 EndCommandBuffer(cmdBuffer);
363
364 testFence.init(*m_device, fenceInfo);
365
366 // Bypass framework since it does the waits automatically
367 VkResult err = VK_SUCCESS;
Chia-I Wu78c2a352015-07-03 11:49:42 +0800368 err = vkQueueSubmit( m_device->m_queue, 1, &cmdBuffer.handle(), testFence.handle());
Mark Lobodzinski81078192015-05-19 10:28:29 -0500369 ASSERT_VK_SUCCESS( err );
370
371 m_errorMonitor->ClearState();
372 // Introduce failure by calling begin again before checking fence
Chia-I Wu78c2a352015-07-03 11:49:42 +0800373 vkResetCommandBuffer(cmdBuffer.handle());
Mark Lobodzinski81078192015-05-19 10:28:29 -0500374
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600375 msgFlags = m_errorMonitor->GetState(&msgString);
376 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 -0500377 if (!strstr(msgString.c_str(),"Resetting CB")) {
378 FAIL() << "Error received was not 'Resetting CB (0xaddress) before it has completed. You must check CB flag before'";
379 }
380}
381
382TEST_F(VkLayerTest, CallBeginCmdBufferBeforeCompletion)
383{
384 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600385 VkFlags msgFlags;
Mark Lobodzinski81078192015-05-19 10:28:29 -0500386 std::string msgString;
387
388 VkFenceCreateInfo fenceInfo = {};
389 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
390 fenceInfo.pNext = NULL;
391 fenceInfo.flags = 0;
392
393 ASSERT_NO_FATAL_FAILURE(InitState());
394 ASSERT_NO_FATAL_FAILURE(InitViewport());
395 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
396
397 VkCommandBufferObj cmdBuffer(m_device);
398 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
399
400 BeginCommandBuffer(cmdBuffer);
401 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
402 EndCommandBuffer(cmdBuffer);
403
404 testFence.init(*m_device, fenceInfo);
405
406 // Bypass framework since it does the waits automatically
407 VkResult err = VK_SUCCESS;
Chia-I Wu78c2a352015-07-03 11:49:42 +0800408 err = vkQueueSubmit( m_device->m_queue, 1, &cmdBuffer.handle(), testFence.handle());
Mark Lobodzinski81078192015-05-19 10:28:29 -0500409 ASSERT_VK_SUCCESS( err );
410
411 m_errorMonitor->ClearState();
412 // Introduce failure by calling begin again before checking fence
413 BeginCommandBuffer(cmdBuffer);
414
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600415 msgFlags = m_errorMonitor->GetState(&msgString);
416 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 -0500417 if (!strstr(msgString.c_str(),"Calling vkBeginCommandBuffer() on active CB")) {
418 FAIL() << "Error received was not 'Calling vkBeginCommandBuffer() on an active CB (0xaddress) before it has completed'";
419 }
420}
421
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500422TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit)
423{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600424 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500425 std::string msgString;
426 VkResult err;
427
428 ASSERT_NO_FATAL_FAILURE(InitState());
429 m_errorMonitor->ClearState();
430
431 // Create an image, allocate memory, free it, and then try to bind it
432 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500433 VkDeviceMemory mem;
434 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500435
436 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
437 const int32_t tex_width = 32;
438 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500439
440 const VkImageCreateInfo image_create_info = {
441 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
442 .pNext = NULL,
443 .imageType = VK_IMAGE_TYPE_2D,
444 .format = tex_format,
445 .extent = { tex_width, tex_height, 1 },
446 .mipLevels = 1,
447 .arraySize = 1,
448 .samples = 1,
449 .tiling = VK_IMAGE_TILING_LINEAR,
450 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
451 .flags = 0,
452 };
453 VkMemoryAllocInfo mem_alloc = {
454 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
455 .pNext = NULL,
456 .allocationSize = 0,
457 // Introduce failure, do NOT set memProps to VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Mark Lobodzinski72346292015-07-02 16:49:40 -0600458 .memoryTypeIndex = 1,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500459 };
460
461 err = vkCreateImage(m_device->device(), &image_create_info, &image);
462 ASSERT_VK_SUCCESS(err);
463
Tony Barbour426b9052015-06-24 16:06:58 -0600464 err = vkGetObjectMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500465 VK_OBJECT_TYPE_IMAGE,
466 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500467 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500468 ASSERT_VK_SUCCESS(err);
469
Mark Lobodzinski23182612015-05-29 09:32:35 -0500470 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500471
472 // allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500473 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500474 ASSERT_VK_SUCCESS(err);
475
476 // Try to bind free memory that has been freed
Mark Lobodzinski23182612015-05-29 09:32:35 -0500477 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500478 ASSERT_VK_SUCCESS(err);
479
480 // Map memory as if to initialize the image
481 void *mappedAddress = NULL;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500482 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, &mappedAddress);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500483
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600484 msgFlags = m_errorMonitor->GetState(&msgString);
485 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 -0500486 if (!strstr(msgString.c_str(),"Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT")) {
487 FAIL() << "Error received did not match expected error message from vkMapMemory in MemTracker";
488 }
489}
490
491TEST_F(VkLayerTest, BindInvalidMemory)
492{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600493 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500494 std::string msgString;
495 VkResult err;
496
497 ASSERT_NO_FATAL_FAILURE(InitState());
498 m_errorMonitor->ClearState();
499
500 // Create an image, allocate memory, free it, and then try to bind it
501 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500502 VkDeviceMemory mem;
503 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500504
505 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
506 const int32_t tex_width = 32;
507 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500508
509 const VkImageCreateInfo image_create_info = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600510 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
511 .pNext = NULL,
512 .imageType = VK_IMAGE_TYPE_2D,
513 .format = tex_format,
514 .extent = { tex_width, tex_height, 1 },
515 .mipLevels = 1,
516 .arraySize = 1,
517 .samples = 1,
518 .tiling = VK_IMAGE_TILING_LINEAR,
519 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
520 .flags = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500521 };
522 VkMemoryAllocInfo mem_alloc = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600523 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
524 .pNext = NULL,
525 .allocationSize = 0,
526 .memoryTypeIndex = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500527 };
528
529 err = vkCreateImage(m_device->device(), &image_create_info, &image);
530 ASSERT_VK_SUCCESS(err);
531
Tony Barbour426b9052015-06-24 16:06:58 -0600532 err = vkGetObjectMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500533 VK_OBJECT_TYPE_IMAGE,
534 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500535 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500536 ASSERT_VK_SUCCESS(err);
537
Mark Lobodzinski23182612015-05-29 09:32:35 -0500538 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500539
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800540 err = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinski72346292015-07-02 16:49:40 -0600541 ASSERT_VK_SUCCESS(err);
542
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500543 // allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500544 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500545 ASSERT_VK_SUCCESS(err);
546
547 // Introduce validation failure, free memory before binding
Mark Lobodzinski23182612015-05-29 09:32:35 -0500548 vkFreeMemory(m_device->device(), mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500549 ASSERT_VK_SUCCESS(err);
550
551 // Try to bind free memory that has been freed
Mark Lobodzinski23182612015-05-29 09:32:35 -0500552 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500553 ASSERT_VK_SUCCESS(err);
554
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600555 msgFlags = m_errorMonitor->GetState(&msgString);
556 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 -0500557 if (!strstr(msgString.c_str(),"couldn't find info for mem obj")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500558 FAIL() << "Error received did not match expected error message from BindObjectMemory in MemTracker";
559 }
560}
561
562TEST_F(VkLayerTest, FreeBoundMemory)
563{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600564 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500565 std::string msgString;
566 VkResult err;
567
568 ASSERT_NO_FATAL_FAILURE(InitState());
569 m_errorMonitor->ClearState();
570
571 // Create an image, allocate memory, free it, and then try to bind it
572 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500573 VkDeviceMemory mem;
574 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500575
576 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
577 const int32_t tex_width = 32;
578 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500579
580 const VkImageCreateInfo image_create_info = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600581 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
582 .pNext = NULL,
583 .imageType = VK_IMAGE_TYPE_2D,
584 .format = tex_format,
585 .extent = { tex_width, tex_height, 1 },
586 .mipLevels = 1,
587 .arraySize = 1,
588 .samples = 1,
589 .tiling = VK_IMAGE_TILING_LINEAR,
590 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
591 .flags = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500592 };
593 VkMemoryAllocInfo mem_alloc = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600594 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
595 .pNext = NULL,
596 .allocationSize = 0,
597 .memoryTypeIndex = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500598 };
599
600 err = vkCreateImage(m_device->device(), &image_create_info, &image);
601 ASSERT_VK_SUCCESS(err);
602
Tony Barbour426b9052015-06-24 16:06:58 -0600603 err = vkGetObjectMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500604 VK_OBJECT_TYPE_IMAGE,
605 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500606 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500607 ASSERT_VK_SUCCESS(err);
608
Mark Lobodzinski23182612015-05-29 09:32:35 -0500609 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500610
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800611 err = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinski72346292015-07-02 16:49:40 -0600612 ASSERT_VK_SUCCESS(err);
613
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500614 // allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500615 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500616 ASSERT_VK_SUCCESS(err);
617
618 // Bind memory to Image object
Mark Lobodzinski23182612015-05-29 09:32:35 -0500619 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500620 ASSERT_VK_SUCCESS(err);
621
622 // Introduce validation failure, free memory while still bound to object
Mark Lobodzinski23182612015-05-29 09:32:35 -0500623 vkFreeMemory(m_device->device(), mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500624 ASSERT_VK_SUCCESS(err);
625
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600626 msgFlags = m_errorMonitor->GetState(&msgString);
Courtney Goeltzenleuchter7dc4c8b2015-06-13 21:48:47 -0600627 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 -0500628 if (!strstr(msgString.c_str(),"Freeing memory object while it still has references")) {
629 FAIL() << "Warning received did not match expected message from freeMemObjInfo in MemTracker";
630 }
631}
632
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500633TEST_F(VkLayerTest, RebindMemory)
634{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600635 VkFlags msgFlags;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500636 std::string msgString;
637 VkResult err;
638
639 ASSERT_NO_FATAL_FAILURE(InitState());
640 m_errorMonitor->ClearState();
641
642 // Create an image, allocate memory, free it, and then try to bind it
643 VkImage image;
644 VkDeviceMemory mem1;
645 VkDeviceMemory mem2;
646 VkMemoryRequirements mem_reqs;
647
648 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
649 const int32_t tex_width = 32;
650 const int32_t tex_height = 32;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500651
652 const VkImageCreateInfo image_create_info = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600653 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
654 .pNext = NULL,
655 .imageType = VK_IMAGE_TYPE_2D,
656 .format = tex_format,
657 .extent = { tex_width, tex_height, 1 },
658 .mipLevels = 1,
659 .arraySize = 1,
660 .samples = 1,
661 .tiling = VK_IMAGE_TILING_LINEAR,
662 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
663 .flags = 0,
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500664 };
665 VkMemoryAllocInfo mem_alloc = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600666 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
667 .pNext = NULL,
668 .allocationSize = 0,
669 .memoryTypeIndex = 0,
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500670 };
671
672 err = vkCreateImage(m_device->device(), &image_create_info, &image);
673 ASSERT_VK_SUCCESS(err);
674
Tony Barbour426b9052015-06-24 16:06:58 -0600675 err = vkGetObjectMemoryRequirements(m_device->device(),
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500676 VK_OBJECT_TYPE_IMAGE,
677 image,
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500678 &mem_reqs);
679 ASSERT_VK_SUCCESS(err);
680
681 mem_alloc.allocationSize = mem_reqs.size;
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800682 err = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinski72346292015-07-02 16:49:40 -0600683 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500684
685 // allocate 2 memory objects
686 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem1);
687 ASSERT_VK_SUCCESS(err);
688 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem2);
689 ASSERT_VK_SUCCESS(err);
690
691 // Bind first memory object to Image object
692 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem1, 0);
693 ASSERT_VK_SUCCESS(err);
694
695 // Introduce validation failure, try to bind a different memory object to the same image object
696 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem2, 0);
697 ASSERT_VK_SUCCESS(err);
698
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600699 msgFlags = m_errorMonitor->GetState(&msgString);
700 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 -0500701 if (!strstr(msgString.c_str(),"which has already been bound to mem object")) {
702 FAIL() << "Error received did not match expected message when rebinding memory to an object";
703 }
704}
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500705
706TEST_F(VkLayerTest, BindMemoryToDestroyedObject)
707{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600708 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500709 std::string msgString;
710 VkResult err;
711
712 ASSERT_NO_FATAL_FAILURE(InitState());
713 m_errorMonitor->ClearState();
714
715 // Create an image object, allocate memory, destroy the object and then try to bind it
716 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500717 VkDeviceMemory mem;
718 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500719
720 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
721 const int32_t tex_width = 32;
722 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500723
724 const VkImageCreateInfo image_create_info = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600725 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
726 .pNext = NULL,
727 .imageType = VK_IMAGE_TYPE_2D,
728 .format = tex_format,
729 .extent = { tex_width, tex_height, 1 },
730 .mipLevels = 1,
731 .arraySize = 1,
732 .samples = 1,
733 .tiling = VK_IMAGE_TILING_LINEAR,
734 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
735 .flags = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500736 };
737 VkMemoryAllocInfo mem_alloc = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600738 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
739 .pNext = NULL,
740 .allocationSize = 0,
741 .memoryTypeIndex = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500742 };
743
744 err = vkCreateImage(m_device->device(), &image_create_info, &image);
745 ASSERT_VK_SUCCESS(err);
746
Tony Barbour426b9052015-06-24 16:06:58 -0600747 err = vkGetObjectMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500748 VK_OBJECT_TYPE_IMAGE,
749 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500750 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500751 ASSERT_VK_SUCCESS(err);
752
Mark Lobodzinski23182612015-05-29 09:32:35 -0500753 mem_alloc.allocationSize = mem_reqs.size;
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800754 err = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinski72346292015-07-02 16:49:40 -0600755 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500756
757 // Allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500758 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500759 ASSERT_VK_SUCCESS(err);
760
761 // Introduce validation failure, destroy Image object before binding
762 vkDestroyObject(m_device->device(), VK_OBJECT_TYPE_IMAGE, image);
763 ASSERT_VK_SUCCESS(err);
764
765 // Now Try to bind memory to this destroyted object
Mark Lobodzinski23182612015-05-29 09:32:35 -0500766 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500767 ASSERT_VK_SUCCESS(err);
768
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600769 msgFlags = m_errorMonitor->GetState(&msgString);
770 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 -0500771 if (!strstr(msgString.c_str(),"that's not in global list")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500772 FAIL() << "Error received did not match expected error message from updateObjectBinding in MemTracker";
773 }
774}
775
Tony Barbour8508b8e2015-04-09 10:48:04 -0600776TEST_F(VkLayerTest, SubmitSignaledFence)
Tony Barbour30486ea2015-04-07 13:44:53 -0600777{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600778 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600779 VkFlags msgFlags;
Tony Barbour30486ea2015-04-07 13:44:53 -0600780 std::string msgString;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600781
782 VkFenceCreateInfo fenceInfo = {};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600783 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
784 fenceInfo.pNext = NULL;
785 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour30486ea2015-04-07 13:44:53 -0600786
Tony Barbour30486ea2015-04-07 13:44:53 -0600787 ASSERT_NO_FATAL_FAILURE(InitState());
788 ASSERT_NO_FATAL_FAILURE(InitViewport());
789 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
790
Tony Barbour01999182015-04-09 12:58:51 -0600791 VkCommandBufferObj cmdBuffer(m_device);
Tony Barbour30486ea2015-04-07 13:44:53 -0600792 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
793
Tony Barbour8508b8e2015-04-09 10:48:04 -0600794 BeginCommandBuffer(cmdBuffer);
Tony Barbour30486ea2015-04-07 13:44:53 -0600795 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour8508b8e2015-04-09 10:48:04 -0600796 EndCommandBuffer(cmdBuffer);
Tony Barbour30486ea2015-04-07 13:44:53 -0600797
798 testFence.init(*m_device, fenceInfo);
799 m_errorMonitor->ClearState();
Chia-I Wua4992342015-07-03 11:45:55 +0800800 cmdBuffer.QueueCommandBuffer(testFence.handle());
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600801 msgFlags = m_errorMonitor->GetState(&msgString);
802 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 -0600803 if (!strstr(msgString.c_str(),"submitted in SIGNALED state. Fences must be reset before being submitted")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500804 FAIL() << "Error received was not 'VkQueueSubmit with fence in SIGNALED_STATE'";
Tony Barbour8508b8e2015-04-09 10:48:04 -0600805 }
806
807}
808
809TEST_F(VkLayerTest, ResetUnsignaledFence)
810{
811 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600812 VkFlags msgFlags;
Tony Barbour8508b8e2015-04-09 10:48:04 -0600813 std::string msgString;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600814 VkFenceCreateInfo fenceInfo = {};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600815 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
816 fenceInfo.pNext = NULL;
817
Tony Barbour8508b8e2015-04-09 10:48:04 -0600818 ASSERT_NO_FATAL_FAILURE(InitState());
819 testFence.init(*m_device, fenceInfo);
820 m_errorMonitor->ClearState();
Chia-I Wua4992342015-07-03 11:45:55 +0800821 VkFence fences[1] = {testFence.handle()};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600822 vkResetFences(m_device->device(), 1, fences);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600823 msgFlags = m_errorMonitor->GetState(&msgString);
824 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 -0600825 if (!strstr(msgString.c_str(),"submitted to VkResetFences in UNSIGNALED STATE")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500826 FAIL() << "Error received was not 'VkResetFences with fence in UNSIGNALED_STATE'";
Tony Barbour8508b8e2015-04-09 10:48:04 -0600827 }
Tony Barbour30486ea2015-04-07 13:44:53 -0600828
829}
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600830
Chia-I Wuc278df82015-07-07 11:50:03 +0800831/* TODO: Update for changes due to bug-14075 tiling across render passes */
832#if 0
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600833TEST_F(VkLayerTest, InvalidUsageBits)
834{
835 // Initiate Draw w/o a PSO bound
836 VkFlags msgFlags;
837 std::string msgString;
838
839 ASSERT_NO_FATAL_FAILURE(InitState());
840 m_errorMonitor->ClearState();
841 VkCommandBufferObj cmdBuffer(m_device);
842 BeginCommandBuffer(cmdBuffer);
843
844 const VkExtent3D e3d = {
845 .width = 128,
846 .height = 128,
847 .depth = 1,
848 };
849 const VkImageCreateInfo ici = {
850 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
851 .pNext = NULL,
852 .imageType = VK_IMAGE_TYPE_2D,
853 .format = VK_FORMAT_D32_SFLOAT_S8_UINT,
854 .extent = e3d,
855 .mipLevels = 1,
856 .arraySize = 1,
857 .samples = 1,
858 .tiling = VK_IMAGE_TILING_LINEAR,
859 .usage = 0, // Not setting VK_IMAGE_USAGE_DEPTH_STENCIL_BIT
860 .flags = 0,
861 };
862
863 VkImage dsi;
864 vkCreateImage(m_device->device(), &ici, &dsi);
865 VkDepthStencilView dsv;
866 const VkDepthStencilViewCreateInfo dsvci = {
867 .sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO,
868 .pNext = NULL,
869 .image = dsi,
870 .mipLevel = 0,
871 .baseArraySlice = 0,
872 .arraySize = 1,
873 .flags = 0,
874 };
875 vkCreateDepthStencilView(m_device->device(), &dsvci, &dsv);
876 msgFlags = m_errorMonitor->GetState(&msgString);
877 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after attempting to create DSView w/ image lacking USAGE_DS_BIT flag";
878 if (!strstr(msgString.c_str(),"Invalid usage flag for image ")) {
879 FAIL() << "Error received was not 'Invalid usage flag for image...'";
880 }
881}
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600882#endif
Chia-I Wuc278df82015-07-07 11:50:03 +0800883#endif
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600884#if OBJ_TRACKER_TESTS
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500885TEST_F(VkLayerTest, RasterStateNotBound)
886{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600887 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500888 std::string msgString;
Tobin Ehlis254eca02015-06-25 15:46:59 -0600889 ASSERT_NO_FATAL_FAILURE(InitState());
890 m_errorMonitor->ClearState();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500891 TEST_DESCRIPTION("Simple Draw Call that validates failure when a raster state object is not bound beforehand");
892
893 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailRaster);
894
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600895 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600896 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from Not Binding a Raster State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500897 if (!strstr(msgString.c_str(),"Raster object not bound to this command buffer")) {
898 FAIL() << "Error received was not 'Raster object not bound to this command buffer'";
899 }
900}
901
902TEST_F(VkLayerTest, ViewportStateNotBound)
903{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600904 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500905 std::string msgString;
Tobin Ehlis254eca02015-06-25 15:46:59 -0600906 ASSERT_NO_FATAL_FAILURE(InitState());
907 m_errorMonitor->ClearState();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500908 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport state object is not bound beforehand");
909
910 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
911
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600912 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600913 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from Not Binding a Viewport State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500914 if (!strstr(msgString.c_str(),"Viewport object not bound to this command buffer")) {
915 FAIL() << "Error received was not 'Viewport object not bound to this command buffer'";
916 }
917}
918
919TEST_F(VkLayerTest, ColorBlendStateNotBound)
920{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600921 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500922 std::string msgString;
Tobin Ehlis254eca02015-06-25 15:46:59 -0600923 ASSERT_NO_FATAL_FAILURE(InitState());
924 m_errorMonitor->ClearState();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500925 TEST_DESCRIPTION("Simple Draw Call that validates failure when a color-blend state object is not bound beforehand");
926
927 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailColorBlend);
928
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600929 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600930 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from Not Binding a ColorBlend State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500931 if (!strstr(msgString.c_str(),"Color-blend object not bound to this command buffer")) {
932 FAIL() << "Error received was not 'Color-blend object not bound to this command buffer'";
933 }
934}
935
936TEST_F(VkLayerTest, DepthStencilStateNotBound)
937{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600938 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500939 std::string msgString;
Tobin Ehlis254eca02015-06-25 15:46:59 -0600940 ASSERT_NO_FATAL_FAILURE(InitState());
941 m_errorMonitor->ClearState();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500942 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth-stencil state object is not bound beforehand");
943
944 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthStencil);
945
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600946 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600947 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from Not Binding a DepthStencil State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500948 if (!strstr(msgString.c_str(),"Depth-stencil object not bound to this command buffer")) {
949 FAIL() << "Error received was not 'Depth-stencil object not bound to this command buffer'";
950 }
Tony Barbourdb686622015-05-06 09:35:56 -0600951}
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600952#endif
953#if DRAW_STATE_TESTS
Tobin Ehlise4076782015-06-24 15:53:07 -0600954TEST_F(VkLayerTest, BindPipelineNoRenderPass)
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600955{
956 // Initiate Draw w/o a PSO bound
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600957 VkFlags msgFlags;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600958 std::string msgString;
959
960 ASSERT_NO_FATAL_FAILURE(InitState());
961 m_errorMonitor->ClearState();
962 VkCommandBufferObj cmdBuffer(m_device);
963 BeginCommandBuffer(cmdBuffer);
964 VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
965 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600966 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlise4076782015-06-24 15:53:07 -0600967 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding pipeline to CmdBuffer w/o active RenderPass";
968 if (!strstr(msgString.c_str(),"Incorrectly binding graphics pipeline ")) {
969 FAIL() << "Error received was not 'Incorrectly binding graphics pipeline (0xbaadb1be) without an active RenderPass'";
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600970 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600971}
972
973TEST_F(VkLayerTest, InvalidDescriptorPool)
974{
975 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
976 // The DS check for this is after driver has been called to validate DS internal data struct
977 // Attempt to clear DS Pool with bad object
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600978/* VkFlags msgFlags;
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600979 std::string msgString;
980 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
981 vkResetDescriptorPool(device(), badPool);
982
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600983 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600984 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from Resetting an invalid DescriptorPool Object";
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600985 if (!strstr(msgString.c_str(),"Unable to find pool node for pool 0xbaad6001 specified in vkResetDescriptorPool() call")) {
986 FAIL() << "Error received was note 'Unable to find pool node for pool 0xbaad6001 specified in vkResetDescriptorPool() call'";
987 }*/
988}
989
990TEST_F(VkLayerTest, InvalidDescriptorSet)
991{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600992 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
993 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600994 // Create a valid cmd buffer
995 // call vkCmdBindDescriptorSets w/ false DS
996}
997
998TEST_F(VkLayerTest, InvalidDescriptorSetLayout)
999{
1000 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
1001 // The DS check for this is after driver has been called to validate DS internal data struct
1002}
1003
1004TEST_F(VkLayerTest, InvalidPipeline)
1005{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001006 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
1007 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001008 // Create a valid cmd buffer
1009 // call vkCmdBindPipeline w/ false Pipeline
Tobin Ehlise4076782015-06-24 15:53:07 -06001010// VkFlags msgFlags;
1011// std::string msgString;
1012//
1013// ASSERT_NO_FATAL_FAILURE(InitState());
1014// m_errorMonitor->ClearState();
1015// VkCommandBufferObj cmdBuffer(m_device);
1016// BeginCommandBuffer(cmdBuffer);
1017// VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
1018// vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
1019// msgFlags = m_errorMonitor->GetState(&msgString);
1020// ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding invalid pipeline to CmdBuffer";
1021// if (!strstr(msgString.c_str(),"Attempt to bind Pipeline ")) {
1022// FAIL() << "Error received was not 'Attempt to bind Pipeline 0xbaadb1be that doesn't exist!'";
1023// }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001024}
1025
Tobin Ehlis254eca02015-06-25 15:46:59 -06001026TEST_F(VkLayerTest, DescriptorSetNotUpdated)
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001027{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001028 // Create and update CmdBuffer then call QueueSubmit w/o calling End on CmdBuffer
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001029 VkFlags msgFlags;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001030 std::string msgString;
1031 VkResult err;
1032
1033 ASSERT_NO_FATAL_FAILURE(InitState());
1034 m_errorMonitor->ClearState();
1035 VkCommandBufferObj cmdBuffer(m_device);
1036 const VkDescriptorTypeCount ds_type_count = {
1037 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1038 .count = 1,
1039 };
1040 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1041 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1042 .pNext = NULL,
1043 .count = 1,
1044 .pTypeCount = &ds_type_count,
1045 };
1046 VkDescriptorPool ds_pool;
1047 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1048 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001049
1050 const VkDescriptorSetLayoutBinding dsl_binding = {
1051 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001052 .arraySize = 1,
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001053 .stageFlags = VK_SHADER_STAGE_ALL,
1054 .pImmutableSamplers = NULL,
1055 };
1056
1057 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1058 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1059 .pNext = NULL,
1060 .count = 1,
1061 .pBinding = &dsl_binding,
1062 };
1063 VkDescriptorSetLayout ds_layout;
1064 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1065 ASSERT_VK_SUCCESS(err);
1066
1067 VkDescriptorSet descriptorSet;
1068 uint32_t ds_count = 0;
1069 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1070 ASSERT_VK_SUCCESS(err);
1071
1072 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1073 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1074 .pNext = NULL,
1075 .descriptorSetCount = 1,
1076 .pSetLayouts = &ds_layout,
1077 };
1078
1079 VkPipelineLayout pipeline_layout;
1080 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1081 ASSERT_VK_SUCCESS(err);
1082
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06001083 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001084
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001085 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1086 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1087 .pNext = NULL,
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001088 .stage = VK_SHADER_STAGE_VERTEX,
Chia-I Wub48eddb2015-07-03 11:49:42 +08001089 .shader = vs.handle(),
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001090 .linkConstBufferCount = 0,
1091 .pLinkConstBufferInfo = NULL,
1092 .pSpecializationInfo = NULL,
1093 };
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001094 const VkGraphicsPipelineCreateInfo gp_ci = {
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001095 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1096 .pNext = NULL,
1097 .stageCount = 1,
1098 .pStages = &pipe_vs_ci,
1099 .pVertexInputState = NULL,
1100 .pIaState = NULL,
1101 .pTessState = NULL,
1102 .pVpState = NULL,
1103 .pRsState = NULL,
1104 .pMsState = NULL,
1105 .pDsState = NULL,
1106 .pCbState = NULL,
1107 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1108 .layout = pipeline_layout,
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001109 };
Jon Ashburn0d60d272015-07-09 15:02:25 -06001110 const VkPipelineCacheCreateInfo pc_ci = {
1111 .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
1112 .pNext = NULL,
1113 .initialSize = 0,
1114 .initialData = 0,
1115 .maxSize = 0,
1116 };
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001117
1118 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06001119 VkPipelineCache pipelineCache;
1120
1121 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
1122 ASSERT_VK_SUCCESS(err);
1123 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001124 ASSERT_VK_SUCCESS(err);
Tobin Ehlis254eca02015-06-25 15:46:59 -06001125 ASSERT_NO_FATAL_FAILURE(InitState());
1126 ASSERT_NO_FATAL_FAILURE(InitViewport());
1127 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1128 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1129 BeginCommandBuffer(cmdBuffer);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001130 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinskia65c4632015-06-15 13:21:21 -06001131 vkCmdBindDescriptorSets(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001132
Tobin Ehlis254eca02015-06-25 15:46:59 -06001133 msgFlags = m_errorMonitor->GetState(&msgString);
1134 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT) << "Did not warn after binding a DescriptorSet that was never updated.";
1135 if (!strstr(msgString.c_str()," bound but it was never updated. ")) {
1136 FAIL() << "Error received was not 'DS <blah> bound but it was never updated. You may want to either update it or not bind it.'";
1137 }
1138}
1139
1140TEST_F(VkLayerTest, NoBeginCmdBuffer)
1141{
1142 VkFlags msgFlags;
1143 std::string msgString;
1144
1145 ASSERT_NO_FATAL_FAILURE(InitState());
1146 m_errorMonitor->ClearState();
1147 VkCommandBufferObj cmdBuffer(m_device);
1148 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
1149 vkEndCommandBuffer(cmdBuffer.GetBufferHandle());
1150 msgFlags = m_errorMonitor->GetState(&msgString);
1151 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after ending a CmdBuffer w/o calling BeginCommandBuffer()";
1152 if (!strstr(msgString.c_str(),"You must call vkBeginCommandBuffer() before this call to ")) {
1153 FAIL() << "Error received was not 'You must call vkBeginCommandBuffer() before this call to vkEndCommandBuffer()'";
1154 }
1155}
1156
1157TEST_F(VkLayerTest, InvalidPipelineCreateState)
1158{
1159 // Attempt to Create Gfx Pipeline w/o a VS
1160 VkFlags msgFlags;
1161 std::string msgString;
1162 VkResult err;
1163
1164 ASSERT_NO_FATAL_FAILURE(InitState());
1165 m_errorMonitor->ClearState();
1166 VkCommandBufferObj cmdBuffer(m_device);
1167 const VkDescriptorTypeCount ds_type_count = {
1168 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1169 .count = 1,
1170 };
1171 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1172 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1173 .pNext = NULL,
1174 .count = 1,
1175 .pTypeCount = &ds_type_count,
1176 };
1177 VkDescriptorPool ds_pool;
1178 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1179 ASSERT_VK_SUCCESS(err);
1180
1181 const VkDescriptorSetLayoutBinding dsl_binding = {
1182 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1183 .arraySize = 1,
1184 .stageFlags = VK_SHADER_STAGE_ALL,
1185 .pImmutableSamplers = NULL,
1186 };
1187
1188 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1189 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1190 .pNext = NULL,
1191 .count = 1,
1192 .pBinding = &dsl_binding,
1193 };
1194 VkDescriptorSetLayout ds_layout;
1195 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1196 ASSERT_VK_SUCCESS(err);
1197
1198 VkDescriptorSet descriptorSet;
1199 uint32_t ds_count = 0;
1200 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1201 ASSERT_VK_SUCCESS(err);
1202
1203 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1204 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1205 .pNext = NULL,
1206 .descriptorSetCount = 1,
1207 .pSetLayouts = &ds_layout,
1208 };
1209
1210 VkPipelineLayout pipeline_layout;
1211 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1212 ASSERT_VK_SUCCESS(err);
1213
1214 const VkGraphicsPipelineCreateInfo gp_ci = {
1215 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1216 .pNext = NULL,
1217 .stageCount = 0,
1218 .pStages = NULL, // Creating Gfx Pipeline w/o VS is a violation
1219 .pVertexInputState = NULL,
1220 .pIaState = NULL,
1221 .pTessState = NULL,
1222 .pVpState = NULL,
1223 .pRsState = NULL,
1224 .pMsState = NULL,
1225 .pDsState = NULL,
1226 .pCbState = NULL,
1227 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1228 .layout = pipeline_layout,
1229 };
Jon Ashburn0d60d272015-07-09 15:02:25 -06001230 const VkPipelineCacheCreateInfo pc_ci = {
1231 .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
1232 .pNext = NULL,
1233 .initialSize = 0,
1234 .initialData = 0,
1235 .maxSize = 0,
1236 };
Tobin Ehlis254eca02015-06-25 15:46:59 -06001237
1238 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06001239 VkPipelineCache pipelineCache;
1240
1241 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
1242 ASSERT_VK_SUCCESS(err);
1243 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001244
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001245 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis254eca02015-06-25 15:46:59 -06001246 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after creating Gfx Pipeline w/o VS.";
1247 if (!strstr(msgString.c_str(),"Invalid Pipeline CreateInfo State: Vtx Shader required")) {
1248 FAIL() << "Error received was not 'Invalid Pipeline CreateInfo State: Vtx Shader required'";
1249 }
1250}
1251
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06001252TEST_F(VkLayerTest, NullRenderPass)
1253{
1254 // Bind a NULL RenderPass
1255 VkFlags msgFlags;
1256 std::string msgString;
1257
1258 ASSERT_NO_FATAL_FAILURE(InitState());
1259 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1260 m_errorMonitor->ClearState();
1261 VkCommandBufferObj cmdBuffer(m_device);
1262
1263 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1264 BeginCommandBuffer(cmdBuffer);
1265 // Don't care about RenderPass handle b/c error should be flagged before that
Chia-I Wuc278df82015-07-07 11:50:03 +08001266 vkCmdBeginRenderPass(cmdBuffer.GetBufferHandle(), NULL, VK_RENDER_PASS_CONTENTS_INLINE);
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06001267
1268 msgFlags = m_errorMonitor->GetState(&msgString);
1269 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding NULL RenderPass.";
1270 if (!strstr(msgString.c_str(),"You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()")) {
1271 FAIL() << "Error received was not 'You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()'";
1272 }
1273}
1274
Tobin Ehlis254eca02015-06-25 15:46:59 -06001275TEST_F(VkLayerTest, RenderPassWithinRenderPass)
1276{
1277 // Bind a BeginRenderPass within an active RenderPass
1278 VkFlags msgFlags;
1279 std::string msgString;
1280
1281 ASSERT_NO_FATAL_FAILURE(InitState());
1282 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1283 m_errorMonitor->ClearState();
1284 VkCommandBufferObj cmdBuffer(m_device);
1285
1286 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1287 BeginCommandBuffer(cmdBuffer);
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06001288 // Just create a dummy Renderpass that's non-NULL so we can get to the proper error
Chia-I Wuc278df82015-07-07 11:50:03 +08001289 const VkRenderPassBeginInfo rp_begin = {
1290 .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
1291 .pNext = NULL,
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06001292 .renderPass = (VkRenderPass) 0xc001d00d,
1293 .framebuffer = NULL
1294 };
Chia-I Wuc278df82015-07-07 11:50:03 +08001295 vkCmdBeginRenderPass(cmdBuffer.GetBufferHandle(), &rp_begin, VK_RENDER_PASS_CONTENTS_INLINE);
Tobin Ehlis254eca02015-06-25 15:46:59 -06001296
1297 msgFlags = m_errorMonitor->GetState(&msgString);
1298 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding RenderPass w/i an active RenderPass.";
1299 if (!strstr(msgString.c_str(),"Cannot call vkCmdBeginRenderPass() during an active RenderPass ")) {
1300 FAIL() << "Error received was not 'Cannot call vkCmdBeginRenderPass() during an active RenderPass...'";
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001301 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001302}
1303
1304TEST_F(VkLayerTest, InvalidDynamicStateObject)
1305{
1306 // Create a valid cmd buffer
1307 // call vkCmdBindDynamicStateObject w/ false DS Obj
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001308 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
1309 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001310}
Tobin Ehlis201b1ba2015-05-27 14:55:35 -06001311
Tobin Ehlise4076782015-06-24 15:53:07 -06001312TEST_F(VkLayerTest, VtxBufferNoRenderPass)
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001313{
1314 // Bind VBO out-of-bounds for given PSO
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001315 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001316 std::string msgString;
1317 VkResult err;
1318
1319 ASSERT_NO_FATAL_FAILURE(InitState());
1320 m_errorMonitor->ClearState();
1321 VkCommandBufferObj cmdBuffer(m_device);
1322 const VkDescriptorTypeCount ds_type_count = {
1323 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1324 .count = 1,
1325 };
1326 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1327 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1328 .pNext = NULL,
1329 .count = 1,
1330 .pTypeCount = &ds_type_count,
1331 };
1332 VkDescriptorPool ds_pool;
1333 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1334 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001335
1336 const VkDescriptorSetLayoutBinding dsl_binding = {
1337 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001338 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001339 .stageFlags = VK_SHADER_STAGE_ALL,
1340 .pImmutableSamplers = NULL,
1341 };
1342
1343 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1344 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1345 .pNext = NULL,
1346 .count = 1,
1347 .pBinding = &dsl_binding,
1348 };
1349 VkDescriptorSetLayout ds_layout;
1350 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1351 ASSERT_VK_SUCCESS(err);
1352
1353 VkDescriptorSet descriptorSet;
1354 uint32_t ds_count = 0;
1355 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1356 ASSERT_VK_SUCCESS(err);
1357
1358 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1359 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1360 .pNext = NULL,
1361 .descriptorSetCount = 1,
1362 .pSetLayouts = &ds_layout,
1363 };
1364
1365 VkPipelineLayout pipeline_layout;
1366 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1367 ASSERT_VK_SUCCESS(err);
1368
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06001369 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001370
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001371 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1372 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1373 .pNext = NULL,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001374 .stage = VK_SHADER_STAGE_VERTEX,
Chia-I Wub48eddb2015-07-03 11:49:42 +08001375 .shader = vs.handle(),
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001376 .linkConstBufferCount = 0,
1377 .pLinkConstBufferInfo = NULL,
1378 .pSpecializationInfo = NULL,
1379 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001380 const VkGraphicsPipelineCreateInfo gp_ci = {
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001381 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1382 .pNext = NULL,
1383 .stageCount = 1,
1384 .pStages = &pipe_vs_ci,
1385 .pVertexInputState = NULL,
1386 .pIaState = NULL,
1387 .pTessState = NULL,
1388 .pVpState = NULL,
1389 .pRsState = NULL,
1390 .pMsState = NULL,
1391 .pDsState = NULL,
1392 .pCbState = NULL,
1393 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1394 .layout = pipeline_layout,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001395 };
Jon Ashburn0d60d272015-07-09 15:02:25 -06001396 const VkPipelineCacheCreateInfo pc_ci = {
1397 .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
1398 .pNext = NULL,
1399 .initialSize = 0,
1400 .initialData = 0,
1401 .maxSize = 0,
1402 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001403
1404 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06001405 VkPipelineCache pipelineCache;
1406
1407 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
1408 ASSERT_VK_SUCCESS(err);
1409 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001410 ASSERT_VK_SUCCESS(err);
1411
1412 err= cmdBuffer.BeginCommandBuffer();
1413 ASSERT_VK_SUCCESS(err);
1414 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1415 // Should error before calling to driver so don't care about actual data
1416 vkCmdBindVertexBuffers(cmdBuffer.GetBufferHandle(), 0, 1, NULL, NULL);
1417
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001418 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlise4076782015-06-24 15:53:07 -06001419 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after vkCmdBindVertexBuffers() w/o active RenderPass.";
1420 if (!strstr(msgString.c_str(),"Incorrect call to vkCmdBindVertexBuffers() without an active RenderPass.")) {
1421 FAIL() << "Error received was not 'Incorrect call to vkCmdBindVertexBuffers() without an active RenderPass.'";
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001422 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001423}
1424
1425TEST_F(VkLayerTest, DSTypeMismatch)
1426{
1427 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001428 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001429 std::string msgString;
1430 VkResult err;
1431
1432 ASSERT_NO_FATAL_FAILURE(InitState());
1433 m_errorMonitor->ClearState();
1434 //VkDescriptorSetObj descriptorSet(m_device);
1435 const VkDescriptorTypeCount ds_type_count = {
1436 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1437 .count = 1,
1438 };
1439 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1440 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1441 .pNext = NULL,
1442 .count = 1,
1443 .pTypeCount = &ds_type_count,
1444 };
1445 VkDescriptorPool ds_pool;
1446 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1447 ASSERT_VK_SUCCESS(err);
1448 const VkDescriptorSetLayoutBinding dsl_binding = {
1449 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001450 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001451 .stageFlags = VK_SHADER_STAGE_ALL,
1452 .pImmutableSamplers = NULL,
1453 };
1454
1455 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1456 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1457 .pNext = NULL,
1458 .count = 1,
1459 .pBinding = &dsl_binding,
1460 };
1461 VkDescriptorSetLayout ds_layout;
1462 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1463 ASSERT_VK_SUCCESS(err);
1464
1465 VkDescriptorSet descriptorSet;
1466 uint32_t ds_count = 0;
1467 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1468 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001469
1470 const VkSamplerCreateInfo sampler_ci = {
1471 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1472 .pNext = NULL,
1473 .magFilter = VK_TEX_FILTER_NEAREST,
1474 .minFilter = VK_TEX_FILTER_NEAREST,
1475 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1476 .addressU = VK_TEX_ADDRESS_CLAMP,
1477 .addressV = VK_TEX_ADDRESS_CLAMP,
1478 .addressW = VK_TEX_ADDRESS_CLAMP,
1479 .mipLodBias = 1.0,
1480 .maxAnisotropy = 1,
1481 .compareOp = VK_COMPARE_OP_NEVER,
1482 .minLod = 1.0,
1483 .maxLod = 1.0,
Tony Barbour2c4e7c72015-06-25 16:56:44 -06001484 .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001485 };
1486 VkSampler sampler;
1487 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1488 ASSERT_VK_SUCCESS(err);
1489
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001490 VkDescriptorInfo descriptor_info;
1491 memset(&descriptor_info, 0, sizeof(descriptor_info));
1492 descriptor_info.sampler = sampler;
1493
1494 VkWriteDescriptorSet descriptor_write;
1495 memset(&descriptor_write, 0, sizeof(descriptor_write));
1496 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1497 descriptor_write.destSet = descriptorSet;
1498 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001499 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001500 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1501 descriptor_write.pDescriptors = &descriptor_info;
1502
1503 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1504
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001505 msgFlags = m_errorMonitor->GetState(&msgString);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001506 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 +08001507 if (!strstr(msgString.c_str(),"Descriptor update type of VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET does not match ")) {
1508 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 -06001509 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001510}
1511
1512TEST_F(VkLayerTest, DSUpdateOutOfBounds)
1513{
1514 // For overlapping Update, have arrayIndex exceed that of layout
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001515 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001516 std::string msgString;
1517 VkResult err;
1518
1519 ASSERT_NO_FATAL_FAILURE(InitState());
1520 m_errorMonitor->ClearState();
1521 //VkDescriptorSetObj descriptorSet(m_device);
1522 const VkDescriptorTypeCount ds_type_count = {
1523 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1524 .count = 1,
1525 };
1526 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1527 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1528 .pNext = NULL,
1529 .count = 1,
1530 .pTypeCount = &ds_type_count,
1531 };
1532 VkDescriptorPool ds_pool;
1533 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1534 ASSERT_VK_SUCCESS(err);
1535 const VkDescriptorSetLayoutBinding dsl_binding = {
1536 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001537 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001538 .stageFlags = VK_SHADER_STAGE_ALL,
1539 .pImmutableSamplers = NULL,
1540 };
1541
1542 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1543 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1544 .pNext = NULL,
1545 .count = 1,
1546 .pBinding = &dsl_binding,
1547 };
1548 VkDescriptorSetLayout ds_layout;
1549 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1550 ASSERT_VK_SUCCESS(err);
1551
1552 VkDescriptorSet descriptorSet;
1553 uint32_t ds_count = 0;
1554 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1555 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001556
1557 const VkSamplerCreateInfo sampler_ci = {
1558 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1559 .pNext = NULL,
1560 .magFilter = VK_TEX_FILTER_NEAREST,
1561 .minFilter = VK_TEX_FILTER_NEAREST,
1562 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1563 .addressU = VK_TEX_ADDRESS_CLAMP,
1564 .addressV = VK_TEX_ADDRESS_CLAMP,
1565 .addressW = VK_TEX_ADDRESS_CLAMP,
1566 .mipLodBias = 1.0,
1567 .maxAnisotropy = 1,
1568 .compareOp = VK_COMPARE_OP_NEVER,
1569 .minLod = 1.0,
1570 .maxLod = 1.0,
Tony Barbour2c4e7c72015-06-25 16:56:44 -06001571 .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001572 };
1573 VkSampler sampler;
1574 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1575 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001576
1577 VkDescriptorInfo descriptor_info;
1578 memset(&descriptor_info, 0, sizeof(descriptor_info));
1579 descriptor_info.sampler = sampler;
1580
1581 VkWriteDescriptorSet descriptor_write;
1582 memset(&descriptor_write, 0, sizeof(descriptor_write));
1583 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1584 descriptor_write.destSet = descriptorSet;
1585 descriptor_write.destArrayElement = 1; /* This index out of bounds for the update */
1586 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001587 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001588 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1589 descriptor_write.pDescriptors = &descriptor_info;
1590
1591 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1592
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001593 msgFlags = m_errorMonitor->GetState(&msgString);
1594 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 +08001595 if (!strstr(msgString.c_str(),"Descriptor update type of VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET is out of bounds for matching binding")) {
1596 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 -06001597 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001598}
1599
1600TEST_F(VkLayerTest, InvalidDSUpdateIndex)
1601{
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001602 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001603 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001604 std::string msgString;
1605 VkResult err;
1606
1607 ASSERT_NO_FATAL_FAILURE(InitState());
1608 m_errorMonitor->ClearState();
1609 //VkDescriptorSetObj descriptorSet(m_device);
1610 const VkDescriptorTypeCount ds_type_count = {
1611 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1612 .count = 1,
1613 };
1614 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1615 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1616 .pNext = NULL,
1617 .count = 1,
1618 .pTypeCount = &ds_type_count,
1619 };
1620 VkDescriptorPool ds_pool;
1621 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1622 ASSERT_VK_SUCCESS(err);
1623 const VkDescriptorSetLayoutBinding dsl_binding = {
1624 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001625 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001626 .stageFlags = VK_SHADER_STAGE_ALL,
1627 .pImmutableSamplers = NULL,
1628 };
1629
1630 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1631 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1632 .pNext = NULL,
1633 .count = 1,
1634 .pBinding = &dsl_binding,
1635 };
1636 VkDescriptorSetLayout ds_layout;
1637 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1638 ASSERT_VK_SUCCESS(err);
1639
1640 VkDescriptorSet descriptorSet;
1641 uint32_t ds_count = 0;
1642 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1643 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001644
1645 const VkSamplerCreateInfo sampler_ci = {
1646 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1647 .pNext = NULL,
1648 .magFilter = VK_TEX_FILTER_NEAREST,
1649 .minFilter = VK_TEX_FILTER_NEAREST,
1650 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1651 .addressU = VK_TEX_ADDRESS_CLAMP,
1652 .addressV = VK_TEX_ADDRESS_CLAMP,
1653 .addressW = VK_TEX_ADDRESS_CLAMP,
1654 .mipLodBias = 1.0,
1655 .maxAnisotropy = 1,
1656 .compareOp = VK_COMPARE_OP_NEVER,
1657 .minLod = 1.0,
1658 .maxLod = 1.0,
Tony Barbour2c4e7c72015-06-25 16:56:44 -06001659 .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001660 };
1661 VkSampler sampler;
1662 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1663 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001664
1665 VkDescriptorInfo descriptor_info;
1666 memset(&descriptor_info, 0, sizeof(descriptor_info));
1667 descriptor_info.sampler = sampler;
1668
1669 VkWriteDescriptorSet descriptor_write;
1670 memset(&descriptor_write, 0, sizeof(descriptor_write));
1671 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1672 descriptor_write.destSet = descriptorSet;
1673 descriptor_write.destBinding = 2;
1674 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001675 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001676 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1677 descriptor_write.pDescriptors = &descriptor_info;
1678
1679 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1680
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001681 msgFlags = m_errorMonitor->GetState(&msgString);
1682 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 -06001683 if (!strstr(msgString.c_str()," does not have binding to match update binding ")) {
1684 FAIL() << "Error received was not 'Descriptor Set <blah> does not have binding to match update binding '";
1685 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001686}
1687
1688TEST_F(VkLayerTest, InvalidDSUpdateStruct)
1689{
1690 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_* types
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001691 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001692 std::string msgString;
1693 VkResult err;
1694
1695 ASSERT_NO_FATAL_FAILURE(InitState());
1696 m_errorMonitor->ClearState();
1697 //VkDescriptorSetObj descriptorSet(m_device);
1698 const VkDescriptorTypeCount ds_type_count = {
1699 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1700 .count = 1,
1701 };
1702 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1703 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1704 .pNext = NULL,
1705 .count = 1,
1706 .pTypeCount = &ds_type_count,
1707 };
1708 VkDescriptorPool ds_pool;
1709 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1710 ASSERT_VK_SUCCESS(err);
1711 const VkDescriptorSetLayoutBinding dsl_binding = {
1712 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001713 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001714 .stageFlags = VK_SHADER_STAGE_ALL,
1715 .pImmutableSamplers = NULL,
1716 };
1717
1718 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1719 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1720 .pNext = NULL,
1721 .count = 1,
1722 .pBinding = &dsl_binding,
1723 };
1724 VkDescriptorSetLayout ds_layout;
1725 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1726 ASSERT_VK_SUCCESS(err);
1727
1728 VkDescriptorSet descriptorSet;
1729 uint32_t ds_count = 0;
1730 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1731 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001732
1733 const VkSamplerCreateInfo sampler_ci = {
1734 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1735 .pNext = NULL,
1736 .magFilter = VK_TEX_FILTER_NEAREST,
1737 .minFilter = VK_TEX_FILTER_NEAREST,
1738 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1739 .addressU = VK_TEX_ADDRESS_CLAMP,
1740 .addressV = VK_TEX_ADDRESS_CLAMP,
1741 .addressW = VK_TEX_ADDRESS_CLAMP,
1742 .mipLodBias = 1.0,
1743 .maxAnisotropy = 1,
1744 .compareOp = VK_COMPARE_OP_NEVER,
1745 .minLod = 1.0,
1746 .maxLod = 1.0,
Tony Barbour2c4e7c72015-06-25 16:56:44 -06001747 .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001748 };
1749 VkSampler sampler;
1750 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1751 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001752
1753
1754 VkDescriptorInfo descriptor_info;
1755 memset(&descriptor_info, 0, sizeof(descriptor_info));
1756 descriptor_info.sampler = sampler;
1757
1758 VkWriteDescriptorSet descriptor_write;
1759 memset(&descriptor_write, 0, sizeof(descriptor_write));
1760 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
1761 descriptor_write.destSet = descriptorSet;
1762 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001763 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001764 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1765 descriptor_write.pDescriptors = &descriptor_info;
1766
1767 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1768
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001769 msgFlags = m_errorMonitor->GetState(&msgString);
1770 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 -06001771 if (!strstr(msgString.c_str(),"Unexpected UPDATE struct of type ")) {
1772 FAIL() << "Error received was not 'Unexpected UPDATE struct of type '";
1773 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001774}
1775
1776TEST_F(VkLayerTest, NumSamplesMismatch)
1777{
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001778 // Create CmdBuffer where MSAA samples doesn't match RenderPass sampleCount
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001779 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001780 std::string msgString;
1781 VkResult err;
1782
1783 ASSERT_NO_FATAL_FAILURE(InitState());
1784 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1785 m_errorMonitor->ClearState();
1786 VkCommandBufferObj cmdBuffer(m_device);
1787 const VkDescriptorTypeCount ds_type_count = {
1788 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1789 .count = 1,
1790 };
1791 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1792 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1793 .pNext = NULL,
1794 .count = 1,
1795 .pTypeCount = &ds_type_count,
1796 };
1797 VkDescriptorPool ds_pool;
1798 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1799 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001800
1801 const VkDescriptorSetLayoutBinding dsl_binding = {
1802 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001803 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001804 .stageFlags = VK_SHADER_STAGE_ALL,
1805 .pImmutableSamplers = NULL,
1806 };
1807
1808 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1809 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1810 .pNext = NULL,
1811 .count = 1,
1812 .pBinding = &dsl_binding,
1813 };
1814 VkDescriptorSetLayout ds_layout;
1815 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1816 ASSERT_VK_SUCCESS(err);
1817
1818 VkDescriptorSet descriptorSet;
1819 uint32_t ds_count = 0;
1820 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1821 ASSERT_VK_SUCCESS(err);
1822
1823 const VkPipelineMsStateCreateInfo pipe_ms_state_ci = {
1824 .sType = VK_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO,
1825 .pNext = NULL,
Tony Barboure094edf2015-06-26 10:18:34 -06001826 .rasterSamples = 4,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001827 .multisampleEnable = 1,
1828 .sampleShadingEnable = 0,
1829 .minSampleShading = 1.0,
1830 .sampleMask = 15,
1831 };
1832
1833 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1834 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1835 .pNext = NULL,
1836 .descriptorSetCount = 1,
1837 .pSetLayouts = &ds_layout,
1838 };
1839
1840 VkPipelineLayout pipeline_layout;
1841 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1842 ASSERT_VK_SUCCESS(err);
1843
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06001844 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001845
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001846 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1847 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1848 .pNext = NULL,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001849 .stage = VK_SHADER_STAGE_VERTEX,
Chia-I Wub48eddb2015-07-03 11:49:42 +08001850 .shader = vs.handle(),
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001851 .linkConstBufferCount = 0,
1852 .pLinkConstBufferInfo = NULL,
1853 .pSpecializationInfo = NULL,
1854 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001855 const VkGraphicsPipelineCreateInfo gp_ci = {
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001856 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1857 .pNext = NULL,
1858 .stageCount = 1,
1859 .pStages = &pipe_vs_ci,
1860 .pVertexInputState = NULL,
1861 .pIaState = NULL,
1862 .pTessState = NULL,
1863 .pVpState = NULL,
1864 .pRsState = NULL,
1865 .pMsState = &pipe_ms_state_ci,
1866 .pDsState = NULL,
1867 .pCbState = NULL,
1868 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1869 .layout = pipeline_layout,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001870 };
Jon Ashburn0d60d272015-07-09 15:02:25 -06001871 const VkPipelineCacheCreateInfo pc_ci = {
1872 .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
1873 .pNext = NULL,
1874 .initialSize = 0,
1875 .initialData = 0,
1876 .maxSize = 0,
1877 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001878
1879 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06001880 VkPipelineCache pipelineCache;
1881
1882 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
1883 ASSERT_VK_SUCCESS(err);
1884 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001885 ASSERT_VK_SUCCESS(err);
1886
1887 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1888 BeginCommandBuffer(cmdBuffer);
1889 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1890
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001891 msgFlags = m_errorMonitor->GetState(&msgString);
1892 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 -06001893 if (!strstr(msgString.c_str(),"Num samples mismatch! ")) {
1894 FAIL() << "Error received was not 'Num samples mismatch!...'";
1895 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001896}
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06001897
Tobin Ehlise4076782015-06-24 15:53:07 -06001898TEST_F(VkLayerTest, PipelineNotBound)
1899{
1900 VkFlags msgFlags;
1901 std::string msgString;
1902 VkResult err;
1903
1904 ASSERT_NO_FATAL_FAILURE(InitState());
1905 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1906 m_errorMonitor->ClearState();
1907 VkCommandBufferObj cmdBuffer(m_device);
1908 const VkDescriptorTypeCount ds_type_count = {
1909 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1910 .count = 1,
1911 };
1912 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1913 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1914 .pNext = NULL,
1915 .count = 1,
1916 .pTypeCount = &ds_type_count,
1917 };
1918 VkDescriptorPool ds_pool;
1919 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1920 ASSERT_VK_SUCCESS(err);
1921
1922 const VkDescriptorSetLayoutBinding dsl_binding = {
1923 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1924 .arraySize = 1,
1925 .stageFlags = VK_SHADER_STAGE_ALL,
1926 .pImmutableSamplers = NULL,
1927 };
1928
1929 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1930 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1931 .pNext = NULL,
1932 .count = 1,
1933 .pBinding = &dsl_binding,
1934 };
1935 VkDescriptorSetLayout ds_layout;
1936 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1937 ASSERT_VK_SUCCESS(err);
1938
1939 VkDescriptorSet descriptorSet;
1940 uint32_t ds_count = 0;
1941 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1942 ASSERT_VK_SUCCESS(err);
1943
1944 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1945 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1946 .pNext = NULL,
1947 .descriptorSetCount = 1,
1948 .pSetLayouts = &ds_layout,
1949 };
1950
1951 VkPipelineLayout pipeline_layout;
1952 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1953 ASSERT_VK_SUCCESS(err);
1954
Tobin Ehlise4076782015-06-24 15:53:07 -06001955 VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
1956 //err = vkCreateGraphicsPipeline(m_device->device(), &gp_ci, &pipeline);
1957 ASSERT_VK_SUCCESS(err);
1958
1959 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1960 BeginCommandBuffer(cmdBuffer);
1961 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
1962
1963 msgFlags = m_errorMonitor->GetState(&msgString);
1964 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding invalid pipeline to CmdBuffer";
1965 if (!strstr(msgString.c_str(),"Attempt to bind Pipeline ")) {
1966 FAIL() << "Error received was not 'Attempt to bind Pipeline 0xbaadb1be that doesn't exist!'";
1967 }
1968}
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06001969
1970TEST_F(VkLayerTest, ClearCmdNoDraw)
1971{
1972 // Create CmdBuffer where we add ClearCmd for FB Color attachment prior to issuing a Draw
1973 VkFlags msgFlags;
1974 std::string msgString;
1975 VkResult err;
1976
1977 ASSERT_NO_FATAL_FAILURE(InitState());
1978 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1979 m_errorMonitor->ClearState();
1980 VkCommandBufferObj cmdBuffer(m_device);
1981 const VkDescriptorTypeCount ds_type_count = {
1982 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1983 .count = 1,
1984 };
1985 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1986 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1987 .pNext = NULL,
1988 .count = 1,
1989 .pTypeCount = &ds_type_count,
1990 };
1991 VkDescriptorPool ds_pool;
1992 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1993 ASSERT_VK_SUCCESS(err);
1994
1995 const VkDescriptorSetLayoutBinding dsl_binding = {
1996 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1997 .arraySize = 1,
1998 .stageFlags = VK_SHADER_STAGE_ALL,
1999 .pImmutableSamplers = NULL,
2000 };
2001
2002 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
2003 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
2004 .pNext = NULL,
2005 .count = 1,
2006 .pBinding = &dsl_binding,
2007 };
2008 VkDescriptorSetLayout ds_layout;
2009 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
2010 ASSERT_VK_SUCCESS(err);
2011
2012 VkDescriptorSet descriptorSet;
2013 uint32_t ds_count = 0;
2014 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
2015 ASSERT_VK_SUCCESS(err);
2016
2017 const VkPipelineMsStateCreateInfo pipe_ms_state_ci = {
2018 .sType = VK_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO,
2019 .pNext = NULL,
2020 .rasterSamples = 4,
2021 .multisampleEnable = 1,
2022 .sampleShadingEnable = 0,
2023 .minSampleShading = 1.0,
2024 .sampleMask = 15,
2025 };
2026
2027 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
2028 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
2029 .pNext = NULL,
2030 .descriptorSetCount = 1,
2031 .pSetLayouts = &ds_layout,
2032 };
2033
2034 VkPipelineLayout pipeline_layout;
2035 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
2036 ASSERT_VK_SUCCESS(err);
2037
2038 size_t shader_len = strlen(bindStateVertShaderText);
2039 size_t codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
2040 void* pCode = malloc(codeSize);
2041
2042 /* try version 0 first: VkShaderStage followed by GLSL */
2043 ((uint32_t *) pCode)[0] = ICD_SPV_MAGIC;
2044 ((uint32_t *) pCode)[1] = 0;
2045 ((uint32_t *) pCode)[2] = VK_SHADER_STAGE_VERTEX;
2046 memcpy(((uint32_t *) pCode + 3), bindStateVertShaderText, shader_len + 1);
2047
2048 const VkShaderModuleCreateInfo smci = {
2049 .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
2050 .pNext = NULL,
2051 .codeSize = codeSize,
2052 .pCode = pCode,
2053 .flags = 0,
2054 };
2055 VkShaderModule vksm;
2056 err = vkCreateShaderModule(m_device->device(), &smci, &vksm);
2057 ASSERT_VK_SUCCESS(err);
2058 const VkShaderCreateInfo vs_ci = {
2059 .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
2060 .pNext = NULL,
2061 .module = vksm,
2062 .pName = "main",
2063 .flags = 0,
2064 };
2065 VkShader vs;
2066 err = vkCreateShader(m_device->device(), &vs_ci, &vs);
2067 ASSERT_VK_SUCCESS(err);
2068
2069 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
2070 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
2071 .pNext = NULL,
2072 .stage = VK_SHADER_STAGE_VERTEX,
2073 .shader = vs,
2074 .linkConstBufferCount = 0,
2075 .pLinkConstBufferInfo = NULL,
2076 .pSpecializationInfo = NULL,
2077 };
2078 const VkGraphicsPipelineCreateInfo gp_ci = {
2079 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
2080 .pNext = NULL,
2081 .stageCount = 1,
2082 .pStages = &pipe_vs_ci,
2083 .pVertexInputState = NULL,
2084 .pIaState = NULL,
2085 .pTessState = NULL,
2086 .pVpState = NULL,
2087 .pRsState = NULL,
2088 .pMsState = &pipe_ms_state_ci,
2089 .pDsState = NULL,
2090 .pCbState = NULL,
2091 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
2092 .layout = pipeline_layout,
2093 };
Jon Ashburn0d60d272015-07-09 15:02:25 -06002094 const VkPipelineCacheCreateInfo pc_ci = {
2095 .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
2096 .pNext = NULL,
2097 .initialSize = 0,
2098 .initialData = 0,
2099 .maxSize = 0,
2100 };
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06002101
2102 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06002103 VkPipelineCache pipelineCache;
2104
2105 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
2106 ASSERT_VK_SUCCESS(err);
2107 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06002108 ASSERT_VK_SUCCESS(err);
2109
2110 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
2111 BeginCommandBuffer(cmdBuffer);
2112
2113 m_errorMonitor->ClearState();
2114 // Main thing we care about for this test is that the VkImage obj we're clearing matches Color Attachment of FB
2115 // Also pass down other dummy params to keep driver and paramchecker happy
2116 VkClearColorValue cCV;
2117 cCV.f32[0] = 1.0;
2118 cCV.f32[1] = 1.0;
2119 cCV.f32[2] = 1.0;
2120 cCV.f32[3] = 1.0;
2121
2122 vkCmdClearColorAttachment(cmdBuffer.GetBufferHandle(), 0, (VkImageLayout)NULL, &cCV, 0, NULL);
2123 msgFlags = m_errorMonitor->GetState(&msgString);
2124 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT) << "Did not receive error after issuing Clear Cmd on FB color attachment prior to Draw Cmd.";
2125 if (!strstr(msgString.c_str(),"vkCmdClearColorAttachment() issued on CB object ")) {
2126 FAIL() << "Error received was not 'vkCmdClearColorAttachment() issued on CB object...'";
2127 }
2128}
2129
Tobin Ehlise4076782015-06-24 15:53:07 -06002130TEST_F(VkLayerTest, VtxBufferBadIndex)
2131{
2132 // Create CmdBuffer where MSAA samples doesn't match RenderPass sampleCount
2133 VkFlags msgFlags;
2134 std::string msgString;
2135 VkResult err;
2136
2137 ASSERT_NO_FATAL_FAILURE(InitState());
2138 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2139 m_errorMonitor->ClearState();
2140 VkCommandBufferObj cmdBuffer(m_device);
2141 const VkDescriptorTypeCount ds_type_count = {
2142 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
2143 .count = 1,
2144 };
2145 const VkDescriptorPoolCreateInfo ds_pool_ci = {
2146 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
2147 .pNext = NULL,
2148 .count = 1,
2149 .pTypeCount = &ds_type_count,
2150 };
2151 VkDescriptorPool ds_pool;
2152 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
2153 ASSERT_VK_SUCCESS(err);
2154
2155 const VkDescriptorSetLayoutBinding dsl_binding = {
2156 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
2157 .arraySize = 1,
2158 .stageFlags = VK_SHADER_STAGE_ALL,
2159 .pImmutableSamplers = NULL,
2160 };
2161
2162 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
2163 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
2164 .pNext = NULL,
2165 .count = 1,
2166 .pBinding = &dsl_binding,
2167 };
2168 VkDescriptorSetLayout ds_layout;
2169 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
2170 ASSERT_VK_SUCCESS(err);
2171
2172 VkDescriptorSet descriptorSet;
2173 uint32_t ds_count = 0;
2174 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
2175 ASSERT_VK_SUCCESS(err);
2176
2177 const VkPipelineMsStateCreateInfo pipe_ms_state_ci = {
2178 .sType = VK_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO,
2179 .pNext = NULL,
Tony Barboure094edf2015-06-26 10:18:34 -06002180 .rasterSamples = 1,
Tobin Ehlise4076782015-06-24 15:53:07 -06002181 .multisampleEnable = 1,
2182 .sampleShadingEnable = 0,
2183 .minSampleShading = 1.0,
2184 .sampleMask = 15,
2185 };
2186
2187 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
2188 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
2189 .pNext = NULL,
2190 .descriptorSetCount = 1,
2191 .pSetLayouts = &ds_layout,
2192 };
2193
2194 VkPipelineLayout pipeline_layout;
2195 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
2196 ASSERT_VK_SUCCESS(err);
2197
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06002198 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
Tobin Ehlise4076782015-06-24 15:53:07 -06002199
2200 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
2201 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
2202 .pNext = NULL,
2203 .stage = VK_SHADER_STAGE_VERTEX,
Chia-I Wub48eddb2015-07-03 11:49:42 +08002204 .shader = vs.handle(),
Tobin Ehlise4076782015-06-24 15:53:07 -06002205 .linkConstBufferCount = 0,
2206 .pLinkConstBufferInfo = NULL,
2207 .pSpecializationInfo = NULL,
2208 };
2209 const VkGraphicsPipelineCreateInfo gp_ci = {
2210 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
2211 .pNext = NULL,
2212 .stageCount = 1,
2213 .pStages = &pipe_vs_ci,
2214 .pVertexInputState = NULL,
2215 .pIaState = NULL,
2216 .pTessState = NULL,
2217 .pVpState = NULL,
2218 .pRsState = NULL,
2219 .pMsState = &pipe_ms_state_ci,
2220 .pDsState = NULL,
2221 .pCbState = NULL,
2222 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
2223 .layout = pipeline_layout,
2224 };
2225
Courtney Goeltzenleuchtercdf5e832015-07-10 09:21:02 -06002226 VkPipelineCacheCreateInfo pipelineCache;
2227 VkPipelineCache pipeline_cache;
2228
2229 memset(&pipelineCache, 0, sizeof(pipelineCache));
2230 pipelineCache.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2231 err = vkCreatePipelineCache(m_device->device(), &pipelineCache, &pipeline_cache);
2232
Tobin Ehlise4076782015-06-24 15:53:07 -06002233 VkPipeline pipeline;
Courtney Goeltzenleuchtercdf5e832015-07-10 09:21:02 -06002234 err = vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &gp_ci, &pipeline);
Tobin Ehlise4076782015-06-24 15:53:07 -06002235 ASSERT_VK_SUCCESS(err);
2236
2237 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
2238 BeginCommandBuffer(cmdBuffer);
2239 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2240 // Should error before calling to driver so don't care about actual data
2241 vkCmdBindVertexBuffers(cmdBuffer.GetBufferHandle(), 0, 1, NULL, NULL);
2242
2243 msgFlags = m_errorMonitor->GetState(&msgString);
2244 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding Vtx Buffer w/o VBO attached to PSO.";
2245 if (!strstr(msgString.c_str(),"Vtx Buffer Index 0 was bound, but no vtx buffers are attached to PSO.")) {
2246 FAIL() << "Error received was not 'Vtx Buffer Index 0 was bound, but no vtx buffers are attached to PSO.'";
2247 }
2248}
Tobin Ehlis57e6a612015-05-26 16:11:58 -06002249#endif
2250#if THREADING_TESTS
Mike Stroyan09aae812015-05-12 16:00:45 -06002251#if GTEST_IS_THREADSAFE
2252struct thread_data_struct {
2253 VkCmdBuffer cmdBuffer;
2254 VkEvent event;
2255 bool bailout;
2256};
2257
2258extern "C" void *AddToCommandBuffer(void *arg)
2259{
2260 struct thread_data_struct *data = (struct thread_data_struct *) arg;
2261 std::string msgString;
2262
2263 for (int i = 0; i<10000; i++) {
Tony Barbourc2e987e2015-06-29 16:20:35 -06002264 vkCmdSetEvent(data->cmdBuffer, data->event, VK_PIPELINE_STAGE_ALL_GPU_COMMANDS);
Mike Stroyan09aae812015-05-12 16:00:45 -06002265 if (data->bailout) {
2266 break;
2267 }
2268 }
2269 return NULL;
2270}
2271
2272TEST_F(VkLayerTest, ThreadCmdBufferCollision)
2273{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002274 VkFlags msgFlags;
Mike Stroyan09aae812015-05-12 16:00:45 -06002275 std::string msgString;
2276 pthread_t thread;
2277 pthread_attr_t thread_attr;
2278
2279 ASSERT_NO_FATAL_FAILURE(InitState());
2280 ASSERT_NO_FATAL_FAILURE(InitViewport());
2281 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2282
2283 VkCommandBufferObj cmdBuffer(m_device);
2284
2285 m_errorMonitor->ClearState();
2286 pthread_attr_init(&thread_attr);
2287 BeginCommandBuffer(cmdBuffer);
2288
2289 VkEventCreateInfo event_info;
2290 VkEvent event;
2291 VkMemoryRequirements mem_req;
Mike Stroyan09aae812015-05-12 16:00:45 -06002292 VkResult err;
2293
2294 memset(&event_info, 0, sizeof(event_info));
2295 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
2296
2297 err = vkCreateEvent(device(), &event_info, &event);
2298 ASSERT_VK_SUCCESS(err);
2299
Tony Barbour426b9052015-06-24 16:06:58 -06002300 err = vkGetObjectMemoryRequirements(device(), VK_OBJECT_TYPE_EVENT, event, &mem_req);
Mike Stroyan09aae812015-05-12 16:00:45 -06002301 ASSERT_VK_SUCCESS(err);
2302
2303 VkMemoryAllocInfo mem_info;
2304 VkDeviceMemory event_mem;
2305
Mike Stroyan09aae812015-05-12 16:00:45 -06002306 memset(&mem_info, 0, sizeof(mem_info));
2307 mem_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
2308 mem_info.allocationSize = mem_req.size;
Mark Lobodzinski72346292015-07-02 16:49:40 -06002309 mem_info.memoryTypeIndex = 0;
2310
Chia-I Wuf5fb1092015-07-03 10:32:05 +08002311 err = m_device->phy().set_memory_type(mem_req.memoryTypeBits, &mem_info, 0);
Mark Lobodzinski72346292015-07-02 16:49:40 -06002312 ASSERT_VK_SUCCESS(err);
2313
Mike Stroyan09aae812015-05-12 16:00:45 -06002314 err = vkAllocMemory(device(), &mem_info, &event_mem);
2315 ASSERT_VK_SUCCESS(err);
2316
Mark Lobodzinski23182612015-05-29 09:32:35 -05002317 err = vkBindObjectMemory(device(), VK_OBJECT_TYPE_EVENT, event, event_mem, 0);
Mike Stroyan09aae812015-05-12 16:00:45 -06002318 ASSERT_VK_SUCCESS(err);
2319
2320 err = vkResetEvent(device(), event);
2321 ASSERT_VK_SUCCESS(err);
2322
2323 struct thread_data_struct data;
Chia-I Wu78c2a352015-07-03 11:49:42 +08002324 data.cmdBuffer = cmdBuffer.handle();
Mike Stroyan09aae812015-05-12 16:00:45 -06002325 data.event = event;
2326 data.bailout = false;
2327 m_errorMonitor->SetBailout(&data.bailout);
2328 // Add many entries to command buffer from another thread.
2329 pthread_create(&thread, &thread_attr, AddToCommandBuffer, (void *)&data);
2330 // Add many entries to command buffer from this thread at the same time.
2331 AddToCommandBuffer(&data);
2332 pthread_join(thread, NULL);
2333 EndCommandBuffer(cmdBuffer);
2334
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002335 msgFlags = m_errorMonitor->GetState(&msgString);
Mike Stroyaned254572015-06-17 16:32:06 -06002336 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 -06002337 if (!strstr(msgString.c_str(),"THREADING ERROR")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -05002338 FAIL() << "Error received was not 'THREADING ERROR'";
Mike Stroyan09aae812015-05-12 16:00:45 -06002339 }
2340
2341}
2342#endif
Tobin Ehlis57e6a612015-05-26 16:11:58 -06002343#endif
Chris Forbes5af3bf22015-05-25 11:13:08 +12002344#if SHADER_CHECKER_TESTS
2345TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed)
2346{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002347 VkFlags msgFlags;
Chris Forbes5af3bf22015-05-25 11:13:08 +12002348 std::string msgString;
2349 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002350 ScopedUseGlsl useGlsl(false);
Chris Forbes5af3bf22015-05-25 11:13:08 +12002351
2352 char const *vsSource =
2353 "#version 140\n"
2354 "#extension GL_ARB_separate_shader_objects: require\n"
2355 "#extension GL_ARB_shading_language_420pack: require\n"
2356 "\n"
2357 "layout(location=0) out float x;\n"
2358 "void main(){\n"
2359 " gl_Position = vec4(1);\n"
2360 " x = 0;\n"
2361 "}\n";
2362 char const *fsSource =
2363 "#version 140\n"
2364 "#extension GL_ARB_separate_shader_objects: require\n"
2365 "#extension GL_ARB_shading_language_420pack: require\n"
2366 "\n"
2367 "layout(location=0) out vec4 color;\n"
2368 "void main(){\n"
2369 " color = vec4(1);\n"
2370 "}\n";
2371
2372 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2373 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2374
2375 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002376 pipe.AddColorAttachment();
Chris Forbes5af3bf22015-05-25 11:13:08 +12002377 pipe.AddShader(&vs);
2378 pipe.AddShader(&fs);
2379
2380 VkCommandBufferObj dummyCmd(m_device);
2381 VkDescriptorSetObj descriptorSet(m_device);
2382 descriptorSet.AppendDummy();
2383 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2384
2385 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002386 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes5af3bf22015-05-25 11:13:08 +12002387
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002388 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes5af3bf22015-05-25 11:13:08 +12002389
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002390 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes5af3bf22015-05-25 11:13:08 +12002391 if (!strstr(msgString.c_str(),"not consumed by fragment shader")) {
2392 FAIL() << "Incorrect warning: " << msgString;
2393 }
2394}
Chris Forbes5af3bf22015-05-25 11:13:08 +12002395
Chris Forbes3c10b852015-05-25 11:13:13 +12002396TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided)
2397{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002398 VkFlags msgFlags;
Chris Forbes3c10b852015-05-25 11:13:13 +12002399 std::string msgString;
2400 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002401 ScopedUseGlsl useGlsl(false);
Chris Forbes3c10b852015-05-25 11:13:13 +12002402
2403 char const *vsSource =
2404 "#version 140\n"
2405 "#extension GL_ARB_separate_shader_objects: require\n"
2406 "#extension GL_ARB_shading_language_420pack: require\n"
2407 "\n"
2408 "void main(){\n"
2409 " gl_Position = vec4(1);\n"
2410 "}\n";
2411 char const *fsSource =
2412 "#version 140\n"
2413 "#extension GL_ARB_separate_shader_objects: require\n"
2414 "#extension GL_ARB_shading_language_420pack: require\n"
2415 "\n"
2416 "layout(location=0) in float x;\n"
2417 "layout(location=0) out vec4 color;\n"
2418 "void main(){\n"
2419 " color = vec4(x);\n"
2420 "}\n";
2421
2422 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2423 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2424
2425 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002426 pipe.AddColorAttachment();
Chris Forbes3c10b852015-05-25 11:13:13 +12002427 pipe.AddShader(&vs);
2428 pipe.AddShader(&fs);
2429
2430 VkCommandBufferObj dummyCmd(m_device);
2431 VkDescriptorSetObj descriptorSet(m_device);
2432 descriptorSet.AppendDummy();
2433 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2434
2435 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002436 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes3c10b852015-05-25 11:13:13 +12002437
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002438 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes3c10b852015-05-25 11:13:13 +12002439
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002440 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes3c10b852015-05-25 11:13:13 +12002441 if (!strstr(msgString.c_str(),"not written by vertex shader")) {
2442 FAIL() << "Incorrect error: " << msgString;
2443 }
2444}
2445
Chris Forbescc281692015-05-25 11:13:17 +12002446TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch)
2447{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002448 VkFlags msgFlags;
Chris Forbescc281692015-05-25 11:13:17 +12002449 std::string msgString;
2450 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002451 ScopedUseGlsl useGlsl(false);
Chris Forbescc281692015-05-25 11:13:17 +12002452
2453 char const *vsSource =
2454 "#version 140\n"
2455 "#extension GL_ARB_separate_shader_objects: require\n"
2456 "#extension GL_ARB_shading_language_420pack: require\n"
2457 "\n"
2458 "layout(location=0) out int x;\n"
2459 "void main(){\n"
2460 " x = 0;\n"
2461 " gl_Position = vec4(1);\n"
2462 "}\n";
2463 char const *fsSource =
2464 "#version 140\n"
2465 "#extension GL_ARB_separate_shader_objects: require\n"
2466 "#extension GL_ARB_shading_language_420pack: require\n"
2467 "\n"
2468 "layout(location=0) in float x;\n" /* VS writes int */
2469 "layout(location=0) out vec4 color;\n"
2470 "void main(){\n"
2471 " color = vec4(x);\n"
2472 "}\n";
2473
2474 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2475 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2476
2477 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002478 pipe.AddColorAttachment();
Chris Forbescc281692015-05-25 11:13:17 +12002479 pipe.AddShader(&vs);
2480 pipe.AddShader(&fs);
2481
2482 VkCommandBufferObj dummyCmd(m_device);
2483 VkDescriptorSetObj descriptorSet(m_device);
2484 descriptorSet.AppendDummy();
2485 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2486
2487 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002488 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbescc281692015-05-25 11:13:17 +12002489
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002490 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbescc281692015-05-25 11:13:17 +12002491
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002492 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbescc281692015-05-25 11:13:17 +12002493 if (!strstr(msgString.c_str(),"Type mismatch on location 0")) {
2494 FAIL() << "Incorrect error: " << msgString;
2495 }
2496}
2497
Chris Forbes8291c052015-05-25 11:13:28 +12002498TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed)
2499{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002500 VkFlags msgFlags;
Chris Forbes8291c052015-05-25 11:13:28 +12002501 std::string msgString;
2502 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002503 ScopedUseGlsl useGlsl(false);
Chris Forbes8291c052015-05-25 11:13:28 +12002504
2505 VkVertexInputBindingDescription input_binding;
2506 memset(&input_binding, 0, sizeof(input_binding));
2507
2508 VkVertexInputAttributeDescription input_attrib;
2509 memset(&input_attrib, 0, sizeof(input_attrib));
2510 input_attrib.format = VK_FORMAT_R32_SFLOAT;
2511
2512 char const *vsSource =
2513 "#version 140\n"
2514 "#extension GL_ARB_separate_shader_objects: require\n"
2515 "#extension GL_ARB_shading_language_420pack: require\n"
2516 "\n"
2517 "void main(){\n"
2518 " gl_Position = vec4(1);\n"
2519 "}\n";
2520 char const *fsSource =
2521 "#version 140\n"
2522 "#extension GL_ARB_separate_shader_objects: require\n"
2523 "#extension GL_ARB_shading_language_420pack: require\n"
2524 "\n"
2525 "layout(location=0) out vec4 color;\n"
2526 "void main(){\n"
2527 " color = vec4(1);\n"
2528 "}\n";
2529
2530 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2531 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2532
2533 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002534 pipe.AddColorAttachment();
Chris Forbes8291c052015-05-25 11:13:28 +12002535 pipe.AddShader(&vs);
2536 pipe.AddShader(&fs);
2537
2538 pipe.AddVertexInputBindings(&input_binding, 1);
2539 pipe.AddVertexInputAttribs(&input_attrib, 1);
2540
2541 VkCommandBufferObj dummyCmd(m_device);
2542 VkDescriptorSetObj descriptorSet(m_device);
2543 descriptorSet.AppendDummy();
2544 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2545
2546 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002547 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes8291c052015-05-25 11:13:28 +12002548
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002549 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes8291c052015-05-25 11:13:28 +12002550
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002551 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes8291c052015-05-25 11:13:28 +12002552 if (!strstr(msgString.c_str(),"location 0 not consumed by VS")) {
2553 FAIL() << "Incorrect warning: " << msgString;
2554 }
2555}
2556
Chris Forbes37367e62015-05-25 11:13:29 +12002557TEST_F(VkLayerTest, CreatePipelineAttribNotProvided)
2558{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002559 VkFlags msgFlags;
Chris Forbes37367e62015-05-25 11:13:29 +12002560 std::string msgString;
2561 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002562 ScopedUseGlsl useGlsl(false);
Chris Forbes37367e62015-05-25 11:13:29 +12002563
2564 char const *vsSource =
2565 "#version 140\n"
2566 "#extension GL_ARB_separate_shader_objects: require\n"
2567 "#extension GL_ARB_shading_language_420pack: require\n"
2568 "\n"
2569 "layout(location=0) in vec4 x;\n" /* not provided */
2570 "void main(){\n"
2571 " gl_Position = x;\n"
2572 "}\n";
2573 char const *fsSource =
2574 "#version 140\n"
2575 "#extension GL_ARB_separate_shader_objects: require\n"
2576 "#extension GL_ARB_shading_language_420pack: require\n"
2577 "\n"
2578 "layout(location=0) out vec4 color;\n"
2579 "void main(){\n"
2580 " color = vec4(1);\n"
2581 "}\n";
2582
2583 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2584 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2585
2586 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002587 pipe.AddColorAttachment();
Chris Forbes37367e62015-05-25 11:13:29 +12002588 pipe.AddShader(&vs);
2589 pipe.AddShader(&fs);
2590
2591 VkCommandBufferObj dummyCmd(m_device);
2592 VkDescriptorSetObj descriptorSet(m_device);
2593 descriptorSet.AppendDummy();
2594 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2595
2596 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002597 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes37367e62015-05-25 11:13:29 +12002598
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002599 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes37367e62015-05-25 11:13:29 +12002600
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002601 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes37367e62015-05-25 11:13:29 +12002602 if (!strstr(msgString.c_str(),"VS consumes input at location 0 but not provided")) {
2603 FAIL() << "Incorrect warning: " << msgString;
2604 }
2605}
2606
Chris Forbesa4b02322015-05-25 11:13:31 +12002607TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch)
2608{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002609 VkFlags msgFlags;
Chris Forbesa4b02322015-05-25 11:13:31 +12002610 std::string msgString;
2611 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002612 ScopedUseGlsl useGlsl(false);
Chris Forbesa4b02322015-05-25 11:13:31 +12002613
2614 VkVertexInputBindingDescription input_binding;
2615 memset(&input_binding, 0, sizeof(input_binding));
2616
2617 VkVertexInputAttributeDescription input_attrib;
2618 memset(&input_attrib, 0, sizeof(input_attrib));
2619 input_attrib.format = VK_FORMAT_R32_SFLOAT;
2620
2621 char const *vsSource =
2622 "#version 140\n"
2623 "#extension GL_ARB_separate_shader_objects: require\n"
2624 "#extension GL_ARB_shading_language_420pack: require\n"
2625 "\n"
2626 "layout(location=0) in int x;\n" /* attrib provided float */
2627 "void main(){\n"
2628 " gl_Position = vec4(x);\n"
2629 "}\n";
2630 char const *fsSource =
2631 "#version 140\n"
2632 "#extension GL_ARB_separate_shader_objects: require\n"
2633 "#extension GL_ARB_shading_language_420pack: require\n"
2634 "\n"
2635 "layout(location=0) out vec4 color;\n"
2636 "void main(){\n"
2637 " color = vec4(1);\n"
2638 "}\n";
2639
2640 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2641 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2642
2643 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002644 pipe.AddColorAttachment();
Chris Forbesa4b02322015-05-25 11:13:31 +12002645 pipe.AddShader(&vs);
2646 pipe.AddShader(&fs);
2647
2648 pipe.AddVertexInputBindings(&input_binding, 1);
2649 pipe.AddVertexInputAttribs(&input_attrib, 1);
2650
2651 VkCommandBufferObj dummyCmd(m_device);
2652 VkDescriptorSetObj descriptorSet(m_device);
2653 descriptorSet.AppendDummy();
2654 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2655
2656 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002657 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbesa4b02322015-05-25 11:13:31 +12002658
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002659 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbesa4b02322015-05-25 11:13:31 +12002660
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002661 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbesa4b02322015-05-25 11:13:31 +12002662 if (!strstr(msgString.c_str(),"location 0 does not match VS input type")) {
2663 FAIL() << "Incorrect error: " << msgString;
2664 }
2665}
2666
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002667TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict)
2668{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002669 VkFlags msgFlags;
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002670 std::string msgString;
2671 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002672 ScopedUseGlsl useGlsl(false);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002673
2674 /* Two binding descriptions for binding 0 */
2675 VkVertexInputBindingDescription input_bindings[2];
2676 memset(input_bindings, 0, sizeof(input_bindings));
2677
2678 VkVertexInputAttributeDescription input_attrib;
2679 memset(&input_attrib, 0, sizeof(input_attrib));
2680 input_attrib.format = VK_FORMAT_R32_SFLOAT;
2681
2682 char const *vsSource =
2683 "#version 140\n"
2684 "#extension GL_ARB_separate_shader_objects: require\n"
2685 "#extension GL_ARB_shading_language_420pack: require\n"
2686 "\n"
2687 "layout(location=0) in float x;\n" /* attrib provided float */
2688 "void main(){\n"
2689 " gl_Position = vec4(x);\n"
2690 "}\n";
2691 char const *fsSource =
2692 "#version 140\n"
2693 "#extension GL_ARB_separate_shader_objects: require\n"
2694 "#extension GL_ARB_shading_language_420pack: require\n"
2695 "\n"
2696 "layout(location=0) out vec4 color;\n"
2697 "void main(){\n"
2698 " color = vec4(1);\n"
2699 "}\n";
2700
2701 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2702 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2703
2704 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002705 pipe.AddColorAttachment();
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002706 pipe.AddShader(&vs);
2707 pipe.AddShader(&fs);
2708
2709 pipe.AddVertexInputBindings(input_bindings, 2);
2710 pipe.AddVertexInputAttribs(&input_attrib, 1);
2711
2712 VkCommandBufferObj dummyCmd(m_device);
2713 VkDescriptorSetObj descriptorSet(m_device);
2714 descriptorSet.AppendDummy();
2715 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2716
2717 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002718 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002719
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002720 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002721
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002722 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002723 if (!strstr(msgString.c_str(),"Duplicate vertex input binding descriptions for binding 0")) {
2724 FAIL() << "Incorrect error: " << msgString;
2725 }
2726}
Chris Forbes4c948702015-05-25 11:13:32 +12002727
Chris Forbesc12ef122015-05-25 11:13:40 +12002728/* TODO: would be nice to test the mixed broadcast & custom case, but the GLSL->SPV compiler
2729 * rejects it. */
2730
2731TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten)
2732{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002733 VkFlags msgFlags;
Chris Forbesc12ef122015-05-25 11:13:40 +12002734 std::string msgString;
2735 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002736 ScopedUseGlsl useGlsl(false);
Chris Forbesc12ef122015-05-25 11:13:40 +12002737
2738 char const *vsSource =
2739 "#version 140\n"
2740 "#extension GL_ARB_separate_shader_objects: require\n"
2741 "#extension GL_ARB_shading_language_420pack: require\n"
2742 "\n"
2743 "void main(){\n"
2744 " gl_Position = vec4(1);\n"
2745 "}\n";
2746 char const *fsSource =
2747 "#version 140\n"
2748 "#extension GL_ARB_separate_shader_objects: require\n"
2749 "#extension GL_ARB_shading_language_420pack: require\n"
2750 "\n"
2751 "void main(){\n"
2752 "}\n";
2753
2754 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2755 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2756
2757 VkPipelineObj pipe(m_device);
2758 pipe.AddShader(&vs);
2759 pipe.AddShader(&fs);
2760
Chia-I Wuc278df82015-07-07 11:50:03 +08002761 /* set up CB 0, not written */
2762 pipe.AddColorAttachment();
2763 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc12ef122015-05-25 11:13:40 +12002764
2765 VkCommandBufferObj dummyCmd(m_device);
2766 VkDescriptorSetObj descriptorSet(m_device);
2767 descriptorSet.AppendDummy();
2768 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2769
2770 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002771 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbesc12ef122015-05-25 11:13:40 +12002772
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002773 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbesc12ef122015-05-25 11:13:40 +12002774
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002775 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbesc12ef122015-05-25 11:13:40 +12002776 if (!strstr(msgString.c_str(),"Attachment 0 not written by FS")) {
2777 FAIL() << "Incorrect error: " << msgString;
2778 }
2779}
2780
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002781TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed)
2782{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002783 VkFlags msgFlags;
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002784 std::string msgString;
2785 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002786 ScopedUseGlsl useGlsl(false);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002787
2788 char const *vsSource =
2789 "#version 140\n"
2790 "#extension GL_ARB_separate_shader_objects: require\n"
2791 "#extension GL_ARB_shading_language_420pack: require\n"
2792 "\n"
2793 "void main(){\n"
2794 " gl_Position = vec4(1);\n"
2795 "}\n";
2796 char const *fsSource =
2797 "#version 140\n"
2798 "#extension GL_ARB_separate_shader_objects: require\n"
2799 "#extension GL_ARB_shading_language_420pack: require\n"
2800 "\n"
2801 "layout(location=0) out vec4 x;\n"
2802 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
2803 "void main(){\n"
2804 " x = vec4(1);\n"
2805 " y = vec4(1);\n"
2806 "}\n";
2807
2808 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2809 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2810
2811 VkPipelineObj pipe(m_device);
2812 pipe.AddShader(&vs);
2813 pipe.AddShader(&fs);
2814
Chia-I Wuc278df82015-07-07 11:50:03 +08002815 /* set up CB 0, not written */
2816 pipe.AddColorAttachment();
2817 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002818 /* FS writes CB 1, but we don't configure it */
2819
2820 VkCommandBufferObj dummyCmd(m_device);
2821 VkDescriptorSetObj descriptorSet(m_device);
2822 descriptorSet.AppendDummy();
2823 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2824
2825 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002826 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002827
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002828 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002829
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002830 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002831 if (!strstr(msgString.c_str(),"FS writes to output location 1 with no matching attachment")) {
2832 FAIL() << "Incorrect warning: " << msgString;
2833 }
2834}
2835
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002836TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch)
2837{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002838 VkFlags msgFlags;
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002839 std::string msgString;
2840 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002841 ScopedUseGlsl useGlsl(false);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002842
2843 char const *vsSource =
2844 "#version 140\n"
2845 "#extension GL_ARB_separate_shader_objects: require\n"
2846 "#extension GL_ARB_shading_language_420pack: require\n"
2847 "\n"
2848 "void main(){\n"
2849 " gl_Position = vec4(1);\n"
2850 "}\n";
2851 char const *fsSource =
2852 "#version 140\n"
2853 "#extension GL_ARB_separate_shader_objects: require\n"
2854 "#extension GL_ARB_shading_language_420pack: require\n"
2855 "\n"
2856 "layout(location=0) out ivec4 x;\n" /* not UNORM */
2857 "void main(){\n"
2858 " x = ivec4(1);\n"
2859 "}\n";
2860
2861 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2862 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2863
2864 VkPipelineObj pipe(m_device);
2865 pipe.AddShader(&vs);
2866 pipe.AddShader(&fs);
2867
Chia-I Wuc278df82015-07-07 11:50:03 +08002868 /* set up CB 0; type is UNORM by default */
2869 pipe.AddColorAttachment();
2870 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002871
2872 VkCommandBufferObj dummyCmd(m_device);
2873 VkDescriptorSetObj descriptorSet(m_device);
2874 descriptorSet.AppendDummy();
2875 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2876
2877 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002878 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002879
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002880 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002881
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002882 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002883 if (!strstr(msgString.c_str(),"does not match FS output type")) {
2884 FAIL() << "Incorrect error: " << msgString;
2885 }
2886}
Chris Forbesc2050732015-06-05 14:43:36 +12002887
2888TEST_F(VkLayerTest, CreatePipelineNonSpirvShader)
2889{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002890 VkFlags msgFlags;
Chris Forbesc2050732015-06-05 14:43:36 +12002891 std::string msgString;
2892 ASSERT_NO_FATAL_FAILURE(InitState());
2893 /* Intentionally provided GLSL rather than compiling to SPIRV first */
Cody Northrop1cfbd172015-06-03 16:49:20 -06002894 ScopedUseGlsl useGlsl(true);
Chris Forbesc2050732015-06-05 14:43:36 +12002895
2896 char const *vsSource =
2897 "#version 140\n"
2898 "#extension GL_ARB_separate_shader_objects: require\n"
2899 "#extension GL_ARB_shading_language_420pack: require\n"
2900 "\n"
2901 "void main(){\n"
2902 " gl_Position = vec4(1);\n"
2903 "}\n";
2904 char const *fsSource =
2905 "#version 140\n"
2906 "#extension GL_ARB_separate_shader_objects: require\n"
2907 "#extension GL_ARB_shading_language_420pack: require\n"
2908 "\n"
2909 "layout(location=0) out vec4 x;\n"
2910 "void main(){\n"
2911 " x = vec4(1);\n"
2912 "}\n";
2913
2914 m_errorMonitor->ClearState();
2915
2916 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2917 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2918
2919
2920 VkPipelineObj pipe(m_device);
2921 pipe.AddShader(&vs);
2922 pipe.AddShader(&fs);
2923
Chia-I Wuc278df82015-07-07 11:50:03 +08002924 /* set up CB 0; type is UNORM by default */
2925 pipe.AddColorAttachment();
2926 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc2050732015-06-05 14:43:36 +12002927
2928 VkCommandBufferObj dummyCmd(m_device);
2929 VkDescriptorSetObj descriptorSet(m_device);
2930 descriptorSet.AppendDummy();
2931 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2932
Chia-I Wuc278df82015-07-07 11:50:03 +08002933 VkResult res = pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbesc2050732015-06-05 14:43:36 +12002934 /* pipeline creation should have succeeded */
2935 ASSERT_EQ(VK_SUCCESS, res);
2936
2937 /* should have emitted a warning: the shader is not SPIRV, so we're
2938 * not going to be able to analyze it */
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002939 msgFlags = m_errorMonitor->GetState(&msgString);
2940 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbesc2050732015-06-05 14:43:36 +12002941 if (!strstr(msgString.c_str(),"is not SPIR-V")) {
2942 FAIL() << "Incorrect warning: " << msgString;
2943 }
2944}
Chris Forbes01c9db72015-06-04 09:25:25 +12002945#endif
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002946
Tony Barbour30486ea2015-04-07 13:44:53 -06002947int main(int argc, char **argv) {
2948 int result;
2949
2950 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour01999182015-04-09 12:58:51 -06002951 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour30486ea2015-04-07 13:44:53 -06002952
2953 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
2954
2955 result = RUN_ALL_TESTS();
2956
Tony Barbour01999182015-04-09 12:58:51 -06002957 VkTestFramework::Finish();
Tony Barbour30486ea2015-04-07 13:44:53 -06002958 return result;
2959}