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