blob: 8d62a936d052aa9d21bc35c3f8c866c21d1cd5e2 [file] [log] [blame]
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001#include <vulkan.h>
2#include <vkDbg.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"
Tony Barbour30486ea2015-04-07 13:44:53 -06005
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06006void VKAPI myDbgFunc(
7 VK_DBG_MSG_TYPE msgType,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06008 VkValidationLevel validationLevel,
Mike Stroyan230e6252015-04-17 12:36:38 -06009 VkObject srcObject,
Tony Barbour30486ea2015-04-07 13:44:53 -060010 size_t location,
11 int32_t msgCode,
12 const char* pMsg,
13 void* pUserData);
14
15class ErrorMonitor {
16public:
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060017 ErrorMonitor(VkInstance inst)
Tony Barbour30486ea2015-04-07 13:44:53 -060018 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060019 vkDbgRegisterMsgCallback(inst, myDbgFunc, this);
20 m_msgType = VK_DBG_MSG_UNKNOWN;
Tony Barbour30486ea2015-04-07 13:44:53 -060021 }
22 void ClearState()
23 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060024 m_msgType = VK_DBG_MSG_UNKNOWN;
Tony Barbour30486ea2015-04-07 13:44:53 -060025 m_msgString.clear();
26 }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060027 VK_DBG_MSG_TYPE GetState(std::string *msgString)
Tony Barbour30486ea2015-04-07 13:44:53 -060028 {
29 *msgString = m_msgString;
30 return m_msgType;
31 }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060032 void SetState(VK_DBG_MSG_TYPE msgType, const char *msgString)
Tony Barbour30486ea2015-04-07 13:44:53 -060033 {
34 m_msgType = msgType;
Tony Barbour8508b8e2015-04-09 10:48:04 -060035 m_msgString.reserve(strlen(msgString));
36 m_msgString = msgString;
Tony Barbour30486ea2015-04-07 13:44:53 -060037 }
38
39private:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060040 VK_DBG_MSG_TYPE m_msgType;
Tony Barbour30486ea2015-04-07 13:44:53 -060041 std::string m_msgString;
42
43};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060044void VKAPI myDbgFunc(
Mike Stroyan230e6252015-04-17 12:36:38 -060045 VK_DBG_MSG_TYPE msgType,
46 VkValidationLevel validationLevel,
47 VkObject srcObject,
Tony Barbour30486ea2015-04-07 13:44:53 -060048 size_t location,
49 int32_t msgCode,
50 const char* pMsg,
51 void* pUserData)
52{
Tony Barbour8508b8e2015-04-09 10:48:04 -060053 if (msgType == VK_DBG_MSG_WARNING || msgType == VK_DBG_MSG_ERROR) {
54 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
55 errMonitor->SetState(msgType, pMsg);
56 }
Tony Barbour30486ea2015-04-07 13:44:53 -060057}
Tony Barbour01999182015-04-09 12:58:51 -060058class VkLayerTest : public VkRenderFramework
Tony Barbour30486ea2015-04-07 13:44:53 -060059{
60public:
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060061 VkResult BeginCommandBuffer(VkCommandBufferObj &cmdBuffer);
62 VkResult EndCommandBuffer(VkCommandBufferObj &cmdBuffer);
Tony Barbour30486ea2015-04-07 13:44:53 -060063
64protected:
Tony Barbour01999182015-04-09 12:58:51 -060065 VkMemoryRefManager m_memoryRefManager;
66 ErrorMonitor *m_errorMonitor;
Tony Barbour30486ea2015-04-07 13:44:53 -060067
68 virtual void SetUp() {
Tony Barbour950ebc02015-04-23 12:55:36 -060069 const char *layer_names[] = {"MemTracker", "ObjectTracker"};
70 const std::vector<const char *> layers(layer_names, layer_names + 2);
71
72 size_t extSize = sizeof(uint32_t);
73 uint32_t extCount = 0;
74 VkResult err;
75 err = vkGetGlobalExtensionInfo(VK_EXTENSION_INFO_TYPE_COUNT, 0, &extSize, &extCount);
76 assert(!err);
77
78 VkExtensionProperties extProp;
79 extSize = sizeof(VkExtensionProperties);
80 bool32_t extFound;
81
82 for (uint32_t i = 0; i < layers.size(); i++) {
83 extFound = 0;
84 for (uint32_t j = 0; j < extCount; j++) {
85 err = vkGetGlobalExtensionInfo(VK_EXTENSION_INFO_TYPE_PROPERTIES, j, &extSize, &extProp);
86 if (!strcmp(layers[i], extProp.extName)) {
87 extFound = 1;
88 break;
89 }
90 }
91 ASSERT_EQ(extFound, 1) << "ERROR: Cannot find extension named " << layers[i] << " which is necessary to pass this test";
92 }
Tony Barbour30486ea2015-04-07 13:44:53 -060093
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060094 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour30486ea2015-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 Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600100 this->app_info.apiVersion = VK_API_VERSION;
Tony Barbour30486ea2015-04-07 13:44:53 -0600101
Tony Barbour950ebc02015-04-23 12:55:36 -0600102 InitFramework(layers);
Tony Barbour30486ea2015-04-07 13:44:53 -0600103 m_errorMonitor = new ErrorMonitor(inst);
104 }
105
106 virtual void TearDown() {
107 // Clean up resources before we reset
Tony Barbour30486ea2015-04-07 13:44:53 -0600108 ShutdownFramework();
Tony Barbour8508b8e2015-04-09 10:48:04 -0600109 delete m_errorMonitor;
Tony Barbour30486ea2015-04-07 13:44:53 -0600110 }
111};
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600112VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &cmdBuffer)
Tony Barbour30486ea2015-04-07 13:44:53 -0600113{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600114 VkResult result;
Tony Barbour30486ea2015-04-07 13:44:53 -0600115
116 result = cmdBuffer.BeginCommandBuffer();
117
118 /*
119 * For render test all drawing happens in a single render pass
120 * on a single command buffer.
121 */
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600122 if (VK_SUCCESS == result) {
Tony Barbour30486ea2015-04-07 13:44:53 -0600123 cmdBuffer.BeginRenderPass(renderPass(), framebuffer());
124 }
125
126 return result;
127}
128
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600129VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &cmdBuffer)
Tony Barbour30486ea2015-04-07 13:44:53 -0600130{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600131 VkResult result;
Tony Barbour30486ea2015-04-07 13:44:53 -0600132
133 cmdBuffer.EndRenderPass(renderPass());
134
135 result = cmdBuffer.EndCommandBuffer();
136
137 return result;
138}
139
Tony Barbour8508b8e2015-04-09 10:48:04 -0600140TEST_F(VkLayerTest, SubmitSignaledFence)
Tony Barbour30486ea2015-04-07 13:44:53 -0600141{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600142 vk_testing::Fence testFence;
143 VK_DBG_MSG_TYPE msgType;
Tony Barbour30486ea2015-04-07 13:44:53 -0600144 std::string msgString;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600145
146 VkFenceCreateInfo fenceInfo = {};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600147 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
148 fenceInfo.pNext = NULL;
149 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour30486ea2015-04-07 13:44:53 -0600150
151 // Verifiy that the appropriate layer is loaded
152
153 ASSERT_NO_FATAL_FAILURE(InitState());
154 ASSERT_NO_FATAL_FAILURE(InitViewport());
155 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
156
Tony Barbour01999182015-04-09 12:58:51 -0600157 VkCommandBufferObj cmdBuffer(m_device);
Tony Barbour30486ea2015-04-07 13:44:53 -0600158 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
159
Tony Barbour8508b8e2015-04-09 10:48:04 -0600160 BeginCommandBuffer(cmdBuffer);
Tony Barbour30486ea2015-04-07 13:44:53 -0600161 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour8508b8e2015-04-09 10:48:04 -0600162 EndCommandBuffer(cmdBuffer);
Tony Barbour30486ea2015-04-07 13:44:53 -0600163
164 testFence.init(*m_device, fenceInfo);
165 m_errorMonitor->ClearState();
Tony Barbour8508b8e2015-04-09 10:48:04 -0600166 cmdBuffer.QueueCommandBuffer(testFence.obj());
Tony Barbour30486ea2015-04-07 13:44:53 -0600167 msgType = m_errorMonitor->GetState(&msgString);
Tony Barbour8508b8e2015-04-09 10:48:04 -0600168 ASSERT_EQ(msgType, VK_DBG_MSG_ERROR) << "Did not receive an err from using a fence in SIGNALED state in call to vkQueueSubmit";
169 if (!strstr(msgString.c_str(),"submitted in SIGNALED state. Fences must be reset before being submitted")) {
Tony Barbour9c238c42015-04-09 16:00:51 -0600170 FAIL() << "Error received was not VkQueueSubmit with fence in SIGNALED_STATE";
Tony Barbour8508b8e2015-04-09 10:48:04 -0600171 }
172
173}
174
175TEST_F(VkLayerTest, ResetUnsignaledFence)
176{
177 vk_testing::Fence testFence;
178 VK_DBG_MSG_TYPE msgType;
179 std::string msgString;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600180 VkFenceCreateInfo fenceInfo = {};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600181 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
182 fenceInfo.pNext = NULL;
183
184 // Verifiy that the appropriate layer is loaded
185
186 ASSERT_NO_FATAL_FAILURE(InitState());
187 testFence.init(*m_device, fenceInfo);
188 m_errorMonitor->ClearState();
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600189 VkFence fences[1] = {testFence.obj()};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600190 vkResetFences(m_device->device(), 1, fences);
191 msgType = m_errorMonitor->GetState(&msgString);
192 ASSERT_EQ(msgType, VK_DBG_MSG_ERROR) << "Did not receive an error from submitting fence with UNSIGNALED state to vkResetFences";
Tony Barbour01999182015-04-09 12:58:51 -0600193 if (!strstr(msgString.c_str(),"submitted to VkResetFences in UNSIGNALED STATE")) {
Tony Barbour9c238c42015-04-09 16:00:51 -0600194 FAIL() << "Error received was not VkResetFences with fence in UNSIGNALED_STATE";
Tony Barbour8508b8e2015-04-09 10:48:04 -0600195 }
Tony Barbour30486ea2015-04-07 13:44:53 -0600196
197}
198
Tony Barbour54cdd192015-04-22 15:12:07 -0600199TEST_F(VkLayerTest, WaitForUnsubmittedFence)
200{
201 vk_testing::Fence testFence;
202 VK_DBG_MSG_TYPE msgType;
203 std::string msgString;
204 VkFenceCreateInfo fenceInfo = {};
205 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
206 fenceInfo.pNext = NULL;
207
208 // Verifiy that the appropriate layer is loaded
209
210 ASSERT_NO_FATAL_FAILURE(InitState());
211 testFence.init(*m_device, fenceInfo);
212 m_errorMonitor->ClearState();
213 vkGetFenceStatus(m_device->device(),testFence.obj());
214 msgType = m_errorMonitor->GetState(&msgString);
215 ASSERT_EQ(msgType, VK_DBG_MSG_ERROR) << "Did not receive an error asking for status of unsubmitted fence";
216 if (!strstr(msgString.c_str(),"Status Requested for Unsubmitted Fence")) {
217 FAIL() << "Error received was not Status Requested for Unsubmitted Fence";
218 }
219
220 VkFence fences[1] = {testFence.obj()};
221 m_errorMonitor->ClearState();
222 vkWaitForFences(m_device->device(), 1, fences, VK_TRUE, 0);
223 msgType = m_errorMonitor->GetState(&msgString);
224 ASSERT_EQ(msgType, VK_DBG_MSG_ERROR) << "Did not receive an error for waiting for unsubmitted fence";
225 if (!strstr(msgString.c_str(),"Waiting for Unsubmitted Fence")) {
226 FAIL() << "Error received was not Waiting for Unsubmitted Fence";
227 }
228}
229
Tony Barbour30486ea2015-04-07 13:44:53 -0600230int main(int argc, char **argv) {
231 int result;
232
233 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour01999182015-04-09 12:58:51 -0600234 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour30486ea2015-04-07 13:44:53 -0600235
236 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
237
238 result = RUN_ALL_TESTS();
239
Tony Barbour01999182015-04-09 12:58:51 -0600240 VkTestFramework::Finish();
Tony Barbour30486ea2015-04-07 13:44:53 -0600241 return result;
242}