diff --git a/docs/credits_acknowledgements.rst b/docs/credits_acknowledgements.rst index 9c6602854..c0831e9a9 100644 --- a/docs/credits_acknowledgements.rst +++ b/docs/credits_acknowledgements.rst @@ -120,6 +120,10 @@ The following libraries and components are incorporated into RenderDoc, listed h Used to emulate half-precision operations in shader debugging. +* `Superluminal `_ - Copyright (c) 2019-2020 Superluminal. Distributed under the BSD License. + + Used to emit profiling events in development builds. + Thanks ------ diff --git a/renderdoc/3rdparty/superluminal/PerformanceAPI_capi.h b/renderdoc/3rdparty/superluminal/PerformanceAPI_capi.h new file mode 100644 index 000000000..316a669b4 --- /dev/null +++ b/renderdoc/3rdparty/superluminal/PerformanceAPI_capi.h @@ -0,0 +1,201 @@ +/* +BSD LICENSE + +Copyright (c) 2019-2020 Superluminal. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#pragma once + +#include + +// When PERFORMANCEAPI_ENABLED is defined to 0, all calls to the PerformanceAPI (either through macro or direct function calls) will be compiled out. +#ifndef PERFORMANCEAPI_ENABLED + #ifdef _WIN32 + #define PERFORMANCEAPI_ENABLED 1 + #else + #define PERFORMANCEAPI_ENABLED 0 + #endif +#endif + +#define PERFORMANCEAPI_MAJOR_VERSION 2 +#define PERFORMANCEAPI_MINOR_VERSION 0 +#define PERFORMANCEAPI_VERSION ((PERFORMANCEAPI_MAJOR_VERSION << 16) | PERFORMANCEAPI_MINOR_VERSION) + +/** + * This header has been designed to be fully self-contained, which makes it easy to copy this header into your own source tree as needed. + * + * See PerformanceAPI.h for the high level documentation on how to use the API. + * + * Note that this header is split into two sections: + * - The first section defines the static library interface. If you use these functions directly, you need to link against the PerformanceAPI static library. + * - The second section defines the DLL interface. The DLL interface allows you to use the API without linking to a library. Instead, you can load the DLL yourself + * through LoadLibrary, then find the "PerformanceAPI_GetAPI" export through GetProcAddress. PerformanceAPI_GetAPI can be called to get a table of function pointers + * to the API. A convenience function to perform the DLL load & retrieve the API functions is provided for you in a separate header, PerformanceAPI_loader.h. + */ +#ifdef __cplusplus +extern "C" { +#endif + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Static library interface - if you use these functions, you need to link against the PerformanceAPI library +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * Helper struct that is used to prevent calls to EndEvent from being optimized to jmp instructions as part of tail call optimization. + * You don't ever need to do anything with this as user of the API. + */ +typedef struct +{ + int64_t SuppressTailCall[3]; +} PerformanceAPI_SuppressTailCallOptimization; + +#if PERFORMANCEAPI_ENABLED + /** + * Helper function to create an uint32_t color from 3 RGB values. The R, G and B values must be in range [0, 255]. + * The resulting color can be passed to the BeginEvent function. + */ + #define PERFORMANCEAPI_MAKE_COLOR(R, G, B) ((((uint32_t)(R)) << 24) | (((uint32_t)(G)) << 16) | (((uint32_t)(B)) << 8) | (uint32_t)0xFF) + + /** + * Use this define if you don't care about the color of an event and just want to use the default + */ + #define PERFORMANCEAPI_DEFAULT_COLOR 0xFFFFFFFF + + /** + * Set the name of the current thread to the specified thread name. + * + * @param inThreadName The thread name as an UTF8 encoded string. + */ + void PerformanceAPI_SetCurrentThreadName(const char* inThreadName); + + /** + * Set the name of the current thread to the specified thread name. + * + * @param inThreadName The thread name as an UTF8 encoded string. + * @param inThreadNameLength The length of the thread name, in characters, excluding the null terminator. + */ + void PerformanceAPI_SetCurrentThreadName_N(const char* inThreadName, uint16_t inThreadNameLength); + + /** + * Begin an instrumentation event with the specified ID and runtime data + * + * @param inID The ID of this scope as an UTF8 encoded string. The ID for a specific scope must be the same over the lifetime of the program (see docs at the top of this file) + * @param inData [optional] The data for this scope as an UTF8 encoded string. The data can vary for each invocation of this scope and is intended to hold information that is only available at runtime. See docs at the top of this file. + * Set to null if not available. + * @param inColor [optional] The color for this scope. The color for a specific scope is coupled to the ID and must be the same over the lifetime of the program + * Set to PERFORMANCEAPI_DEFAULT_COLOR to use default coloring. + * + */ + void PerformanceAPI_BeginEvent(const char* inID, const char* inData, uint32_t inColor); + + /** + * Begin an instrumentation event with the specified ID and runtime data, both with an explicit length. + + * It works the same as the regular BeginEvent function (see docs above). The difference is that it allows you to specify the length of both the ID and the data, + * which is useful for languages that do not have null-terminated strings. + * + * Note: both lengths should be specified in the number of characters, not bytes, excluding the null terminator. + */ + void PerformanceAPI_BeginEvent_N(const char* inID, uint16_t inIDLength, const char* inData, uint16_t inDataLength, uint32_t inColor); + + /** + * Begin an instrumentation event with the specified ID and runtime data + * + * @param inID The ID of this scope as an UTF16 encoded string. The ID for a specific scope must be the same over the lifetime of the program (see docs at the top of this file) + * @param inData [optional] The data for this scope as an UTF16 encoded string. The data can vary for each invocation of this scope and is intended to hold information that is only available at runtime. See docs at the top of this file. + Set to null if not available. + * @param inColor [optional] The color for this scope. The color for a specific scope is coupled to the ID and must be the same over the lifetime of the program + * Set to PERFORMANCEAPI_DEFAULT_COLOR to use default coloring. + */ + void PerformanceAPI_BeginEvent_Wide(const wchar_t* inID, const wchar_t* inData, uint32_t inColor); + + /** + * Begin an instrumentation event with the specified ID and runtime data, both with an explicit length. + + * It works the same as the regular BeginEvent_Wide function (see docs above). The difference is that it allows you to specify the length of both the ID and the data, + * which is useful for languages that do not have null-terminated strings. + * + * Note: both lengths should be specified in the number of characters, not bytes, excluding the null terminator. + */ + void PerformanceAPI_BeginEvent_Wide_N(const wchar_t* inID, uint16_t inIDLength, const wchar_t* inData, uint16_t inDataLength, uint32_t inColor); + + /** + * End an instrumentation event. Must be matched with a call to BeginEvent within the same function + * Note: the return value can be ignored. It is only there to prevent calls to the function from being optimized to jmp instructions as part of tail call optimization. + */ + PerformanceAPI_SuppressTailCallOptimization PerformanceAPI_EndEvent(); +#else + #define PERFORMANCEAPI_MAKE_COLOR(R, G, B) 0xFFFFFFFF + #define PERFORMANCEAPI_DEFAULT_COLOR 0xFFFFFFFF + + inline void PerformanceAPI_SetCurrentThreadName(const char* inThreadName) {} + inline void PerformanceAPI_SetCurrentThreadName_N(const char* inThreadName, uint16_t inThreadNameLength) {} + inline void PerformanceAPI_BeginEvent(const char* inID, const char* inData, uint32_t inColor) {} + inline void PerformanceAPI_BeginEvent_N(const char* inID, uint16_t inIDLength, const char* inData, uint16_t inDataLength, uint32_t inColor) {} + inline void PerformanceAPI_BeginEvent_Wide(const wchar_t* inID, const wchar_t* inData, uint32_t inColor) {} + inline void PerformanceAPI_BeginEvent_Wide_N(const wchar_t* inID, uint16_t inIDLength, const wchar_t* inData, uint16_t inDataLength, uint32_t inColor) {} + inline void PerformanceAPI_EndEvent() {} +#endif + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// DLL interface - These functions can be used without linking by loading PerformanceAPI.dll and using GetProcAddress to find the PerformanceAPI_GetAPI function. +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +typedef void (PerformanceAPI_SetCurrentThreadName_Func)(const char* inThreadName); +typedef void (PerformanceAPI_SetCurrentThreadName_N_Func)(const char* inThreadName, uint16_t inThreadNameLength); +typedef void (PerformanceAPI_BeginEvent_Func)(const char* inID, const char* inData, uint32_t inColor); +typedef void (PerformanceAPI_BeginEvent_N_Func)(const char* inID, uint16_t inIDLength, const char* inData, uint16_t inDataLength, uint32_t inColor); +typedef void (PerformanceAPI_BeginEvent_Wide_Func)(const wchar_t* inID, const wchar_t* inData, uint32_t inColor); +typedef void (PerformanceAPI_BeginEvent_Wide_N_Func)(const wchar_t* inID, uint16_t inIDLength, const wchar_t* inData, uint16_t inDataLength, uint32_t inColor); +typedef PerformanceAPI_SuppressTailCallOptimization (PerformanceAPI_EndEvent_Func)(); + +typedef struct +{ + PerformanceAPI_SetCurrentThreadName_Func* SetCurrentThreadName; + PerformanceAPI_SetCurrentThreadName_N_Func* SetCurrentThreadNameN; + PerformanceAPI_BeginEvent_Func* BeginEvent; + PerformanceAPI_BeginEvent_N_Func* BeginEventN; + PerformanceAPI_BeginEvent_Wide_Func* BeginEventWide; + PerformanceAPI_BeginEvent_Wide_N_Func* BeginEventWideN; + PerformanceAPI_EndEvent_Func* EndEvent; +} PerformanceAPI_Functions; + +/** + * Entry point for the PerformanceAPI when used through a DLL. You can get the actual function from the DLL through + * GetProcAddress and then cast it to this function pointer. The name of the function exported from the DLL is "PerformanceAPI_GetAPI". + * + * A convenience function to find & call this function from the PerformanceAPI dll is provided in a separate header, PerformanceAPI_loader.h (PerformanceAPI_LoadFrom) + * + * @param inVersion The version of the header that's used to request the function table. Always specify PERFORMANCEAPI_VERSION for this argument (defined at the top of this file). + * Note: the version of the header and DLL must match exactly; if it doesn't an error will be returned. + * @param outFunctions Pointer to a PerformanceAPI_Functions struct that will be filled with the correct function pointers to use the API + * + * @return 0 if there was an error (version mismatch), 1 on success + */ +typedef int (*PerformanceAPI_GetAPI_Func)(int inVersion, PerformanceAPI_Functions* outFunctions); + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/renderdoc/3rdparty/superluminal/README.md b/renderdoc/3rdparty/superluminal/README.md new file mode 100644 index 000000000..6c5268a0a --- /dev/null +++ b/renderdoc/3rdparty/superluminal/README.md @@ -0,0 +1,30 @@ +This header comes from Superluminal to provide an interface for optional marker regions. + +---------- + +BSD LICENSE + +Copyright (c) 2019-2020 Superluminal. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/renderdoc/3rdparty/superluminal/superluminal.cpp b/renderdoc/3rdparty/superluminal/superluminal.cpp new file mode 100644 index 000000000..510e3cd96 --- /dev/null +++ b/renderdoc/3rdparty/superluminal/superluminal.cpp @@ -0,0 +1,111 @@ +/****************************************************************************** + * The MIT License (MIT) + * + * Copyright (c) 2020 Baldur Karlsson + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + ******************************************************************************/ + +#include "common/globalconfig.h" +#include "superluminal/PerformanceAPI_capi.h" + +// use registry to locate superluminal DLL +#if ENABLED(RDOC_WIN32) +#include +#endif + +namespace Superluminal +{ +PerformanceAPI_Functions funcTable = {}; + +void Init() +{ + void *module = NULL; + +#if ENABLED(RDOC_WIN32) + { + HKEY key = NULL; + LSTATUS ret = ERROR_SUCCESS; + + ret = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Superluminal\\Performance", 0, KEY_READ, &key); + + if(ret == ERROR_SUCCESS) + { + DWORD size = 0; + ret = RegGetValueA(key, NULL, "InstallDir", RRF_RT_ANY, NULL, NULL, &size); + + if(ret == ERROR_SUCCESS) + { + rdcstr path; + path.resize(size); + + ret = RegGetValueA(key, NULL, "InstallDir", RRF_RT_ANY, NULL, path.data(), &size); + + if(ret == ERROR_SUCCESS) + { + path.trim(); + + path += "\\API\\dll\\"; + +#if ENABLED(RDOC_X64) + path += "x64\\"; +#else + path += "x86\\"; +#endif + + path += "PerformanceAPI.dll"; + + module = Process::LoadModule(path.c_str()); + } + } + + RegCloseKey(key); + } + } +#else +// not supported. Yet! +#endif + + if(module == NULL) + RDCEraseEl(funcTable); + + PerformanceAPI_GetAPI_Func GetAPI = + (PerformanceAPI_GetAPI_Func)Process::GetFunctionAddress(module, "PerformanceAPI_GetAPI"); + + int ret = 0; + + if(GetAPI) + ret = GetAPI(PERFORMANCEAPI_VERSION, &funcTable); + + if(ret != 1) + RDCEraseEl(funcTable); +} + +void BeginProfileRange(const rdcstr &name) +{ + if(funcTable.BeginEvent) + funcTable.BeginEvent("RenderDoc", name.c_str(), PERFORMANCEAPI_DEFAULT_COLOR); +} + +void EndProfileRange() +{ + if(funcTable.EndEvent) + funcTable.EndEvent(); +} +}; diff --git a/renderdoc/3rdparty/superluminal/superluminal.h b/renderdoc/3rdparty/superluminal/superluminal.h new file mode 100644 index 000000000..8d62f0dbb --- /dev/null +++ b/renderdoc/3rdparty/superluminal/superluminal.h @@ -0,0 +1,32 @@ +/****************************************************************************** + * The MIT License (MIT) + * + * Copyright (c) 2020 Baldur Karlsson + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + ******************************************************************************/ + +// this file exists just to wrap the superluminal interface in a platform-independent way + +namespace Superluminal +{ +void Init(); +void BeginProfileRange(const rdcstr &name); +void EndProfileRange(); +}; \ No newline at end of file diff --git a/renderdoc/api/replay/renderdoc_replay.h b/renderdoc/api/replay/renderdoc_replay.h index 0b5df5866..e6127db19 100644 --- a/renderdoc/api/replay/renderdoc_replay.h +++ b/renderdoc/api/replay/renderdoc_replay.h @@ -2175,3 +2175,37 @@ extern "C" RENDERDOC_API int RENDERDOC_CC RENDERDOC_RunUnitTests(const rdcstr &c DOCUMENT("Internal function that runs functional tests."); extern "C" RENDERDOC_API int RENDERDOC_CC RENDERDOC_RunFunctionalTests(int pythonMinorVersion, const rdcarray &args); + +#if !defined(SWIG) +#include "version.h" + +DOCUMENT("Internal function that begins a profile region."); +extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_BeginProfileRegion(const rdcstr &name); + +DOCUMENT("Internal function that ends a profile region."); +extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_EndProfileRegion(); + +// don't define profile regions in stable builds +#if RENDERDOC_STABLE_BUILD + +#define RENDERDOC_PROFILEREGION(name) + +#else + +struct RENDERDOC_ProfileRegion +{ + RENDERDOC_ProfileRegion(const rdcstr &name) { RENDERDOC_BeginProfileRegion(name); } + ~RENDERDOC_ProfileRegion() { RENDERDOC_EndProfileRegion(); } +}; + +#define RENDERDOC_PROFILEREGION(name) RENDERDOC_ProfileRegion profile##__LINE__(name); + +#endif + +#if defined(RENDERDOC_PLATFORM_WIN32) +#define RENDERDOC_PROFILEFUNCTION() RENDERDOC_PROFILEREGION(__FUNCSIG__); +#else +#define RENDERDOC_PROFILEFUNCTION() RENDERDOC_PROFILEREGION(__PRETTY_FUNCTION__); +#endif + +#endif diff --git a/renderdoc/core/core.cpp b/renderdoc/core/core.cpp index 3596a1fdb..360e21610 100644 --- a/renderdoc/core/core.cpp +++ b/renderdoc/core/core.cpp @@ -37,6 +37,7 @@ #include "serialise/serialiser.h" #include "stb/stb_image_write.h" #include "strings/string_utils.h" +#include "superluminal/superluminal.h" #include "crash_handler.h" #include "api/replay/renderdoc_tostr.inl" @@ -353,6 +354,10 @@ void RenderDoc::Initialise() Threading::Init(); +#if !RENDERDOC_STABLE_BUILD + Superluminal::Init(); +#endif + m_RemoteIdent = 0; m_RemoteThread = 0; diff --git a/renderdoc/renderdoc.vcxproj b/renderdoc/renderdoc.vcxproj index c52671c72..68d561bee 100644 --- a/renderdoc/renderdoc.vcxproj +++ b/renderdoc/renderdoc.vcxproj @@ -143,6 +143,8 @@ + + @@ -351,6 +353,7 @@ true false + NotUsing diff --git a/renderdoc/renderdoc.vcxproj.filters b/renderdoc/renderdoc.vcxproj.filters index 82568b6b0..708839d70 100644 --- a/renderdoc/renderdoc.vcxproj.filters +++ b/renderdoc/renderdoc.vcxproj.filters @@ -142,6 +142,9 @@ {3d212b9b-bf42-40db-84a3-b94e064fd281} + + {11053d6b-5b03-44ff-80f3-088d34c66b0a} + {1b49d2aa-1cfb-4f0a-8fcf-1065af55ea2b} @@ -552,6 +555,12 @@ API\Replay + + 3rdparty\superluminal + + + 3rdparty\superluminal + @@ -959,6 +968,9 @@ 3rdparty\compressonator + + 3rdparty\superluminal + diff --git a/renderdoc/replay/entry_points.cpp b/renderdoc/replay/entry_points.cpp index ed8097111..3276b54d1 100644 --- a/renderdoc/replay/entry_points.cpp +++ b/renderdoc/replay/entry_points.cpp @@ -34,6 +34,7 @@ #include "miniz/miniz.h" #include "replay/replay_driver.h" #include "strings/string_utils.h" +#include "superluminal/superluminal.h" // these entry points are for the replay/analysis side - not for the application. @@ -984,3 +985,13 @@ extern "C" RENDERDOC_API int RENDERDOC_CC RENDERDOC_RunFunctionalTests(int pytho return mainFunc((int)wideArgStrings.size(), wideArgStrings.data()); } + +extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_BeginProfileRegion(const rdcstr &name) +{ + Superluminal::BeginProfileRange(name); +} + +extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_EndProfileRegion() +{ + Superluminal::EndProfileRange(); +} diff --git a/util/installer/LICENSE.rtf b/util/installer/LICENSE.rtf index 20afad73f..d466ec60a 100644 --- a/util/installer/LICENSE.rtf +++ b/util/installer/LICENSE.rtf @@ -39,5 +39,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI {\field{\*\fldinst{HYPERLINK "{\pntext\f1\'B7\tab}https://github.com/GPUOpen-Tools/compressonator/"}}{\fldrslt{\ul\cf1 https://github.com/GPUOpen-Tools/compressonator}}}\f0\fs22\line Compressonator distributed under the MIT License. Copyright (c) 2018 Advanced Micro Devices, Inc. Copyright (c) 2004-2006 ATI Technologies Inc. Distributed under the MIT License.\par {\field{\*\fldinst{HYPERLINK "{\pntext\f1\'B7\tab}http://download.nvidia.com/XFree86/nvapi-open-source-sdk/"}}{\fldrslt{\ul\cf1 http://download.nvidia.com/XFree86/nvapi-open-source-sdk}}}\f0\fs22\line nvapi open source SDK distributed under the MIT License. Copyright (c) 2019, NVIDIA CORPORATION.\par {\field{\*\fldinst{HYPERLINK "{\pntext\f1\'B7\tab}http://half.sourceforge.net/"}}{\fldrslt{\ul\cf1 http://half.sourceforge.net/}}}\f0\fs22\line half.hpp distributed under the MIT License. Copyright (c) 2012-2019 Christian Rau.\par +{\field{\*\fldinst{HYPERLINK "{\pntext\f1\'B7\tab}https://superluminal.eu/"}}{\fldrslt{\ul\cf1 https://superluminal.eu/}}}\f0\fs22\line Superluminal distributed under the BSD License. Copyright (c) 2019-2020 Superluminal.\par }