0%

blender_drw_command

blender 源码分析 对command的分析已经DrawPass分析

struct

1
2
3
4
5
6
7
8
结构体MeshBatchList中包含了GPUBatch.draw使用.
结构体MeshBufferList中包含GPUVertBuf和GPUIndexBuf,也就是vbobuffer的数据.
struct MeshBufferCache
{
MeshBufferList buff;
MeshExtractLooseGeom loose_geom;
SortedPolyData poly_sorted;
};
1
2
3
4
5
struct MeshBatchCache 
{
MeshBufferCache final, cage, uv_cage;
MeshBatchList batch;
}

流程

对cache的填充是在wm_event_do_handlers的流程下的.

1
2
3
4
5
6
7
8
9
10
列举出以为重要的函数堆栈
1.wm_event_do_handlers
2.wm_handler_operator_call
3.WM_gesture_box_modal
4.gesture_box_apply
5.view3d_box_select_exec
6.DRW_draw_select_id
7.drw_engines_cache_populate
8.DRW_mesh_batch_cache_create_requested

DRWPass init

以OVERLAY_antialiasing_cache_init为例

1
2
3
4
5
6
7
8
//创建shader
GPUShader *sh = OVERLAY_shader_antialiasing();
//创建Pass
DRW_PASS_CREATE(psl->antialiasing_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA_PREMUL);
//创建DRWShadingGroup,并把此group传给pass
DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->antialiasing_ps);
//创建command
drw_command_draw_procedural

不同的数据,command函数不一样,创建command函数为drw_command_create

DRW_mesh_batch_cache_create_requested

可以通过Mesh获取到缓冲结构体MeshBatchCache

1
2
Mesh *me,
MeshBatchCache *cache = mesh_batch_cache_get(me);

MeshBatchCache将final的buff中的vbo给到batch中.
之后在mesh_buffer_cache_create_requested函数中分配任务,在extract_task_range_run任务中修改vbo数据.

1
2
3
4
MeshBufferList *mbuflist = &cache->final.buff;
DRW_vbo_request(cache->batch.edit_triangles, &mbuflist->vbo.edit_data);
mesh_buffer_cache_create_requested
BLI_task_graph_work_and_wait