100 input_data_(input_data),
108 output_result_.release();
109 viewer_output_result_.release();
113 for (
ImBuf *pass : cached_cpu_passes_) {
120 input_data_ = input_data;
125 return *input_data_.scene;
130 return *input_data_.node_tree;
140 return input_data_.needed_outputs;
145 return *(input_data_.render_data);
176 if (output_result_.is_allocated()) {
178 if (render_size == output_result_.domain().size) {
179 return output_result_;
183 output_result_.release();
187 output_result_.allocate_texture(render_size,
false);
188 return output_result_;
196 viewer_output_result_.meta_data.is_non_color_data = is_data;
198 if (viewer_output_result_.is_allocated()) {
200 if (domain.
size == viewer_output_result_.domain().size &&
201 precision == viewer_output_result_.precision())
203 return viewer_output_result_;
208 viewer_output_result_.release();
211 viewer_output_result_.meta_data.is_non_color_data = is_data;
214 viewer_output_result_.set_precision(precision);
215 viewer_output_result_.allocate_texture(domain,
false);
216 return viewer_output_result_;
241 if (!render_result) {
272 cached_gpu_passes_.append(pass_texture);
279 cached_cpu_passes_.append(render_pass->
ibuf);
288 if (
name ==
"Image") {
321 return input_data_.view_name;
326 switch (input_data_.scene->r.compositor_precision) {
345 const char *pass_name,
364 if (!render_result || !render_result->
stamp_data) {
371 const std::string combined_pass_name = std::string(view_layer->
name) +
"." + pass_name;
375 struct StampCallbackData {
376 std::string cryptomatte_layer_name;
381 StampCallbackData callback_data = {cryptomatte_layer_name, &meta_data};
385 [](
void *user_data,
const char *key,
char *value,
int ) {
386 StampCallbackData *data = static_cast<StampCallbackData *>(user_data);
388 const std::string manifest_key = bke::cryptomatte::BKE_cryptomatte_meta_data_key(
389 data->cryptomatte_layer_name,
"manifest");
390 if (key == manifest_key) {
391 data->meta_data->cryptomatte.manifest = value;
395 data->cryptomatte_layer_name,
"hash");
397 data->meta_data->cryptomatte.hash = value;
401 data->cryptomatte_layer_name,
"conversion");
402 if (key == conversion_key) {
403 data->meta_data->cryptomatte.conversion = value;
413 if (!output_result_.is_allocated()) {
427 float *output_buffer =
static_cast<float *
>(
436 data, output_result_.cpu_data().data(), rr->
rectx * rr->
recty * 4 *
sizeof(
float));
454 if (!viewer_output_result_.is_allocated()) {
459 const float2 translation = viewer_output_result_.domain().transformation.location();
460 image->
runtime->backdrop_offset[0] = translation.x;
461 image->
runtime->backdrop_offset[1] = translation.y;
463 if (viewer_output_result_.meta_data.is_non_color_data) {
472 input_data_.view_name.c_str());
475 input_data_.view_name.c_str()))
485 const int2 size = viewer_output_result_.domain().size;
486 if (image_buffer->
x !=
size.x || image_buffer->
y !=
size.y) {
489 image_buffer->
x =
size.x;
490 image_buffer->
y =
size.y;
500 float *output_buffer =
static_cast<float *
>(
509 viewer_output_result_.cpu_data().data(),
510 size.x *
size.y * 4 *
sizeof(
float));
514 if (input_data_.node_tree->runtime->update_draw) {
515 input_data_.node_tree->runtime->update_draw(input_data_.node_tree->runtime->udh);
521 return input_data_.render_context;
526 return input_data_.profiler;
552 std::unique_ptr<Context> context_;
564 context_ = std::make_unique<Context>(input_data);
566 uses_gpu_ = context_->use_gpu();
567 used_precision_ = context_->get_precision();
600 context_->update_input_data(input_data);
605 if (context_->use_gpu()) {
630 context_->output_to_render_result();
631 context_->viewer_output_to_viewer_image();
633 if (context_->use_gpu()) {
657 return context_->use_gpu() != uses_gpu_ || context_->get_precision() != used_precision_;
666 const char *view_name,
674 scene, render_data, node_tree, view_name, render_context, profiler, needed_outputs);
677 this->
compositor->update_input_data(input_data);
679 if (this->
compositor->needs_to_be_recreated()) {
707 const char *view_name,
713 scene, render_data, node_tree, view_name, render_context, profiler, needed_outputs);
ImBuf * BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **r_lock)
void BKE_image_ensure_viewer_views(const RenderData *rd, Image *ima, ImageUser *iuser)
Image * BKE_image_ensure_viewer(Main *bmain, int type, const char *name)
void BKE_image_release_ibuf(Image *ima, ImBuf *ibuf, void *lock)
void BKE_stamp_info_callback(void *data, StampData *stamp_data, StampCallback callback, bool noskip)
void BKE_image_signal(Main *bmain, Image *ima, ImageUser *iuser, int signal)
void BKE_image_partial_update_mark_full_update(Image *image)
Mark the whole image to be updated.
void BKE_render_resolution(const RenderData *r, const bool use_crop, int *r_width, int *r_height)
bool BKE_scene_multiview_is_render_view_first(const RenderData *rd, const char *viewname)
int BKE_scene_multiview_view_id_get(const RenderData *rd, const char *viewname)
#define BLI_assert_unreachable()
void * BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_thread_unlock(int type)
void BLI_thread_lock(int type)
int BLI_thread_is_main(void)
@ SCE_COMPOSITOR_PRECISION_FULL
@ SCE_COMPOSITOR_PRECISION_AUTO
@ SCE_COMPOSITOR_DEVICE_GPU
void DRW_gpu_context_disable()
void DRW_gpu_context_enable()
void DRW_render_context_disable(Render *render)
void DRW_render_context_enable(Render *render)
void GPU_context_active_set(GPUContext *)
@ GPU_BARRIER_TEXTURE_UPDATE
void GPU_memory_barrier(GPUBarrier barrier)
void GPU_texture_ref(blender::gpu::Texture *texture)
void * GPU_texture_read(blender::gpu::Texture *texture, eGPUDataFormat data_format, int mip_level)
void GPU_texture_free(blender::gpu::Texture *texture)
void IMB_assign_float_buffer(ImBuf *ibuf, float *buffer_data, ImBufOwnership ownership)
void IMB_freeImBuf(ImBuf *ibuf)
void IMB_free_float_pixels(ImBuf *ibuf)
void IMB_refImBuf(ImBuf *ibuf)
void IMB_free_byte_pixels(ImBuf *ibuf)
bool IMB_alloc_float_pixels(ImBuf *ibuf, const unsigned int channels, bool initialize_pixels=true)
@ IB_DISPLAY_BUFFER_INVALID
Read Guarded memory(de)allocation.
BMesh const char void * data
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
constexpr const char * data() const
Result create_result(ResultType type, ResultPrecision precision)
void wrap_external(blender::gpu::Texture *texture)
void set_transformation(const float3x3 &transformation)
void reset(bool force_free=false)
static TexturePool & get()
Compositor(Render &render, const ContextInputData &input_data)
void update_input_data(const ContextInputData &input_data)
bool needs_to_be_recreated()
compositor::RenderContext * render_context
ContextInputData(const Scene &scene, const RenderData &render_data, const bNodeTree &node_tree, const char *view_name, compositor::RenderContext *render_context, compositor::Profiler *profiler, compositor::OutputTypes needed_outputs)
const bNodeTree * node_tree
compositor::OutputTypes needed_outputs
compositor::Profiler * profiler
const RenderData * render_data
const Scene & get_scene() const override
StringRef get_view_name() const override
compositor::RenderContext * render_context() const override
void populate_meta_data_for_pass(const Scene *scene, int view_layer_id, const char *pass_name, compositor::MetaData &meta_data) const override
void viewer_output_to_viewer_image()
compositor::Result get_pass(const Scene *scene, int view_layer_id, const char *name) override
compositor::ResultPrecision get_precision() const override
void evaluate_operation_post() const override
compositor::ResultType result_type_from_pass(const RenderPass *pass)
compositor::OutputTypes needed_outputs() const override
Context(const ContextInputData &input_data)
compositor::Profiler * profiler() const override
compositor::Result get_output(compositor::Domain) override
bool use_gpu() const override
compositor::Result get_viewer_output(compositor::Domain domain, const bool is_data, compositor::ResultPrecision precision) override
void update_input_data(const ContextInputData &input_data)
Bounds< int2 > get_compositing_region() const override
const RenderData & get_render_data() const override
compositor::Result get_input(StringRef name) override
int2 get_render_size() const
const bNodeTree & get_node_tree() const override
void output_to_render_result()
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
StringRef BKE_cryptomatte_extract_layer_name(StringRef render_pass_name)
std::string BKE_cryptomatte_meta_data_key(StringRef layer_name, StringRefNull key_name)
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
void RE_compositor_free(Render &render)
void RE_compositor_execute(Render &render, const Scene &scene, const RenderData &render_data, const bNodeTree &node_tree, const char *view_name, blender::compositor::RenderContext *render_context, blender::compositor::Profiler *profiler, blender::compositor::OutputTypes needed_outputs)
RenderView * RE_RenderViewGetByName(RenderResult *rr, const char *viewname)
ImBuf * RE_RenderViewEnsureImBuf(const RenderResult *render_result, RenderView *render_view)
blender::gpu::Texture * RE_pass_ensure_gpu_texture_cache(Render *re, RenderPass *rpass)
void * RE_blender_gpu_context_ensure(Render *re)
void * RE_system_gpu_context_get(Render *re)
RenderPass * RE_pass_find_by_name(RenderLayer *rl, const char *name, const char *viewname)
RenderResult * RE_AcquireResultWrite(Render *re)
RenderResult * RE_AcquireResultRead(Render *re)
RenderLayer * RE_GetRenderLayer(RenderResult *rr, const char *name)
void RE_ReleaseResult(Render *re)
Render * RE_GetSceneRender(const Scene *scene)
ImBufFloatBuffer float_buffer
ImageRuntimeHandle * runtime
struct StampData * stamp_data
void compositor_free() override
blender::render::Compositor * compositor
blender::Mutex compositor_mutex
void compositor_execute(const Scene &scene, const RenderData &render_data, const bNodeTree &node_tree, const char *view_name, blender::compositor::RenderContext *render_context, blender::compositor::Profiler *profiler, blender::compositor::OutputTypes needed_outputs) override
void WM_system_gpu_context_activate(void *context)
void WM_system_gpu_context_release(void *context)