This repository has been archived on 2023-10-09. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
blender-archive/source/blender/draw/intern/draw_common_shader_shared.h
Clément Foucault 65ad36f5fd DRWManager: New implementation.
This is a new implementation of the draw manager using modern
rendering practices and GPU driven culling.

This only ports features that are not considered deprecated or to be
removed.

The old DRW API is kept working along side this new one, and does not
interfeer with it. However this needed some more hacking inside the
draw_view_lib.glsl. At least the create info are well separated.

The reviewer might start by looking at `draw_pass_test.cc` to see the
API in usage.

Important files are `draw_pass.hh`, `draw_command.hh`,
`draw_command_shared.hh`.

In a nutshell (for a developper used to old DRW API):
- `DRWShadingGroups` are replaced by `Pass<T>::Sub`.
- Contrary to DRWShadingGroups, all commands recorded inside a pass or
   sub-pass (even binds / push_constant / uniforms) will be executed in order.
- All memory is managed per object (except for Sub-Pass which are managed
   by their parent pass) and not from draw manager pools. So passes "can"
   potentially be recorded once and submitted multiple time (but this is
   not really encouraged for now). The only implicit link is between resource
   lifetime and `ResourceHandles`
- Sub passes can be any level deep.
- IMPORTANT: All state propagate from sub pass to subpass. There is no
   state stack concept anymore. Ensure the correct render state is set before
   drawing anything using `Pass::state_set()`.
- The drawcalls now needs a `ResourceHandle` instead of an `Object *`.
   This is to remove any implicit dependency between `Pass` and `Manager`.
   This was a huge problem in old implementation since the manager did not
   know what to pull from the object. Now it is explicitly requested by the
   engine.
- The pases need to be submitted to a `draw::Manager` instance which can
   be retrieved using `DRW_manager_get()` (for now).

Internally:
- All object data are stored in contiguous storage buffers. Removing a lot
   of complexity in the pass submission.
- Draw calls are sorted and visibility tested on GPU. Making more modern
   culling and better instancing usage possible in the future.
- Unit Tests have been added for regression testing and avoid most API
   breakage.
- `draw::View` now contains culling data for all objects in the scene
   allowing caching for multiple views.
- Bounding box and sphere final setup is moved to GPU.
- Some global resources locations have been hardcoded to reduce complexity.

What is missing:
- ~~Workaround for lack of gl_BaseInstanceARB.~~ Done
- ~~Object Uniform Attributes.~~ Done (Not in this patch)
- Workaround for hardware supporting a maximum of 8 SSBO.

Reviewed By: jbakker

Differential Revision: https://developer.blender.org/D15817
2022-09-02 18:45:14 +02:00

269 lines
10 KiB
C++

/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. */
/** \file
* \ingroup draw
*/
#ifndef GPU_SHADER
# include "GPU_shader_shared_utils.h"
typedef struct GlobalsUboStorage GlobalsUboStorage;
#endif
/* Future Plan: These globals were once shared between multiple overlay engines. But now that they
* have been merged into one engine, there is no reasons to keep these globals out of the overlay
* engine. */
#define UBO_FIRST_COLOR color_wire
#define UBO_LAST_COLOR color_uv_shadow
/* Used as ubo but colors can be directly referenced as well */
/* \note Also keep all color as vec4 and between #UBO_FIRST_COLOR and #UBO_LAST_COLOR. */
struct GlobalsUboStorage {
/* UBOs data needs to be 16 byte aligned (size of vec4) */
float4 color_wire;
float4 color_wire_edit;
float4 color_active;
float4 color_select;
float4 color_library_select;
float4 color_library;
float4 color_transform;
float4 color_light;
float4 color_speaker;
float4 color_camera;
float4 color_camera_path;
float4 color_empty;
float4 color_vertex;
float4 color_vertex_select;
float4 color_vertex_unreferenced;
float4 color_vertex_missing_data;
float4 color_edit_mesh_active;
float4 color_edge_select;
float4 color_edge_seam;
float4 color_edge_sharp;
float4 color_edge_crease;
float4 color_edge_bweight;
float4 color_edge_face_select;
float4 color_edge_freestyle;
float4 color_face;
float4 color_face_select;
float4 color_face_freestyle;
float4 color_gpencil_vertex;
float4 color_gpencil_vertex_select;
float4 color_normal;
float4 color_vnormal;
float4 color_lnormal;
float4 color_facedot;
float4 color_skinroot;
float4 color_deselect;
float4 color_outline;
float4 color_light_no_alpha;
float4 color_background;
float4 color_background_gradient;
float4 color_checker_primary;
float4 color_checker_secondary;
float4 color_clipping_border;
float4 color_edit_mesh_middle;
float4 color_handle_free;
float4 color_handle_auto;
float4 color_handle_vect;
float4 color_handle_align;
float4 color_handle_autoclamp;
float4 color_handle_sel_free;
float4 color_handle_sel_auto;
float4 color_handle_sel_vect;
float4 color_handle_sel_align;
float4 color_handle_sel_autoclamp;
float4 color_nurb_uline;
float4 color_nurb_vline;
float4 color_nurb_sel_uline;
float4 color_nurb_sel_vline;
float4 color_active_spline;
float4 color_bone_pose;
float4 color_bone_pose_active;
float4 color_bone_pose_active_unsel;
float4 color_bone_pose_constraint;
float4 color_bone_pose_ik;
float4 color_bone_pose_spline_ik;
float4 color_bone_pose_target;
float4 color_bone_solid;
float4 color_bone_locked;
float4 color_bone_active;
float4 color_bone_active_unsel;
float4 color_bone_select;
float4 color_bone_ik_line;
float4 color_bone_ik_line_no_target;
float4 color_bone_ik_line_spline;
float4 color_text;
float4 color_text_hi;
float4 color_bundle_solid;
float4 color_mball_radius;
float4 color_mball_radius_select;
float4 color_mball_stiffness;
float4 color_mball_stiffness_select;
float4 color_current_frame;
float4 color_grid;
float4 color_grid_emphasis;
float4 color_grid_axis_x;
float4 color_grid_axis_y;
float4 color_grid_axis_z;
float4 color_face_back;
float4 color_face_front;
float4 color_uv_shadow;
/* NOTE: Put all color before #UBO_LAST_COLOR. */
float4 screen_vecs[2]; /* Padded as vec4. */
float4 size_viewport; /* Packed as vec4. */
/* Pack individual float at the end of the buffer to avoid alignment errors */
float size_pixel, pixel_fac;
float size_object_center, size_light_center, size_light_circle, size_light_circle_shadow;
float size_vertex, size_edge, size_edge_fix, size_face_dot;
float size_checker;
float size_vertex_gpencil;
};
BLI_STATIC_ASSERT_ALIGN(GlobalsUboStorage, 16)
#ifdef GPU_SHADER
/* Keep compatibility_with old global scope syntax. */
/* TODO(@fclem) Mass rename and remove the camel case. */
# define colorWire globalsBlock.color_wire
# define colorWireEdit globalsBlock.color_wire_edit
# define colorActive globalsBlock.color_active
# define colorSelect globalsBlock.color_select
# define colorLibrarySelect globalsBlock.color_library_select
# define colorLibrary globalsBlock.color_library
# define colorTransform globalsBlock.color_transform
# define colorLight globalsBlock.color_light
# define colorSpeaker globalsBlock.color_speaker
# define colorCamera globalsBlock.color_camera
# define colorCameraPath globalsBlock.color_camera_path
# define colorEmpty globalsBlock.color_empty
# define colorVertex globalsBlock.color_vertex
# define colorVertexSelect globalsBlock.color_vertex_select
# define colorVertexUnreferenced globalsBlock.color_vertex_unreferenced
# define colorVertexMissingData globalsBlock.color_vertex_missing_data
# define colorEditMeshActive globalsBlock.color_edit_mesh_active
# define colorEdgeSelect globalsBlock.color_edge_select
# define colorEdgeSeam globalsBlock.color_edge_seam
# define colorEdgeSharp globalsBlock.color_edge_sharp
# define colorEdgeCrease globalsBlock.color_edge_crease
# define colorEdgeBWeight globalsBlock.color_edge_bweight
# define colorEdgeFaceSelect globalsBlock.color_edge_face_select
# define colorEdgeFreestyle globalsBlock.color_edge_freestyle
# define colorFace globalsBlock.color_face
# define colorFaceSelect globalsBlock.color_face_select
# define colorFaceFreestyle globalsBlock.color_face_freestyle
# define colorGpencilVertex globalsBlock.color_gpencil_vertex
# define colorGpencilVertexSelect globalsBlock.color_gpencil_vertex_select
# define colorNormal globalsBlock.color_normal
# define colorVNormal globalsBlock.color_vnormal
# define colorLNormal globalsBlock.color_lnormal
# define colorFaceDot globalsBlock.color_facedot
# define colorSkinRoot globalsBlock.color_skinroot
# define colorDeselect globalsBlock.color_deselect
# define colorOutline globalsBlock.color_outline
# define colorLightNoAlpha globalsBlock.color_light_no_alpha
# define colorBackground globalsBlock.color_background
# define colorBackgroundGradient globalsBlock.color_background_gradient
# define colorCheckerPrimary globalsBlock.color_checker_primary
# define colorCheckerSecondary globalsBlock.color_checker_secondary
# define colorClippingBorder globalsBlock.color_clipping_border
# define colorEditMeshMiddle globalsBlock.color_edit_mesh_middle
# define colorHandleFree globalsBlock.color_handle_free
# define colorHandleAuto globalsBlock.color_handle_auto
# define colorHandleVect globalsBlock.color_handle_vect
# define colorHandleAlign globalsBlock.color_handle_align
# define colorHandleAutoclamp globalsBlock.color_handle_autoclamp
# define colorHandleSelFree globalsBlock.color_handle_sel_free
# define colorHandleSelAuto globalsBlock.color_handle_sel_auto
# define colorHandleSelVect globalsBlock.color_handle_sel_vect
# define colorHandleSelAlign globalsBlock.color_handle_sel_align
# define colorHandleSelAutoclamp globalsBlock.color_handle_sel_autoclamp
# define colorNurbUline globalsBlock.color_nurb_uline
# define colorNurbVline globalsBlock.color_nurb_vline
# define colorNurbSelUline globalsBlock.color_nurb_sel_uline
# define colorNurbSelVline globalsBlock.color_nurb_sel_vline
# define colorActiveSpline globalsBlock.color_active_spline
# define colorBonePose globalsBlock.color_bone_pose
# define colorBonePoseActive globalsBlock.color_bone_pose_active
# define colorBonePoseActiveUnsel globalsBlock.color_bone_pose_active_unsel
# define colorBonePoseConstraint globalsBlock.color_bone_pose_constraint
# define colorBonePoseIK globalsBlock.color_bone_pose_ik
# define colorBonePoseSplineIK globalsBlock.color_bone_pose_spline_ik
# define colorBonePoseTarget globalsBlock.color_bone_pose_target
# define colorBoneSolid globalsBlock.color_bone_solid
# define colorBoneLocked globalsBlock.color_bone_locked
# define colorBoneActive globalsBlock.color_bone_active
# define colorBoneActiveUnsel globalsBlock.color_bone_active_unsel
# define colorBoneSelect globalsBlock.color_bone_select
# define colorBoneIKLine globalsBlock.color_bone_ik_line
# define colorBoneIKLineNoTarget globalsBlock.color_bone_ik_line_no_target
# define colorBoneIKLineSpline globalsBlock.color_bone_ik_line_spline
# define colorText globalsBlock.color_text
# define colorTextHi globalsBlock.color_text_hi
# define colorBundleSolid globalsBlock.color_bundle_solid
# define colorMballRadius globalsBlock.color_mball_radius
# define colorMballRadiusSelect globalsBlock.color_mball_radius_select
# define colorMballStiffness globalsBlock.color_mball_stiffness
# define colorMballStiffnessSelect globalsBlock.color_mball_stiffness_select
# define colorCurrentFrame globalsBlock.color_current_frame
# define colorGrid globalsBlock.color_grid
# define colorGridEmphasis globalsBlock.color_grid_emphasis
# define colorGridAxisX globalsBlock.color_grid_axis_x
# define colorGridAxisY globalsBlock.color_grid_axis_y
# define colorGridAxisZ globalsBlock.color_grid_axis_z
# define colorFaceBack globalsBlock.color_face_back
# define colorFaceFront globalsBlock.color_face_front
# define colorUVShadow globalsBlock.color_uv_shadow
# define screenVecs globalsBlock.screen_vecs
# define sizeViewport globalsBlock.size_viewport.xy
# define sizePixel globalsBlock.size_pixel
# define pixelFac globalsBlock.pixel_fac
# define sizeObjectCenter globalsBlock.size_object_center
# define sizeLightCenter globalsBlock.size_light_center
# define sizeLightCircle globalsBlock.size_light_circle
# define sizeLightCircleShadow globalsBlock.size_light_circle_shadow
# define sizeVertex globalsBlock.size_vertex
# define sizeEdge globalsBlock.size_edge
# define sizeEdgeFix globalsBlock.size_edge_fix
# define sizeFaceDot globalsBlock.size_face_dot
# define sizeChecker globalsBlock.size_checker
# define sizeVertexGpencil globalsBlock.size_vertex_gpencil
#endif
/* See: 'draw_cache_impl.h' for matching includes. */
#define VERT_GPENCIL_BEZT_HANDLE (1 << 30)
/* data[0] (1st byte flags) */
#define FACE_ACTIVE (1 << 0)
#define FACE_SELECTED (1 << 1)
#define FACE_FREESTYLE (1 << 2)
#define VERT_UV_SELECT (1 << 3)
#define VERT_UV_PINNED (1 << 4)
#define EDGE_UV_SELECT (1 << 5)
#define FACE_UV_ACTIVE (1 << 6)
#define FACE_UV_SELECT (1 << 7)
/* data[1] (2st byte flags) */
#define VERT_ACTIVE (1 << 0)
#define VERT_SELECTED (1 << 1)
#define VERT_SELECTED_BEZT_HANDLE (1 << 2)
#define EDGE_ACTIVE (1 << 3)
#define EDGE_SELECTED (1 << 4)
#define EDGE_SEAM (1 << 5)
#define EDGE_SHARP (1 << 6)
#define EDGE_FREESTYLE (1 << 7)
#define COMMON_GLOBALS_LIB