1/*------------------------------------------------------------------------- 2 * Vulkan CTS Framework 3 * -------------------- 4 * 5 * Copyright (c) 2018 The Khronos Group Inc. 6 * Copyright (c) 2018 Intel Corporation 7 * 8 * Licensed under the Apache License, Version 2.0 (the "License"); 9 * you may not use this file except in compliance with the License. 10 * You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, software 15 * distributed under the License is distributed on an "AS IS" BASIS, 16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 * See the License for the specific language governing permissions and 18 * limitations under the License. 19 * 20 *//*! 21 * \file 22 * \brief RenderDoc utility 23 *//*--------------------------------------------------------------------*/ 24 25#include "vkRenderDocUtil.hpp" 26 27#include "deDynamicLibrary.hpp" 28#include "deUniquePtr.hpp" 29#include "tcuDefs.hpp" 30 31#if defined(DEQP_HAVE_RENDERDOC_HEADER) 32#include "renderdoc_app.h" 33#endif 34#include <stdexcept> 35 36#if (DE_OS == DE_OS_WIN32) 37# define RENDERDOC_LIBRARY_NAME "renderdoc.dll" 38#elif (DE_OS == DE_OS_ANDROID) 39# define RENDERDOC_LIBRARY_NAME "libVkLayer_GLES_RenderDoc.so" 40#else 41# define RENDERDOC_LIBRARY_NAME "librenderdoc.so" 42#endif 43 44namespace vk 45{ 46 47struct RenderDocPrivate 48{ 49#if defined(DEQP_HAVE_RENDERDOC_HEADER) 50 RenderDocPrivate (void) : m_api(DE_NULL), m_valid(false) {} 51 52 de::MovePtr<de::DynamicLibrary> m_library; 53 ::RENDERDOC_API_1_1_2* m_api; 54 bool m_valid; 55#endif 56}; 57 58RenderDocUtil::RenderDocUtil (void) 59 : m_priv (new RenderDocPrivate) 60{ 61#if defined(DEQP_HAVE_RENDERDOC_HEADER) 62 try 63 { 64 m_priv->m_library = de::MovePtr<de::DynamicLibrary>(new de::DynamicLibrary(RENDERDOC_LIBRARY_NAME)); 65 } 66 catch (const std::runtime_error& e) 67 { 68 tcu::print("Library %s not loaded: %s, RenderDoc API not available", e.what(), RENDERDOC_LIBRARY_NAME); 69 } 70 71 if (m_priv->m_library) 72 { 73 ::pRENDERDOC_GetAPI pGetApi = (::pRENDERDOC_GetAPI)m_priv->m_library->getFunction("RENDERDOC_GetAPI"); 74 const int ret = pGetApi(eRENDERDOC_API_Version_1_1_2, (void **)&m_priv->m_api); 75 76 if (ret == 1) 77 { 78 m_priv->m_api->TriggerCapture(); 79 80 m_priv->m_valid = true; 81 } 82 else 83 { 84 tcu::print("RENDERDOC_GetAPI returned %d status, RenderDoc API not available", ret); 85 } 86 } 87#endif 88} 89 90RenderDocUtil::~RenderDocUtil (void) 91{ 92 if (m_priv) 93 { 94 delete m_priv; 95 } 96} 97 98bool RenderDocUtil::isValid (void) 99{ 100#if defined(DEQP_HAVE_RENDERDOC_HEADER) 101 return m_priv != DE_NULL && m_priv->m_valid; 102#else 103 return false; 104#endif 105} 106 107void RenderDocUtil::startFrame (vk::VkInstance instance) 108{ 109 if (!isValid()) return; 110#if defined(DEQP_HAVE_RENDERDOC_HEADER) 111 m_priv->m_api->StartFrameCapture(RENDERDOC_DEVICEPOINTER_FROM_VKINSTANCE(instance), DE_NULL); 112#else 113 (void) instance; 114#endif 115} 116 117void RenderDocUtil::endFrame (vk::VkInstance instance) 118{ 119 if (!isValid()) return; 120#if defined(DEQP_HAVE_RENDERDOC_HEADER) 121 m_priv->m_api->EndFrameCapture(RENDERDOC_DEVICEPOINTER_FROM_VKINSTANCE(instance), DE_NULL); 122#else 123 (void) instance; 124#endif 125} 126 127} // vk 128