100 input_data_(input_data),
108 output_result_.release();
109 viewer_output_result_.release();
110 for (GPUTexture *pass : cached_gpu_passes_) {
113 for (
ImBuf *pass : cached_cpu_passes_) {
120 input_data_ = input_data;
125 return *input_data_.scene;
130 return *input_data_.node_tree;
151 return input_data_.needed_outputs;
156 return *(input_data_.render_data);
182 const rcti render_region =
rcti{0, render_size.x, 0, render_size.y};
184 return render_region;
190 if (output_result_.is_allocated()) {
192 if (render_size == output_result_.domain().size) {
193 return output_result_;
197 output_result_.release();
201 output_result_.allocate_texture(render_size,
false);
202 return output_result_;
210 viewer_output_result_.meta_data.is_non_color_data = is_data;
212 if (viewer_output_result_.is_allocated()) {
214 if (domain.
size == viewer_output_result_.domain().size &&
215 precision == viewer_output_result_.precision())
217 return viewer_output_result_;
222 viewer_output_result_.release();
225 viewer_output_result_.meta_data.is_non_color_data = is_data;
228 viewer_output_result_.set_precision(precision);
229 viewer_output_result_.allocate_texture(domain,
false);
230 return viewer_output_result_;
235 const char *pass_name)
override
253 if (!render_result) {
284 cached_gpu_passes_.append(pass_texture);
291 cached_cpu_passes_.append(render_pass->
ibuf);
324 return input_data_.view_name;
329 switch (input_data_.scene->r.compositor_precision) {
357 const char *pass_name,
376 if (!render_result || !render_result->
stamp_data) {
383 const std::string combined_pass_name = std::string(view_layer->
name) +
"." + pass_name;
387 struct StampCallbackData {
388 std::string cryptomatte_layer_name;
393 StampCallbackData callback_data = {cryptomatte_layer_name, &meta_data};
397 [](
void *user_data,
const char *key,
char *value,
int ) {
398 StampCallbackData *data = static_cast<StampCallbackData *>(user_data);
400 const std::string manifest_key = bke::cryptomatte::BKE_cryptomatte_meta_data_key(
401 data->cryptomatte_layer_name,
"manifest");
402 if (key == manifest_key) {
403 data->meta_data->cryptomatte.manifest = value;
407 data->cryptomatte_layer_name,
"hash");
409 data->meta_data->cryptomatte.hash = value;
413 data->cryptomatte_layer_name,
"conversion");
414 if (key == conversion_key) {
415 data->meta_data->cryptomatte.conversion = value;
425 if (!output_result_.is_allocated()) {
439 float *output_buffer =
static_cast<float *
>(
448 data, output_result_.cpu_data().data(), rr->
rectx * rr->
recty * 4 *
sizeof(
float));
466 if (!viewer_output_result_.is_allocated()) {
471 const float2 translation = viewer_output_result_.domain().transformation.location();
472 image->
runtime->backdrop_offset[0] = translation.x;
473 image->
runtime->backdrop_offset[1] = translation.y;
475 if (viewer_output_result_.meta_data.is_non_color_data) {
484 input_data_.view_name.c_str());
487 input_data_.view_name.c_str()))
497 const int2 size = viewer_output_result_.domain().size;
498 if (image_buffer->
x !=
size.x || image_buffer->
y !=
size.y) {
501 image_buffer->
x =
size.x;
502 image_buffer->
y =
size.y;
512 float *output_buffer =
static_cast<float *
>(
521 viewer_output_result_.cpu_data().data(),
522 size.x *
size.y * 4 *
sizeof(
float));
526 if (input_data_.node_tree->runtime->update_draw) {
527 input_data_.node_tree->runtime->update_draw(input_data_.node_tree->runtime->udh);
533 return input_data_.render_context;
538 return input_data_.profiler;
564 std::unique_ptr<Context> context_;
576 context_ = std::make_unique<Context>(input_data);
578 uses_gpu_ = context_->use_gpu();
579 used_precision_ = context_->get_precision();
612 context_->update_input_data(input_data);
617 if (context_->use_gpu()) {
642 context_->output_to_render_result();
643 context_->viewer_output_to_viewer_image();
645 if (context_->use_gpu()) {
669 return context_->use_gpu() != uses_gpu_ || context_->get_precision() != used_precision_;
678 const char *view_name,
686 scene, render_data, node_tree, view_name, render_context, profiler, needed_outputs);
689 this->
compositor->update_input_data(input_data);
691 if (this->
compositor->needs_to_be_recreated()) {
719 const char *view_name,
725 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)
eCompositorDenoiseQaulity
@ 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 *)
void GPU_memory_barrier(eGPUBarrier barrier)
@ GPU_BARRIER_TEXTURE_UPDATE
void GPU_texture_free(GPUTexture *texture)
void GPU_texture_ref(GPUTexture *texture)
void * GPU_texture_read(GPUTexture *texture, eGPUDataFormat data_format, int mip_level)
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)
Result create_result(ResultType type, ResultPrecision precision)
void set_transformation(const float3x3 &transformation)
void wrap_external(GPUTexture *texture)
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
compositor::Result get_pass(const Scene *scene, int view_layer_id, const char *pass_name) override
const Scene & get_scene() const override
void set_info_message(StringRef) 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::ResultPrecision get_precision() const override
eCompositorDenoiseQaulity get_denoise_quality() 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::Result get_output_result() override
compositor::Result get_viewer_output_result(compositor::Domain domain, const bool is_data, compositor::ResultPrecision precision) override
compositor::Profiler * profiler() const override
bool use_gpu() const override
void update_input_data(const ContextInputData &input_data)
const RenderData & get_render_data() const override
rcti get_compositing_region() const override
const bNodeTree & get_node_tree() const override
int2 get_render_size() 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)
GPUTexture * RE_pass_ensure_gpu_texture_cache(Render *re, RenderPass *rpass)
RenderView * RE_RenderViewGetByName(RenderResult *rr, const char *viewname)
ImBuf * RE_RenderViewEnsureImBuf(const RenderResult *render_result, RenderView *render_view)
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
int compositor_denoise_preview_quality
int compositor_denoise_final_quality
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)