| #include <vulkan.h> |
| #include <vkDbg.h> |
| #include "gtest-1.7.0/include/gtest/gtest.h" |
| #include "vkrenderframework.h" |
| |
| void VKAPI myDbgFunc( |
| VK_DBG_MSG_TYPE msgType, |
| VK_VALIDATION_LEVEL validationLevel, |
| VK_BASE_OBJECT srcObject, |
| size_t location, |
| int32_t msgCode, |
| const char* pMsg, |
| void* pUserData); |
| |
| class ErrorMonitor { |
| public: |
| ErrorMonitor(VK_INSTANCE inst) |
| { |
| vkDbgRegisterMsgCallback(inst, myDbgFunc, this); |
| m_msgType = VK_DBG_MSG_UNKNOWN; |
| } |
| void ClearState() |
| { |
| m_msgType = VK_DBG_MSG_UNKNOWN; |
| m_msgString.clear(); |
| } |
| VK_DBG_MSG_TYPE GetState(std::string *msgString) |
| { |
| *msgString = m_msgString; |
| return m_msgType; |
| } |
| void SetState(VK_DBG_MSG_TYPE msgType, const char *msgString) |
| { |
| m_msgType = msgType; |
| m_msgString = *msgString; |
| } |
| |
| private: |
| VK_DBG_MSG_TYPE m_msgType; |
| std::string m_msgString; |
| |
| }; |
| void VKAPI myDbgFunc( |
| VK_DBG_MSG_TYPE msgType, |
| VK_VALIDATION_LEVEL validationLevel, |
| VK_BASE_OBJECT srcObject, |
| size_t location, |
| int32_t msgCode, |
| const char* pMsg, |
| void* pUserData) |
| { |
| ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData; |
| errMonitor->SetState(msgType, pMsg); |
| } |
| class XglLayerTest : public XglRenderFramework |
| { |
| public: |
| VK_RESULT BeginCommandBuffer(XglCommandBufferObj &cmdBuffer); |
| VK_RESULT EndCommandBuffer(XglCommandBufferObj &cmdBuffer); |
| |
| protected: |
| XglMemoryRefManager m_memoryRefManager; |
| ErrorMonitor *m_errorMonitor; |
| |
| virtual void SetUp() { |
| |
| this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; |
| this->app_info.pNext = NULL; |
| this->app_info.pAppName = "layer_tests"; |
| this->app_info.appVersion = 1; |
| this->app_info.pEngineName = "unittest"; |
| this->app_info.engineVersion = 1; |
| this->app_info.apiVersion = VK_API_VERSION; |
| |
| InitFramework(); |
| m_errorMonitor = new ErrorMonitor(inst); |
| } |
| |
| virtual void TearDown() { |
| // Clean up resources before we reset |
| delete m_errorMonitor; |
| ShutdownFramework(); |
| } |
| }; |
| VK_RESULT XglLayerTest::BeginCommandBuffer(XglCommandBufferObj &cmdBuffer) |
| { |
| VK_RESULT result; |
| |
| result = cmdBuffer.BeginCommandBuffer(); |
| |
| /* |
| * For render test all drawing happens in a single render pass |
| * on a single command buffer. |
| */ |
| if (VK_SUCCESS == result) { |
| cmdBuffer.BeginRenderPass(renderPass(), framebuffer()); |
| } |
| |
| return result; |
| } |
| |
| VK_RESULT XglLayerTest::EndCommandBuffer(XglCommandBufferObj &cmdBuffer) |
| { |
| VK_RESULT result; |
| |
| cmdBuffer.EndRenderPass(renderPass()); |
| |
| result = cmdBuffer.EndCommandBuffer(); |
| |
| return result; |
| } |
| |
| TEST_F(XglLayerTest, UseSignaledFence) |
| { |
| vk_testing::Fence testFence; |
| VK_DBG_MSG_TYPE msgType; |
| std::string msgString; |
| const VK_FENCE_CREATE_INFO fenceInfo = { |
| .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, |
| .pNext = NULL, |
| .flags = VK_FENCE_CREATE_SIGNALED_BIT, |
| }; |
| |
| // Register error callback to catch errors and record parameters |
| |
| // Verifiy that the appropriate layer is loaded |
| |
| ASSERT_NO_FATAL_FAILURE(InitState()); |
| ASSERT_NO_FATAL_FAILURE(InitViewport()); |
| ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); |
| |
| XglCommandBufferObj cmdBuffer(m_device); |
| cmdBuffer.AddRenderTarget(m_renderTargets[0]); |
| |
| cmdBuffer.begin(); |
| cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL); |
| cmdBuffer.end(); |
| |
| testFence.init(*m_device, fenceInfo); |
| m_errorMonitor->ClearState(); |
| cmdBuffer.QueueCommandBuffer(); |
| msgType = m_errorMonitor->GetState(&msgString); |
| |
| } |
| |
| int main(int argc, char **argv) { |
| int result; |
| |
| ::testing::InitGoogleTest(&argc, argv); |
| XglTestFramework::InitArgs(&argc, argv); |
| |
| ::testing::AddGlobalTestEnvironment(new TestEnvironment); |
| |
| result = RUN_ALL_TESTS(); |
| |
| XglTestFramework::Finish(); |
| return result; |
| } |