Commit: 6f92c8ceacae59ae8366e5d2955814f15711ad9c Author: Omar Emara Date: Wed Feb 16 17:39:54 2022 +0200 Branches: temp-viewport-compositor-compiler https://developer.blender.org/rB6f92c8ceacae59ae8366e5d2955814f15711ad9c
Viewport Compositor: Compute operations stream This patch implements the necessary componenets for compilling the node schedule into an operations stream that can be executed by the evaluator. =================================================================== M source/blender/blenkernel/BKE_node.h M source/blender/draw/engines/compositor/compositor_engine.cc M source/blender/draw/engines/compositor/compositor_shader.cc M source/blender/draw/engines/compositor/compositor_shader.hh M source/blender/nodes/NOD_compositor_execute.hh M source/blender/nodes/intern/node_compositor_execute.cc =================================================================== diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index c57224d95a3..2f255bde0ae 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -126,10 +126,10 @@ namespace fn { class CPPType; class MFDataType; } // namespace fn -namespace compositor { +namespace viewport_compositor { class Context; class NodeOperation; -} // namespace compositor +} // namespace viewport_compositor } // namespace blender using CPPTypeHandle = blender::fn::CPPType; @@ -144,11 +144,11 @@ using SocketGetGeometryNodesCPPValueFunction = void (*)(const struct bNodeSocket using NodeGatherSocketLinkOperationsFunction = void (*)(blender::nodes::GatherLinkSearchOpParams ¶ms); -using NodeCompositorGetOperationFunction = blender::compositor::NodeOperation (*)( - blender::compositor::Context &context, blender::nodes::DNode &node); +using NodeGetCompositorOperationFunction = blender::viewport_compositor::NodeOperation + *(*)(blender::viewport_compositor::Context &context, blender::nodes::DNode node); #else -typedef void *NodeCompositorGetOperationFunction; +typedef void *NodeGetCompositorOperationFunction; typedef void *NodeMultiFunctionBuildFunction; typedef void *NodeGeometryExecFunction; typedef void *NodeDeclareFunction; @@ -331,8 +331,8 @@ typedef struct bNodeType { /* gpu */ NodeGPUExecFunction gpu_fn; - /* Execute a compositor node. */ - NodeCompositorGetOperationFunction compositor_get_operation; + /* Get an instance of this node's compositor operation. */ + NodeGetCompositorOperationFunction get_compositor_operation; /* Build a multi-function for this node. */ NodeMultiFunctionBuildFunction build_multi_function; diff --git a/source/blender/draw/engines/compositor/compositor_engine.cc b/source/blender/draw/engines/compositor/compositor_engine.cc index 7b86b1592b3..021e916ee52 100644 --- a/source/blender/draw/engines/compositor/compositor_engine.cc +++ b/source/blender/draw/engines/compositor/compositor_engine.cc @@ -16,12 +16,6 @@ * Copyright 2021, Blender Foundation. */ -/** \file - * \ingroup draw_engine - * - * Engine processing the render buffer using GLSL to apply the scene compositing node tree. - */ - #include "DNA_scene_types.h" #include "DRW_render.h" @@ -34,9 +28,10 @@ #include "compositor_shader.hh" -namespace blender::compositor { +namespace blender::viewport_compositor { class DRWTexturePool : public TexturePool { + public: GPUTexture *allocate_texture(int width, int height, eGPUTextureFormat format) override { DrawEngineType *owner = (DrawEngineType *)this; @@ -45,6 +40,8 @@ class DRWTexturePool : public TexturePool { }; class DRWContext : public Context { + public: + using Context::Context; GPUTexture *get_viewport_texture() override { return DRW_viewport_texture_list_get()->color; @@ -56,201 +53,61 @@ class DRWContext : public Context { } }; -/* Keep in sync with CompositorData in compositor_lib.glsl. */ -typedef struct CompositorData { - float luminance_coefficients[3]; - float frame_number; -} CompositorData; - -BLI_STATIC_ASSERT_ALIGN(CompositorData, 16) - -static ShaderModule *g_shader_module = nullptr; - -class Instance { - public: - ShaderModule &shaders; - - private: - /** TODO(fclem) multipass. */ - DRWPass *pass_; - /** A UBO storing CompositorData. */ - GPUUniformBuf *ubo_; - GPUMaterial *gpumat_; - /** Temp buffers to hold intermediate results or the input color. */ - GPUTexture *tmp_buffer_ = nullptr; - GPUFrameBuffer *tmp_fb_ = nullptr; - - bool enabled_; - - public: - Instance(ShaderModule &shader_module) : shaders(shader_module) - { - ubo_ = GPU_uniformbuf_create_ex(sizeof(CompositorData), &ubo_, "CompositorData"); - }; - - ~Instance() - { - GPU_uniformbuf_free(ubo_); - GPU_FRAMEBUFFER_FREE_SAFE(tmp_fb_); - } - - void init() - { - const DRWContextState *ctx_state = DRW_context_state_get(); - Scene *scene = ctx_state->scene; - enabled_ = scene->use_nodes && scene->nodetree; - - if (!enabled_) { - return; - } - - gpumat_ = shaders.material_get(scene); - enabled_ = GPU_material_status(gpumat_) == GPU_MAT_SUCCESS; - - if (!enabled_) { - return; - } - - /* Create temp double buffer to render to or copy source to. */ - /* TODO(fclem) with multipass compositing we might need more than one temp buffer. */ - DrawEngineType *owner = (DrawEngineType *)g_shader_module; - eGPUTextureFormat format = GPU_texture_format(DRW_viewport_texture_list_get()->color); - tmp_buffer_ = DRW_texture_pool_query_fullscreen(format, owner); - - GPU_framebuffer_ensure_config(&tmp_fb_, - { - GPU_ATTACHMENT_NONE, - GPU_ATTACHMENT_TEXTURE(tmp_buffer_), - }); - } - - void sync() - { - if (!enabled_) { - return; - } - - pass_ = DRW_pass_create("Compositing", DRW_STATE_WRITE_COLOR); - DRWShadingGroup *grp = DRW_shgroup_material_create(gpumat_, pass_); - - sync_compositor_ubo(grp); - - ListBase rpasses = GPU_material_render_passes(gpumat_); - LISTBASE_FOREACH (GPUMaterialRenderPass *, gpu_rp, &rpasses) { - DRWRenderPass *drw_rp = DRW_render_pass_find( - gpu_rp->scene, gpu_rp->viewlayer, gpu_rp->pass_type); - if (drw_rp) { - DRW_shgroup_uniform_texture_ex( - grp, gpu_rp->sampler_name, drw_rp->pass_tx, gpu_rp->sampler_state); - } - } - - DRW_shgroup_call_procedural_triangles(grp, nullptr, 1); - } - - void draw() - { - if (!enabled_) { - return; - } - - DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); - - /* Reset default view. */ - DRW_view_set_active(nullptr); - - GPU_framebuffer_bind(tmp_fb_); - DRW_draw_pass(pass_); - - /* TODO(fclem) only copy if we need to. Only possible in multipass. - * This is because dtxl->color can also be an input to the compositor. */ - GPU_texture_copy(dtxl->color, tmp_buffer_); - } - - private: - void sync_compositor_ubo(DRWShadingGroup *shading_group) - { - CompositorData compositor_data; - IMB_colormanagement_get_luminance_coefficients(compositor_data.luminance_coefficients); - compositor_data.frame_number = (float)DRW_context_state_get()->scene->r.cfra; - - GPU_uniformbuf_update(ubo_, &compositor_data); - DRW_shgroup_uniform_block(shading_group, "compositor_block", ubo_); - } -}; - -} // namespace blender::compositor - -/* -------------------------------------------------------------------- */ -/** \name C interface - * \{ */ - -using namespace blender::compositor; - -typedef struct COMPOSITOR_Data { - DrawEngineType *engine_type; - DRWViewportEmptyList *fbl; - DRWViewportEmptyList *txl; - DRWViewportEmptyList *psl; - DRWViewportEmptyList *stl; - Instance *instance_data; -} COMPOSITOR_Data; - -static void compositor_engine_init(void *vedata) +/* Get the scene which includes the compositor node tree. */ +static const Scene *get_scene() { - COMPOSITOR_Data *ved = (COMPOSITOR_Data *)vedata; + return DRW_context_state_get()->scene; +} - if (g_shader_module == nullptr) { - /* TODO(fclem) threadsafety. */ - g_shader_module = new ShaderModule(); +/* It is sufficient to check for the scene node tree because the engine will not be enabled when + * the viewport shading option is disabled. */ +static bool is_compositor_enabled() +{ + const Scene *scene = get_scene(); + if (scene->use_nodes && scene->nodetree) { + return true; } + return false; +} - if (ved->instance_data == nullptr) { - ved->instance_data = new Instance(*g_shader_module); +static void draw() +{ + if (!is_compositor_enabled()) { + return; } - ved->instance_data->init(); -} + /* Reset default view. */ + DRW_view_set_active(nullptr); -static void compositor_engine_free(void) -{ - delete g_shader_module; - g_shader_module = nullptr; + DRWTexturePool texture_pool; + DRWContext context(texture_pool); + const Scene *scene = get_scene(); + Evaluator evaluator(context, scene->nodetree); + evaluator.evaluate(); } -static void compositor_instance_free(void *instance_data_) -{ - Instance *instance_data = reinterpret_cast<Instance *>(instance_data_); - delete instance_data; -} +} // namespace blender::viewport_compositor -static void compositor_cache_init(void *vedata) -{ - COMPOSITOR_Data *ved = (COMPOSITOR_Data *)vedata; - ved->instance_data->sync(); -} +using namespace blender::viewport_compositor; -static void compositor_draw(void *vedata) +static void compositor_draw(void *UNUSED(data)) { - COMPOSITOR_Data *ved = (COMPOSITOR_Data *)vedata; - ved->instance_data->draw(); + draw(); } -/** \} */ - extern "C" { -static const DrawEngineDataSize compositor_data_size = DRW_VIEWPORT_DATA_SIZE(COMPOSITOR_Data); +static const DrawEngineDataSize compositor_data_size = {}; DrawEngineType draw_engine_compositor_type = { nullptr, nullptr, N_("Compositor"), &compositor_data_size, - &compositor_engine_init, - &compositor_engine_free, - &compositor_instance_free, - &compositor_cache_init, + nullptr, + nullptr, + nullptr, + nullptr, nullptr, nullptr, &compositor_draw, diff --git a/source/blender/draw/engines/compositor/compositor_shader.cc b/source/blender/draw/engines/compositor/compositor_shader.cc index d9e8e4b5f79..17bc28ce759 100644 --- a/source/blender/draw/engines/compositor/compositor_shader.cc +++ b/source/blender/draw/engines/compositor/compositor_shader.cc @@ -33,7 +33,7 @@ extern char datatoc_compositor_nodetree_eval_lib_glsl[]; extern char datatoc_gpu_shader_codegen_lib_glsl[]; } -namespace blender::compositor { +namespace blender::viewport_compositor { ShaderModule::ShaderModule() { @@ -112,4 +112,4 @@ GPUMaterial *ShaderModule::material_get(Scene *scene) return DRW_shader_from_compositor(scene, shader_id, true, codegen_callback, this); } -} // namespace blender::compositor +} // namespace blender::viewport_compositor diff --git a/source/blender/draw/engines/compositor/compositor_shader.hh b/source/blender/dra @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs