From f9f25dbd8a8c75faa4166c8fb818c92306b175ea Mon Sep 17 00:00:00 2001 From: Michael Fabian 'Xaymar' Dirks Date: Wed, 29 Jul 2020 04:31:55 +0200 Subject: [PATCH] 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. --- source/obs/gs/gs-effect-parameter.cpp | 11 +++++------ source/obs/gs/gs-effect-parameter.hpp | 12 ++++++------ source/obs/gs/gs-effect-pass.cpp | 10 +++++----- source/obs/gs/gs-effect-pass.hpp | 5 +++-- source/obs/gs/gs-effect-technique.cpp | 7 +++---- source/obs/gs/gs-effect-technique.hpp | 4 ++-- source/obs/gs/gs-effect.cpp | 8 ++++---- 7 files changed, 28 insertions(+), 29 deletions(-) diff --git a/source/obs/gs/gs-effect-parameter.cpp b/source/obs/gs/gs-effect-parameter.cpp index c75e9857..e5c4d5af 100644 --- a/source/obs/gs/gs-effect-parameter.cpp +++ b/source/obs/gs/gs-effect-parameter.cpp @@ -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* parent) +gs::effect_parameter::effect_parameter(gs_eparam_t* param, std::shared_ptr parent) : effect_parameter(param) { _effect_parent = parent; } -gs::effect_parameter::effect_parameter(gs_eparam_t* param, std::shared_ptr* parent) - : effect_parameter(param) +gs::effect_parameter::effect_parameter(gs_eparam_t* param, std::shared_ptr parent) : effect_parameter(param) { _pass_parent = parent; } -gs::effect_parameter::effect_parameter(gs_eparam_t* param, std::shared_ptr* parent) +gs::effect_parameter::effect_parameter(gs_eparam_t* param, std::shared_ptr 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); } } diff --git a/source/obs/gs/gs-effect-parameter.hpp b/source/obs/gs/gs-effect-parameter.hpp index 5fa9a85e..bafae6b3 100644 --- a/source/obs/gs/gs-effect-parameter.hpp +++ b/source/obs/gs/gs-effect-parameter.hpp @@ -24,9 +24,9 @@ namespace gs { class effect_parameter : public std::shared_ptr { - std::shared_ptr* _effect_parent; - std::shared_ptr* _pass_parent; - std::shared_ptr* _param_parent; + std::shared_ptr _effect_parent; + std::shared_ptr _pass_parent; + std::shared_ptr _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* parent); - effect_parameter(gs_eparam_t* param, std::shared_ptr* parent); - effect_parameter(gs_eparam_t* param, std::shared_ptr* parent); + effect_parameter(gs_eparam_t* param, std::shared_ptr parent); + effect_parameter(gs_eparam_t* param, std::shared_ptr parent); + effect_parameter(gs_eparam_t* param, std::shared_ptr parent); ~effect_parameter(); effect_parameter(const effect_parameter& rhs); diff --git a/source/obs/gs/gs-effect-pass.cpp b/source/obs/gs/gs-effect-pass.cpp index 91890633..01f90278 100644 --- a/source/obs/gs/gs-effect-pass.cpp +++ b/source/obs/gs/gs-effect-pass.cpp @@ -31,7 +31,7 @@ extern "C" { #endif } -gs::effect_pass::effect_pass(gs_epass_t* pass, std::shared_ptr* parent) : _parent(parent) +gs::effect_pass::effect_pass(gs_epass_t* pass, std::shared_ptr 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; } diff --git a/source/obs/gs/gs-effect-pass.hpp b/source/obs/gs/gs-effect-pass.hpp index 86f32275..8fa5d847 100644 --- a/source/obs/gs/gs-effect-pass.hpp +++ b/source/obs/gs/gs-effect-pass.hpp @@ -23,16 +23,17 @@ namespace gs { class effect_pass : public std::shared_ptr { - std::shared_ptr* _parent; + std::shared_ptr _parent; public: - effect_pass(gs_epass_t* pass, std::shared_ptr* parent = nullptr); + effect_pass(gs_epass_t* pass, std::shared_ptr 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); diff --git a/source/obs/gs/gs-effect-technique.cpp b/source/obs/gs/gs-effect-technique.cpp index fc4d30e1..cf02b1c8 100644 --- a/source/obs/gs/gs-effect-technique.cpp +++ b/source/obs/gs/gs-effect-technique.cpp @@ -32,8 +32,7 @@ extern "C" { #endif } -gs::effect_technique::effect_technique(gs_technique_t* technique, std::shared_ptr* parent) - : _parent(parent) +gs::effect_technique::effect_technique(gs_technique_t* technique, std::shared_ptr 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; diff --git a/source/obs/gs/gs-effect-technique.hpp b/source/obs/gs/gs-effect-technique.hpp index 37a02b35..07cd0866 100644 --- a/source/obs/gs/gs-effect-technique.hpp +++ b/source/obs/gs/gs-effect-technique.hpp @@ -23,10 +23,10 @@ namespace gs { class effect_technique : public std::shared_ptr { - std::shared_ptr* _parent; + std::shared_ptr _parent; public: - effect_technique(gs_technique_t* technique, std::shared_ptr* parent = nullptr); + effect_technique(gs_technique_t* technique, std::shared_ptr parent = nullptr); ~effect_technique(); std::string name(); diff --git a/source/obs/gs/gs-effect.cpp b/source/obs/gs/gs-effect.cpp index 694cf388..301bc788 100644 --- a/source/obs/gs/gs-effect.cpp +++ b/source/obs/gs/gs-effect.cpp @@ -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); } }