mirror of
https://github.com/Xaymar/obs-StreamFX
synced 2024-11-23 20:05:11 +00:00
project: Improve performance profiling support
Adds a new CMake option "ENABLE_PROFILING" which enables all CPU and GPU performance profiling available in StreamFX for tracking what's actually causing things to be slow.
This commit is contained in:
parent
071760b867
commit
49f1cbc15e
21 changed files with 322 additions and 91 deletions
|
@ -230,7 +230,9 @@ else()
|
|||
set(ENABLE_SOURCE_SHADER TRUE)
|
||||
set(ENABLE_TRANSITION_SHADER TRUE)
|
||||
endif()
|
||||
## Encoders
|
||||
set(${PropertyPrefix}ENABLE_ENCODER_FFMPEG ${ENABLE_ENCODER_FFMPEG} CACHE BOOL "Enable FFmpeg Encoder")
|
||||
## Filters
|
||||
set(${PropertyPrefix}ENABLE_FILTER_BLUR ${ENABLE_FILTER_BLUR} CACHE BOOL "Enable Blur Filter")
|
||||
set(${PropertyPrefix}ENABLE_FILTER_COLOR_GRADE ${ENABLE_FILTER_COLOR_GRADE} CACHE BOOL "Enable Color Grade Filter")
|
||||
set(${PropertyPrefix}ENABLE_FILTER_DISPLACEMENT ${ENABLE_FILTER_DISPLACEMENT} CACHE BOOL "Enable Displacement Filter")
|
||||
|
@ -239,9 +241,13 @@ set(${PropertyPrefix}ENABLE_FILTER_NVIDIA_FACE_TRACKING ${ENABLE_FILTER_NVIDIA_F
|
|||
set(${PropertyPrefix}ENABLE_FILTER_SDF_EFFECTS ${ENABLE_FILTER_SDF_EFFECTS} CACHE BOOL "Enable SDF Effects Filter")
|
||||
set(${PropertyPrefix}ENABLE_FILTER_SHADER ${ENABLE_FILTER_SHADER} CACHE BOOL "Enable Shader Filter")
|
||||
set(${PropertyPrefix}ENABLE_FILTER_TRANSFORM ${ENABLE_FILTER_TRANSFORM} CACHE BOOL "Enable Transform Filter")
|
||||
## Sources
|
||||
set(${PropertyPrefix}ENABLE_SOURCE_MIRROR ${ENABLE_SOURCE_MIRROR} CACHE BOOL "Enable Mirror Source")
|
||||
set(${PropertyPrefix}ENABLE_SOURCE_SHADER ${ENABLE_SOURCE_SHADER} CACHE BOOL "Enable Shader Source")
|
||||
## Transitions
|
||||
set(${PropertyPrefix}ENABLE_TRANSITION_SHADER ${ENABLE_TRANSITION_SHADER} CACHE BOOL "Enable Shader Transition")
|
||||
## Debugging
|
||||
set(${PropertyPrefix}ENABLE_PROFILING FALSE CACHE BOOL "Enable CPU and GPU performance tracking, which has a non-zero overhead at all times. Do not enable this for release builds.")
|
||||
|
||||
################################################################################
|
||||
# CMake / Compiler Dependencies
|
||||
|
@ -806,6 +812,13 @@ if(${PropertyPrefix}ENABLE_TRANSITION_SHADER)
|
|||
)
|
||||
endif()
|
||||
|
||||
## Features - Performance Profiling
|
||||
if(${PropertyPrefix}ENABLE_PROFILING)
|
||||
list(APPEND PROJECT_DEFINITIONS
|
||||
ENABLE_PROFILING
|
||||
)
|
||||
endif()
|
||||
|
||||
## Parts
|
||||
if(REQUIRE_SHADER_CODE)
|
||||
list(APPEND PROJECT_PRIVATE_SOURCE
|
||||
|
|
|
@ -367,13 +367,17 @@ void blur_instance::video_render(gs_effect_t* effect)
|
|||
return;
|
||||
}
|
||||
|
||||
auto gdm =
|
||||
gs::debug_marker(gs::debug_color_azure_radiance, "%s '%s'", __FUNCTION_SIG__, obs_source_get_name(_self));
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdmp{gs::debug_color_source, "Blur '%s'", obs_source_get_name(_self)};
|
||||
#endif
|
||||
|
||||
if (!_source_rendered) {
|
||||
// Source To Texture
|
||||
{
|
||||
auto gdm = gs::debug_marker(gs::debug_color_cache, "Cache");
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_cache, "Cache"};
|
||||
#endif
|
||||
|
||||
if (obs_source_process_filter_begin(this->_self, GS_RGBA, OBS_ALLOW_DIRECT_RENDERING)) {
|
||||
{
|
||||
auto op = this->_source_rt->render(baseW, baseH);
|
||||
|
@ -419,12 +423,21 @@ void blur_instance::video_render(gs_effect_t* effect)
|
|||
}
|
||||
|
||||
if (!_output_rendered) {
|
||||
_blur->set_input(_source_texture);
|
||||
_output_texture = _blur->render();
|
||||
{
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_convert, "Blur"};
|
||||
#endif
|
||||
|
||||
_blur->set_input(_source_texture);
|
||||
_output_texture = _blur->render();
|
||||
}
|
||||
|
||||
// Mask
|
||||
if (_mask.enabled) {
|
||||
auto gdm = gs::debug_marker(gs::debug_color_convert, "Mask");
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_convert, "Mask"};
|
||||
#endif
|
||||
|
||||
gs_blend_state_push();
|
||||
gs_reset_blend_state();
|
||||
gs_enable_color(true, true, true, true);
|
||||
|
@ -479,6 +492,11 @@ void blur_instance::video_render(gs_effect_t* effect)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_capture, "Capture '%s'",
|
||||
obs_source_get_name(_mask.source.source_texture->get_object())};
|
||||
#endif
|
||||
|
||||
this->_mask.source.texture = this->_mask.source.source_texture->render(source_width, source_height);
|
||||
}
|
||||
|
||||
|
@ -510,7 +528,10 @@ void blur_instance::video_render(gs_effect_t* effect)
|
|||
|
||||
// Draw source
|
||||
{
|
||||
auto gdm = gs::debug_marker(gs::debug_color_render, "Render");
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_render, "Render"};
|
||||
#endif
|
||||
|
||||
// It is important that we do not modify the blend state here, as it is set correctly by OBS
|
||||
gs_set_cull_mode(GS_NEITHER);
|
||||
gs_enable_color(true, true, true, true);
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include "filter-color-grade.hpp"
|
||||
#include "strings.hpp"
|
||||
#include <stdexcept>
|
||||
#include "obs/gs/gs-helper.hpp"
|
||||
#include "util-math.hpp"
|
||||
|
||||
// OBS
|
||||
|
@ -186,7 +187,15 @@ void color_grade_instance::video_render(gs_effect_t* effect)
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdmp{gs::debug_color_source, "Color Grading '%s'", obs_source_get_name(_self)};
|
||||
#endif
|
||||
|
||||
if (!_source_updated) {
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_cache, "Cache"};
|
||||
#endif
|
||||
|
||||
if (obs_source_process_filter_begin(_self, GS_RGBA, OBS_ALLOW_DIRECT_RENDERING)) {
|
||||
auto op = _rt_source->render(width, height);
|
||||
gs_blend_state_push();
|
||||
|
@ -207,6 +216,10 @@ void color_grade_instance::video_render(gs_effect_t* effect)
|
|||
}
|
||||
|
||||
if (!_grade_updated) {
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_convert, "Calculate"};
|
||||
#endif
|
||||
|
||||
{
|
||||
auto op = _rt_grade->render(width, height);
|
||||
gs_blend_state_push();
|
||||
|
@ -245,6 +258,10 @@ void color_grade_instance::video_render(gs_effect_t* effect)
|
|||
|
||||
// Render final result.
|
||||
{
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_render, "Render"};
|
||||
#endif
|
||||
|
||||
auto shader = obs_get_base_effect(OBS_EFFECT_DEFAULT);
|
||||
gs_enable_depth_test(false);
|
||||
while (gs_effect_loop(shader, "Draw")) {
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include "strings.hpp"
|
||||
#include <stdexcept>
|
||||
#include <sys/stat.h>
|
||||
#include "obs/gs/gs-helper.hpp"
|
||||
|
||||
#define ST "Filter.Displacement"
|
||||
#define ST_FILE "Filter.Displacement.File"
|
||||
|
@ -95,6 +96,11 @@ void displacement_instance::video_render(gs_effect_t*)
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdmp{gs::debug_color_source, "Displacement Mapping '%s' on '%s'", obs_source_get_name(_self),
|
||||
obs_source_get_name(obs_filter_get_parent(_self))};
|
||||
#endif
|
||||
|
||||
if (!obs_source_process_filter_begin(_self, GS_RGBA, OBS_ALLOW_DIRECT_RENDERING)) {
|
||||
obs_source_skip_video_filter(_self);
|
||||
return;
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <sstream>
|
||||
#include <stdexcept>
|
||||
#include <vector>
|
||||
#include "obs/gs/gs-helper.hpp"
|
||||
|
||||
// Filter to allow dynamic masking
|
||||
// Allow any channel to affect any other channel
|
||||
|
@ -201,10 +202,19 @@ void dynamic_mask_instance::video_render(gs_effect_t* in_effect)
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdmp{gs::debug_color_source, "Dynamic Mask '%s' on '%s'", obs_source_get_name(_self),
|
||||
obs_source_get_name(obs_filter_get_parent(_self))};
|
||||
#endif
|
||||
|
||||
gs_effect_t* default_effect = obs_get_base_effect(obs_base_effect::OBS_EFFECT_DEFAULT);
|
||||
|
||||
try { // Capture filter and input
|
||||
if (!_have_filter_texture) {
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_cache, "Cache"};
|
||||
#endif
|
||||
|
||||
if (obs_source_process_filter_begin(_self, GS_RGBA, OBS_ALLOW_DIRECT_RENDERING)) {
|
||||
auto op = _filter_rt->render(width, height);
|
||||
|
||||
|
@ -237,12 +247,21 @@ void dynamic_mask_instance::video_render(gs_effect_t* in_effect)
|
|||
}
|
||||
|
||||
if (!_have_input_texture) {
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_capture, "Capture '%s'",
|
||||
obs_source_get_name(_input_capture->get_object())};
|
||||
#endif
|
||||
|
||||
_input_texture = _input_capture->render(_input->width(), _input->height());
|
||||
_have_input_texture = true;
|
||||
}
|
||||
|
||||
// Draw source
|
||||
if (!_have_final_texture) {
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_convert, "Masking"};
|
||||
#endif
|
||||
|
||||
{
|
||||
auto op = _final_rt->render(width, height);
|
||||
|
||||
|
@ -296,6 +315,10 @@ void dynamic_mask_instance::video_render(gs_effect_t* in_effect)
|
|||
|
||||
// Draw source
|
||||
{
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_render, "Render"};
|
||||
#endif
|
||||
|
||||
// It is important that we do not modify the blend state here, as it is set correctly by OBS
|
||||
gs_set_cull_mode(GS_NEITHER);
|
||||
gs_enable_color(true, true, true, true);
|
||||
|
|
|
@ -79,7 +79,7 @@ face_tracking_instance::face_tracking_instance(obs_data_t* settings, obs_source_
|
|||
minPrio + ((maxPrio - minPrio) / 2));
|
||||
}
|
||||
|
||||
#ifdef _DEBUG
|
||||
#ifdef ENABLE_PROFILING
|
||||
// Profiling
|
||||
_profile_capture = util::profiler::create();
|
||||
_profile_capture_realloc = util::profiler::create();
|
||||
|
@ -247,10 +247,10 @@ void face_tracking_instance::async_track(std::shared_ptr<void> ptr)
|
|||
|
||||
// Check if things exist as planned.
|
||||
if (!_ar_texture || (_ar_texture->get_width() != _size.first) || (_ar_texture->get_height() != _size.second)) {
|
||||
#ifdef _DEBUG
|
||||
auto prof = _profile_capture_realloc->track();
|
||||
#endif
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto prof = _profile_capture_realloc->track();
|
||||
gs::debug_marker marker{gs::debug_color_allocate, "Reallocate GPU Buffer"};
|
||||
#endif
|
||||
|
||||
_ar_texture =
|
||||
std::make_shared<gs::texture>(_size.first, _size.second, GS_RGBA, 1, nullptr, gs::texture::flags::None);
|
||||
|
@ -258,10 +258,10 @@ void face_tracking_instance::async_track(std::shared_ptr<void> ptr)
|
|||
}
|
||||
|
||||
{ // Copy texture
|
||||
#ifdef _DEBUG
|
||||
auto prof = _profile_capture_copy->track();
|
||||
#endif
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto prof = _profile_capture_copy->track();
|
||||
gs::debug_marker marker{gs::debug_color_copy, "Copy Capture", obs_source_get_name(_self)};
|
||||
#endif
|
||||
|
||||
gs_copy_texture(_ar_texture->get_object(), _rt->get_texture()->get_object());
|
||||
}
|
||||
|
@ -279,17 +279,19 @@ void face_tracking_instance::async_track(std::shared_ptr<void> ptr)
|
|||
return;
|
||||
}
|
||||
|
||||
// Acquire GS context.
|
||||
gs::context gctx;
|
||||
|
||||
// Update the current CUDA context for working.
|
||||
auto cctx = std::make_shared<::nvidia::cuda::context_stack>(_cuda, _cuda_ctx);
|
||||
|
||||
// Refresh any now broken buffers.
|
||||
if (!_ar_texture_cuda_fresh) {
|
||||
#ifdef _DEBUG
|
||||
auto prof = _profile_ar_realloc->track();
|
||||
#endif
|
||||
gs::context gctx;
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto prof = _profile_ar_realloc->track();
|
||||
gs::debug_marker marker{gs::debug_color_allocate, "%s: Reallocate CUDA Buffers",
|
||||
obs_source_get_name(_self)};
|
||||
#endif
|
||||
|
||||
// Assign new texture and allocate new memory.
|
||||
std::size_t pitch = _size.first * 4ul;
|
||||
|
@ -320,10 +322,9 @@ void face_tracking_instance::async_track(std::shared_ptr<void> ptr)
|
|||
}
|
||||
|
||||
{ // Copy from CUDA array to CUDA device memory.
|
||||
#ifdef _DEBUG
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto prof = _profile_ar_copy->track();
|
||||
#endif
|
||||
gs::context gctx;
|
||||
|
||||
::nvidia::cuda::cu_memcpy2d_t mc;
|
||||
mc.src_x_in_bytes = 0;
|
||||
|
@ -350,10 +351,10 @@ void face_tracking_instance::async_track(std::shared_ptr<void> ptr)
|
|||
}
|
||||
|
||||
{ // Convert from RGBA 32-bit to BGR 24-bit.
|
||||
#ifdef _DEBUG
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto prof = _profile_ar_transfer->track();
|
||||
#endif
|
||||
gs::context gctx;
|
||||
|
||||
if (NvCV_Status res =
|
||||
_ar_library->image_transfer(&_ar_image, &_ar_image_bgr, 1.0,
|
||||
reinterpret_cast<CUstream_st*>(_cuda_stream->get()), &_ar_image_temp);
|
||||
|
@ -364,10 +365,10 @@ void face_tracking_instance::async_track(std::shared_ptr<void> ptr)
|
|||
}
|
||||
|
||||
{ // Track any faces.
|
||||
#ifdef _DEBUG
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto prof = _profile_ar_run->track();
|
||||
#endif
|
||||
gs::context gctx;
|
||||
|
||||
if (NvCV_Status res = _ar_library->run(_ar_feature.get()); res != NVCV_SUCCESS) {
|
||||
LOG_ERROR("<%s> Failed to run tracking.", obs_source_get_name(_self));
|
||||
return;
|
||||
|
@ -377,9 +378,10 @@ void face_tracking_instance::async_track(std::shared_ptr<void> ptr)
|
|||
if ((_ar_bboxes.num_boxes == 0) || (_ar_bboxes_confidence.at(0) < 0.5)) {
|
||||
// Not confident enough or not tracking anything, return to full frame after a bit.
|
||||
} else {
|
||||
#ifdef _DEBUG
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto prof = _profile_ar_calc->track();
|
||||
#endif
|
||||
|
||||
double_t aspect = double_t(_size.first) / double_t(_size.second);
|
||||
|
||||
// Store values and center.
|
||||
|
@ -482,35 +484,49 @@ void face_tracking_instance::video_tick(float_t seconds)
|
|||
|
||||
void face_tracking_instance::video_render(gs_effect_t* effect)
|
||||
{
|
||||
gs::debug_marker gdm_main{gs::debug_color_source, "%s", obs_source_get_name(_self)};
|
||||
obs_source_t* filter_parent = obs_filter_get_parent(_self);
|
||||
obs_source_t* filter_target = obs_filter_get_target(_self);
|
||||
gs_effect_t* default_effect = obs_get_base_effect(OBS_EFFECT_DEFAULT);
|
||||
obs_source_t* filter_parent = obs_filter_get_parent(_self);
|
||||
obs_source_t* filter_target = obs_filter_get_target(_self);
|
||||
gs_effect_t* default_effect = obs_get_base_effect(OBS_EFFECT_DEFAULT);
|
||||
|
||||
if (!filter_parent || !filter_target || !_size.first || !_size.second || !_ar_loaded) {
|
||||
obs_source_skip_video_filter(_self);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdmp{gs::debug_color_source, "Nvidia Face Tracking '%s' on '%s'", obs_source_get_name(_self),
|
||||
obs_source_get_name(obs_filter_get_parent(_self))};
|
||||
#endif
|
||||
|
||||
if (!_rt_is_fresh) { // Capture the filter stack "below" us.
|
||||
#ifdef _DEBUG
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto prof = _profile_capture->track();
|
||||
#endif
|
||||
gs::debug_marker marker{gs::debug_color_capture, "Capture"};
|
||||
if (obs_source_process_filter_begin(_self, _rt->get_color_format(), OBS_ALLOW_DIRECT_RENDERING)) {
|
||||
auto op = _rt->render(_size.first, _size.second);
|
||||
vec4 clr = {0., 0., 0., 0.};
|
||||
|
||||
gs_ortho(0., static_cast<float_t>(_size.first), 0., static_cast<float_t>(_size.second), 0., 1.);
|
||||
gs_clear(GS_CLEAR_COLOR, &clr, 0., 0.);
|
||||
{
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_cache, "Cache"};
|
||||
#endif
|
||||
|
||||
obs_source_process_filter_tech_end(_self, default_effect, _size.first, _size.second, "Draw");
|
||||
} else {
|
||||
obs_source_skip_video_filter(_self);
|
||||
return;
|
||||
if (obs_source_process_filter_begin(_self, _rt->get_color_format(), OBS_ALLOW_DIRECT_RENDERING)) {
|
||||
auto op = _rt->render(_size.first, _size.second);
|
||||
vec4 clr = {0., 0., 0., 0.};
|
||||
|
||||
gs_ortho(0., static_cast<float_t>(_size.first), 0., static_cast<float_t>(_size.second), 0., 1.);
|
||||
gs_clear(GS_CLEAR_COLOR, &clr, 0., 0.);
|
||||
|
||||
obs_source_process_filter_tech_end(_self, default_effect, _size.first, _size.second, "Draw");
|
||||
} else {
|
||||
obs_source_skip_video_filter(_self);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (_ar_tracked) {
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_convert, "Trigger Async Tracking Task"};
|
||||
#endif
|
||||
|
||||
async_track(nullptr);
|
||||
refresh_geometry();
|
||||
}
|
||||
|
@ -518,18 +534,22 @@ void face_tracking_instance::video_render(gs_effect_t* effect)
|
|||
_rt_is_fresh = true;
|
||||
}
|
||||
|
||||
// Draw Texture
|
||||
gs::debug_marker marker{gs::debug_color_render, "Render"};
|
||||
gs_effect_set_texture(gs_effect_get_param_by_name(effect ? effect : default_effect, "image"),
|
||||
_rt->get_texture()->get_object());
|
||||
gs_load_vertexbuffer(_roi_geom->update());
|
||||
while (gs_effect_loop(effect ? effect : default_effect, "Draw")) {
|
||||
gs_draw(gs_draw_mode::GS_TRISTRIP, 0, _roi_geom->size());
|
||||
{ // Draw Texture
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_render, "Render"};
|
||||
#endif
|
||||
|
||||
gs_effect_set_texture(gs_effect_get_param_by_name(effect ? effect : default_effect, "image"),
|
||||
_rt->get_texture()->get_object());
|
||||
gs_load_vertexbuffer(_roi_geom->update());
|
||||
while (gs_effect_loop(effect ? effect : default_effect, "Draw")) {
|
||||
gs_draw(gs_draw_mode::GS_TRISTRIP, 0, _roi_geom->size());
|
||||
}
|
||||
gs_load_vertexbuffer(nullptr);
|
||||
}
|
||||
gs_load_vertexbuffer(nullptr);
|
||||
}
|
||||
|
||||
#ifdef _DEBUG
|
||||
#ifdef ENABLE_PROFILING
|
||||
bool face_tracking_instance::button_profile(obs_properties_t* props, obs_property_t* property)
|
||||
{
|
||||
LOG_INFO("%-22s: %-10s %-10s %-10s %-10s %-10s", "Task", "Total", "Count", "Average", "99.9%ile", "95.0%ile");
|
||||
|
@ -634,7 +654,7 @@ obs_properties_t* face_tracking_factory::get_properties2(face_tracking_instance*
|
|||
}
|
||||
}
|
||||
}
|
||||
#ifdef _DEBUG
|
||||
#ifdef ENABLE_PROFILING
|
||||
{
|
||||
obs_properties_add_button2(
|
||||
pr, "Profile", "Profile",
|
||||
|
|
|
@ -74,7 +74,7 @@ namespace streamfx::filter::nvidia {
|
|||
NvCVImage _ar_image_bgr;
|
||||
NvCVImage _ar_image_temp;
|
||||
|
||||
#ifdef _DEBUG
|
||||
#ifdef ENABLE_PROFILING
|
||||
// Profiling
|
||||
std::shared_ptr<util::profiler> _profile_capture;
|
||||
std::shared_ptr<util::profiler> _profile_capture_realloc;
|
||||
|
@ -114,7 +114,7 @@ namespace streamfx::filter::nvidia {
|
|||
|
||||
virtual void video_render(gs_effect_t* effect) override;
|
||||
|
||||
#ifdef _DEBUG
|
||||
#ifdef ENABLE_PROFILING
|
||||
bool button_profile(obs_properties_t* props, obs_property_t* property);
|
||||
#endif
|
||||
};
|
||||
|
|
|
@ -281,6 +281,11 @@ void sdf_effects_instance::video_render(gs_effect_t* effect)
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdmp{gs::debug_color_source, "SDF Effects '%s' on '%s'", obs_source_get_name(_self),
|
||||
obs_source_get_name(obs_filter_get_parent(_self))};
|
||||
#endif
|
||||
|
||||
auto gctx = gs::context();
|
||||
vec4 color_transparent = {0, 0, 0, 0};
|
||||
|
||||
|
@ -302,6 +307,10 @@ void sdf_effects_instance::video_render(gs_effect_t* effect)
|
|||
if (!_source_rendered) {
|
||||
// Store input texture.
|
||||
{
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_cache, "Cache"};
|
||||
#endif
|
||||
|
||||
auto op = _source_rt->render(baseW, baseH);
|
||||
gs_ortho(0, (float)baseW, 0, (float)baseH, -1, 1);
|
||||
gs_clear(GS_CLEAR_COLOR | GS_CLEAR_DEPTH, &color_transparent, 0, 0);
|
||||
|
@ -340,6 +349,10 @@ void sdf_effects_instance::video_render(gs_effect_t* effect)
|
|||
}
|
||||
|
||||
{
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_convert, "Update Distance Field"};
|
||||
#endif
|
||||
|
||||
auto op = _sdf_write->render(uint32_t(sdfW), uint32_t(sdfH));
|
||||
gs_ortho(0, (float)sdfW, 0, (float)sdfH, -1, 1);
|
||||
gs_clear(GS_CLEAR_COLOR | GS_CLEAR_DEPTH, &color_transparent, 0, 0);
|
||||
|
@ -394,6 +407,10 @@ void sdf_effects_instance::video_render(gs_effect_t* effect)
|
|||
|
||||
// Optimized Render path.
|
||||
try {
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_convert, "Calculate"};
|
||||
#endif
|
||||
|
||||
auto op = _output_rt->render(baseW, baseH);
|
||||
gs_ortho(0, 1, 0, 1, 0, 1);
|
||||
|
||||
|
@ -486,12 +503,18 @@ void sdf_effects_instance::video_render(gs_effect_t* effect)
|
|||
return;
|
||||
}
|
||||
|
||||
gs_eparam_t* ep = gs_effect_get_param_by_name(final_effect, "image");
|
||||
if (ep) {
|
||||
gs_effect_set_texture(ep, _output_texture->get_object());
|
||||
}
|
||||
while (gs_effect_loop(final_effect, "Draw")) {
|
||||
gs_draw_sprite(0, 0, baseW, baseH);
|
||||
{
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_render, "Render"};
|
||||
#endif
|
||||
|
||||
gs_eparam_t* ep = gs_effect_get_param_by_name(final_effect, "image");
|
||||
if (ep) {
|
||||
gs_effect_set_texture(ep, _output_texture->get_object());
|
||||
}
|
||||
while (gs_effect_loop(final_effect, "Draw")) {
|
||||
gs_draw_sprite(0, 0, baseW, baseH);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -85,9 +85,17 @@ void shader_instance::video_render(gs_effect_t* effect)
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdmp{gs::debug_color_source, "Shader Filter '%s' on '%s'", obs_source_get_name(_self),
|
||||
obs_source_get_name(obs_filter_get_parent(_self))};
|
||||
#endif
|
||||
|
||||
{
|
||||
gs::debug_marker _marker_cache{gs::debug_color_source, "%s: Capture", obs_source_get_name(_self)};
|
||||
auto op = _rt->render(_fx->width(), _fx->height());
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_source, "Cache"};
|
||||
#endif
|
||||
|
||||
auto op = _rt->render(_fx->width(), _fx->height());
|
||||
|
||||
gs_ortho(0, static_cast<float_t>(_fx->width()), 0, static_cast<float_t>(_fx->height()), -1, 1);
|
||||
|
||||
|
@ -116,7 +124,9 @@ void shader_instance::video_render(gs_effect_t* effect)
|
|||
}
|
||||
|
||||
{
|
||||
gs::debug_marker _marker_cache{gs::debug_color_render, "%s: Render", obs_source_get_name(_self)};
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_render, "Render"};
|
||||
#endif
|
||||
|
||||
_fx->prepare_render();
|
||||
_fx->set_input_a(_rt->get_texture());
|
||||
|
|
|
@ -286,7 +286,10 @@ void transform_instance::video_render(gs_effect_t* effect)
|
|||
return;
|
||||
}
|
||||
|
||||
gs::debug_marker marker{gs::debug_color_source, "3D Transform: %s", obs_source_get_name(_self)};
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdmp{gs::debug_color_source, "3D Transform '%s' on '%s'", obs_source_get_name(_self),
|
||||
obs_source_get_name(obs_filter_get_parent(_self))};
|
||||
#endif
|
||||
|
||||
std::uint32_t cache_width = base_width;
|
||||
std::uint32_t cache_height = base_height;
|
||||
|
@ -310,8 +313,11 @@ void transform_instance::video_render(gs_effect_t* effect)
|
|||
}
|
||||
|
||||
if (!_cache_rendered) {
|
||||
gs::debug_marker _marker_cache{gs::debug_color_cache, "Cache"};
|
||||
auto op = _cache_rt->render(cache_width, cache_height);
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_cache, "Cache"};
|
||||
#endif
|
||||
|
||||
auto op = _cache_rt->render(cache_width, cache_height);
|
||||
|
||||
gs_ortho(0, static_cast<float_t>(base_width), 0, static_cast<float_t>(base_height), -1, 1);
|
||||
|
||||
|
@ -347,13 +353,18 @@ void transform_instance::video_render(gs_effect_t* effect)
|
|||
}
|
||||
|
||||
if (_mipmap_enabled) {
|
||||
gs::debug_marker _marker_mipmap{gs::debug_color_convert, "Mipmap"};
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_convert, "Mipmap"};
|
||||
#endif
|
||||
|
||||
if (!_mipmap_texture || (_mipmap_texture->get_width() != cache_width)
|
||||
|| (_mipmap_texture->get_height() != cache_height)) {
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdr{gs::debug_color_allocate, "Allocate Mipmapped Texture"};
|
||||
#endif
|
||||
|
||||
std::size_t mip_levels = std::max(util::math::get_power_of_two_exponent_ceil(cache_width),
|
||||
util::math::get_power_of_two_exponent_ceil(cache_height));
|
||||
|
||||
_mipmap_texture = std::make_shared<gs::texture>(cache_width, cache_height, GS_RGBA, mip_levels, nullptr,
|
||||
gs::texture::flags::None);
|
||||
}
|
||||
|
@ -367,8 +378,11 @@ void transform_instance::video_render(gs_effect_t* effect)
|
|||
}
|
||||
|
||||
{
|
||||
gs::debug_marker _marker_draw{gs::debug_color_cache_render, "Geometry"};
|
||||
auto op = _source_rt->render(base_width, base_height);
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_convert, "Transform"};
|
||||
#endif
|
||||
|
||||
auto op = _source_rt->render(base_width, base_height);
|
||||
|
||||
gs_blend_state_push();
|
||||
gs_reset_blend_state();
|
||||
|
@ -412,7 +426,10 @@ void transform_instance::video_render(gs_effect_t* effect)
|
|||
}
|
||||
|
||||
{
|
||||
gs::debug_marker _marker_draw{gs::debug_color_cache_render, "Final"};
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdm{gs::debug_color_render, "Render"};
|
||||
#endif
|
||||
|
||||
gs_effect_set_texture(gs_effect_get_param_by_name(effect, "image"), _source_texture->get_object());
|
||||
while (gs_effect_loop(effect, "Draw")) {
|
||||
gs_draw_sprite(nullptr, 0, base_width, base_height);
|
||||
|
|
|
@ -246,7 +246,10 @@ double_t gfx::blur::box_linear::get_step_scale_y()
|
|||
std::shared_ptr<::gs::texture> gfx::blur::box_linear::render()
|
||||
{
|
||||
auto gctx = gs::context();
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdmp = gs::debug_marker(gs::debug_color_azure_radiance, "Box Linear Blur");
|
||||
#endif
|
||||
|
||||
float_t width = float_t(_input_texture->get_width());
|
||||
float_t height = float_t(_input_texture->get_height());
|
||||
|
@ -275,8 +278,11 @@ std::shared_ptr<::gs::texture> gfx::blur::box_linear::render()
|
|||
effect.get_parameter("pSizeInverseMul").set_float(float_t(1.0f / (float_t(_size) * 2.0f + 1.0f)));
|
||||
|
||||
{
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdm = gs::debug_marker(gs::debug_color_azure_radiance, "Horizontal");
|
||||
auto op = _rendertarget2->render(uint32_t(width), uint32_t(height));
|
||||
#endif
|
||||
|
||||
auto op = _rendertarget2->render(uint32_t(width), uint32_t(height));
|
||||
gs_ortho(0, 1., 0, 1., 0, 1.);
|
||||
while (gs_effect_loop(effect.get_object(), "Draw")) {
|
||||
gs_draw_sprite(nullptr, 0, 1, 1);
|
||||
|
@ -288,8 +294,11 @@ std::shared_ptr<::gs::texture> gfx::blur::box_linear::render()
|
|||
effect.get_parameter("pImageTexel").set_float2(0., float_t(1.f / height));
|
||||
|
||||
{
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdm = gs::debug_marker(gs::debug_color_azure_radiance, "Vertical");
|
||||
auto op = _rendertarget->render(uint32_t(width), uint32_t(height));
|
||||
#endif
|
||||
|
||||
auto op = _rendertarget->render(uint32_t(width), uint32_t(height));
|
||||
gs_ortho(0, 1., 0, 1., 0, 1.);
|
||||
while (gs_effect_loop(effect.get_object(), "Draw")) {
|
||||
gs_draw_sprite(nullptr, 0, 1, 1);
|
||||
|
@ -327,7 +336,10 @@ void gfx::blur::box_linear_directional::set_angle(double_t angle)
|
|||
std::shared_ptr<::gs::texture> gfx::blur::box_linear_directional::render()
|
||||
{
|
||||
auto gctx = gs::context();
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdmp = gs::debug_marker(gs::debug_color_azure_radiance, "Box Linear Directional Blur");
|
||||
#endif
|
||||
|
||||
float_t width = float_t(_input_texture->get_width());
|
||||
float_t height = float_t(_input_texture->get_height());
|
||||
|
|
|
@ -254,7 +254,10 @@ double_t gfx::blur::box::get_step_scale_y()
|
|||
std::shared_ptr<::gs::texture> gfx::blur::box::render()
|
||||
{
|
||||
auto gctx = gs::context();
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdmp = gs::debug_marker(gs::debug_color_azure_radiance, "Box Blur");
|
||||
#endif
|
||||
|
||||
float_t width = float_t(_input_texture->get_width());
|
||||
float_t height = float_t(_input_texture->get_height());
|
||||
|
@ -283,8 +286,11 @@ std::shared_ptr<::gs::texture> gfx::blur::box::render()
|
|||
effect.get_parameter("pSizeInverseMul").set_float(float_t(1.0f / (float_t(_size) * 2.0f + 1.0f)));
|
||||
|
||||
{
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdm = gs::debug_marker(gs::debug_color_azure_radiance, "Horizontal");
|
||||
auto op = _rendertarget2->render(uint32_t(width), uint32_t(height));
|
||||
#endif
|
||||
|
||||
auto op = _rendertarget2->render(uint32_t(width), uint32_t(height));
|
||||
gs_ortho(0, 1., 0, 1., 0, 1.);
|
||||
while (gs_effect_loop(effect.get_object(), "Draw")) {
|
||||
gs_draw_sprite(nullptr, 0, 1, 1);
|
||||
|
@ -296,8 +302,11 @@ std::shared_ptr<::gs::texture> gfx::blur::box::render()
|
|||
effect.get_parameter("pImageTexel").set_float2(0.f, float_t(1.f / height));
|
||||
|
||||
{
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdm = gs::debug_marker(gs::debug_color_azure_radiance, "Vertical");
|
||||
auto op = _rendertarget->render(uint32_t(width), uint32_t(height));
|
||||
#endif
|
||||
|
||||
auto op = _rendertarget->render(uint32_t(width), uint32_t(height));
|
||||
gs_ortho(0, 1., 0, 1., 0, 1.);
|
||||
while (gs_effect_loop(effect.get_object(), "Draw")) {
|
||||
gs_draw_sprite(nullptr, 0, 1, 1);
|
||||
|
@ -335,7 +344,10 @@ void gfx::blur::box_directional::set_angle(double_t angle)
|
|||
std::shared_ptr<::gs::texture> gfx::blur::box_directional::render()
|
||||
{
|
||||
auto gctx = gs::context();
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdmp = gs::debug_marker(gs::debug_color_azure_radiance, "Box Directional Blur");
|
||||
#endif
|
||||
|
||||
float_t width = float_t(_input_texture->get_width());
|
||||
float_t height = float_t(_input_texture->get_height());
|
||||
|
@ -407,7 +419,10 @@ void gfx::blur::box_rotational::set_angle(double_t angle)
|
|||
std::shared_ptr<::gs::texture> gfx::blur::box_rotational::render()
|
||||
{
|
||||
auto gctx = gs::context();
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdmp = gs::debug_marker(gs::debug_color_azure_radiance, "Box Rotational Blur");
|
||||
#endif
|
||||
|
||||
float_t width = float_t(_input_texture->get_width());
|
||||
float_t height = float_t(_input_texture->get_height());
|
||||
|
@ -470,7 +485,10 @@ void gfx::blur::box_zoom::get_center(double_t& x, double_t& y)
|
|||
std::shared_ptr<::gs::texture> gfx::blur::box_zoom::render()
|
||||
{
|
||||
auto gctx = gs::context();
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdmp = gs::debug_marker(gs::debug_color_azure_radiance, "Box Zoom Blur");
|
||||
#endif
|
||||
|
||||
float_t width = float_t(_input_texture->get_width());
|
||||
float_t height = float_t(_input_texture->get_height());
|
||||
|
|
|
@ -229,7 +229,10 @@ void gfx::blur::dual_filtering::get_step_scale(double_t&, double_t&) {}
|
|||
std::shared_ptr<::gs::texture> gfx::blur::dual_filtering::render()
|
||||
{
|
||||
auto gctx = gs::context();
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdmp = gs::debug_marker(gs::debug_color_azure_radiance, "Dual-Filtering Blur");
|
||||
#endif
|
||||
|
||||
auto effect = _data->get_effect();
|
||||
if (!effect) {
|
||||
|
@ -256,14 +259,15 @@ std::shared_ptr<::gs::texture> gfx::blur::dual_filtering::render()
|
|||
|
||||
// Downsample
|
||||
for (std::size_t n = 1; n <= actual_iterations; n++) {
|
||||
// Idx 0 is a simply considered as a straight copy of the original and not rendered to.
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdm = gs::debug_marker(gs::debug_color_azure_radiance, "Down %lld", n);
|
||||
#endif
|
||||
|
||||
// Select Texture
|
||||
std::shared_ptr<gs::texture> tex_cur;
|
||||
if (n > 1) {
|
||||
tex_cur = _rts[n - 1]->get_texture();
|
||||
} else {
|
||||
} else { // Idx 0 is a simply considered as a straight copy of the original and not rendered to.
|
||||
tex_cur = _input_texture;
|
||||
}
|
||||
|
||||
|
@ -292,8 +296,9 @@ std::shared_ptr<::gs::texture> gfx::blur::dual_filtering::render()
|
|||
|
||||
// Upsample
|
||||
for (std::size_t n = actual_iterations; n > 0; n--) {
|
||||
// Idx max is a simply considered as a straight copy of the downscale and not rendered to.
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdm = gs::debug_marker(gs::debug_color_azure_radiance, "Up %lld", n);
|
||||
#endif
|
||||
|
||||
// Select Texture
|
||||
std::shared_ptr<gs::texture> tex_in = _rts[n]->get_texture();
|
||||
|
|
|
@ -292,7 +292,10 @@ double_t gfx::blur::gaussian_linear::get_step_scale_y()
|
|||
std::shared_ptr<::gs::texture> gfx::blur::gaussian_linear::render()
|
||||
{
|
||||
auto gctx = gs::context();
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdmp = gs::debug_marker(gs::debug_color_azure_radiance, "Gaussian Linear Blur");
|
||||
#endif
|
||||
|
||||
gs::effect effect = _data->get_effect();
|
||||
auto kernel = _data->get_kernel(size_t(_size));
|
||||
|
@ -328,8 +331,11 @@ std::shared_ptr<::gs::texture> gfx::blur::gaussian_linear::render()
|
|||
effect.get_parameter("pImageTexel").set_float2(float_t(1.f / width), 0.f);
|
||||
|
||||
{
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdm = gs::debug_marker(gs::debug_color_azure_radiance, "Horizontal");
|
||||
auto op = _rendertarget2->render(uint32_t(width), uint32_t(height));
|
||||
#endif
|
||||
|
||||
auto op = _rendertarget2->render(uint32_t(width), uint32_t(height));
|
||||
gs_ortho(0, 1., 0, 1., 0, 1.);
|
||||
while (gs_effect_loop(effect.get_object(), "Draw")) {
|
||||
gs_draw_sprite(nullptr, 0, 1, 1);
|
||||
|
@ -345,8 +351,11 @@ std::shared_ptr<::gs::texture> gfx::blur::gaussian_linear::render()
|
|||
effect.get_parameter("pImageTexel").set_float2(0.f, float_t(1.f / height));
|
||||
|
||||
{
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdm = gs::debug_marker(gs::debug_color_azure_radiance, "Vertical");
|
||||
auto op = _rendertarget2->render(uint32_t(width), uint32_t(height));
|
||||
#endif
|
||||
|
||||
auto op = _rendertarget2->render(uint32_t(width), uint32_t(height));
|
||||
gs_ortho(0, 1., 0, 1., 0, 1.);
|
||||
while (gs_effect_loop(effect.get_object(), "Draw")) {
|
||||
gs_draw_sprite(nullptr, 0, 1, 1);
|
||||
|
@ -388,7 +397,10 @@ void gfx::blur::gaussian_linear_directional::set_angle(double_t angle)
|
|||
std::shared_ptr<::gs::texture> gfx::blur::gaussian_linear_directional::render()
|
||||
{
|
||||
auto gctx = gs::context();
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdmp = gs::debug_marker(gs::debug_color_azure_radiance, "Gaussian Linear Directional Blur");
|
||||
#endif
|
||||
|
||||
gs::effect effect = _data->get_effect();
|
||||
auto kernel = _data->get_kernel(size_t(_size));
|
||||
|
|
|
@ -298,7 +298,10 @@ double_t gfx::blur::gaussian::get_step_scale_y()
|
|||
std::shared_ptr<::gs::texture> gfx::blur::gaussian::render()
|
||||
{
|
||||
auto gctx = gs::context();
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdmp = gs::debug_marker(gs::debug_color_azure_radiance, "Gaussian Blur");
|
||||
#endif
|
||||
|
||||
gs::effect effect = _data->get_effect();
|
||||
auto kernel = _data->get_kernel(size_t(_size));
|
||||
|
@ -334,8 +337,11 @@ std::shared_ptr<::gs::texture> gfx::blur::gaussian::render()
|
|||
effect.get_parameter("pImageTexel").set_float2(float_t(1.f / width), 0.f);
|
||||
|
||||
{
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdm = gs::debug_marker(gs::debug_color_azure_radiance, "Horizontal");
|
||||
auto op = _rendertarget2->render(uint32_t(width), uint32_t(height));
|
||||
#endif
|
||||
|
||||
auto op = _rendertarget2->render(uint32_t(width), uint32_t(height));
|
||||
gs_ortho(0, 1., 0, 1., 0, 1.);
|
||||
while (gs_effect_loop(effect.get_object(), "Draw")) {
|
||||
gs_draw_sprite(nullptr, 0, 1, 1);
|
||||
|
@ -351,8 +357,11 @@ std::shared_ptr<::gs::texture> gfx::blur::gaussian::render()
|
|||
effect.get_parameter("pImageTexel").set_float2(0.f, float_t(1.f / height));
|
||||
|
||||
{
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdm = gs::debug_marker(gs::debug_color_azure_radiance, "Vertical");
|
||||
auto op = _rendertarget2->render(uint32_t(width), uint32_t(height));
|
||||
#endif
|
||||
|
||||
auto op = _rendertarget2->render(uint32_t(width), uint32_t(height));
|
||||
gs_ortho(0, 1., 0, 1., 0, 1.);
|
||||
while (gs_effect_loop(effect.get_object(), "Draw")) {
|
||||
gs_draw_sprite(nullptr, 0, 1, 1);
|
||||
|
@ -394,7 +403,10 @@ void gfx::blur::gaussian_directional::set_angle(double_t angle)
|
|||
std::shared_ptr<::gs::texture> gfx::blur::gaussian_directional::render()
|
||||
{
|
||||
auto gctx = gs::context();
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdmp = gs::debug_marker(gs::debug_color_azure_radiance, "Gaussian Directional Blur");
|
||||
#endif
|
||||
|
||||
gs::effect effect = _data->get_effect();
|
||||
auto kernel = _data->get_kernel(size_t(_size));
|
||||
|
@ -449,7 +461,10 @@ std::shared_ptr<::gs::texture> gfx::blur::gaussian_directional::render()
|
|||
std::shared_ptr<::gs::texture> gfx::blur::gaussian_rotational::render()
|
||||
{
|
||||
auto gctx = gs::context();
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdmp = gs::debug_marker(gs::debug_color_azure_radiance, "Gaussian Rotational Blur");
|
||||
#endif
|
||||
|
||||
gs::effect effect = _data->get_effect();
|
||||
auto kernel = _data->get_kernel(size_t(_size));
|
||||
|
@ -527,7 +542,10 @@ void gfx::blur::gaussian_rotational::set_angle(double_t angle)
|
|||
std::shared_ptr<::gs::texture> gfx::blur::gaussian_zoom::render()
|
||||
{
|
||||
auto gctx = gs::context();
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto gdmp = gs::debug_marker(gs::debug_color_azure_radiance, "Gaussian Zoom Blur");
|
||||
#endif
|
||||
|
||||
gs::effect effect = _data->get_effect();
|
||||
auto kernel = _data->get_kernel(size_t(_size));
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
#include "gfx-source-texture.hpp"
|
||||
#include <stdexcept>
|
||||
#include "obs/gs/gs-helper.hpp"
|
||||
|
||||
gfx::source_texture::~source_texture()
|
||||
{
|
||||
|
@ -117,17 +118,17 @@ std::shared_ptr<gs::texture> gfx::source_texture::render(std::size_t width, std:
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
{
|
||||
GS_DEBUG_MARKER_BEGIN(GS_DEBUG_COLOR_ITEM, "gfx::source_texture");
|
||||
if (_child) {
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto cctr =
|
||||
gs::debug_marker(gs::debug_color_capture, "gfx::source_texture '%s'", obs_source_get_name(_child->get()));
|
||||
#endif
|
||||
auto op = _rt->render((uint32_t)width, (uint32_t)height);
|
||||
vec4 black;
|
||||
vec4_zero(&black);
|
||||
gs_ortho(0, (float_t)width, 0, (float_t)height, 0, 1);
|
||||
gs_clear(GS_CLEAR_COLOR, &black, 0, 0);
|
||||
if (_child) {
|
||||
obs_source_video_render(_child->get());
|
||||
}
|
||||
GS_DEBUG_MARKER_END();
|
||||
obs_source_video_render(_child->get());
|
||||
}
|
||||
|
||||
std::shared_ptr<gs::texture> tex;
|
||||
|
|
|
@ -29,11 +29,6 @@ gs::context::~context()
|
|||
obs_leave_graphics();
|
||||
}
|
||||
|
||||
/*gs::debug_marker::debug_marker(const float color[4], std::string name) : _name(name)
|
||||
{
|
||||
gs_debug_marker_begin(color, _name.c_str());
|
||||
}*/
|
||||
|
||||
gs::debug_marker::debug_marker(const float_t color[4], const char* format, ...)
|
||||
{
|
||||
std::size_t size;
|
||||
|
|
|
@ -137,7 +137,10 @@ void gs::mipmapper::rebuild(std::shared_ptr<gs::texture> source, std::shared_ptr
|
|||
size_t max_mip_level = 1;
|
||||
|
||||
{
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto cctr = gs::debug_marker(gs::debug_color_azure_radiance, "Mip Level %lld", 0);
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
if (gs_get_device_type() == GS_DEVICE_DIRECT3D_11) {
|
||||
{ // Retrieve maximum mip map level.
|
||||
|
@ -161,7 +164,9 @@ void gs::mipmapper::rebuild(std::shared_ptr<gs::texture> source, std::shared_ptr
|
|||
|
||||
// Render each mip map level.
|
||||
for (size_t mip = 1; mip < max_mip_level; mip++) {
|
||||
#ifdef ENABLE_PROFILING
|
||||
auto cctr = gs::debug_marker(gs::debug_color_azure_radiance, "Mip Level %lld", mip);
|
||||
#endif
|
||||
|
||||
uint32_t cwidth = std::max<uint32_t>(width >> mip, 1);
|
||||
uint32_t cheight = std::max<uint32_t>(height >> mip, 1);
|
||||
|
|
|
@ -141,6 +141,11 @@ void mirror_instance::video_render(gs_effect_t* effect)
|
|||
if ((obs_source_get_output_flags(_source.get()) & OBS_SOURCE_VIDEO) == 0)
|
||||
return;
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdmp{gs::debug_color_source, "Source Mirror '%s' for '%s'", obs_source_get_name(_self),
|
||||
obs_source_get_name(_source.get())};
|
||||
#endif
|
||||
|
||||
obs_source_video_render(_source.get());
|
||||
}
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include "source-shader.hpp"
|
||||
#include "strings.hpp"
|
||||
#include <stdexcept>
|
||||
#include "obs/gs/gs-helper.hpp"
|
||||
#include "utility.hpp"
|
||||
|
||||
#define ST "Source.Shader"
|
||||
|
@ -79,6 +80,10 @@ void shader_instance::video_render(gs_effect_t* effect)
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdmp{gs::debug_color_source, "Shader Source '%s'", obs_source_get_name(_self)};
|
||||
#endif
|
||||
|
||||
_fx->prepare_render();
|
||||
_fx->render();
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include "transition-shader.hpp"
|
||||
#include "strings.hpp"
|
||||
#include <stdexcept>
|
||||
#include "obs/gs/gs-helper.hpp"
|
||||
#include "utility.hpp"
|
||||
|
||||
#define ST "Transition.Shader"
|
||||
|
@ -81,6 +82,10 @@ void shader_instance::video_render(gs_effect_t* effect)
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef ENABLE_PROFILING
|
||||
gs::debug_marker gdmp{gs::debug_color_source, "Shader Transition '%s'", obs_source_get_name(_self)};
|
||||
#endif
|
||||
|
||||
_fx->prepare_render();
|
||||
obs_transition_video_render(
|
||||
_self, [](void* data, gs_texture_t* a, gs_texture_t* b, float t, std::uint32_t cx, std::uint32_t cy) {
|
||||
|
|
Loading…
Reference in a new issue