66 for (GPUTexture *
texture : available_textures) {
72 for (GPUTexture *
texture : textures_in_use) {
96 textures_in_use_.lookup_or_add_default(key).append(
texture);
108 for (GPUTexture *
texture : available_textures) {
114 available_textures_ = textures_in_use_;
115 textures_in_use_.clear();
169 input_data_(input_data),
177 output_result_.release();
178 viewer_output_result_.release();
179 for (GPUTexture *
texture : textures_) {
186 input_data_ = input_data;
191 return *input_data_.scene;
196 return *input_data_.node_tree;
221 return *(input_data_.render_data);
228 return int2(width, height);
234 const rcti render_region =
rcti{0, render_size.x, 0, render_size.y};
236 return render_region;
242 if (output_result_.is_allocated()) {
244 if (render_size == output_result_.domain().size) {
245 return output_result_;
250 output_result_.release();
251 output_result_.reset();
255 output_result_.allocate_texture(render_size,
false);
256 return output_result_;
265 viewer_output_result_.meta_data.is_non_color_data = is_data;
267 if (viewer_output_result_.is_allocated()) {
269 if (domain.
size == viewer_output_result_.domain().size &&
270 precision == viewer_output_result_.precision())
272 return viewer_output_result_;
277 viewer_output_result_.release();
278 viewer_output_result_.reset();
282 viewer_output_result_.set_precision(precision);
283 viewer_output_result_.allocate_texture(domain,
false);
284 return viewer_output_result_;
289 const char *pass_name)
override
297 GPUTexture *input_texture =
nullptr;
316 textures_.append(input_texture);
328 return input_texture;
333 return input_data_.view_name;
338 switch (input_data_.scene->r.compositor_precision) {
375 const char *pass_name,
390 if (!render_result || !render_result->
stamp_data) {
397 const std::string combined_pass_name = std::string(view_layer->
name) +
"." + pass_name;
401 struct StampCallbackData {
402 std::string cryptomatte_layer_name;
407 StampCallbackData callback_data = {cryptomatte_layer_name, &meta_data};
411 [](
void *user_data,
const char *key,
char *value,
int ) {
412 StampCallbackData *data = static_cast<StampCallbackData *>(user_data);
414 const std::string manifest_key = bke::cryptomatte::BKE_cryptomatte_meta_data_key(
415 data->cryptomatte_layer_name,
"manifest");
416 if (key == manifest_key) {
417 data->meta_data->cryptomatte.manifest = value;
421 data->cryptomatte_layer_name,
"hash");
423 data->meta_data->cryptomatte.hash = value;
427 data->cryptomatte_layer_name,
"conversion");
428 if (key == conversion_key) {
429 data->meta_data->cryptomatte.conversion = value;
448 meta_data.is_4d_vector =
true;
456 if (!output_result_.is_allocated()) {
470 float *output_buffer =
static_cast<float *
>(
475 float *
data =
static_cast<float *
>(
479 data, output_result_.float_texture(), rr->
rectx * rr->
recty * 4 *
sizeof(
float));
497 if (!viewer_output_result_.is_allocated()) {
502 const float2 translation = viewer_output_result_.domain().transformation.location();
503 image->runtime.backdrop_offset[0] = translation.x;
504 image->runtime.backdrop_offset[1] = translation.y;
506 if (viewer_output_result_.meta_data.is_non_color_data) {
515 input_data_.view_name.c_str());
518 input_data_.view_name.c_str()))
528 const int2 size = viewer_output_result_.domain().size;
529 if (image_buffer->
x !=
size.x || image_buffer->
y !=
size.y) {
532 image_buffer->
x =
size.x;
533 image_buffer->
y =
size.y;
543 float *output_buffer =
static_cast<float *
>(
552 viewer_output_result_.float_texture(),
553 size.x *
size.y * 4 *
sizeof(
float));
557 if (input_data_.node_tree->runtime->update_draw) {
558 input_data_.node_tree->runtime->update_draw(input_data_.node_tree->runtime->udh);
564 return input_data_.render_context;
569 return input_data_.profiler;
595 std::unique_ptr<TexturePool> texture_pool_;
596 std::unique_ptr<Context> context_;
601 texture_pool_ = std::make_unique<TexturePool>();
602 context_ = std::make_unique<Context>(input_data, *texture_pool_);
607 const bool use_gpu = context_->use_gpu();
620 texture_pool_.reset();
635 context_->update_input_data(input_data);
637 if (context_->use_gpu()) {
664 context_->output_to_render_result();
665 context_->viewer_output_to_viewer_image();
666 texture_pool_->free_unused_and_reset();
668 if (context_->use_gpu()) {
688 const char *view_name,
695 scene, render_data,
node_tree, view_name, render_context, profiler);
718 const char *view_name,
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 struct 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)
ID and Library types, which are fundamental for SDNA.
@ 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
GPUTexture * GPU_texture_create_2d(const char *name, int width, int height, int mip_len, eGPUTextureFormat format, eGPUTextureUsage usage, const float *data)
void GPU_texture_free(GPUTexture *texture)
void GPU_texture_ref(GPUTexture *texture)
void * GPU_texture_read(GPUTexture *texture, eGPUDataFormat data_format, int mip_level)
@ GPU_TEXTURE_USAGE_GENERAL
void imb_freerectImBuf(ImBuf *ibuf)
void imb_freerectfloatImBuf(ImBuf *ibuf)
void IMB_assign_float_buffer(ImBuf *ibuf, float *buffer_data, ImBufOwnership ownership)
bool imb_addrectfloatImBuf(ImBuf *ibuf, const unsigned int channels, bool initialize_pixels=true)
@ IB_DISPLAY_BUFFER_INVALID
Read Guarded memory(de)allocation.
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert Color
struct GPUContext GPUContext
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Result create_result(ResultType type, ResultPrecision precision)
TexturePool & texture_pool()
void set_transformation(const float3x3 &transformation)
realtime_compositor::RenderContext * render_context
const bNodeTree * node_tree
realtime_compositor::Profiler * profiler
ContextInputData(const Scene &scene, const RenderData &render_data, const bNodeTree &node_tree, const char *view_name, realtime_compositor::RenderContext *render_context, realtime_compositor::Profiler *profiler)
const RenderData * render_data
IDRecalcFlag query_id_recalc_flag(ID *id) const override
bool should_compute_node_previews() const override
const Scene & get_scene() const override
void set_info_message(StringRef) const override
StringRef get_view_name() const override
realtime_compositor::Result get_output_result() override
void viewer_output_to_viewer_image()
realtime_compositor::ResultPrecision get_precision() const override
void populate_meta_data_for_pass(const Scene *scene, int view_layer_id, const char *pass_name, realtime_compositor::MetaData &meta_data) const override
realtime_compositor::Result get_viewer_output_result(realtime_compositor::Domain domain, const bool is_data, realtime_compositor::ResultPrecision precision) override
realtime_compositor::Profiler * profiler() const override
void evaluate_operation_post() const override
bool use_gpu() const override
Context(const ContextInputData &input_data, TexturePool &texture_pool)
void update_input_data(const ContextInputData &input_data)
bool use_file_output() const override
const RenderData & get_render_data() const override
bool use_composite_output() const override
rcti get_compositing_region() const override
const bNodeTree & get_node_tree() const override
GPUTexture * get_input_texture(const Scene *scene, int view_layer_id, const char *pass_name) override
realtime_compositor::RenderContext * render_context() const override
int2 get_render_size() const override
void output_to_render_result()
RealtimeCompositor(Render &render, const ContextInputData &input_data)
void execute(const ContextInputData &input_data)
GPUTexture * allocate_texture(int2 size, eGPUTextureFormat format) override
void free_unused_and_reset()
input_tx image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "preview_img") .compute_source("compositor_compute_preview.glsl") .do_static_compilation(true)
local_group_size(16, 16) .push_constant(Type texture
DrawData * DRW_drawdata_ensure(ID *id, DrawEngineType *engine_type, size_t size, DrawDataInitCb init_cb, DrawDataFreeCb free_cb)
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
StringRef BKE_cryptomatte_extract_layer_name(const StringRef render_pass_name)
std::string BKE_cryptomatte_meta_data_key(const StringRef layer_name, const StringRefNull key_name)
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
void RE_compositor_execute(Render &render, const Scene &scene, const RenderData &render_data, const bNodeTree &node_tree, const char *view_name, blender::realtime_compositor::RenderContext *render_context, blender::realtime_compositor::Profiler *profiler)
void RE_compositor_free(Render &render)
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
struct StampData * stamp_data
void compositor_free() override
blender::render::RealtimeCompositor * compositor
void compositor_execute(const Scene &scene, const RenderData &render_data, const bNodeTree &node_tree, const char *view_name, blender::realtime_compositor::RenderContext *render_context, blender::realtime_compositor::Profiler *profiler) override
std::mutex compositor_mutex
void WM_system_gpu_context_activate(void *context)
void WM_system_gpu_context_release(void *context)