New ("fullframe") CPU compositor backend is being used now, and all the code
related to "tiled" CPU compositor is just never used anymore. The new backend
is faster, uses less memory, better matches GPU compositor, etc.
TL;DR: 20 thousand lines of code gone.
This commit:
- Removes various bits and pieces related to "tiled" compositor (execution
groups, one-pixel-at-a-time node processing, read/write buffer operations
related to node execution groups).
- "GPU" (OpenCL) execution device, that was only used by several nodes of
the tiled compositor.
- With that, remove CLEW external library too, since nothing within Blender
uses OpenCL directly anymore.
Pull Request: https://projects.blender.org/blender/blender/pulls/118819
177 lines
4.7 KiB
C++
177 lines
4.7 KiB
C++
/* SPDX-FileCopyrightText: 2011 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
#pragma once
|
|
|
|
#include "COM_MultiThreadedOperation.h"
|
|
|
|
namespace blender::compositor {
|
|
|
|
class BaseScaleOperation : public MultiThreadedOperation {
|
|
|
|
public:
|
|
void set_sampler(PixelSampler sampler)
|
|
{
|
|
sampler_ = (int)sampler;
|
|
}
|
|
void set_variable_size(bool variable_size)
|
|
{
|
|
variable_size_ = variable_size;
|
|
};
|
|
|
|
protected:
|
|
BaseScaleOperation();
|
|
|
|
PixelSampler get_effective_sampler(PixelSampler sampler)
|
|
{
|
|
return (sampler_ == -1) ? sampler : (PixelSampler)sampler_;
|
|
}
|
|
|
|
int sampler_;
|
|
bool variable_size_;
|
|
};
|
|
|
|
class ScaleOperation : public BaseScaleOperation {
|
|
public:
|
|
static constexpr float MIN_RELATIVE_SCALE = 0.0001f;
|
|
|
|
protected:
|
|
static constexpr int IMAGE_INPUT_INDEX = 0;
|
|
static constexpr int X_INPUT_INDEX = 1;
|
|
static constexpr int Y_INPUT_INDEX = 2;
|
|
|
|
float canvas_center_x_;
|
|
float canvas_center_y_;
|
|
|
|
public:
|
|
ScaleOperation();
|
|
ScaleOperation(DataType data_type);
|
|
|
|
static float scale_coord(const float coord, const float center, const float relative_scale)
|
|
{
|
|
return center + (coord - center) * std::max(relative_scale, MIN_RELATIVE_SCALE);
|
|
}
|
|
|
|
static float scale_coord_inverted(const float coord,
|
|
const float center,
|
|
const float relative_scale)
|
|
{
|
|
return center + (coord - center) / std::max(relative_scale, MIN_RELATIVE_SCALE);
|
|
}
|
|
|
|
static void get_scale_offset(const rcti &input_canvas,
|
|
const rcti &scale_canvas,
|
|
float &r_scale_offset_x,
|
|
float &r_scale_offset_y);
|
|
static void scale_area(rcti &area, float relative_scale_x, float relative_scale_y);
|
|
static void get_scale_area_of_interest(const rcti &input_canvas,
|
|
const rcti &scale_canvas,
|
|
float relative_scale_x,
|
|
float relative_scale_y,
|
|
const rcti &output_area,
|
|
rcti &r_input_area);
|
|
static void clamp_area_size_max(rcti &area, Size2f max_size);
|
|
|
|
void init_data() override;
|
|
|
|
void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override;
|
|
void update_memory_buffer_partial(MemoryBuffer *output,
|
|
const rcti &area,
|
|
Span<MemoryBuffer *> inputs) override;
|
|
|
|
void determine_canvas(const rcti &preferred_area, rcti &r_area) override;
|
|
|
|
protected:
|
|
virtual float get_relative_scale_x_factor(float width) = 0;
|
|
virtual float get_relative_scale_y_factor(float height) = 0;
|
|
|
|
private:
|
|
bool is_scaling_variable();
|
|
float get_constant_scale(int input_op_idx, float factor);
|
|
float get_constant_scale_x(float width);
|
|
float get_constant_scale_y(float height);
|
|
};
|
|
|
|
class ScaleRelativeOperation : public ScaleOperation {
|
|
public:
|
|
ScaleRelativeOperation();
|
|
ScaleRelativeOperation(DataType data_type);
|
|
|
|
float get_relative_scale_x_factor(float /*width*/) override
|
|
{
|
|
return 1.0f;
|
|
}
|
|
|
|
float get_relative_scale_y_factor(float /*height*/) override
|
|
{
|
|
return 1.0f;
|
|
}
|
|
};
|
|
|
|
class ScaleAbsoluteOperation : public ScaleOperation {
|
|
public:
|
|
float get_relative_scale_x_factor(float width) override
|
|
{
|
|
return 1.0f / width;
|
|
}
|
|
|
|
float get_relative_scale_y_factor(float height) override
|
|
{
|
|
return 1.0f / height;
|
|
}
|
|
};
|
|
|
|
class ScaleFixedSizeOperation : public BaseScaleOperation {
|
|
int new_width_;
|
|
int new_height_;
|
|
float rel_x_;
|
|
float rel_y_;
|
|
|
|
/* center is only used for aspect correction */
|
|
float offset_x_;
|
|
float offset_y_;
|
|
bool is_aspect_;
|
|
bool is_crop_;
|
|
/* set from other properties on initialization,
|
|
* check if we need to apply offset */
|
|
bool is_offset_;
|
|
|
|
public:
|
|
/** Absolute fixed size. */
|
|
ScaleFixedSizeOperation();
|
|
void determine_canvas(const rcti &preferred_area, rcti &r_area) override;
|
|
|
|
void set_new_width(int width)
|
|
{
|
|
new_width_ = width;
|
|
}
|
|
void set_new_height(int height)
|
|
{
|
|
new_height_ = height;
|
|
}
|
|
void set_is_aspect(bool is_aspect)
|
|
{
|
|
is_aspect_ = is_aspect;
|
|
}
|
|
void set_is_crop(bool is_crop)
|
|
{
|
|
is_crop_ = is_crop;
|
|
}
|
|
void set_offset(float x, float y)
|
|
{
|
|
offset_x_ = x;
|
|
offset_y_ = y;
|
|
}
|
|
|
|
void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override;
|
|
void update_memory_buffer_partial(MemoryBuffer *output,
|
|
const rcti &area,
|
|
Span<MemoryBuffer *> inputs) override;
|
|
|
|
private:
|
|
void init_data(const rcti &input_canvas);
|
|
};
|
|
|
|
} // namespace blender::compositor
|