From 15eaec2e0938562bde0f646a51394dc2ddcaba8c Mon Sep 17 00:00:00 2001 From: Michael Fabian 'Xaymar' Dirks Date: Sun, 30 Oct 2022 02:09:33 +0100 Subject: [PATCH] obs/gs/rendertarget: Add support for color spaces --- source/obs/gs/gs-rendertarget.cpp | 60 +++++++++++++++++++++---------- source/obs/gs/gs-rendertarget.hpp | 41 +++++++++++---------- 2 files changed, 65 insertions(+), 36 deletions(-) diff --git a/source/obs/gs/gs-rendertarget.cpp b/source/obs/gs/gs-rendertarget.cpp index 5a3a6d8..729f2ee 100644 --- a/source/obs/gs/gs-rendertarget.cpp +++ b/source/obs/gs/gs-rendertarget.cpp @@ -1,21 +1,22 @@ -/* - * Modern effects for a modern Streamer - * Copyright (C) 2017 Michael Fabian Dirks - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - */ +// Copyright (c) 2017-2022 Michael Fabian Dirks +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. #include "gs-rendertarget.hpp" #include "obs/gs/gs-helper.hpp" @@ -46,6 +47,12 @@ streamfx::obs::gs::rendertarget_op streamfx::obs::gs::rendertarget::render(uint3 return {this, width, height}; } +streamfx::obs::gs::rendertarget_op streamfx::obs::gs::rendertarget::render(uint32_t width, uint32_t height, + gs_color_space cs) +{ + return {this, width, height, cs}; +} + gs_texture_t* streamfx::obs::gs::rendertarget::get_object() { auto gctx = streamfx::obs::gs::context(); @@ -100,6 +107,23 @@ streamfx::obs::gs::rendertarget_op::rendertarget_op(streamfx::obs::gs::rendertar parent->_is_being_rendered = true; } +streamfx::obs::gs::rendertarget_op::rendertarget_op(streamfx::obs::gs::rendertarget* rt, uint32_t width, + uint32_t height, gs_color_space cs) + : parent(rt) +{ + if (parent == nullptr) + throw std::invalid_argument("rt"); + if (parent->_is_being_rendered) + throw std::logic_error("Can't start rendering to the same render target twice."); + + auto gctx = streamfx::obs::gs::context(); + gs_texrender_reset(parent->_render_target); + if (!gs_texrender_begin_with_color_space(parent->_render_target, width, height, cs)) { + throw std::runtime_error("Failed to begin rendering to render target."); + } + parent->_is_being_rendered = true; +} + streamfx::obs::gs::rendertarget_op::rendertarget_op(streamfx::obs::gs::rendertarget_op&& r) noexcept { this->parent = r.parent; diff --git a/source/obs/gs/gs-rendertarget.hpp b/source/obs/gs/gs-rendertarget.hpp index d736cdd..9467446 100644 --- a/source/obs/gs/gs-rendertarget.hpp +++ b/source/obs/gs/gs-rendertarget.hpp @@ -1,21 +1,22 @@ -/* - * Modern effects for a modern Streamer - * Copyright (C) 2017 Michael Fabian Dirks - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - */ +// Copyright (c) 2017-2022 Michael Fabian Dirks +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. #pragma once #include "common.hpp" @@ -54,6 +55,8 @@ namespace streamfx::obs::gs { gs_zstencil_format get_zstencil_format(); streamfx::obs::gs::rendertarget_op render(uint32_t width, uint32_t height); + + streamfx::obs::gs::rendertarget_op render(uint32_t width, uint32_t height, gs_color_space cs); }; class rendertarget_op { @@ -64,6 +67,8 @@ namespace streamfx::obs::gs { rendertarget_op(streamfx::obs::gs::rendertarget* rt, uint32_t width, uint32_t height); + rendertarget_op(streamfx::obs::gs::rendertarget* rt, uint32_t width, uint32_t height, gs_color_space cs); + // Move Constructor rendertarget_op(streamfx::obs::gs::rendertarget_op&&) noexcept;