Commit: 74e9cad08276ba01a2360846d7cf26cfa03e7ece Author: Omar Emara Date: Thu Apr 14 15:27:56 2022 +0200 Branches: temp-viewport-compositor-compiler https://developer.blender.org/rB74e9cad08276ba01a2360846d7cf26cfa03e7ece
Viewport Compositor: Do eager evaluation (Part 2) =================================================================== M source/blender/gpu/shaders/compositor/infos/compositor_convert_info.hh M source/blender/viewport_compositor/VPC_compile_state.hh M source/blender/viewport_compositor/VPC_conversion_processor_operation.hh M source/blender/viewport_compositor/VPC_domain.hh M source/blender/viewport_compositor/VPC_evaluator.hh M source/blender/viewport_compositor/VPC_node_operation.hh M source/blender/viewport_compositor/VPC_operation.hh M source/blender/viewport_compositor/VPC_processor_operation.hh M source/blender/viewport_compositor/VPC_realize_on_domain_processor_operation.hh M source/blender/viewport_compositor/VPC_reduce_to_single_value_processor_operation.hh M source/blender/viewport_compositor/intern/conversion_processor_operation.cc M source/blender/viewport_compositor/intern/operation.cc M source/blender/viewport_compositor/intern/processor_operation.cc M source/blender/viewport_compositor/intern/realize_on_domain_processor_operation.cc M source/blender/viewport_compositor/intern/reduce_to_single_value_processor_operation.cc =================================================================== diff --git a/source/blender/gpu/shaders/compositor/infos/compositor_convert_info.hh b/source/blender/gpu/shaders/compositor/infos/compositor_convert_info.hh index a0e02a3d087..f8512f414cc 100644 --- a/source/blender/gpu/shaders/compositor/infos/compositor_convert_info.hh +++ b/source/blender/gpu/shaders/compositor/infos/compositor_convert_info.hh @@ -9,16 +9,34 @@ GPU_SHADER_CREATE_INFO(compositor_convert_shared) .typedef_source("gpu_shader_compositor_type_conversion.glsl") .compute_source("compositor_convert.glsl"); +GPU_SHADER_CREATE_INFO(compositor_convert_float_to_vector) + .additional_info("compositor_convert_shared") + .image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_image") + .define("CONVERT_EXPRESSION", "vec4(vec3_from_float(texel.x), 0.0)") + .do_static_compilation(true); + +GPU_SHADER_CREATE_INFO(compositor_convert_float_to_color) + .additional_info("compositor_convert_shared") + .image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_image") + .define("CONVERT_EXPRESSION", "vec4_from_float(texel.x)") + .do_static_compilation(true); + GPU_SHADER_CREATE_INFO(compositor_convert_color_to_float) .additional_info("compositor_convert_shared") .image(0, GPU_R16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_image") .define("CONVERT_EXPRESSION", "vec4(float_from_vec4(texel))") .do_static_compilation(true); -GPU_SHADER_CREATE_INFO(compositor_convert_float_to_color) +GPU_SHADER_CREATE_INFO(compositor_convert_color_to_vector) .additional_info("compositor_convert_shared") .image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_image") - .define("CONVERT_EXPRESSION", "vec4_from_float(texel.x)") + .define("CONVERT_EXPRESSION", "vec4(vec3_from_vec4(texel), 0.0)") + .do_static_compilation(true); + +GPU_SHADER_CREATE_INFO(compositor_convert_vector_to_float) + .additional_info("compositor_convert_shared") + .image(0, GPU_R16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_image") + .define("CONVERT_EXPRESSION", "vec4(float_from_vec3(texel.xyz))") .do_static_compilation(true); GPU_SHADER_CREATE_INFO(compositor_convert_vector_to_color) diff --git a/source/blender/viewport_compositor/VPC_compile_state.hh b/source/blender/viewport_compositor/VPC_compile_state.hh index 952fdbd4bbc..02c744f5ee6 100644 --- a/source/blender/viewport_compositor/VPC_compile_state.hh +++ b/source/blender/viewport_compositor/VPC_compile_state.hh @@ -51,7 +51,7 @@ using namespace nodes::derived_node_tree_types; * Second, it stores the GPU material compile group as well as its domain. One should first go over * the discussion in VPC_evaluator.hh for a high level description of the mechanism of the compile * group. The one important detail in this class is the should_compile_gpu_material_compile_group - * method, which implements the criteria of whether the compile group should be compiled taking the + * method, which implements the criteria of whether the compile group should be compiled given the * node currently being processed as an argument. Those criteria are described as follows. If the * compile group is empty as is the case when processing nodes 1, 2, and 3, then it plainly * shouldn't be compiled. If the given node is not a GPU material node, then it can't be added to diff --git a/source/blender/viewport_compositor/VPC_conversion_processor_operation.hh b/source/blender/viewport_compositor/VPC_conversion_processor_operation.hh index 64fb24e955b..f7832e2cfeb 100644 --- a/source/blender/viewport_compositor/VPC_conversion_processor_operation.hh +++ b/source/blender/viewport_compositor/VPC_conversion_processor_operation.hh @@ -6,46 +6,44 @@ #include "GPU_shader.h" #include "VPC_context.hh" +#include "VPC_input_descriptor.hh" #include "VPC_processor_operation.hh" #include "VPC_result.hh" namespace blender::viewport_compositor { -/* -------------------------------------------------------------------- +/* ------------------------------------------------------------------------------------------------- * Conversion Processor Operation. - */ - -/* A conversion processor is a processor that converts a result from a certain type to another. See - the derived classes for more details. */ + * + * A processor that converts a result from a certain type to another. See the derived classes for + * more details. */ class ConversionProcessorOperation : public ProcessorOperation { - public: - /* The name of the input sampler in the conversion shader. - * This is constant for all operations. */ - static const char *shader_input_sampler_name; - /* The name of the output image in the conversion shader. - * This is constant for all operations. */ - static const char *shader_output_image_name; - public: using ProcessorOperation::ProcessorOperation; + /* If the input result is a single value, execute_single is called. Otherwise, the shader + * provided by get_conversion_shader is dispatched. */ void execute() override; + /* Determine if a conversion processor operation is needed for the input with the given result + * and descriptor. If it is not needed, return a null pointer. If it is needed, return an + * instance of the appropriate conversion processor. */ + static ProcessorOperation *construct_if_needed(Context &context, + const Result &input_result, + const InputDescriptor &input_descriptor); + protected: /* Convert the input single value result to the output single value result. */ virtual void execute_single(const Result &input, Result &output) = 0; - /* Get the shader the will be used for conversion. It should have an input sampler called - * shader_input_sampler_name and an output image of an appropriate type called - * shader_output_image_name. */ + /* Get the shader the will be used for conversion. */ virtual GPUShader *get_conversion_shader() const = 0; }; -/* -------------------------------------------------------------------- +/* ------------------------------------------------------------------------------------------------- * Convert Float To Vector Processor Operation. - */ - -/* Takes a float result and outputs a vector result. All three components of the output are filled + * + * Takes a float result and outputs a vector result. All three components of the output are filled * with the input float. */ class ConvertFloatToVectorProcessorOperation : public ConversionProcessorOperation { public: @@ -56,11 +54,10 @@ class ConvertFloatToVectorProcessorOperation : public ConversionProcessorOperati GPUShader *get_conversion_shader() const override; }; -/* -------------------------------------------------------------------- +/* ------------------------------------------------------------------------------------------------- * Convert Float To Color Processor Operation. - */ - -/* Takes a float result and outputs a color result. All three color channels of the output are + * + * Takes a float result and outputs a color result. All three color channels of the output are * filled with the input float and the alpha channel is set to 1. */ class ConvertFloatToColorProcessorOperation : public ConversionProcessorOperation { public: @@ -71,11 +68,10 @@ class ConvertFloatToColorProcessorOperation : public ConversionProcessorOperatio GPUShader *get_conversion_shader() const override; }; -/* -------------------------------------------------------------------- +/* ------------------------------------------------------------------------------------------------- * Convert Color To Float Processor Operation. - */ - -/* Takes a color result and outputs a float result. The output is the average of the three color + * + * Takes a color result and outputs a float result. The output is the average of the three color * channels, the alpha channel is ignored. */ class ConvertColorToFloatProcessorOperation : public ConversionProcessorOperation { public: @@ -86,11 +82,24 @@ class ConvertColorToFloatProcessorOperation : public ConversionProcessorOperatio GPUShader *get_conversion_shader() const override; }; -/* -------------------------------------------------------------------- - * Convert Vector To Float Processor Operation. - */ +/* ------------------------------------------------------------------------------------------------- + * Convert Color To Vector Processor Operation. + * + * Takes a color result and outputs a vector result. The output is a copy of the three color + * channels to the three vector components. */ +class ConvertColorToVectorProcessorOperation : public ConversionProcessorOperation { + public: + ConvertColorToVectorProcessorOperation(Context &context); + + void execute_single(const Result &input, Result &output) override; + + GPUShader *get_conversion_shader() const override; +}; -/* Takes a vector result and outputs a float result. The output is the average of the three +/* ------------------------------------------------------------------------------------------------- + * Convert Vector To Float Processor Operation. + * + * Takes a vector result and outputs a float result. The output is the average of the three * components. */ class ConvertVectorToFloatProcessorOperation : public ConversionProcessorOperation { public: @@ -101,11 +110,10 @@ class ConvertVectorToFloatProcessorOperation : public ConversionProcessorOperati GPUShader *get_conversion_shader() const override; }; -/* -------------------------------------------------------------------- +/* ------------------------------------------------------------------------------------------------- * Convert Vector To Color Processor Operation. - */ - -/* Takes a vector result and outputs a color result. The output is a copy of the three vector + * + * Takes a vector result and outputs a color result. The output is a copy of the three vector * components to the three color channels with the alpha channel set to 1. */ class ConvertVectorToColorProcessorOperation : public ConversionProcessorOperation { public: diff --git a/source/blender/viewport_compositor/V @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs