blob: 1c5633b760239948e85c8ea4ee766ee9b623e678 [file] [log] [blame]
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001#include <vulkan.h>
2#include <vkDbg.h>
Tony Barbour300a6082015-04-07 13:44:53 -06003#include "gtest-1.7.0/include/gtest/gtest.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06004#include "vkrenderframework.h"
Tony Barbour300a6082015-04-07 13:44:53 -06005
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06006void VKAPI myDbgFunc(
7 VK_DBG_MSG_TYPE msgType,
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06008 VkValidationLevel validationLevel,
Mike Stroyanb050c682015-04-17 12:36:38 -06009 VkObject srcObject,
Tony Barbour300a6082015-04-07 13:44:53 -060010 size_t location,
11 int32_t msgCode,
12 const char* pMsg,
13 void* pUserData);
14
15class ErrorMonitor {
16public:
Tony Barbour15524c32015-04-29 17:34:29 -060017 ErrorMonitor()
Tony Barbour300a6082015-04-07 13:44:53 -060018 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060019 m_msgType = VK_DBG_MSG_UNKNOWN;
Tony Barbour300a6082015-04-07 13:44:53 -060020 }
21 void ClearState()
22 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060023 m_msgType = VK_DBG_MSG_UNKNOWN;
Tony Barbour300a6082015-04-07 13:44:53 -060024 m_msgString.clear();
25 }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060026 VK_DBG_MSG_TYPE GetState(std::string *msgString)
Tony Barbour300a6082015-04-07 13:44:53 -060027 {
28 *msgString = m_msgString;
29 return m_msgType;
30 }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060031 void SetState(VK_DBG_MSG_TYPE msgType, const char *msgString)
Tony Barbour300a6082015-04-07 13:44:53 -060032 {
33 m_msgType = msgType;
Tony Barbour0b4d9562015-04-09 10:48:04 -060034 m_msgString.reserve(strlen(msgString));
35 m_msgString = msgString;
Tony Barbour300a6082015-04-07 13:44:53 -060036 }
37
38private:
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060039 VK_DBG_MSG_TYPE m_msgType;
Tony Barbour300a6082015-04-07 13:44:53 -060040 std::string m_msgString;
41
42};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060043void VKAPI myDbgFunc(
Mike Stroyanb050c682015-04-17 12:36:38 -060044 VK_DBG_MSG_TYPE msgType,
45 VkValidationLevel validationLevel,
46 VkObject srcObject,
Tony Barbour300a6082015-04-07 13:44:53 -060047 size_t location,
48 int32_t msgCode,
49 const char* pMsg,
50 void* pUserData)
51{
Tony Barbour0b4d9562015-04-09 10:48:04 -060052 if (msgType == VK_DBG_MSG_WARNING || msgType == VK_DBG_MSG_ERROR) {
53 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
54 errMonitor->SetState(msgType, pMsg);
55 }
Tony Barbour300a6082015-04-07 13:44:53 -060056}
Tony Barbour6918cd52015-04-09 12:58:51 -060057class VkLayerTest : public VkRenderFramework
Tony Barbour300a6082015-04-07 13:44:53 -060058{
59public:
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -060060 VkResult BeginCommandBuffer(VkCommandBufferObj &cmdBuffer);
61 VkResult EndCommandBuffer(VkCommandBufferObj &cmdBuffer);
Tony Barbour300a6082015-04-07 13:44:53 -060062
63protected:
Tony Barbour6918cd52015-04-09 12:58:51 -060064 VkMemoryRefManager m_memoryRefManager;
65 ErrorMonitor *m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -060066
67 virtual void SetUp() {
Tony Barbour9b9fe782015-04-23 15:28:27 -060068 const char *extension_names[] = {"MemTracker", "ObjectTracker"};
69 const std::vector<const char *> extensions(extension_names, extension_names + 2);
Tony Barbour3fdff9e2015-04-23 12:55:36 -060070
71 size_t extSize = sizeof(uint32_t);
72 uint32_t extCount = 0;
Tony Barbour9b9fe782015-04-23 15:28:27 -060073 VkResult U_ASSERT_ONLY err;
Tony Barbour3fdff9e2015-04-23 12:55:36 -060074 err = vkGetGlobalExtensionInfo(VK_EXTENSION_INFO_TYPE_COUNT, 0, &extSize, &extCount);
75 assert(!err);
76
77 VkExtensionProperties extProp;
78 extSize = sizeof(VkExtensionProperties);
79 bool32_t extFound;
80
Tony Barbour9b9fe782015-04-23 15:28:27 -060081 for (uint32_t i = 0; i < extensions.size(); i++) {
Tony Barbour3fdff9e2015-04-23 12:55:36 -060082 extFound = 0;
83 for (uint32_t j = 0; j < extCount; j++) {
84 err = vkGetGlobalExtensionInfo(VK_EXTENSION_INFO_TYPE_PROPERTIES, j, &extSize, &extProp);
Tony Barbour9b9fe782015-04-23 15:28:27 -060085 assert(!err);
86 if (!strcmp(extensions[i], extProp.extName)) {
Tony Barbour3fdff9e2015-04-23 12:55:36 -060087 extFound = 1;
88 break;
89 }
90 }
Tony Barbour9b9fe782015-04-23 15:28:27 -060091 ASSERT_EQ(extFound, 1) << "ERROR: Cannot find extension named " << extensions[i] << " which is necessary to pass this test";
Tony Barbour3fdff9e2015-04-23 12:55:36 -060092 }
Tony Barbour300a6082015-04-07 13:44:53 -060093
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060094 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -060095 this->app_info.pNext = NULL;
96 this->app_info.pAppName = "layer_tests";
97 this->app_info.appVersion = 1;
98 this->app_info.pEngineName = "unittest";
99 this->app_info.engineVersion = 1;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600100 this->app_info.apiVersion = VK_API_VERSION;
Tony Barbour300a6082015-04-07 13:44:53 -0600101
Tony Barbour15524c32015-04-29 17:34:29 -0600102 m_errorMonitor = new ErrorMonitor;
103 InitFramework(extensions, myDbgFunc, m_errorMonitor);
104
Tony Barbour300a6082015-04-07 13:44:53 -0600105 }
106
107 virtual void TearDown() {
108 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600109 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600110 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600111 }
112};
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600113VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &cmdBuffer)
Tony Barbour300a6082015-04-07 13:44:53 -0600114{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600115 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600116
117 result = cmdBuffer.BeginCommandBuffer();
118
119 /*
120 * For render test all drawing happens in a single render pass
121 * on a single command buffer.
122 */
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600123 if (VK_SUCCESS == result) {
Tony Barbour300a6082015-04-07 13:44:53 -0600124 cmdBuffer.BeginRenderPass(renderPass(), framebuffer());
125 }
126
127 return result;
128}
129
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600130VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &cmdBuffer)
Tony Barbour300a6082015-04-07 13:44:53 -0600131{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600132 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600133
134 cmdBuffer.EndRenderPass(renderPass());
135
136 result = cmdBuffer.EndCommandBuffer();
137
138 return result;
139}
140
Tony Barbour0b4d9562015-04-09 10:48:04 -0600141TEST_F(VkLayerTest, SubmitSignaledFence)
Tony Barbour300a6082015-04-07 13:44:53 -0600142{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600143 vk_testing::Fence testFence;
144 VK_DBG_MSG_TYPE msgType;
Tony Barbour300a6082015-04-07 13:44:53 -0600145 std::string msgString;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600146
147 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600148 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
149 fenceInfo.pNext = NULL;
150 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -0600151
Tony Barbour300a6082015-04-07 13:44:53 -0600152 ASSERT_NO_FATAL_FAILURE(InitState());
153 ASSERT_NO_FATAL_FAILURE(InitViewport());
154 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
155
Tony Barbour6918cd52015-04-09 12:58:51 -0600156 VkCommandBufferObj cmdBuffer(m_device);
Tony Barbour300a6082015-04-07 13:44:53 -0600157 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
158
Tony Barbour0b4d9562015-04-09 10:48:04 -0600159 BeginCommandBuffer(cmdBuffer);
Tony Barbour300a6082015-04-07 13:44:53 -0600160 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600161 EndCommandBuffer(cmdBuffer);
Tony Barbour300a6082015-04-07 13:44:53 -0600162
163 testFence.init(*m_device, fenceInfo);
164 m_errorMonitor->ClearState();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600165 cmdBuffer.QueueCommandBuffer(testFence.obj());
Tony Barbour300a6082015-04-07 13:44:53 -0600166 msgType = m_errorMonitor->GetState(&msgString);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600167 ASSERT_EQ(msgType, VK_DBG_MSG_ERROR) << "Did not receive an err from using a fence in SIGNALED state in call to vkQueueSubmit";
168 if (!strstr(msgString.c_str(),"submitted in SIGNALED state. Fences must be reset before being submitted")) {
Tony Barbour22c8f0c2015-04-09 16:00:51 -0600169 FAIL() << "Error received was not VkQueueSubmit with fence in SIGNALED_STATE";
Tony Barbour0b4d9562015-04-09 10:48:04 -0600170 }
171
172}
173
174TEST_F(VkLayerTest, ResetUnsignaledFence)
175{
176 vk_testing::Fence testFence;
177 VK_DBG_MSG_TYPE msgType;
178 std::string msgString;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600179 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600180 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
181 fenceInfo.pNext = NULL;
182
Tony Barbour0b4d9562015-04-09 10:48:04 -0600183 ASSERT_NO_FATAL_FAILURE(InitState());
184 testFence.init(*m_device, fenceInfo);
185 m_errorMonitor->ClearState();
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600186 VkFence fences[1] = {testFence.obj()};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600187 vkResetFences(m_device->device(), 1, fences);
188 msgType = m_errorMonitor->GetState(&msgString);
189 ASSERT_EQ(msgType, VK_DBG_MSG_ERROR) << "Did not receive an error from submitting fence with UNSIGNALED state to vkResetFences";
Tony Barbour6918cd52015-04-09 12:58:51 -0600190 if (!strstr(msgString.c_str(),"submitted to VkResetFences in UNSIGNALED STATE")) {
Tony Barbour22c8f0c2015-04-09 16:00:51 -0600191 FAIL() << "Error received was not VkResetFences with fence in UNSIGNALED_STATE";
Tony Barbour0b4d9562015-04-09 10:48:04 -0600192 }
Tony Barbour300a6082015-04-07 13:44:53 -0600193
194}
195
Tony Barbour806c9062015-04-22 15:12:07 -0600196TEST_F(VkLayerTest, WaitForUnsubmittedFence)
197{
198 vk_testing::Fence testFence;
199 VK_DBG_MSG_TYPE msgType;
200 std::string msgString;
201 VkFenceCreateInfo fenceInfo = {};
202 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
203 fenceInfo.pNext = NULL;
204
Tony Barbour806c9062015-04-22 15:12:07 -0600205 ASSERT_NO_FATAL_FAILURE(InitState());
206 testFence.init(*m_device, fenceInfo);
207 m_errorMonitor->ClearState();
208 vkGetFenceStatus(m_device->device(),testFence.obj());
209 msgType = m_errorMonitor->GetState(&msgString);
210 ASSERT_EQ(msgType, VK_DBG_MSG_ERROR) << "Did not receive an error asking for status of unsubmitted fence";
211 if (!strstr(msgString.c_str(),"Status Requested for Unsubmitted Fence")) {
212 FAIL() << "Error received was not Status Requested for Unsubmitted Fence";
213 }
214
215 VkFence fences[1] = {testFence.obj()};
216 m_errorMonitor->ClearState();
217 vkWaitForFences(m_device->device(), 1, fences, VK_TRUE, 0);
218 msgType = m_errorMonitor->GetState(&msgString);
219 ASSERT_EQ(msgType, VK_DBG_MSG_ERROR) << "Did not receive an error for waiting for unsubmitted fence";
220 if (!strstr(msgString.c_str(),"Waiting for Unsubmitted Fence")) {
221 FAIL() << "Error received was not Waiting for Unsubmitted Fence";
222 }
223}
224
Tony Barbourd866ad02015-05-06 09:35:56 -0600225TEST_F(VkLayerTest, GetObjectInfoMismatchedType)
226{
227 VkEventCreateInfo event_info;
228 VkEvent event;
229 VkMemoryRequirements mem_req;
230 size_t data_size = sizeof(mem_req);
231 VK_DBG_MSG_TYPE msgType;
232 std::string msgString;
233 VkResult err;
234
235 ASSERT_NO_FATAL_FAILURE(InitState());
236 memset(&event_info, 0, sizeof(event_info));
237 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
238
239 err = vkCreateEvent(device(), &event_info, &event);
240 ASSERT_VK_SUCCESS(err);
241 m_errorMonitor->ClearState();
242 err = vkGetObjectInfo(device(), VK_OBJECT_TYPE_IMAGE, event, VK_OBJECT_INFO_TYPE_MEMORY_REQUIREMENTS,
243 &data_size, &mem_req);
244 msgType = m_errorMonitor->GetState(&msgString);
245 ASSERT_EQ(msgType, VK_DBG_MSG_ERROR) << "Did not receive an error from mismatched types in vkGetObjectInfo";
246 if (!strstr(msgString.c_str(),"does not match designated type")) {
247 FAIL() << "Error received was not event does not match designated type image";
248 }
249
250}
251
Tony Barbour300a6082015-04-07 13:44:53 -0600252int main(int argc, char **argv) {
253 int result;
254
255 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -0600256 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -0600257
258 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
259
260 result = RUN_ALL_TESTS();
261
Tony Barbour6918cd52015-04-09 12:58:51 -0600262 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -0600263 return result;
264}