mirror of
https://github.com/Xaymar/obs-StreamFX
synced 2024-11-11 06:15:05 +00:00
obs/gs/effect: Use the actual shared_ptr, not a pointer to it
Fixes several warnings and potential memory corruptions that could happen. Also makes the entire thing easier to read.
This commit is contained in:
parent
09c151a9d2
commit
f9f25dbd8a
7 changed files with 28 additions and 29 deletions
|
@ -44,19 +44,18 @@ gs::effect_parameter::effect_parameter(gs_eparam_t* param)
|
|||
reset(param, [](void*) {});
|
||||
}
|
||||
|
||||
gs::effect_parameter::effect_parameter(gs_eparam_t* param, std::shared_ptr<gs_effect_t>* parent)
|
||||
gs::effect_parameter::effect_parameter(gs_eparam_t* param, std::shared_ptr<gs_effect_t> parent)
|
||||
: effect_parameter(param)
|
||||
{
|
||||
_effect_parent = parent;
|
||||
}
|
||||
|
||||
gs::effect_parameter::effect_parameter(gs_eparam_t* param, std::shared_ptr<gs_epass_t>* parent)
|
||||
: effect_parameter(param)
|
||||
gs::effect_parameter::effect_parameter(gs_eparam_t* param, std::shared_ptr<gs_epass_t> parent) : effect_parameter(param)
|
||||
{
|
||||
_pass_parent = parent;
|
||||
}
|
||||
|
||||
gs::effect_parameter::effect_parameter(gs_eparam_t* param, std::shared_ptr<gs_eparam_t>* parent)
|
||||
gs::effect_parameter::effect_parameter(gs_eparam_t* param, std::shared_ptr<gs_eparam_t> parent)
|
||||
: effect_parameter(param)
|
||||
{
|
||||
_param_parent = parent;
|
||||
|
@ -161,7 +160,7 @@ gs::effect_parameter gs::effect_parameter::get_annotation(std::size_t idx)
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
return effect_parameter(get()->annotations.array + idx, this);
|
||||
return effect_parameter(get()->annotations.array + idx, *this);
|
||||
}
|
||||
|
||||
gs::effect_parameter gs::effect_parameter::get_annotation(const std::string_view name)
|
||||
|
@ -169,7 +168,7 @@ gs::effect_parameter gs::effect_parameter::get_annotation(const std::string_view
|
|||
for (std::size_t idx = 0; idx < get()->annotations.num; idx++) {
|
||||
auto ptr = get()->annotations.array + idx;
|
||||
if (name == std::string_view{ptr->name}) {
|
||||
return gs::effect_parameter(ptr, this);
|
||||
return gs::effect_parameter(ptr, *this);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -24,9 +24,9 @@
|
|||
|
||||
namespace gs {
|
||||
class effect_parameter : public std::shared_ptr<gs_eparam_t> {
|
||||
std::shared_ptr<gs_effect_t>* _effect_parent;
|
||||
std::shared_ptr<gs_epass_t>* _pass_parent;
|
||||
std::shared_ptr<gs_eparam_t>* _param_parent;
|
||||
std::shared_ptr<gs_effect_t> _effect_parent;
|
||||
std::shared_ptr<gs_epass_t> _pass_parent;
|
||||
std::shared_ptr<gs_eparam_t> _param_parent;
|
||||
|
||||
public:
|
||||
enum class type {
|
||||
|
@ -50,9 +50,9 @@ namespace gs {
|
|||
public:
|
||||
effect_parameter();
|
||||
effect_parameter(gs_eparam_t* param);
|
||||
effect_parameter(gs_eparam_t* param, std::shared_ptr<gs_effect_t>* parent);
|
||||
effect_parameter(gs_eparam_t* param, std::shared_ptr<gs_epass_t>* parent);
|
||||
effect_parameter(gs_eparam_t* param, std::shared_ptr<gs_eparam_t>* parent);
|
||||
effect_parameter(gs_eparam_t* param, std::shared_ptr<gs_effect_t> parent);
|
||||
effect_parameter(gs_eparam_t* param, std::shared_ptr<gs_epass_t> parent);
|
||||
effect_parameter(gs_eparam_t* param, std::shared_ptr<gs_eparam_t> parent);
|
||||
~effect_parameter();
|
||||
|
||||
effect_parameter(const effect_parameter& rhs);
|
||||
|
|
|
@ -31,7 +31,7 @@ extern "C" {
|
|||
#endif
|
||||
}
|
||||
|
||||
gs::effect_pass::effect_pass(gs_epass_t* pass, std::shared_ptr<gs_technique_t>* parent) : _parent(parent)
|
||||
gs::effect_pass::effect_pass(gs_epass_t* pass, std::shared_ptr<gs_technique_t> parent) : _parent(parent)
|
||||
{
|
||||
reset(pass, [](void*) {});
|
||||
}
|
||||
|
@ -55,7 +55,7 @@ gs::effect_parameter gs::effect_pass::get_vertex_parameter(std::size_t idx)
|
|||
if (idx >= count_vertex_parameters())
|
||||
return nullptr;
|
||||
|
||||
return gs::effect_parameter((get()->vertshader_params.array + idx)->eparam, this);
|
||||
return gs::effect_parameter((get()->vertshader_params.array + idx)->eparam, *this);
|
||||
}
|
||||
|
||||
gs::effect_parameter gs::effect_pass::get_vertex_parameter(std::string name)
|
||||
|
@ -63,7 +63,7 @@ gs::effect_parameter gs::effect_pass::get_vertex_parameter(std::string name)
|
|||
for (std::size_t idx = 0; idx < count_vertex_parameters(); idx++) {
|
||||
auto ptr = get()->vertshader_params.array + idx;
|
||||
if (strcmp(ptr->eparam->name, name.c_str()) == 0)
|
||||
return gs::effect_parameter(ptr->eparam, this);
|
||||
return gs::effect_parameter(ptr->eparam, *this);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -91,7 +91,7 @@ gs::effect_parameter gs::effect_pass::get_pixel_parameter(std::size_t idx)
|
|||
if (idx >= count_pixel_parameters())
|
||||
return nullptr;
|
||||
|
||||
return gs::effect_parameter((get()->pixelshader_params.array + idx)->eparam, this);
|
||||
return gs::effect_parameter((get()->pixelshader_params.array + idx)->eparam, *this);
|
||||
}
|
||||
|
||||
gs::effect_parameter gs::effect_pass::get_pixel_parameter(std::string name)
|
||||
|
@ -99,7 +99,7 @@ gs::effect_parameter gs::effect_pass::get_pixel_parameter(std::string name)
|
|||
for (std::size_t idx = 0; idx < count_pixel_parameters(); idx++) {
|
||||
auto ptr = get()->pixelshader_params.array + idx;
|
||||
if (strcmp(ptr->eparam->name, name.c_str()) == 0)
|
||||
return gs::effect_parameter(ptr->eparam, this);
|
||||
return gs::effect_parameter(ptr->eparam, *this);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
|
|
@ -23,16 +23,17 @@
|
|||
|
||||
namespace gs {
|
||||
class effect_pass : public std::shared_ptr<gs_epass_t> {
|
||||
std::shared_ptr<gs_technique_t>* _parent;
|
||||
std::shared_ptr<gs_technique_t> _parent;
|
||||
|
||||
public:
|
||||
effect_pass(gs_epass_t* pass, std::shared_ptr<gs_technique_t>* parent = nullptr);
|
||||
effect_pass(gs_epass_t* pass, std::shared_ptr<gs_technique_t> parent = nullptr);
|
||||
~effect_pass();
|
||||
|
||||
std::string name();
|
||||
|
||||
//gs::shader get_pixel_shader();
|
||||
//gs::shader get_vertex_shader();
|
||||
//
|
||||
|
||||
std::size_t count_vertex_parameters();
|
||||
gs::effect_parameter get_vertex_parameter(std::size_t idx);
|
||||
|
|
|
@ -32,8 +32,7 @@ extern "C" {
|
|||
#endif
|
||||
}
|
||||
|
||||
gs::effect_technique::effect_technique(gs_technique_t* technique, std::shared_ptr<gs_effect_t>* parent)
|
||||
: _parent(parent)
|
||||
gs::effect_technique::effect_technique(gs_technique_t* technique, std::shared_ptr<gs_effect_t> parent) : _parent(parent)
|
||||
{
|
||||
reset(technique, [](void*) {});
|
||||
}
|
||||
|
@ -58,7 +57,7 @@ gs::effect_pass gs::effect_technique::get_pass(std::size_t idx)
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
return gs::effect_pass(get()->passes.array + idx, this);
|
||||
return gs::effect_pass(get()->passes.array + idx, *this);
|
||||
}
|
||||
|
||||
gs::effect_pass gs::effect_technique::get_pass(std::string name)
|
||||
|
@ -66,7 +65,7 @@ gs::effect_pass gs::effect_technique::get_pass(std::string name)
|
|||
for (std::size_t idx = 0; idx < get()->passes.num; idx++) {
|
||||
auto ptr = get()->passes.array + idx;
|
||||
if (strcmp(ptr->name, name.c_str()) == 0)
|
||||
return gs::effect_pass(ptr, this);
|
||||
return gs::effect_pass(ptr, *this);
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
|
|
|
@ -23,10 +23,10 @@
|
|||
|
||||
namespace gs {
|
||||
class effect_technique : public std::shared_ptr<gs_technique_t> {
|
||||
std::shared_ptr<gs_effect_t>* _parent;
|
||||
std::shared_ptr<gs_effect_t> _parent;
|
||||
|
||||
public:
|
||||
effect_technique(gs_technique_t* technique, std::shared_ptr<gs_effect_t>* parent = nullptr);
|
||||
effect_technique(gs_technique_t* technique, std::shared_ptr<gs_effect_t> parent = nullptr);
|
||||
~effect_technique();
|
||||
|
||||
std::string name();
|
||||
|
|
|
@ -77,7 +77,7 @@ gs::effect_technique gs::effect::get_technique(std::size_t idx)
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
return gs::effect_technique(get()->techniques.array + idx, this);
|
||||
return gs::effect_technique(get()->techniques.array + idx, *this);
|
||||
}
|
||||
|
||||
gs::effect_technique gs::effect::get_technique(const std::string& name)
|
||||
|
@ -85,7 +85,7 @@ gs::effect_technique gs::effect::get_technique(const std::string& name)
|
|||
for (std::size_t idx = 0; idx < count_techniques(); idx++) {
|
||||
auto ptr = get()->techniques.array + idx;
|
||||
if (strcmp(ptr->name, name.c_str()) == 0) {
|
||||
return gs::effect_technique(ptr, this);
|
||||
return gs::effect_technique(ptr, *this);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -110,7 +110,7 @@ gs::effect_parameter gs::effect::get_parameter(std::size_t idx)
|
|||
throw std::out_of_range("Index is out of range.");
|
||||
}
|
||||
|
||||
return gs::effect_parameter(get()->params.array + idx, this);
|
||||
return gs::effect_parameter(get()->params.array + idx, *this);
|
||||
}
|
||||
|
||||
gs::effect_parameter gs::effect::get_parameter(const std::string& name)
|
||||
|
@ -118,7 +118,7 @@ gs::effect_parameter gs::effect::get_parameter(const std::string& name)
|
|||
for (std::size_t idx = 0; idx < count_parameters(); idx++) {
|
||||
auto ptr = get()->params.array + idx;
|
||||
if (strcmp(ptr->name, name.c_str()) == 0) {
|
||||
return gs::effect_parameter(ptr, this);
|
||||
return gs::effect_parameter(ptr, *this);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue