Add Chromium-only Blender WebEngine parity work
This commit is contained in:
25
blender-5.2.0/intern/renderdoc_dynload/CMakeLists.txt
Normal file
25
blender-5.2.0/intern/renderdoc_dynload/CMakeLists.txt
Normal file
@@ -0,0 +1,25 @@
|
||||
# SPDX-FileCopyrightText: 2023 Blender Authors
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
set(INC
|
||||
include
|
||||
../../extern/renderdoc/include
|
||||
)
|
||||
|
||||
set(INC_SYS
|
||||
)
|
||||
|
||||
set(SRC
|
||||
intern/renderdoc_api.cc
|
||||
|
||||
include/renderdoc_api.hh
|
||||
|
||||
# Without these files listed, they aren't known to CMake.
|
||||
../../extern/renderdoc/include/renderdoc_app.h
|
||||
)
|
||||
|
||||
set(LIB
|
||||
)
|
||||
|
||||
blender_add_lib(bf_intern_renderdoc_dynload "${SRC}" "${INC}" "${INC_SYS}" "${LIB}")
|
||||
@@ -0,0 +1,48 @@
|
||||
/* SPDX-FileCopyrightText: 2023 Blender Authors
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "renderdoc_app.h"
|
||||
|
||||
namespace renderdoc::api {
|
||||
class Renderdoc {
|
||||
private:
|
||||
enum class State {
|
||||
/**
|
||||
* Initial state of the API indicating that the API hasn't checked if it can find renderdoc.
|
||||
*/
|
||||
UNINITIALIZED,
|
||||
|
||||
/**
|
||||
* API has looked for renderdoc, but couldn't find it. This indicates that renderdoc isn't
|
||||
* available on the platform, or wasn't registered correctly.
|
||||
*/
|
||||
NOT_FOUND,
|
||||
|
||||
/**
|
||||
* API has loaded the symbols of renderdoc.
|
||||
*/
|
||||
LOADED,
|
||||
};
|
||||
State state_ = State::UNINITIALIZED;
|
||||
RENDERDOC_API_1_6_0 *renderdoc_api_ = nullptr;
|
||||
|
||||
public:
|
||||
bool start_frame_capture(RENDERDOC_DevicePointer device_handle,
|
||||
RENDERDOC_WindowHandle window_handle);
|
||||
void end_frame_capture(RENDERDOC_DevicePointer device_handle,
|
||||
RENDERDOC_WindowHandle window_handle);
|
||||
void set_frame_capture_title(const char *capture_title);
|
||||
|
||||
private:
|
||||
/**
|
||||
* Check if renderdoc has been loaded.
|
||||
*
|
||||
* When not loaded it tries to load the API, but only tries to do it once.
|
||||
*/
|
||||
bool check_loaded();
|
||||
void load();
|
||||
};
|
||||
} // namespace renderdoc::api
|
||||
@@ -0,0 +1,76 @@
|
||||
/* SPDX-FileCopyrightText: 2023 Blender Authors
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
|
||||
#include "renderdoc_api.hh"
|
||||
|
||||
#ifdef _WIN32
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
# include <Windows.h>
|
||||
#else
|
||||
# include <dlfcn.h>
|
||||
#endif
|
||||
#include <iostream>
|
||||
|
||||
namespace renderdoc::api {
|
||||
bool Renderdoc::start_frame_capture(RENDERDOC_DevicePointer device_handle,
|
||||
RENDERDOC_WindowHandle window_handle)
|
||||
{
|
||||
if (!check_loaded()) {
|
||||
return false;
|
||||
}
|
||||
renderdoc_api_->StartFrameCapture(device_handle, window_handle);
|
||||
return true;
|
||||
}
|
||||
|
||||
void Renderdoc::end_frame_capture(RENDERDOC_DevicePointer device_handle,
|
||||
RENDERDOC_WindowHandle window_handle)
|
||||
|
||||
{
|
||||
if (!check_loaded()) {
|
||||
return;
|
||||
}
|
||||
renderdoc_api_->EndFrameCapture(device_handle, window_handle);
|
||||
}
|
||||
|
||||
void Renderdoc::set_frame_capture_title(const char *title)
|
||||
{
|
||||
if (!check_loaded()) {
|
||||
return;
|
||||
}
|
||||
renderdoc_api_->SetCaptureTitle(title);
|
||||
}
|
||||
|
||||
bool Renderdoc::check_loaded()
|
||||
{
|
||||
switch (state_) {
|
||||
case State::UNINITIALIZED:
|
||||
load();
|
||||
return renderdoc_api_ != nullptr;
|
||||
break;
|
||||
case State::NOT_FOUND:
|
||||
return false;
|
||||
case State::LOADED:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void Renderdoc::load()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (HMODULE mod = GetModuleHandleA("renderdoc.dll")) {
|
||||
pRENDERDOC_GetAPI RENDERDOC_GetAPI = (pRENDERDOC_GetAPI)GetProcAddress(mod,
|
||||
"RENDERDOC_GetAPI");
|
||||
RENDERDOC_GetAPI(eRENDERDOC_API_Version_1_1_2, (void **)&renderdoc_api_);
|
||||
}
|
||||
#else
|
||||
if (void *mod = dlopen("librenderdoc.so", RTLD_NOW | RTLD_NOLOAD)) {
|
||||
pRENDERDOC_GetAPI RENDERDOC_GetAPI = (pRENDERDOC_GetAPI)dlsym(mod, "RENDERDOC_GetAPI");
|
||||
RENDERDOC_GetAPI(eRENDERDOC_API_Version_1_1_2, (void **)&renderdoc_api_);
|
||||
}
|
||||
#endif
|
||||
state_ = (renderdoc_api_) ? State::LOADED : State::NOT_FOUND;
|
||||
}
|
||||
|
||||
} // namespace renderdoc::api
|
||||
Reference in New Issue
Block a user