filter-displacement: Use gs::effect instead of gs_effect_t*

The managed gs::effect class handles all acquire and release calls for us. Also slightly simplifies the video_render logic.
This commit is contained in:
Michael Fabian 'Xaymar' Dirks 2019-01-24 23:34:43 +01:00
parent fedb6e3259
commit 0bdf8e3bba
2 changed files with 26 additions and 34 deletions

View File

@ -142,31 +142,28 @@ void filter::DisplacementAddon::video_render(void* ptr, gs_effect_t* effect)
filter::Displacement::Displacement(obs_data_t* data, obs_source_t* context) filter::Displacement::Displacement(obs_data_t* data, obs_source_t* context)
: m_self(context), m_active(true), m_effect(nullptr), m_distance(0), m_timer(0) : m_self(context), m_active(true), m_effect(nullptr), m_distance(0), m_timer(0)
{ {
this->m_displacement_map.texture = nullptr; this->m_displacement_map.texture = nullptr;
this->m_displacement_map.createTime = 0; this->m_displacement_map.createTime = 0;
this->m_displacement_map.modifiedTime = 0; this->m_displacement_map.modifiedTime = 0;
this->m_displacement_map.size = 0; this->m_displacement_map.size = 0;
obs_enter_graphics();
char* effectFile = obs_module_file("effects/displace.effect"); char* effectFile = obs_module_file("effects/displace.effect");
char* errorMessage = nullptr; try {
this->m_effect = gs_effect_create_from_file(effectFile, &errorMessage); m_effect = std::make_shared<gs::effect>(effectFile);
bfree(effectFile); } catch (...) {
if (errorMessage != nullptr) { P_LOG_ERROR("<Displacement Filter:%s> Failed to load displacement effect.", obs_source_get_name(m_self));
P_LOG_ERROR("%s", errorMessage);
bfree(errorMessage);
} }
obs_leave_graphics(); bfree(effectFile);
update(data); update(data);
} }
filter::Displacement::~Displacement() filter::Displacement::~Displacement()
{ {
m_effect.reset();
obs_enter_graphics(); obs_enter_graphics();
gs_effect_destroy(m_effect);
gs_texture_destroy(m_displacement_map.texture); gs_texture_destroy(m_displacement_map.texture);
obs_leave_graphics(); obs_leave_graphics();
} }
@ -219,7 +216,7 @@ void filter::Displacement::video_render(gs_effect_t*)
uint32_t baseW = obs_source_get_base_width(target), baseH = obs_source_get_base_height(target); uint32_t baseW = obs_source_get_base_width(target), baseH = obs_source_get_base_height(target);
// Skip rendering if our target, parent or context is not valid. // Skip rendering if our target, parent or context is not valid.
if (!target || !parent || !m_self || !m_displacement_map.texture || !baseW || !baseH) { if (!parent || !target || !baseW || !baseH || !m_displacement_map.texture) {
obs_source_skip_video_filter(m_self); obs_source_skip_video_filter(m_self);
return; return;
} }
@ -231,25 +228,18 @@ void filter::Displacement::video_render(gs_effect_t*)
vec2 texelScale; vec2 texelScale;
vec2_set(&texelScale, interp((1.0f / baseW), 1.0f, m_distance), interp((1.0f / baseH), 1.0f, m_distance)); vec2_set(&texelScale, interp((1.0f / baseW), 1.0f, m_distance), interp((1.0f / baseH), 1.0f, m_distance));
param = gs_effect_get_param_by_name(m_effect, "texelScale");
if (param)
gs_effect_set_vec2(param, &texelScale);
else
P_LOG_ERROR("Failed to set texel scale param.");
param = gs_effect_get_param_by_name(m_effect, "displacementScale"); if (m_effect->has_parameter("texelScale")) {
if (param) m_effect->get_parameter("texelScale").set_float2(texelScale);
gs_effect_set_vec2(param, &m_displacement_scale); }
else if (m_effect->has_parameter("displacementScale")) {
P_LOG_ERROR("Failed to set displacement scale param."); m_effect->get_parameter("displacmenetScale").set_float2(m_displacement_scale);
}
if (m_effect->has_parameter("displacementMap")) {
m_effect->get_parameter("displacementMap").set_texture(m_displacement_map.texture);
}
param = gs_effect_get_param_by_name(m_effect, "displacementMap"); obs_source_process_filter_end(m_self, m_effect->get_object(), baseW, baseH);
if (param)
gs_effect_set_texture(param, m_displacement_map.texture);
else
P_LOG_ERROR("Failed to set texture param.");
obs_source_process_filter_end(m_self, m_effect, baseW, baseH);
} }
std::string filter::Displacement::get_file() std::string filter::Displacement::get_file()

View File

@ -18,8 +18,10 @@
*/ */
#pragma once #pragma once
#include "plugin.hpp" #include <memory>
#include <string> #include <string>
#include "gs-effect.hpp"
#include "plugin.hpp"
// OBS // OBS
#ifdef _MSC_VER #ifdef _MSC_VER
@ -68,7 +70,7 @@ namespace filter {
bool m_active; bool m_active;
// Rendering // Rendering
gs_effect_t* m_effect; std::shared_ptr<gs::effect> m_effect;
float_t m_distance; float_t m_distance;
vec2 m_displacement_scale; vec2 m_displacement_scale;
struct { struct {