66 for (GPUTexture *texture : available_textures) {
72 for (GPUTexture *texture : textures_in_use) {
82 GPUTexture *texture =
nullptr;
93 texture = available_textures.
pop_last();
108 for (GPUTexture *texture : available_textures) {
114 available_textures_ = textures_in_use_;
115 textures_in_use_.
clear();
169 input_data_(input_data),
170 output_result_(this->
create_result(realtime_compositor::ResultType::Color)),
171 viewer_output_result_(this->
create_result(realtime_compositor::ResultType::Color))
178 viewer_output_result_.
release();
179 for (GPUTexture *texture : textures_) {
186 input_data_ = input_data;
191 return *input_data_.
scene;
228 return int2(width, height);
234 const rcti render_region =
rcti{0, render_size.x, 0, render_size.y};
236 return render_region;
244 if (render_size == output_result_.
domain().
size) {
245 return output_result_;
251 output_result_.
reset();
256 return output_result_;
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();
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;
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;
447 if (StringRef(render_pass->
chan_id) ==
"XYZW") {
448 meta_data.is_4d_vector =
true;
468 if (this->use_gpu()) {
470 float *output_buffer =
static_cast<float *
>(
475 float *data =
static_cast<float *
>(
503 image->runtime.backdrop_offset[0] = translation.x;
504 image->runtime.backdrop_offset[1] = translation.y;
507 image->flag &= ~IMA_VIEW_AS_RENDER;
529 if (image_buffer->
x != size.x || image_buffer->
y != size.y) {
532 image_buffer->
x = size.x;
533 image_buffer->
y = size.y;
541 if (this->use_gpu()) {
543 float *output_buffer =
static_cast<float *
>(
547 image_buffer->
float_buffer.
data, output_buffer, size.x * size.y * 4 *
sizeof(
float));
553 size.x * size.y * 4 *
sizeof(
float));
582 if (this->use_gpu() && !this->render_context()) {
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);
697 if (this->compositor ==
nullptr) {
701 this->compositor->execute(input_data);
708 if (this->compositor !=
nullptr) {
710 this->compositor =
nullptr;
718 const char *view_name,
722 render.compositor_execute(scene, render_data,
node_tree, view_name, render_context, profiler);
727 render.compositor_free();
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.
struct GPUContext GPUContext
Value & lookup_or_add_default(const Key &key)
ValueIterator values() const
void append(const T &value)
Result create_result(ResultType type, ResultPrecision precision)
TexturePool & texture_pool()
static ResultPrecision precision(eGPUTextureFormat format)
bool is_allocated() const
const Domain & domain() const
void set_precision(ResultPrecision precision)
void set_transformation(const float3x3 &transformation)
void allocate_texture(Domain domain, bool from_pool=true)
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()
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
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
bNodeTreeRuntimeHandle * runtime
void WM_system_gpu_context_activate(void *context)
void WM_system_gpu_context_release(void *context)