Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/draw/engines/workbench/workbench_private.h')
-rw-r--r--source/blender/draw/engines/workbench/workbench_private.h670
1 files changed, 301 insertions, 369 deletions
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index bb93864966e..a68b66e0f85 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -34,16 +34,14 @@
#include "workbench_engine.h"
+extern struct DrawEngineType draw_engine_workbench;
+
#define WORKBENCH_ENGINE "BLENDER_WORKBENCH"
-#define MAX_COMPOSITE_SHADERS (1 << 7)
-#define MAX_PREPASS_SHADERS (1 << 8)
-#define MAX_ACCUM_SHADERS (1 << 8)
-#define MAX_CAVITY_SHADERS (1 << 3)
-
-#define TEXTURE_DRAWING_ENABLED(wpd) (wpd->shading.color_type == V3D_SHADING_TEXTURE_COLOR)
-#define VERTEX_COLORS_ENABLED(wpd) (wpd->shading.color_type == V3D_SHADING_VERTEX_COLOR)
-#define MATERIAL_COLORS_ENABLED(wpd) (wpd->shading.color_type == V3D_SHADING_MATERIAL_COLOR)
-#define FLAT_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_FLAT)
+
+#define MAX_MATERIAL (1 << 12)
+
+#define DEBUG_SHADOW_VOLUME 0
+
#define STUDIOLIGHT_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_STUDIO)
#define MATCAP_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_MATCAP)
#define USE_WORLD_ORIENTATION(wpd) ((wpd->shading.flag & V3D_SHADING_WORLD_ORIENTATION) != 0)
@@ -63,45 +61,24 @@
(wpd->shading.cavity_type == V3D_SHADING_CAVITY_BOTH)))
#define CAVITY_ENABLED(wpd) (CURVATURE_ENABLED(wpd) || SSAO_ENABLED(wpd))
#define SHADOW_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_SHADOW)
-#define GHOST_ENABLED(psl) \
- (!DRW_pass_is_empty(psl->ghost_prepass_pass) || !DRW_pass_is_empty(psl->ghost_prepass_hair_pass))
#define CULL_BACKFACE_ENABLED(wpd) ((wpd->shading.flag & V3D_SHADING_BACKFACE_CULLING) != 0)
-#define OIT_ENABLED(wpd) \
- (ELEM(wpd->shading.color_type, \
- V3D_SHADING_MATERIAL_COLOR, \
- V3D_SHADING_OBJECT_COLOR, \
- V3D_SHADING_TEXTURE_COLOR, \
- V3D_SHADING_VERTEX_COLOR))
-
-#define IS_NAVIGATING(wpd) \
- ((DRW_context_state_get()->rv3d) && \
- (DRW_context_state_get()->rv3d->rflag & (RV3D_NAVIGATING | RV3D_PAINTING)))
#define OBJECT_OUTLINE_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_OBJECT_OUTLINE)
#define OBJECT_ID_PASS_ENABLED(wpd) (OBJECT_OUTLINE_ENABLED(wpd) || CURVATURE_ENABLED(wpd))
-#define NORMAL_VIEWPORT_COMP_PASS_ENABLED(wpd) \
- (MATCAP_ENABLED(wpd) || STUDIOLIGHT_ENABLED(wpd) || SHADOW_ENABLED(wpd))
-#define NORMAL_VIEWPORT_PASS_ENABLED(wpd) \
- (NORMAL_VIEWPORT_COMP_PASS_ENABLED(wpd) || SSAO_ENABLED(wpd) || CURVATURE_ENABLED(wpd))
#define NORMAL_ENCODING_ENABLED() (true)
-#define WORLD_CLIPPING_ENABLED(wpd) (wpd->world_clip_planes != NULL)
struct RenderEngine;
struct RenderLayer;
struct rcti;
typedef struct WORKBENCH_FramebufferList {
- /* Deferred render buffers */
- struct GPUFrameBuffer *prepass_fb;
- struct GPUFrameBuffer *ghost_prepass_fb;
- struct GPUFrameBuffer *cavity_fb;
- struct GPUFrameBuffer *composite_fb;
- struct GPUFrameBuffer *id_clear_fb;
+ struct GPUFrameBuffer *opaque_fb;
+ struct GPUFrameBuffer *opaque_infront_fb;
- struct GPUFrameBuffer *effect_fb;
- struct GPUFrameBuffer *effect_taa_fb;
- struct GPUFrameBuffer *depth_buffer_fb;
- struct GPUFrameBuffer *color_only_fb;
+ struct GPUFrameBuffer *transp_accum_fb;
+ struct GPUFrameBuffer *transp_accum_infront_fb;
+
+ struct GPUFrameBuffer *id_clear_fb;
struct GPUFrameBuffer *dof_downsample_fb;
struct GPUFrameBuffer *dof_coc_tile_h_fb;
@@ -110,10 +87,9 @@ typedef struct WORKBENCH_FramebufferList {
struct GPUFrameBuffer *dof_blur1_fb;
struct GPUFrameBuffer *dof_blur2_fb;
- /* Forward render buffers */
- struct GPUFrameBuffer *object_outline_fb;
- struct GPUFrameBuffer *transparent_accum_fb;
- struct GPUFrameBuffer *transparent_revealage_fb;
+ struct GPUFrameBuffer *antialiasing_fb;
+ struct GPUFrameBuffer *smaa_edge_fb;
+ struct GPUFrameBuffer *smaa_weight_fb;
} WORKBENCH_FramebufferList;
typedef struct WORKBENCH_TextureList {
@@ -121,34 +97,35 @@ typedef struct WORKBENCH_TextureList {
struct GPUTexture *coc_halfres_tx;
struct GPUTexture *history_buffer_tx;
struct GPUTexture *depth_buffer_tx;
+ struct GPUTexture *smaa_search_tx;
+ struct GPUTexture *smaa_area_tx;
+ struct GPUTexture *dummy_image_tx;
+ struct GPUTexture *dummy_volume_tx;
+ struct GPUTexture *dummy_coba_tx;
} WORKBENCH_TextureList;
typedef struct WORKBENCH_StorageList {
- struct WORKBENCH_PrivateData *g_data;
- struct WORKBENCH_EffectInfo *effects;
+ struct WORKBENCH_PrivateData *wpd;
float *dof_ubo_data;
} WORKBENCH_StorageList;
typedef struct WORKBENCH_PassList {
- /* deferred rendering */
- struct DRWPass *prepass_pass;
- struct DRWPass *prepass_hair_pass;
- struct DRWPass *ghost_prepass_pass;
- struct DRWPass *ghost_prepass_hair_pass;
- struct DRWPass *cavity_pass;
- struct DRWPass *shadow_depth_pass_pass;
- struct DRWPass *shadow_depth_pass_mani_pass;
- struct DRWPass *shadow_depth_fail_pass;
- struct DRWPass *shadow_depth_fail_mani_pass;
- struct DRWPass *shadow_depth_fail_caps_pass;
- struct DRWPass *shadow_depth_fail_caps_mani_pass;
- struct DRWPass *composite_pass;
- struct DRWPass *composite_shadow_pass;
- struct DRWPass *oit_composite_pass;
- struct DRWPass *background_pass;
- struct DRWPass *background_pass_clip;
- struct DRWPass *ghost_resolve_pass;
- struct DRWPass *effect_aa_pass;
+ struct DRWPass *opaque_ps;
+ struct DRWPass *opaque_infront_ps;
+
+ struct DRWPass *transp_resolve_ps;
+ struct DRWPass *transp_accum_ps;
+ struct DRWPass *transp_accum_infront_ps;
+
+ struct DRWPass *shadow_ps[2];
+
+ struct DRWPass *merge_infront_ps;
+
+ struct DRWPass *cavity_ps;
+ struct DRWPass *outline_ps;
+
+ struct DRWPass *composite_ps;
+
struct DRWPass *dof_down_ps;
struct DRWPass *dof_down2_ps;
struct DRWPass *dof_flatten_v_ps;
@@ -158,12 +135,13 @@ typedef struct WORKBENCH_PassList {
struct DRWPass *dof_blur1_ps;
struct DRWPass *dof_blur2_ps;
struct DRWPass *dof_resolve_ps;
- struct DRWPass *volume_pass;
- /* forward rendering */
- struct DRWPass *transparent_accum_pass;
- struct DRWPass *object_outline_pass;
- struct DRWPass *depth_pass;
+ struct DRWPass *volume_ps;
+
+ struct DRWPass *aa_accum_ps;
+ struct DRWPass *aa_edge_ps;
+ struct DRWPass *aa_weight_ps;
+ struct DRWPass *aa_resolve_ps;
} WORKBENCH_PassList;
typedef struct WORKBENCH_Data {
@@ -180,84 +158,164 @@ typedef struct WORKBENCH_UBO_Light {
float diffuse_color[3], wrapped;
} WORKBENCH_UBO_Light;
+typedef struct WORKBENCH_UBO_Material {
+ float base_color[3];
+ /* Packed data into a int. Decoded in the shader. */
+ uint32_t packed_data;
+} WORKBENCH_UBO_Material;
+
typedef struct WORKBENCH_UBO_World {
+ float viewvecs[3][4];
+ float viewport_size[2], viewport_size_inv[2];
float object_outline_color[4];
float shadow_direction_vs[4];
+ float shadow_focus, shadow_shift, shadow_mul, shadow_add;
WORKBENCH_UBO_Light lights[4];
float ambient_color[4];
- int num_lights;
- int matcap_orientation;
+
+ int cavity_sample_start;
+ int cavity_sample_end;
+ float cavity_sample_count_inv;
+ float cavity_jitter_scale;
+
+ float cavity_valley_factor;
+ float cavity_ridge_factor;
+ float cavity_attenuation;
+ float cavity_distance;
+
float curvature_ridge;
float curvature_valley;
+ float ui_scale;
+ float _pad0;
+
+ int matcap_orientation;
+ int use_specular; /* Bools are 32bit ints in GLSL. */
+ int _pad1;
+ int _pad2;
} WORKBENCH_UBO_World;
+
BLI_STATIC_ASSERT_ALIGN(WORKBENCH_UBO_World, 16)
+BLI_STATIC_ASSERT_ALIGN(WORKBENCH_UBO_Light, 16)
+BLI_STATIC_ASSERT_ALIGN(WORKBENCH_UBO_Material, 16)
-typedef struct WORKBENCH_PrivateData {
+typedef struct WORKBENCH_Prepass {
+ /** Hash storing shading group for each Material or GPUTexture to reduce state changes. */
struct GHash *material_hash;
- struct GHash *material_transp_hash;
- struct GPUShader *prepass_sh;
- struct GPUShader *prepass_hair_sh;
- struct GPUShader *prepass_uniform_sh;
- struct GPUShader *prepass_uniform_hair_sh;
- struct GPUShader *prepass_textured_sh;
- struct GPUShader *prepass_textured_array_sh;
- struct GPUShader *prepass_vertex_sh;
- struct GPUShader *composite_sh;
- struct GPUShader *background_sh;
- struct GPUShader *transparent_accum_sh;
- struct GPUShader *transparent_accum_hair_sh;
- struct GPUShader *transparent_accum_uniform_sh;
- struct GPUShader *transparent_accum_uniform_hair_sh;
- struct GPUShader *transparent_accum_textured_sh;
- struct GPUShader *transparent_accum_textured_array_sh;
- struct GPUShader *transparent_accum_vertex_sh;
+ /** First common (non-vcol and non-image colored) shading group to created subgroups. */
+ struct DRWShadingGroup *common_shgrp;
+ /** First Vertex Color shading group to created subgroups. */
+ struct DRWShadingGroup *vcol_shgrp;
+ /** First Image shading group to created subgroups. */
+ struct DRWShadingGroup *image_shgrp;
+ /** First UDIM (tiled image) shading group to created subgroups. */
+ struct DRWShadingGroup *image_tiled_shgrp;
+} WORKBENCH_Prepass;
+
+typedef struct WORKBENCH_PrivateData {
+ /** ViewLayerData for faster access. */
+ struct WORKBENCH_ViewLayerData *vldata;
+ /** Copy of draw_ctx->sh_cfg for faster access. */
+ eGPUShaderConfig sh_cfg;
+ /** Global clip and cull states. */
+ DRWState clip_state, cull_state;
+ /** Copy of scene->display.shading or v3d->shading for viewport. */
View3DShading shading;
+ /** Chosen studiolight or matcap. */
StudioLight *studio_light;
+ /** Copy of ctx_draw->scene for faster access. */
+ struct Scene *scene;
+ /** Shorthand version of U global for user preferences. */
const UserDef *preferences;
- /* Does this instance owns the `world_ubo` field.
- * Normally the field is borrowed from `WORKBENCH_WorldData`. In case that
- * there is no World attached to the scene the UBO cannot be cached and should
- * be freed after using. */
- bool is_world_ubo_owner;
+ /** Copy of context mode for faster access. */
+ eContextObjectMode ctx_mode;
+ /** Shorthand for wpd->vldata->world_ubo. */
struct GPUUniformBuffer *world_ubo;
- struct DRWShadingGroup *shadow_shgrp;
- struct DRWShadingGroup *depth_shgrp;
- WORKBENCH_UBO_World world_data;
- float shadow_multiplier;
- float shadow_shift;
- float shadow_focus;
- float cached_shadow_direction[3];
+ /** Background color to clear the color buffer with. */
+ float background_color[4];
+
+ /* Shadow */
+ /** Previous shadow direction to test if shadow has changed. */
+ float shadow_cached_direction[3];
+ /** Current shadow direction in world space. */
+ float shadow_direction_ws[3];
+ /** Shadow precomputed matrices. */
float shadow_mat[4][4];
float shadow_inv[4][4];
- /* Far plane of the view frustum. */
+ /** Far plane of the view frustum. Used for shadow volume extrusion. */
float shadow_far_plane[4];
- /* Near plane corners in shadow space. */
- float shadow_near_corners[4][3];
- /* min and max of shadow_near_corners. allow fast test */
+ /** Min and max of shadow_near_corners. Speed up culling test. */
float shadow_near_min[3];
float shadow_near_max[3];
- /* This is a parallelogram, so only 2 normal and distance to the edges. */
+ /** This is a parallelogram, so only 2 normal and distance to the edges. */
float shadow_near_sides[2][4];
+ /* Shadow shading groups. First array elem is for non-manifold geom and second for manifold. */
+ struct DRWShadingGroup *shadow_pass_grp[2];
+ struct DRWShadingGroup *shadow_fail_grp[2];
+ struct DRWShadingGroup *shadow_fail_caps_grp[2];
+ /** If the shadow has changed direction and ob bboxes needs to be updated. */
bool shadow_changed;
- bool is_playback;
- float (*world_clip_planes)[4];
+ /* Temporal Antialiasing */
+ /** Total number of samples to after which TAA stops accumulating samples. */
+ int taa_sample_len;
+ /** Current TAA sample index in [0..taa_sample_len[ range. */
+ int taa_sample;
+ /** Inverse of taa_sample to divide the accumulation buffer. */
+ float taa_sample_inv;
+ /** If the view has been updated and TAA needs to be reset. */
+ bool view_updated;
+ /** View */
+ struct DRWView *view;
+ /** Last projection matrix to see if view is still valid. */
+ float last_mat[4][4];
+
+ /* Smart Morphological Anti-Aliasing */
+ /** Temp buffers to store edges and weights. */
+ struct GPUTexture *smaa_edge_tx;
+ struct GPUTexture *smaa_weight_tx;
+ /** Weight of the smaa pass. */
+ float smaa_mix_factor;
+
+ /** Opaque pipeline buffers. */
+ struct GPUTexture *material_buffer_tx;
+ struct GPUTexture *composite_buffer_tx;
+ struct GPUTexture *normal_buffer_tx;
+ /** Transparent pipeline buffers. */
+ struct GPUTexture *accum_buffer_tx;
+ struct GPUTexture *reveal_buffer_tx;
+ /** Object IDs buffer for curvature & outline. */
+ struct GPUTexture *object_id_tx;
+
+ /** Prepass infos for each draw types [transparent][infront][hair]. */
+ WORKBENCH_Prepass prepass[2][2][2];
+
+ /* Materials */
+ /** Copy of vldata->material_ubo for faster access. */
+ struct BLI_memblock *material_ubo;
+ /** Copy of vldata->material_ubo_data for faster access. */
+ struct BLI_memblock *material_ubo_data;
+ /** Current material chunk being filled by workbench_material_setup_ex(). */
+ WORKBENCH_UBO_Material *material_ubo_data_curr;
+ struct GPUUniformBuffer *material_ubo_curr;
+ /** Copy of txl->dummy_image_tx for faster access. */
+ struct GPUTexture *dummy_image_tx;
+ /** Total number of used material chunk. */
+ int material_chunk_count;
+ /** Index of current material chunk. */
+ int material_chunk_curr;
+ /** Index of current material inside the material chunk. Only for material coloring mode. */
+ int material_index;
/* Volumes */
- bool volumes_do;
+ /** List of smoke domain textures to free after drawing. */
ListBase smoke_domains;
- /* Ssao */
- float winmat[4][4];
- float viewvecs[3][4];
- float ssao_params[4];
- float ssao_settings[4];
-
- /* Dof */
+ /* Depth of Field */
+ /** Depth of field temp buffers. */
struct GPUTexture *dof_blur_tx;
struct GPUTexture *coc_temp_tx;
struct GPUTexture *coc_tiles_tx[2];
- struct GPUUniformBuffer *dof_ubo;
+ /** Depth of field parameters. */
float dof_aperturesize;
float dof_distance;
float dof_invsensorsize;
@@ -265,37 +323,15 @@ typedef struct WORKBENCH_PrivateData {
float dof_blades;
float dof_rotation;
float dof_ratio;
- bool dof_enabled;
- /* Color Management */
- bool use_color_management;
- bool use_color_render_settings;
+ /** True if any volume needs to be rendered. */
+ bool volumes_do;
+ /** Convenience boolean. */
+ bool dof_enabled;
+ bool is_playback;
+ bool is_navigating;
} WORKBENCH_PrivateData; /* Transient data */
-typedef struct WORKBENCH_EffectInfo {
- /** View */
- struct DRWView *view;
- /** Last projection matrix to see if view is still valid. */
- float last_mat[4][4];
- int jitter_index;
- float taa_mix_factor;
- bool view_updated;
-} WORKBENCH_EffectInfo;
-
-typedef struct WORKBENCH_MaterialData {
- float base_color[3], metallic;
- float roughness, alpha;
- eV3DShadingColorType color_type;
- int interp;
- Image *ima;
- ImageUser *iuser;
-
- /* Linked shgroup for drawing */
- DRWShadingGroup *shgrp;
- /* forward rendering */
- DRWShadingGroup *shgrp_object_outline;
-} WORKBENCH_MaterialData;
-
typedef struct WORKBENCH_ObjectData {
DrawData dd;
@@ -307,20 +343,21 @@ typedef struct WORKBENCH_ObjectData {
bool shadow_bbox_dirty;
} WORKBENCH_ObjectData;
-typedef struct WORKBENCH_WorldData {
- DrawData dd;
- /* The cached `GPUUniformBuffer`, that is reused between draw calls. */
+typedef struct WORKBENCH_ViewLayerData {
+ /** Depth of field sample location array.*/
+ struct GPUUniformBuffer *dof_sample_ubo;
+ /** All constant data used for a render loop.*/
struct GPUUniformBuffer *world_ubo;
-} WORKBENCH_WorldData;
-
-/* Enumeration containing override options for base color rendering.
- * This is used to during painting to force the base color to show what you are
- * painting using the selected lighting model. */
-typedef enum WORKBENCH_ColorOverride {
- WORKBENCH_COLOR_OVERRIDE_OFF = 0,
- WORKBENCH_COLOR_OVERRIDE_TEXTURE = CTX_MODE_PAINT_TEXTURE,
- WORKBENCH_COLOR_OVERRIDE_VERTEX = CTX_MODE_PAINT_VERTEX,
-} WORKBENCH_ColorOverride;
+ /** Cavity sample location array.*/
+ struct GPUUniformBuffer *cavity_sample_ubo;
+ /** Blue noise texture used to randomize the sampling of some effects.*/
+ struct GPUTexture *cavity_jitter_tx;
+ /** Materials ubos allocated in a memblock for easy bookeeping. */
+ struct BLI_memblock *material_ubo;
+ struct BLI_memblock *material_ubo_data;
+ /** Number of samples for which cavity_sample_ubo is valid. */
+ int cavity_sample_count;
+} WORKBENCH_ViewLayerData;
/* inline helper functions */
BLI_INLINE bool workbench_is_specular_highlight_enabled(WORKBENCH_PrivateData *wpd)
@@ -333,234 +370,129 @@ BLI_INLINE bool workbench_is_specular_highlight_enabled(WORKBENCH_PrivateData *w
return false;
}
-BLI_INLINE bool workbench_is_taa_enabled(WORKBENCH_PrivateData *wpd)
-{
- if (DRW_state_is_image_render()) {
- const DRWContextState *draw_ctx = DRW_context_state_get();
- if (draw_ctx->v3d) {
- return draw_ctx->scene->display.viewport_aa > SCE_DISPLAY_AA_FXAA;
- }
- else {
- return draw_ctx->scene->display.render_aa > SCE_DISPLAY_AA_FXAA;
- }
- }
- else {
- return !(IS_NAVIGATING(wpd) || wpd->is_playback) &&
- wpd->preferences->viewport_aa > SCE_DISPLAY_AA_FXAA;
- }
-}
-
-BLI_INLINE bool workbench_is_fxaa_enabled(WORKBENCH_PrivateData *wpd)
-{
- if (DRW_state_is_image_render()) {
- const DRWContextState *draw_ctx = DRW_context_state_get();
- if (draw_ctx->v3d) {
- return draw_ctx->scene->display.viewport_aa == SCE_DISPLAY_AA_FXAA;
- }
- else {
- return draw_ctx->scene->display.render_aa == SCE_DISPLAY_AA_FXAA;
- }
- }
- else {
- if (wpd->preferences->viewport_aa == SCE_DISPLAY_AA_FXAA) {
- return true;
- }
-
- /* when navigating or animation playback use FXAA if scene uses TAA. */
- return (IS_NAVIGATING(wpd) || wpd->is_playback) &&
- wpd->preferences->viewport_aa > SCE_DISPLAY_AA_FXAA;
- }
-}
-
-/** Is texture paint mode enabled (globally) */
-BLI_INLINE bool workbench_is_in_texture_paint_mode(void)
-{
- const DRWContextState *draw_ctx = DRW_context_state_get();
- return draw_ctx->object_mode == OB_MODE_TEXTURE_PAINT;
-}
-
-/** Is vertex paint mode enabled (globally) */
-BLI_INLINE bool workbench_is_in_vertex_paint_mode(void)
-{
- const DRWContextState *draw_ctx = DRW_context_state_get();
- return draw_ctx->object_mode == OB_MODE_VERTEX_PAINT;
-}
-
-/* Must the `View3DShading.color_type` be overriden for the given object. */
-BLI_INLINE WORKBENCH_ColorOverride workbench_object_color_override_get(Object *ob)
-{
- const DRWContextState *draw_ctx = DRW_context_state_get();
- if (ob->type == OB_MESH && (draw_ctx->obact == ob)) {
- const enum eContextObjectMode mode = CTX_data_mode_enum_ex(
- draw_ctx->object_edit, draw_ctx->obact, draw_ctx->object_mode);
- if (mode == CTX_MODE_PAINT_TEXTURE) {
- return WORKBENCH_COLOR_OVERRIDE_TEXTURE;
- }
- else if (mode == CTX_MODE_PAINT_VERTEX) {
- return WORKBENCH_COLOR_OVERRIDE_VERTEX;
- }
- }
-
- return WORKBENCH_COLOR_OVERRIDE_OFF;
-}
-
-BLI_INLINE bool workbench_is_matdata_pass_enabled(WORKBENCH_PrivateData *wpd)
-{
- return (wpd->shading.color_type != V3D_SHADING_SINGLE_COLOR || MATCAP_ENABLED(wpd)) ||
- workbench_is_in_texture_paint_mode() || workbench_is_in_vertex_paint_mode();
-}
-
-/**
- * Get the default texture format to be used by the color and history buffers.
- *
- * Use GPU_RGBA16F for final renderings and for drawing textures. This
- * allows displaying HDRI textures. Vertex Colors uses GPU_RGBA16 to resolve
- * color banding issues (T66100). All other modes use GPU_RGBA8 to reduce
- * bandwidth and gpu memory.
- */
-BLI_INLINE eGPUTextureFormat workbench_color_texture_format(const WORKBENCH_PrivateData *wpd)
-{
- eGPUTextureFormat result;
- if (DRW_state_is_image_render() || workbench_is_in_texture_paint_mode() ||
- TEXTURE_DRAWING_ENABLED(wpd)) {
- result = GPU_RGBA16F;
- }
- else {
- result = GPU_RGBA16;
- }
- return result;
-}
-
-/* workbench_deferred.c */
-void workbench_deferred_engine_init(WORKBENCH_Data *vedata);
-void workbench_deferred_engine_free(void);
-void workbench_deferred_draw_scene(WORKBENCH_Data *vedata);
-void workbench_deferred_draw_finish(WORKBENCH_Data *vedata);
-void workbench_deferred_cache_init(WORKBENCH_Data *vedata);
-void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob);
-void workbench_deferred_cache_finish(WORKBENCH_Data *vedata);
-
-/* workbench_forward.c */
-void workbench_forward_engine_init(WORKBENCH_Data *vedata);
-void workbench_forward_engine_free(void);
-void workbench_forward_draw_scene(WORKBENCH_Data *vedata);
-void workbench_forward_draw_finish(WORKBENCH_Data *vedata);
-void workbench_forward_cache_init(WORKBENCH_Data *vedata);
-void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob);
-void workbench_forward_cache_finish(WORKBENCH_Data *vedata);
-
-/* For OIT in deferred */
-void workbench_forward_outline_shaders_ensure(WORKBENCH_PrivateData *wpd, eGPUShaderConfig sh_cfg);
-void workbench_forward_choose_shaders(WORKBENCH_PrivateData *wpd, eGPUShaderConfig sh_cfg);
-WORKBENCH_MaterialData *workbench_forward_get_or_create_material_data(
- WORKBENCH_Data *vedata,
- Object *ob,
- Material *mat,
- Image *ima,
- ImageUser *iuser,
- eV3DShadingColorType color_type,
- int interp);
-
-/* workbench_effect_aa.c */
-void workbench_aa_create_pass(WORKBENCH_Data *vedata, GPUTexture **tx);
-void workbench_aa_draw_pass(WORKBENCH_Data *vedata, GPUTexture *tx);
-
-/* workbench_effect_fxaa.c */
-void workbench_fxaa_engine_init(void);
-void workbench_fxaa_engine_free(void);
-DRWPass *workbench_fxaa_create_pass(GPUTexture **color_buffer_tx);
-
-/* workbench_effect_taa.c */
-void workbench_taa_engine_init(WORKBENCH_Data *vedata);
-void workbench_taa_engine_free(void);
-DRWPass *workbench_taa_create_pass(WORKBENCH_Data *vedata, GPUTexture **color_buffer_tx);
-void workbench_taa_draw_scene_start(WORKBENCH_Data *vedata);
-void workbench_taa_draw_scene_end(WORKBENCH_Data *vedata);
-void workbench_taa_view_updated(WORKBENCH_Data *vedata);
-int workbench_taa_calculate_num_iterations(WORKBENCH_Data *vedata);
-int workbench_num_viewport_rendering_iterations(WORKBENCH_Data *vedata);
-
+/* workbench_opaque.c */
+void workbench_opaque_engine_init(WORKBENCH_Data *data);
+void workbench_opaque_cache_init(WORKBENCH_Data *data);
+
+/* workbench_transparent.c */
+void workbench_transparent_engine_init(WORKBENCH_Data *data);
+void workbench_transparent_cache_init(WORKBENCH_Data *data);
+void workbench_transparent_draw_depth_pass(WORKBENCH_Data *data);
+
+/* workbench_shadow.c */
+void workbench_shadow_data_update(WORKBENCH_PrivateData *wpd, WORKBENCH_UBO_World *wd);
+void workbench_shadow_cache_init(WORKBENCH_Data *data);
+void workbench_shadow_cache_populate(WORKBENCH_Data *data, Object *ob, const bool has_transp_mat);
+
+/* workbench_shader.c */
+GPUShader *workbench_shader_opaque_get(WORKBENCH_PrivateData *wpd, bool hair);
+GPUShader *workbench_shader_opaque_image_get(WORKBENCH_PrivateData *wpd, bool hair, bool tiled);
+GPUShader *workbench_shader_composite_get(WORKBENCH_PrivateData *wpd);
+GPUShader *workbench_shader_merge_infront_get(WORKBENCH_PrivateData *wpd);
+
+GPUShader *workbench_shader_transparent_get(WORKBENCH_PrivateData *wpd, bool hair);
+GPUShader *workbench_shader_transparent_image_get(WORKBENCH_PrivateData *wpd,
+ bool hair,
+ bool tiled);
+GPUShader *workbench_shader_transparent_resolve_get(WORKBENCH_PrivateData *wpd);
+
+GPUShader *workbench_shader_shadow_pass_get(bool manifold);
+GPUShader *workbench_shader_shadow_fail_get(bool manifold, bool cap);
+
+GPUShader *workbench_shader_cavity_get(bool cavity, bool curvature);
+GPUShader *workbench_shader_outline_get(void);
+
+GPUShader *workbench_shader_antialiasing_accumulation_get(void);
+GPUShader *workbench_shader_antialiasing_get(int stage);
+
+GPUShader *workbench_shader_volume_get(bool slice, bool coba, bool cubic);
+
+void workbench_shader_depth_of_field_get(GPUShader **prepare_sh,
+ GPUShader **downsample_sh,
+ GPUShader **blur1_sh,
+ GPUShader **blur2_sh,
+ GPUShader **resolve_sh);
+
+void workbench_shader_library_ensure(void);
+void workbench_shader_free(void);
+
+/* workbench_effect_antialiasing.c */
+int workbench_antialiasing_sample_count_get(WORKBENCH_PrivateData *wpd);
+void workbench_antialiasing_engine_init(WORKBENCH_Data *vedata);
+void workbench_antialiasing_cache_init(WORKBENCH_Data *vedata);
+void workbench_antialiasing_view_updated(WORKBENCH_Data *vedata);
+bool workbench_antialiasing_setup(WORKBENCH_Data *vedata);
+void workbench_antialiasing_draw_pass(WORKBENCH_Data *vedata);
+
+/* workbench_effect_cavity.c */
+void workbench_cavity_data_update(WORKBENCH_PrivateData *wpd, WORKBENCH_UBO_World *wd);
+void workbench_cavity_samples_ubo_ensure(WORKBENCH_PrivateData *wpd);
+void workbench_cavity_cache_init(WORKBENCH_Data *data);
+
+/* workbench_effect_outline.c */
+void workbench_outline_cache_init(WORKBENCH_Data *data);
/* workbench_effect_dof.c */
-void workbench_dof_engine_init(WORKBENCH_Data *vedata, Object *camera);
-void workbench_dof_engine_free(void);
-void workbench_dof_create_pass(WORKBENCH_Data *vedata,
- GPUTexture **dof_input,
- GPUTexture *noise_tex);
+void workbench_dof_engine_init(WORKBENCH_Data *vedata);
+void workbench_dof_cache_init(WORKBENCH_Data *vedata);
void workbench_dof_draw_pass(WORKBENCH_Data *vedata);
/* workbench_materials.c */
-eV3DShadingColorType workbench_material_determine_color_type(WORKBENCH_PrivateData *wpd,
- Image *ima,
- Object *ob,
- bool use_sculpt_pbvh);
-void workbench_material_get_image_and_mat(
- Object *ob, int mat_nr, Image **r_image, ImageUser **r_iuser, int *r_interp, Material **r_mat);
-char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd,
- bool is_uniform_color,
- bool is_hair,
- bool is_tiled,
- const WORKBENCH_ColorOverride color_override);
-void workbench_material_update_data(WORKBENCH_PrivateData *wpd,
- Object *ob,
- Material *mat,
- WORKBENCH_MaterialData *data,
- int color_type);
-uint workbench_material_get_hash(WORKBENCH_MaterialData *material_template, bool is_ghost);
-int workbench_material_get_composite_shader_index(WORKBENCH_PrivateData *wpd);
-int workbench_material_get_prepass_shader_index(WORKBENCH_PrivateData *wpd,
- bool is_uniform_color,
- bool is_hair,
- bool is_tiled,
- const WORKBENCH_ColorOverride color_override);
-int workbench_material_get_accum_shader_index(WORKBENCH_PrivateData *wpd,
- bool is_uniform_color,
- bool is_hair,
- bool is_tiled,
- const WORKBENCH_ColorOverride color_override);
-void workbench_material_shgroup_uniform(WORKBENCH_PrivateData *wpd,
- DRWShadingGroup *grp,
- WORKBENCH_MaterialData *material,
- Object *ob,
- const bool deferred,
- const bool is_tiled,
- const int interp);
-void workbench_material_copy(WORKBENCH_MaterialData *dest_material,
- const WORKBENCH_MaterialData *source_material);
-
-/* workbench_studiolight.c */
-void studiolight_update_world(WORKBENCH_PrivateData *wpd,
- StudioLight *sl,
- WORKBENCH_UBO_World *wd);
-void studiolight_update_light(WORKBENCH_PrivateData *wpd, const float light_direction[3]);
-bool studiolight_object_cast_visible_shadow(WORKBENCH_PrivateData *wpd,
- Object *ob,
- WORKBENCH_ObjectData *oed);
-float studiolight_object_shadow_distance(WORKBENCH_PrivateData *wpd,
- Object *ob,
- WORKBENCH_ObjectData *oed);
-bool studiolight_camera_in_object_shadow(WORKBENCH_PrivateData *wpd,
- Object *ob,
- WORKBENCH_ObjectData *oed);
+void workbench_material_ubo_data(WORKBENCH_PrivateData *wpd,
+ Object *ob,
+ Material *mat,
+ WORKBENCH_UBO_Material *data,
+ eV3DShadingColorType color_type);
+
+DRWShadingGroup *workbench_material_setup_ex(WORKBENCH_PrivateData *wpd,
+ Object *ob,
+ int mat_nr,
+ eV3DShadingColorType color_type,
+ bool hair,
+ bool *r_transp);
+DRWShadingGroup *workbench_image_setup_ex(WORKBENCH_PrivateData *wpd,
+ Object *ob,
+ int mat_nr,
+ Image *ima,
+ ImageUser *iuser,
+ int interp,
+ bool hair);
+
+#define workbench_material_setup(wpd, ob, mat_nr, color_type, r_transp) \
+ workbench_material_setup_ex(wpd, ob, mat_nr, color_type, false, r_transp)
+#define workbench_image_setup(wpd, ob, mat_nr, ima, iuser, interp) \
+ workbench_image_setup_ex(wpd, ob, mat_nr, ima, iuser, interp, false)
+
+#define workbench_material_hair_setup(wpd, ob, mat_nr, color_type) \
+ workbench_material_setup_ex(wpd, ob, mat_nr, color_type, true, 0)
+#define workbench_image_hair_setup(wpd, ob, mat_nr, ima, iuser, interp) \
+ workbench_image_setup_ex(wpd, ob, mat_nr, ima, iuser, interp, true)
/* workbench_data.c */
-void workbench_effect_info_init(WORKBENCH_EffectInfo *effect_info);
void workbench_private_data_init(WORKBENCH_PrivateData *wpd);
-void workbench_private_data_free(WORKBENCH_PrivateData *wpd);
-void workbench_private_data_get_light_direction(float r_light_direction[3]);
-void workbench_clear_color_get(float color[4]);
+void workbench_update_world_ubo(WORKBENCH_PrivateData *wpd);
+void workbench_update_material_ubos(WORKBENCH_PrivateData *wpd);
+struct GPUUniformBuffer *workbench_material_ubo_alloc(WORKBENCH_PrivateData *wpd);
/* workbench_volume.c */
-void workbench_volume_engine_init(void);
-void workbench_volume_engine_free(void);
+void workbench_volume_engine_init(WORKBENCH_Data *vedata);
void workbench_volume_cache_init(WORKBENCH_Data *vedata);
void workbench_volume_cache_populate(WORKBENCH_Data *vedata,
- Scene *scene,
- Object *ob,
+ struct Scene *UNUSED(scene),
+ struct Object *ob,
struct ModifierData *md);
-void workbench_volume_smoke_textures_free(WORKBENCH_PrivateData *wpd);
+void workbench_volume_draw_pass(WORKBENCH_Data *vedata);
+void workbench_volume_draw_finish(WORKBENCH_Data *vedata);
+
+/* workbench_engine.c */
+void workbench_engine_init(void *ved);
+void workbench_cache_init(void *ved);
+void workbench_cache_populate(void *ved, Object *ob);
+void workbench_cache_finish(void *ved);
+void workbench_draw_sample(void *ved);
+void workbench_draw_finish(void *ved);
/* workbench_render.c */
-void workbench_render(WORKBENCH_Data *vedata,
+void workbench_render(void *ved,
struct RenderEngine *engine,
struct RenderLayer *render_layer,
const struct rcti *rect);