Blender V4.3
draw_manager_exec.cc File Reference
#include "draw_manager_c.hh"
#include "BLI_alloca.h"
#include "BLI_math_bits.h"
#include "BLI_memblock.h"
#include "BKE_global.hh"
#include "GPU_compute.hh"
#include "GPU_platform.hh"
#include "GPU_shader.hh"
#include "GPU_state.hh"
#include "GPU_select.hh"

Go to the source code of this file.

Classes

struct  DRWCommandsState
 
struct  DRWCommandIterator
 

Macros

#define DEBUG_UBO_BINDING
 
#define MAX_UNIFORM_STACK_SIZE   64
 

Functions

void DRW_select_load_id (uint id)
 
Draw State (DRW_state)
void drw_state_set (DRWState state)
 
static void drw_stencil_state_set (uint write_mask, uint reference, uint compare_mask)
 
void DRW_state_reset_ex (DRWState state)
 
static void drw_state_validate ()
 
void DRW_state_lock (DRWState state)
 
void DRW_state_reset ()
 
Culling (DRW_culling)
static bool draw_call_is_culled (const DRWResourceHandle *handle, DRWView *view)
 
void DRW_view_set_active (const DRWView *view)
 
const DRWViewDRW_view_get_active ()
 
static bool draw_culling_sphere_test (const BoundSphere *frustum_bsphere, const float(*frustum_planes)[4], const BoundSphere *bsphere)
 
static bool draw_culling_box_test (const float(*frustum_planes)[4], const BoundBox *bbox)
 
static bool draw_culling_plane_test (const BoundBox *corners, const float plane[4])
 
bool DRW_culling_sphere_test (const DRWView *view, const BoundSphere *bsphere)
 
bool DRW_culling_box_test (const DRWView *view, const BoundBox *bbox)
 
bool DRW_culling_plane_test (const DRWView *view, const float plane[4])
 
bool DRW_culling_min_max_test (const DRWView *view, float obmat[4][4], float min[3], float max[3])
 
void DRW_culling_frustum_corners_get (const DRWView *view, BoundBox *corners)
 
void DRW_culling_frustum_planes_get (const DRWView *view, float planes[6][4])
 
static void draw_compute_culling (DRWView *view)
 
Draw (DRW_draw)
BLI_INLINE void draw_legacy_matrix_update (DRWShadingGroup *shgroup, DRWResourceHandle *handle, float obmat_loc, float obinv_loc)
 
BLI_INLINE void draw_geometry_bind (DRWShadingGroup *shgroup, blender::gpu::Batch *geom)
 
BLI_INLINE void draw_geometry_execute (DRWShadingGroup *shgroup, blender::gpu::Batch *geom, int vert_first, int vert_count, int inst_first, int inst_count, int baseinst_loc)
 
BLI_INLINE void draw_indirect_call (DRWShadingGroup *shgroup, DRWCommandsState *state)
 
static void draw_update_uniforms (DRWShadingGroup *shgroup, DRWCommandsState *state, bool *use_tfeedback)
 
BLI_INLINE void draw_select_buffer (DRWShadingGroup *shgroup, DRWCommandsState *state, blender::gpu::Batch *batch, const DRWResourceHandle *handle)
 
static void draw_command_iter_begin (DRWCommandIterator *iter, DRWShadingGroup *shgroup)
 
static DRWCommanddraw_command_iter_step (DRWCommandIterator *iter, eDRWCommandType *cmd_type)
 
static void draw_call_resource_bind (DRWCommandsState *state, const DRWResourceHandle *handle)
 
static void draw_call_batching_flush (DRWShadingGroup *shgroup, DRWCommandsState *state)
 
static void draw_call_single_do (DRWShadingGroup *shgroup, DRWCommandsState *state, blender::gpu::Batch *batch, DRWResourceHandle handle, int vert_first, int vert_count, int inst_first, int inst_count, bool do_base_instance)
 
static void draw_call_indirect (DRWShadingGroup *shgroup, DRWCommandsState *state, blender::gpu::Batch *batch, DRWResourceHandle handle, GPUStorageBuf *indirect_buf)
 
static void draw_call_batching_start (DRWCommandsState *state)
 
static void draw_call_batching_do (DRWShadingGroup *shgroup, DRWCommandsState *state, DRWCommandDraw *call)
 
static void draw_call_batching_finish (DRWShadingGroup *shgroup, DRWCommandsState *state)
 
static void draw_shgroup (DRWShadingGroup *shgroup, DRWState pass_state)
 
static void drw_update_view ()
 
static void drw_draw_pass_ex (DRWPass *pass, DRWShadingGroup *start_group, DRWShadingGroup *end_group)
 
void DRW_draw_pass (DRWPass *pass)
 
void DRW_draw_pass_subset (DRWPass *pass, DRWShadingGroup *start_group, DRWShadingGroup *end_group)
 

Macro Definition Documentation

◆ DEBUG_UBO_BINDING

#define DEBUG_UBO_BINDING

Definition at line 34 of file draw_manager_exec.cc.

◆ MAX_UNIFORM_STACK_SIZE

#define MAX_UNIFORM_STACK_SIZE   64

Function Documentation

◆ draw_call_batching_do()

◆ draw_call_batching_finish()

◆ draw_call_batching_flush()

static void draw_call_batching_flush ( DRWShadingGroup * shgroup,
DRWCommandsState * state )
static

◆ draw_call_batching_start()

static void draw_call_batching_start ( DRWCommandsState * state)
static

Definition at line 912 of file draw_manager_exec.cc.

References state.

Referenced by draw_shgroup().

◆ draw_call_indirect()

static void draw_call_indirect ( DRWShadingGroup * shgroup,
DRWCommandsState * state,
blender::gpu::Batch * batch,
DRWResourceHandle handle,
GPUStorageBuf * indirect_buf )
static

◆ draw_call_is_culled()

static bool draw_call_is_culled ( const DRWResourceHandle * handle,
DRWView * view )
static

◆ draw_call_resource_bind()

◆ draw_call_single_do()

static void draw_call_single_do ( DRWShadingGroup * shgroup,
DRWCommandsState * state,
blender::gpu::Batch * batch,
DRWResourceHandle handle,
int vert_first,
int vert_count,
int inst_first,
int inst_count,
bool do_base_instance )
static

◆ draw_command_iter_begin()

static void draw_command_iter_begin ( DRWCommandIterator * iter,
DRWShadingGroup * shgroup )
static

◆ draw_command_iter_step()

◆ draw_compute_culling()

◆ draw_culling_box_test()

static bool draw_culling_box_test ( const float(*) frustum_planes[4],
const BoundBox * bbox )
static

Definition at line 386 of file draw_manager_exec.cc.

References plane_point_side_v3(), v, and BoundBox::vec.

Referenced by DRW_culling_box_test().

◆ draw_culling_plane_test()

static bool draw_culling_plane_test ( const BoundBox * corners,
const float plane[4] )
static

Definition at line 407 of file draw_manager_exec.cc.

References plane_point_side_v3().

Referenced by DRW_culling_plane_test().

◆ draw_culling_sphere_test()

static bool draw_culling_sphere_test ( const BoundSphere * frustum_bsphere,
const float(*) frustum_planes[4],
const BoundSphere * bsphere )
static

◆ draw_geometry_bind()

BLI_INLINE void draw_geometry_bind ( DRWShadingGroup * shgroup,
blender::gpu::Batch * geom )

◆ draw_geometry_execute()

BLI_INLINE void draw_geometry_execute ( DRWShadingGroup * shgroup,
blender::gpu::Batch * geom,
int vert_first,
int vert_count,
int inst_first,
int inst_count,
int baseinst_loc )

◆ draw_indirect_call()

◆ draw_legacy_matrix_update()

◆ draw_select_buffer()

BLI_INLINE void draw_select_buffer ( DRWShadingGroup * shgroup,
DRWCommandsState * state,
blender::gpu::Batch * batch,
const DRWResourceHandle * handle )

◆ draw_shgroup()

static void draw_shgroup ( DRWShadingGroup * shgroup,
DRWState pass_state )
static

Definition at line 984 of file draw_manager_exec.cc.

References DRWCommand::barrier, DRWCommandDraw::batch, DRWCommandDrawIndirect::batch, DRWCommandDrawInstance::batch, DRWCommandDrawInstanceRange::batch, DRWCommandDrawProcedural::batch, DRWCommandDrawRange::batch, DRWManager::batch, BLI_assert, DRWCommand::clear, DRWCommandClear::clear_channels, DRWCommandSetStencil::comp_mask, DRWCommand::compute, DRWCommand::compute_indirect, DRWCommand::compute_ref, DRWCommandClear::depth, DRWCommandSetMutableState::disable, DRWCommand::draw, draw_call_batching_do(), draw_call_batching_finish(), draw_call_batching_flush(), draw_call_batching_start(), draw_call_indirect(), draw_call_is_culled(), draw_call_single_do(), draw_command_iter_begin(), draw_command_iter_step(), DRWCommand::draw_indirect, draw_update_uniforms(), DRW_CMD_BARRIER, DRW_CMD_CLEAR, DRW_CMD_COMPUTE, DRW_CMD_COMPUTE_INDIRECT, DRW_CMD_COMPUTE_REF, DRW_CMD_DRAW, DRW_CMD_DRAW_INDIRECT, DRW_CMD_DRAW_INSTANCE, DRW_CMD_DRAW_INSTANCE_RANGE, DRW_CMD_DRAW_PROCEDURAL, DRW_CMD_DRAW_RANGE, DRW_CMD_DRWSTATE, DRW_CMD_SELECTID, DRW_CMD_STENCIL, drw_state_set(), drw_stencil_state_set(), DST, DRWCommandSetMutableState::enable, G, G_DEBUG_GPU, G_FLAG_PICKSEL, GPU_compute_dispatch(), GPU_compute_dispatch_indirect(), GPU_framebuffer_active_get(), GPU_framebuffer_clear(), GPU_memory_barrier(), GPU_shader_bind(), GPU_shader_transform_feedback_disable(), GPU_shader_unbind(), GPU_storagebuf_debug_unbind_all(), GPU_texture_image_unbind_all(), GPU_texture_unbind_all(), GPU_uniformbuf_debug_unbind_all(), DRWCommandComputeRef::groups_ref, DRWCommandCompute::groups_x_len, DRWCommandCompute::groups_y_len, DRWCommandCompute::groups_z_len, DRWCommandDraw::handle, DRWCommandDrawIndirect::handle, DRWCommandDrawInstance::handle, DRWCommandDrawInstanceRange::handle, DRWCommandDrawProcedural::handle, DRWCommandDrawRange::handle, DRWCommandComputeIndirect::indirect_buf, DRWCommandDrawIndirect::indirect_buf, DRWCommandDrawInstance::inst_count, DRWCommandDrawInstanceRange::inst_count, DRWCommandDrawInstanceRange::inst_first, DRWCommand::instance, DRWCommand::instance_range, DRWCommandsState::obmats_loc, DRWCommand::procedural, DRWCommand::range, DRWCommandSetStencil::ref, DRWCommandSetSelectID::select_buf, DRWCommand::select_id, DRWCommandSetSelectID::select_id, DRWManager::shader, DRWShadingGroup::shader, DRWCommand::state, state, DRWCommand::stencil, DRWCommandClear::stencil, DRWCommandBarrier::type, DRWCommandDrawInstance::use_attrs, USE_BATCHING, DRWCommandDrawProcedural::vert_count, DRWCommandDrawRange::vert_count, DRWCommandDrawRange::vert_first, DRWManager::view_active, and DRWCommandSetStencil::write_mask.

Referenced by drw_draw_pass_ex().

◆ draw_update_uniforms()

static void draw_update_uniforms ( DRWShadingGroup * shgroup,
DRWCommandsState * state,
bool * use_tfeedback )
static

Definition at line 587 of file draw_manager_exec.cc.

References DRWUniform::arraysize, BLI_assert, DRWUniform::block, DRWUniform::block_ref, drw_ensure_layer_attribute_buffer(), DRW_sparse_uniform_buffer_bind(), DRW_uniform_attrs_pool_find_ubo(), DRW_UNIFORM_BASE_INSTANCE, DRW_UNIFORM_BLOCK, DRW_UNIFORM_BLOCK_OBATTRS, DRW_UNIFORM_BLOCK_OBINFOS, DRW_UNIFORM_BLOCK_OBMATS, DRW_UNIFORM_BLOCK_REF, DRW_UNIFORM_BLOCK_VLATTRS, DRW_UNIFORM_FLOAT, DRW_UNIFORM_FLOAT_COPY, DRW_UNIFORM_IMAGE, DRW_UNIFORM_IMAGE_REF, DRW_UNIFORM_INT, DRW_UNIFORM_INT_COPY, DRW_UNIFORM_MODEL_MATRIX, DRW_UNIFORM_MODEL_MATRIX_INVERSE, DRW_UNIFORM_RESOURCE_CHUNK, DRW_UNIFORM_RESOURCE_ID, DRW_UNIFORM_STORAGE_BLOCK, DRW_UNIFORM_STORAGE_BLOCK_REF, DRW_UNIFORM_TEXTURE, DRW_UNIFORM_TEXTURE_REF, DRW_UNIFORM_TFEEDBACK_TARGET, DRW_UNIFORM_VERTEX_BUFFER_AS_STORAGE, DRW_UNIFORM_VERTEX_BUFFER_AS_STORAGE_REF, DRW_UNIFORM_VERTEX_BUFFER_AS_TEXTURE, DRW_UNIFORM_VERTEX_BUFFER_AS_TEXTURE_REF, DST, DRWUniform::fvalue, GPU_shader_transform_feedback_enable(), GPU_shader_uniform_float_ex(), GPU_shader_uniform_int_ex(), GPU_storagebuf_bind(), GPU_texture_bind_ex(), GPU_texture_image_bind(), GPU_uniformbuf_bind(), GPU_vertbuf_bind_as_ssbo(), GPU_vertbuf_bind_as_texture(), DRWUniform::ivalue, DRWUniform::length, DRWUniform::location, DRWData::matrices_ubo, DRWData::obattrs_ubo_pool, DRWData::obinfos_ubo, DRWUniform::pvalue, DRWUniform::sampler_state, DRWShadingGroup::shader, DRWUniform::ssbo, DRWUniform::ssbo_ref, state, DRWUniform::texture, DRWUniform::texture_ref, DRWUniform::type, DRWUniform::uniform_attrs, DRWShadingGroup::uniforms, UNUSED_VARS_NDEBUG, DRWUniform::vertbuf, DRWUniform::vertbuf_ref, and DRWManager::vmempool.

Referenced by draw_shgroup().

◆ DRW_culling_box_test()

bool DRW_culling_box_test ( const DRWView * view,
const BoundBox * bbox )
Returns
True if the given BoundBox intersect the current view frustum. bbox must be in world space.

Definition at line 425 of file draw_manager_exec.cc.

References draw_culling_box_test(), DST, view, and DRWManager::view_default.

◆ DRW_culling_frustum_corners_get()

void DRW_culling_frustum_corners_get ( const DRWView * view,
BoundBox * corners )

Definition at line 455 of file draw_manager_exec.cc.

References DST, DRWView::frustum_corners, view, and DRWManager::view_default.

◆ DRW_culling_frustum_planes_get()

void DRW_culling_frustum_planes_get ( const DRWView * view,
float planes[6][4] )

Definition at line 461 of file draw_manager_exec.cc.

References DST, view, and DRWManager::view_default.

Referenced by blender::workbench::ShadowPass::init().

◆ DRW_culling_min_max_test()

bool DRW_culling_min_max_test ( const DRWView * view,
float obmat[4][4],
float min[3],
float max[3] )

Return True if the given box intersect the current view frustum. This function will have to be replaced when world space bounding-box per objects is implemented.

Definition at line 437 of file draw_manager_exec.cc.

References aabb_get_near_far_from_plane(), DST, min, mul_v4_m4v4(), plane_point_side_v3(), transpose_m4_m4(), view, and DRWManager::view_default.

◆ DRW_culling_plane_test()

bool DRW_culling_plane_test ( const DRWView * view,
const float plane[4] )
Returns
True if the view frustum is inside or intersect the given plane. plane must be in world space.

Definition at line 431 of file draw_manager_exec.cc.

References draw_culling_plane_test(), DST, view, and DRWManager::view_default.

◆ DRW_culling_sphere_test()

bool DRW_culling_sphere_test ( const DRWView * view,
const BoundSphere * bsphere )
Returns
True if the given BoundSphere intersect the current view frustum. bsphere must be in world space.

Definition at line 419 of file draw_manager_exec.cc.

References draw_culling_sphere_test(), DST, view, and DRWManager::view_default.

Referenced by ArmatureBoneDrawStrategyBBone::culling_test(), ArmatureBoneDrawStrategyEnvelope::culling_test(), pchan_culling_test_simple(), and pchan_culling_test_with_radius_scale().

◆ DRW_draw_pass()

void DRW_draw_pass ( DRWPass * pass)

Definition at line 1254 of file draw_manager_exec.cc.

References drw_draw_pass_ex().

Referenced by basic_draw_scene(), blender::draw::image_engine::ScreenSpaceDrawingMode< TextureMethod >::draw_viewport(), blender::draw::DRW_curves_update(), DRW_hair_update(), external_draw_scene(), GPENCIL_antialiasing_draw(), gpencil_draw_mask(), GPENCIL_draw_object(), GPENCIL_draw_scene_depth_only(), OVERLAY_antialiasing_end(), OVERLAY_armature_draw(), OVERLAY_armature_in_front_draw(), OVERLAY_background_draw(), OVERLAY_edit_curve_draw(), OVERLAY_edit_curves_draw(), OVERLAY_edit_gpencil_legacy_draw(), OVERLAY_edit_grease_pencil_draw(), OVERLAY_edit_lattice_draw(), OVERLAY_edit_mesh_draw(), overlay_edit_mesh_draw_components(), OVERLAY_edit_particle_draw(), OVERLAY_edit_text_draw(), OVERLAY_edit_uv_draw(), OVERLAY_extra_blend_draw(), OVERLAY_extra_centers_draw(), OVERLAY_extra_draw(), OVERLAY_extra_in_front_draw(), OVERLAY_facing_draw(), OVERLAY_facing_infront_draw(), OVERLAY_fade_draw(), OVERLAY_fade_infront_draw(), OVERLAY_gpencil_legacy_draw(), OVERLAY_grease_pencil_draw(), OVERLAY_grid_draw(), OVERLAY_image_background_draw(), OVERLAY_image_draw(), OVERLAY_image_in_front_draw(), OVERLAY_image_scene_background_draw(), OVERLAY_metaball_draw(), OVERLAY_metaball_in_front_draw(), OVERLAY_mode_transfer_draw(), OVERLAY_mode_transfer_infront_draw(), OVERLAY_motion_path_draw(), OVERLAY_outline_draw(), OVERLAY_paint_draw(), OVERLAY_particle_draw(), OVERLAY_pose_draw(), OVERLAY_sculpt_curves_draw(), OVERLAY_sculpt_curves_draw_wires(), OVERLAY_sculpt_draw(), OVERLAY_viewer_attribute_draw(), OVERLAY_volume_draw(), OVERLAY_wireframe_draw(), OVERLAY_wireframe_in_front_draw(), OVERLAY_xray_fade_draw(), select_debug_draw_scene(), and select_draw_scene().

◆ drw_draw_pass_ex()

◆ DRW_draw_pass_subset()

void DRW_draw_pass_subset ( DRWPass * pass,
DRWShadingGroup * start_group,
DRWShadingGroup * end_group )

Draw only a subset of shgroups. Used in special situations as grease pencil strokes.

Definition at line 1261 of file draw_manager_exec.cc.

References drw_draw_pass_ex().

◆ DRW_select_load_id()

◆ DRW_state_lock()

void DRW_state_lock ( DRWState state)

◆ DRW_state_reset()

◆ DRW_state_reset_ex()

void DRW_state_reset_ex ( DRWState state)

Reset state to not interfere with other UI draw-call.

Definition at line 262 of file draw_manager_exec.cc.

References drw_state_set(), DST, DRWManager::state, and state.

Referenced by DRW_state_reset(), external_draw_scene_do_image(), and external_draw_scene_do_v3d().

◆ drw_state_set()

void drw_state_set ( DRWState state)

Definition at line 68 of file draw_manager_exec.cc.

References blend, DRWView::clip_planes_len, DRW_STATE_BLEND_ADD, DRW_STATE_BLEND_ADD_FULL, DRW_STATE_BLEND_ALPHA, DRW_STATE_BLEND_ALPHA_PREMUL, DRW_STATE_BLEND_ALPHA_UNDER_PREMUL, DRW_STATE_BLEND_BACKGROUND, DRW_STATE_BLEND_CUSTOM, DRW_STATE_BLEND_ENABLED, DRW_STATE_BLEND_MUL, DRW_STATE_BLEND_OIT, DRW_STATE_BLEND_SUB, DRW_STATE_CLIP_PLANES, DRW_STATE_CULL_BACK, DRW_STATE_CULL_FRONT, DRW_STATE_DEPTH_ALWAYS, DRW_STATE_DEPTH_EQUAL, DRW_STATE_DEPTH_GREATER, DRW_STATE_DEPTH_GREATER_EQUAL, DRW_STATE_DEPTH_LESS, DRW_STATE_DEPTH_LESS_EQUAL, DRW_STATE_DEPTH_TEST_ENABLED, DRW_STATE_FIRST_VERTEX_CONVENTION, DRW_STATE_IN_FRONT_SELECT, DRW_STATE_LOGIC_INVERT, DRW_STATE_PROGRAM_POINT_SIZE, DRW_STATE_SHADOW_OFFSET, DRW_STATE_STENCIL_ALWAYS, DRW_STATE_STENCIL_EQUAL, DRW_STATE_STENCIL_NEQUAL, DRW_STATE_STENCIL_TEST_ENABLED, DRW_STATE_WRITE_COLOR, DRW_STATE_WRITE_DEPTH, DRW_STATE_WRITE_STENCIL, DRW_STATE_WRITE_STENCIL_ENABLED, DRW_STATE_WRITE_STENCIL_SHADOW_FAIL, DRW_STATE_WRITE_STENCIL_SHADOW_PASS, DST, GPU_BLEND_ADDITIVE, GPU_BLEND_ADDITIVE_PREMULT, GPU_BLEND_ALPHA, GPU_BLEND_ALPHA_PREMULT, GPU_BLEND_ALPHA_UNDER_PREMUL, GPU_BLEND_BACKGROUND, GPU_BLEND_CUSTOM, GPU_BLEND_INVERT, GPU_BLEND_MULTIPLY, GPU_BLEND_NONE, GPU_BLEND_OIT, GPU_BLEND_SUBTRACT, GPU_clip_distances(), GPU_CULL_BACK, GPU_CULL_FRONT, GPU_CULL_NONE, GPU_DEPTH_ALWAYS, GPU_DEPTH_EQUAL, GPU_DEPTH_GREATER, GPU_DEPTH_GREATER_EQUAL, GPU_DEPTH_LESS, GPU_DEPTH_LESS_EQUAL, GPU_DEPTH_NONE, GPU_depth_range(), GPU_program_point_size(), GPU_provoking_vertex(), GPU_shadow_offset(), GPU_state_set(), GPU_STENCIL_ALWAYS, GPU_STENCIL_EQUAL, GPU_STENCIL_NEQUAL, GPU_STENCIL_NONE, GPU_STENCIL_OP_COUNT_DEPTH_FAIL, GPU_STENCIL_OP_COUNT_DEPTH_PASS, GPU_STENCIL_OP_NONE, GPU_STENCIL_OP_REPLACE, GPU_stencil_write_mask_set(), GPU_VERTEX_FIRST, GPU_VERTEX_LAST, GPU_WRITE_COLOR, GPU_WRITE_DEPTH, GPU_WRITE_STENCIL, DRWManager::state, state, DRWManager::state_lock, and DRWManager::view_active.

Referenced by draw_shgroup(), drw_draw_pass_ex(), DRW_state_reset_ex(), and DRW_transform_none().

◆ drw_state_validate()

◆ drw_stencil_state_set()

static void drw_stencil_state_set ( uint write_mask,
uint reference,
uint compare_mask )
static

◆ drw_update_view()

◆ DRW_view_get_active()

const DRWView * DRW_view_get_active ( )

◆ DRW_view_set_active()