Files
test2/source/blender/compositor/intern/COM_CompositorContext.h
Omar Emara 0dca908191 Compositor: Add GPU per-node execution time report
This patch adds support for timing GPU compositor executions. This was
previously not possible since there was no mechanism to measure GPU
calls, which is still the case. However, since 2cf8b5c4e1, we now flush
GPU calls immediately for interactive editing, so we can now measure the
GPU evaluation on the host, which is not a very accurate method, but it
is better than having no timing information. Therefore, timing is only
implemented for interactive editing.

This is different from the CPU implementation in that it measures the
total evaluation time, including any preprocessing of the inputs like
implicit type conversion as well as things like previews.

The profiling implementation was moved to the realtime compositor since
the compositor module is optional.

Pull Request: https://projects.blender.org/blender/blender/pulls/122230
2024-05-28 08:13:46 +02:00

226 lines
4.5 KiB
C++

/* SPDX-FileCopyrightText: 2011 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#pragma once
#include "COM_Enums.h"
#include "DNA_color_types.h"
#include "DNA_node_types.h"
#include "DNA_scene_types.h"
namespace blender::bke {
struct bNodeInstanceHash;
}
namespace blender::realtime_compositor {
class RenderContext;
class Profiler;
} // namespace blender::realtime_compositor
namespace blender::compositor {
/**
* \brief Overall context of the compositor
*/
class CompositorContext {
private:
/**
* \brief The rendering field describes if we are rendering (F12) or if we are editing (Node
* editor) This field is initialized in ExecutionSystem and must only be read from that point
* on. \see ExecutionSystem
*/
bool rendering_;
Scene *scene_;
/**
* \brief Reference to the render data that is being composited.
* This field is initialized in ExecutionSystem and must only be read from that point on.
* \see ExecutionSystem
*/
RenderData *rd_;
/**
* \brief reference to the bNodeTree
* This field is initialized in ExecutionSystem and must only be read from that point on.
* \see ExecutionSystem
*/
bNodeTree *bnodetree_;
/**
* \brief Preview image hash table
* This field is initialized in ExecutionSystem and must only be read from that point on.
*/
bke::bNodeInstanceHash *previews_;
/**
* \brief active rendering view name
*/
const char *view_name_;
/**
* \brief Render context that contains information about active render. Can be null if the
* compositor is not executing as part of the render pipeline.
*/
realtime_compositor::RenderContext *render_context_;
/**
* \brief Profiler that stores timing information about compositor execution. Can be null if the
* compositor context does not support profiling.
*/
realtime_compositor::Profiler *profiler_;
public:
/**
* \brief constructor initializes the context with default values.
*/
CompositorContext();
/**
* \brief set the rendering field of the context
*/
void set_rendering(bool rendering)
{
rendering_ = rendering;
}
/**
* \brief get the rendering field of the context
*/
bool is_rendering() const
{
return rendering_;
}
/**
* \brief set the scene of the context
*/
void set_render_data(RenderData *rd)
{
rd_ = rd;
}
/**
* \brief set the bnodetree of the context
*/
void set_bnodetree(bNodeTree *bnodetree)
{
bnodetree_ = bnodetree;
}
/**
* \brief get the bnodetree of the context
*/
const bNodeTree *get_bnodetree() const
{
return bnodetree_;
}
/**
* \brief get the scene of the context
*/
const RenderData *get_render_data() const
{
return rd_;
}
void set_scene(Scene *scene)
{
scene_ = scene;
}
Scene *get_scene() const
{
return scene_;
}
/**
* \brief set the preview image hash table
*/
void set_preview_hash(bke::bNodeInstanceHash *previews)
{
previews_ = previews;
}
/**
* \brief get the preview image hash table
*/
bke::bNodeInstanceHash *get_preview_hash() const
{
return previews_;
}
/**
* \brief get the current frame-number of the scene in this context
*/
int get_framenumber() const;
/** Whether it has a view with a specific name and not the default one. */
bool has_explicit_view() const
{
return view_name_ && view_name_[0] != '\0';
}
/**
* \brief get the render context
*/
realtime_compositor::RenderContext *get_render_context() const
{
return render_context_;
}
/**
* \brief set the render context
*/
void set_render_context(realtime_compositor::RenderContext *render_context)
{
render_context_ = render_context;
}
/**
* \brief get the profiler
*/
realtime_compositor::Profiler *get_profiler() const
{
return profiler_;
}
/**
* \brief set the profiler
*/
void set_profiler(realtime_compositor::Profiler *profiler)
{
profiler_ = profiler;
}
/**
* \brief get the active rendering view
*/
const char *get_view_name() const
{
return view_name_;
}
/**
* \brief set the active rendering view
*/
void set_view_name(const char *view_name)
{
view_name_ = view_name;
}
/**
* \brief Get the render percentage as a factor.
* The compositor uses a factor i.o. a percentage.
*/
float get_render_percentage_as_factor() const
{
return rd_->size * 0.01f;
}
Size2f get_render_size() const;
};
} // namespace blender::compositor