[Bf-blender-cvs] [7881629e1eb] temp-viewport-compositor-compiler: Viewport Compositor: Add GPU material operation
Omar Emara
noreply at git.blender.org
Tue Mar 29 21:24:44 CEST 2022
Commit: 7881629e1eb8e2fd6b01bf6b26c51790bb776a67
Author: Omar Emara
Date: Mon Mar 21 08:52:32 2022 +0200
Branches: temp-viewport-compositor-compiler
https://developer.blender.org/rB7881629e1eb8e2fd6b01bf6b26c51790bb776a67
Viewport Compositor: Add GPU material operation
This patch adds supports for compiling nodes into a GPU material
operation and ports existing node implementations to the appropriate
interface.
===================================================================
M source/blender/blenkernel/BKE_node.h
M source/blender/draw/engines/compositor/compositor_engine.cc
M source/blender/gpu/CMakeLists.txt
M source/blender/gpu/GPU_material.h
M source/blender/gpu/intern/gpu_codegen.cc
M source/blender/gpu/intern/gpu_material.c
M source/blender/gpu/intern/gpu_material_library.h
M source/blender/gpu/intern/gpu_node_graph.c
M source/blender/gpu/intern/gpu_node_graph.h
M source/blender/gpu/intern/gpu_shader.cc
M source/blender/gpu/intern/gpu_shader_create_info.hh
M source/blender/gpu/intern/gpu_shader_dependency.cc
M source/blender/gpu/shaders/common/gpu_shader_common_curves.glsl
M source/blender/gpu/shaders/common/gpu_shader_common_math_util.glsl
D source/blender/gpu/shaders/compositor/material/gpu_shader_compositor_box_mask.glsl
M source/blender/gpu/shaders/compositor/material/gpu_shader_compositor_bright_contrast.glsl
M source/blender/gpu/shaders/compositor/material/gpu_shader_compositor_color_correction.glsl
M source/blender/gpu/shaders/compositor/material/gpu_shader_compositor_color_to_luminance.glsl
D source/blender/gpu/shaders/compositor/material/gpu_shader_compositor_ellipse_mask.glsl
M source/blender/gpu/shaders/compositor/material/gpu_shader_compositor_invert.glsl
A source/blender/gpu/shaders/compositor/material/gpu_shader_compositor_load_input.glsl
M source/blender/gpu/shaders/compositor/material/gpu_shader_compositor_luminance_matte.glsl
D source/blender/gpu/shaders/compositor/material/gpu_shader_compositor_split_viewer.glsl
A source/blender/gpu/shaders/compositor/material/gpu_shader_compositor_store_output.glsl
A source/blender/gpu/shaders/compositor/material/gpu_shader_compositor_type_conversion.glsl
A source/blender/gpu/shaders/material/gpu_shader_material_transform_utils.glsl
M source/blender/nodes/NOD_compositor_execute.hh
M source/blender/nodes/composite/nodes/node_composite_alpha_over.cc
M source/blender/nodes/composite/nodes/node_composite_brightness.cc
M source/blender/nodes/composite/nodes/node_composite_channel_matte.cc
M source/blender/nodes/composite/nodes/node_composite_chroma_matte.cc
M source/blender/nodes/composite/nodes/node_composite_color_matte.cc
M source/blender/nodes/composite/nodes/node_composite_color_spill.cc
M source/blender/nodes/composite/nodes/node_composite_colorbalance.cc
M source/blender/nodes/composite/nodes/node_composite_colorcorrection.cc
M source/blender/nodes/composite/nodes/node_composite_curves.cc
M source/blender/nodes/composite/nodes/node_composite_diff_matte.cc
M source/blender/nodes/composite/nodes/node_composite_distance_matte.cc
M source/blender/nodes/composite/nodes/node_composite_ellipsemask.cc
M source/blender/nodes/composite/nodes/node_composite_exposure.cc
M source/blender/nodes/composite/nodes/node_composite_gamma.cc
M source/blender/nodes/composite/nodes/node_composite_hue_sat_val.cc
M source/blender/nodes/composite/nodes/node_composite_huecorrect.cc
M source/blender/nodes/composite/nodes/node_composite_invert.cc
M source/blender/nodes/composite/nodes/node_composite_luma_matte.cc
M source/blender/nodes/composite/nodes/node_composite_map_range.cc
M source/blender/nodes/composite/nodes/node_composite_map_value.cc
M source/blender/nodes/composite/nodes/node_composite_math.cc
M source/blender/nodes/composite/nodes/node_composite_mixrgb.cc
M source/blender/nodes/composite/nodes/node_composite_normal.cc
M source/blender/nodes/composite/nodes/node_composite_posterize.cc
M source/blender/nodes/composite/nodes/node_composite_premulkey.cc
M source/blender/nodes/composite/nodes/node_composite_rgb.cc
M source/blender/nodes/composite/nodes/node_composite_sepcomb_hsva.cc
M source/blender/nodes/composite/nodes/node_composite_sepcomb_rgba.cc
M source/blender/nodes/composite/nodes/node_composite_sepcomb_ycca.cc
M source/blender/nodes/composite/nodes/node_composite_sepcomb_yuva.cc
M source/blender/nodes/composite/nodes/node_composite_setalpha.cc
M source/blender/nodes/composite/nodes/node_composite_val_to_rgb.cc
M source/blender/nodes/composite/nodes/node_composite_value.cc
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 5cce6ccaf7a..c9bf7f2056a 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -129,6 +129,7 @@ class MFDataType;
namespace viewport_compositor {
class Context;
class NodeOperation;
+class GPUMaterialNode;
} // namespace viewport_compositor
} // namespace blender
@@ -146,9 +147,12 @@ using NodeGatherSocketLinkOperationsFunction =
using NodeGetCompositorOperationFunction = blender::viewport_compositor::NodeOperation
*(*)(blender::viewport_compositor::Context &context, blender::nodes::DNode node);
+using NodeGetCompositorGPUMaterialNodeFunction =
+ blender::viewport_compositor::GPUMaterialNode *(*)(blender::nodes::DNode node);
#else
typedef void *NodeGetCompositorOperationFunction;
+typedef void *NodeGetCompositorGPUMaterialNodeFunction;
typedef void *NodeMultiFunctionBuildFunction;
typedef void *NodeGeometryExecFunction;
typedef void *NodeDeclareFunction;
@@ -331,9 +335,14 @@ typedef struct bNodeType {
/* gpu */
NodeGPUExecFunction gpu_fn;
- /* Get an instance of this node's compositor operation. */
+ /* Get an instance of this node's compositor operation. Freeing the instance is the
+ * responsibility of the caller. */
NodeGetCompositorOperationFunction get_compositor_operation;
+ /* Get an instance of this node's compositor GPU material node. Freeing the instance is the
+ * responsibility of the caller. */
+ NodeGetCompositorGPUMaterialNodeFunction get_compositor_gpu_material_node;
+
/* 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 231bd763e4a..bfdf8ed3147 100644
--- a/source/blender/draw/engines/compositor/compositor_engine.cc
+++ b/source/blender/draw/engines/compositor/compositor_engine.cc
@@ -88,6 +88,7 @@ static void draw()
DRWContext context(texture_pool);
const Scene *scene = get_scene();
Evaluator evaluator(context, scene->nodetree);
+ evaluator.compile();
evaluator.evaluate();
}
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index 924cf5a1c8f..1cdd60b65cf 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -281,9 +281,8 @@ set(GLSL_SRC
shaders/common/gpu_shader_common_math.glsl
shaders/common/gpu_shader_common_mix_rgb.glsl
shaders/common/gpu_shader_common_hash.glsl
-
+
shaders/compositor/material/gpu_shader_compositor_alpha_over.glsl
- shaders/compositor/material/gpu_shader_compositor_box_mask.glsl
shaders/compositor/material/gpu_shader_compositor_bright_contrast.glsl
shaders/compositor/material/gpu_shader_compositor_channel_matte.glsl
shaders/compositor/material/gpu_shader_compositor_chroma_matte.glsl
@@ -294,19 +293,20 @@ set(GLSL_SRC
shaders/compositor/material/gpu_shader_compositor_color_to_luminance.glsl
shaders/compositor/material/gpu_shader_compositor_difference_matte.glsl
shaders/compositor/material/gpu_shader_compositor_distance_matte.glsl
- shaders/compositor/material/gpu_shader_compositor_ellipse_mask.glsl
shaders/compositor/material/gpu_shader_compositor_exposure.glsl
shaders/compositor/material/gpu_shader_compositor_gamma.glsl
shaders/compositor/material/gpu_shader_compositor_hue_correct.glsl
shaders/compositor/material/gpu_shader_compositor_hue_saturation_value.glsl
shaders/compositor/material/gpu_shader_compositor_invert.glsl
+ shaders/compositor/material/gpu_shader_compositor_load_input.glsl
shaders/compositor/material/gpu_shader_compositor_luminance_matte.glsl
shaders/compositor/material/gpu_shader_compositor_map_value.glsl
shaders/compositor/material/gpu_shader_compositor_normal.glsl
shaders/compositor/material/gpu_shader_compositor_posterize.glsl
shaders/compositor/material/gpu_shader_compositor_separate_combine.glsl
shaders/compositor/material/gpu_shader_compositor_set_alpha.glsl
- shaders/compositor/material/gpu_shader_compositor_split_viewer.glsl
+ shaders/compositor/material/gpu_shader_compositor_store_output.glsl
+ shaders/compositor/material/gpu_shader_compositor_type_conversion.glsl
shaders/compositor/compositor_convert_color_to_float.glsl
shaders/compositor/compositor_convert_float_to_color.glsl
@@ -385,6 +385,7 @@ set(GLSL_SRC
shaders/material/gpu_shader_material_tex_wave.glsl
shaders/material/gpu_shader_material_tex_white_noise.glsl
shaders/material/gpu_shader_material_toon.glsl
+ shaders/material/gpu_shader_material_transform_utils.glsl
shaders/material/gpu_shader_material_translucent.glsl
shaders/material/gpu_shader_material_transparent.glsl
shaders/material/gpu_shader_material_uv_map.glsl
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h
index 0f8e10e71f1..84bdd4172e2 100644
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@ -76,6 +76,7 @@ typedef enum eGPUType {
GPU_TEX2D = 1002,
GPU_TEX2D_ARRAY = 1003,
GPU_TEX3D = 1004,
+ GPU_IMAGE_2D = 1005,
/* GLSL Struct types */
GPU_CLOSURE = 1007,
@@ -136,6 +137,7 @@ typedef struct GPUCodegenOutput {
char *surface;
char *volume;
char *thickness;
+ char *compute;
GPUShaderCreateInfo *create_info;
} GPUCodegenOutput;
@@ -146,6 +148,7 @@ GPUNodeLink *GPU_constant(const float *num);
GPUNodeLink *GPU_uniform(const float *num);
GPUNodeLink *GPU_attribute(GPUMaterial *mat, CustomDataType type, const char *name);
GPUNodeLink *GPU_uniform_attribute(GPUMaterial *mat, const char *name, bool use_dupli);
+GPUNodeLink *GPU_texture(GPUMaterial *material, eGPUSamplerState sampler_state);
GPUNodeLink *GPU_image(GPUMaterial *mat,
struct Image *ima,
struct ImageUser *iuser,
@@ -159,10 +162,7 @@ GPUNodeLink *GPU_color_band(GPUMaterial *mat, int size, float *pixels, float *ro
GPUNodeLink *GPU_volume_grid(GPUMaterial *mat,
const char *name,
eGPUVolumeDefaultValue default_value);
-GPUNodeLink *GPU_render_pass(GPUMaterial *mat,
- struct Scene *scene,
- int view_layer,
- eScenePassType pass_type);
+GPUNodeLink *GPU_image_texture(GPUMaterial *material, eGPUTextureFormat format);
bool GPU_link(GPUMaterial *mat, const char *name, ...);
bool GPU_stack_link(GPUMaterial *mat,
@@ -220,6 +220,7 @@ GPUMaterial *GPU_material_from_nodetree(struct Scene *scene,
void *thunk);
void GPU_material_compile(GPUMaterial *mat);
+void GPU_material_free_single(GPUMaterial *material);
void GPU_material_free(struct ListBase *gpumaterial);
void GPU_materials_free(struct Main *bmain);
@@ -237,6 +238,9 @@ struct Material *GPU_material_get_material(GPUMaterial *material);
eGPUMaterialStatus GPU_material_status(GPUMaterial *mat);
void GPU_material_status_set(GPUMaterial *mat, eGPUMaterialStatus status);
+bool GPU_material_is_compute(GPUMaterial *material);
+void GPU_material_is_compute_set(GPUMaterial *material, bool is_compute);
+
struct GPUUniformBuf *GPU_material_uniform_buffer_get(GPUMaterial *material);
/**
* Create dynamic UBO from parameters
@@ -289,22 +293,20 @@ typedef struct GPUMaterialVolumeGrid {
int users;
} GPUMaterialVolumeGrid;
-/* NOTE(fclem): Not to be confused with actual rendering passes.
- * This is a reference to texture input which is the result of a rendering pass. */
-typedef struct GPUMaterialRenderPass {
- struct GPUMaterialRenderPass *next, *prev;
- struct Scene *scene;
- int viewlayer;
- eScenePassType pass_type;
- char sampler_name[32]; /* Name of sampler in GLSL. */
- int users;
- eGPUSamplerState sampler_state;
-} GPUMaterialRenderPass;
+/* A reference to a write only 2D image of a specific format. */
+typedef struct GPUMaterialImage {
+ struct GPUMaterialImage *next, *prev;
+ eGPUTextureFormat format;
+ char name_in_shader[32];
+} GPUMaterialImage;
ListBase GPU_material_attributes(GPUMaterial *material);
ListBase GPU_material_textures(GPUMaterial *material);
ListBase GPU_material_volume_grids(GPUMaterial *material);
-ListBase GPU_material_render_passes(GPUMaterial *material);
+ListBase GPU_material_images(GPUMaterial *material);
+
+GPUMaterialTexture *GPU_material_get_link_texture(GPUNodeLink *link);
+GPUMaterialImage *GPU_material_get_link_image(GPUNodeLink *link);
typedef struct GPUUniformAttr {
struct GPUUniformAttr *next, *prev;
@@ -331,6 +333,19 @@ struct GHash *GPU_uniform_attr_list_hash_new(const char *info);
void GPU_uniform_attr_list_copy(GPUUniformAttrList *dest, GPUUniformAttrList *src);
void GPU_uniform_attr_list_free(GPUUniformAttrList *set);
+typedef void (*GPUMaterialSetupFn)(void *thunk, GPUMaterial *material);
+typedef void (*GPUMaterialCompileFn)(void *thunk, GPUMaterial *material);
+
+/* Construct and immediately compile a GPU material from a set of callbacks. The setup callback
+ * should set the appropriate flags or members to the material. The compile callback should
+ * construct the material graph by adding and linking the necessary GPU material graph nodes. The
+ * generate function should construct the needed shader by initializing the passed shader create
+ * info structure. The given thunk will be passed as the first parameter of each callback. */
+GPUMaterial *GPU_material_from_callbacks(GPUMaterialSetupFn setup_function,
+ GPUMaterialCompileFn compile_function,
+ GPUCodegenCallbackFn generate_function,
+ void *thunk);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/gpu/intern/gpu_codegen.cc b/source/blender/gpu/intern/gpu_codegen.cc
index db55c3b3be8..f31ec23b86d 100644
--- a/source/blender/gpu/intern/gpu_codegen.cc
+++ b/source/blender/gpu/intern/gpu_codegen.cc
@@ -186,8 +186,8 @@ static std::ostream &operator<<(std::ostream &stream, const GPUInput *input)
return stream << input
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list