From cbd01d2a6f3d7114bcabae3ec45a6df13f92d450 Mon Sep 17 00:00:00 2001 From: Omar Emara Date: Thu, 13 Mar 2025 11:38:12 +0200 Subject: [PATCH] Refactor: Compositor: Reduce boilerplate in conversion code This patch refactors GPU implicit conversion code by generating the name of the shaders on the fly using fmt. This reduces boilerplate and makes it easier to add new types. --- source/blender/compositor/CMakeLists.txt | 1 + source/blender/compositor/COM_result.hh | 3 + .../compositor/intern/conversion_operation.cc | 115 +----------------- source/blender/compositor/intern/result.cc | 23 ++++ 4 files changed, 33 insertions(+), 109 deletions(-) diff --git a/source/blender/compositor/CMakeLists.txt b/source/blender/compositor/CMakeLists.txt index e0cc3f43054..95c92cd8d46 100644 --- a/source/blender/compositor/CMakeLists.txt +++ b/source/blender/compositor/CMakeLists.txt @@ -145,6 +145,7 @@ set(SRC set(LIB PRIVATE bf::blenkernel PRIVATE bf::blentranslation + PRIVATE bf::extern::fmtlib PRIVATE bf::functions PRIVATE bf::gpu PRIVATE bf::imbuf diff --git a/source/blender/compositor/COM_result.hh b/source/blender/compositor/COM_result.hh index 495ddb349bd..fb123391e58 100644 --- a/source/blender/compositor/COM_result.hh +++ b/source/blender/compositor/COM_result.hh @@ -187,6 +187,9 @@ class Result { /* Returns the CPP type corresponding to the given result type. */ static const CPPType &cpp_type(const ResultType type); + /* Returns a string representation of the given result type. */ + static const char *type_name(const ResultType type); + /* Implicit conversion to the internal GPU texture. */ operator GPUTexture *() const; diff --git a/source/blender/compositor/intern/conversion_operation.cc b/source/blender/compositor/intern/conversion_operation.cc index f3889810d48..90fcdfca499 100644 --- a/source/blender/compositor/intern/conversion_operation.cc +++ b/source/blender/compositor/intern/conversion_operation.cc @@ -2,6 +2,8 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#include + #include "BLI_math_vector_types.hh" #include "BLI_utildefines.h" @@ -38,7 +40,10 @@ void ConversionOperation::execute() result.allocate_texture(input.domain()); if (this->context().use_gpu()) { - GPUShader *shader = this->context().get_shader(this->get_conversion_shader_name()); + const std::string shader_name = fmt::format("compositor_convert_{}_to_{}", + Result::type_name(this->get_input().type()), + Result::type_name(this->get_result().type())); + GPUShader *shader = this->context().get_shader(shader_name.c_str()); GPU_shader_bind(shader); if (this->get_input().type() == ResultType::Color && @@ -79,114 +84,6 @@ SimpleOperation *ConversionOperation::construct_if_needed(Context &context, return nullptr; } -const char *ConversionOperation::get_conversion_shader_name() -{ - switch (this->get_input().type()) { - case ResultType::Float: - switch (this->get_result().type()) { - case ResultType::Int: - return "compositor_convert_float_to_int"; - case ResultType::Float3: - return "compositor_convert_float_to_float3"; - case ResultType::Color: - return "compositor_convert_float_to_color"; - case ResultType::Float4: - return "compositor_convert_float_to_float4"; - case ResultType::Float: - /* Same type, no conversion needed. */ - break; - case ResultType::Float2: - case ResultType::Int2: - /* Types are not user facing, so we needn't implement them. */ - break; - } - break; - case ResultType::Int: - switch (this->get_result().type()) { - case ResultType::Float: - return "compositor_convert_int_to_float"; - case ResultType::Float3: - return "compositor_convert_int_to_float3"; - case ResultType::Color: - return "compositor_convert_int_to_color"; - case ResultType::Float4: - return "compositor_convert_int_to_float4"; - case ResultType::Int: - /* Same type, no conversion needed. */ - break; - case ResultType::Float2: - case ResultType::Int2: - /* Types are not user facing, so we needn't implement them. */ - break; - } - break; - case ResultType::Float3: - switch (this->get_result().type()) { - case ResultType::Float: - return "compositor_convert_float3_to_float"; - case ResultType::Int: - return "compositor_convert_float3_to_int"; - case ResultType::Color: - return "compositor_convert_float3_to_color"; - case ResultType::Float4: - return "compositor_convert_float3_to_float4"; - case ResultType::Float3: - /* Same type, no conversion needed. */ - break; - case ResultType::Float2: - case ResultType::Int2: - /* Types are not user facing, so we needn't implement them. */ - break; - } - break; - case ResultType::Color: - switch (this->get_result().type()) { - case ResultType::Float: - return "compositor_convert_color_to_float"; - case ResultType::Int: - return "compositor_convert_color_to_int"; - case ResultType::Float3: - return "compositor_convert_color_to_float3"; - case ResultType::Float4: - return "compositor_convert_color_to_float4"; - case ResultType::Color: - /* Same type, no conversion needed. */ - break; - case ResultType::Float2: - case ResultType::Int2: - /* Types are not user facing, so we needn't implement them. */ - break; - } - break; - case ResultType::Float4: - switch (this->get_result().type()) { - case ResultType::Float: - return "compositor_convert_float4_to_float"; - case ResultType::Int: - return "compositor_convert_float4_to_int"; - case ResultType::Float3: - return "compositor_convert_float4_to_float3"; - case ResultType::Color: - return "compositor_convert_float4_to_color"; - case ResultType::Float4: - /* Same type, no conversion needed. */ - break; - case ResultType::Float2: - case ResultType::Int2: - /* Types are not user facing, so we needn't implement them. */ - break; - } - break; - case ResultType::Float2: - case ResultType::Int2: - /* Types are not user facing, so we needn't implement them. */ - break; - } - - BLI_assert_unreachable(); - return nullptr; -} - void ConversionOperation::execute_single(const Result &input, Result &output) { switch (this->get_input().type()) { diff --git a/source/blender/compositor/intern/result.cc b/source/blender/compositor/intern/result.cc index b9cd2203d86..4b734928ff3 100644 --- a/source/blender/compositor/intern/result.cc +++ b/source/blender/compositor/intern/result.cc @@ -244,6 +244,29 @@ const CPPType &Result::cpp_type(const ResultType type) return CPPType::get(); } +const char *Result::type_name(const ResultType type) +{ + switch (type) { + case ResultType::Float: + return "float"; + case ResultType::Float2: + return "float2"; + case ResultType::Float3: + return "float3"; + case ResultType::Float4: + return "float4"; + case ResultType::Color: + return "color"; + case ResultType::Int2: + return "int2"; + case ResultType::Int: + return "int"; + } + + BLI_assert_unreachable(); + return ""; +} + Result::operator GPUTexture *() const { return this->gpu_texture();