Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/intern/draw_manager.c
| Show First 20 Lines • Show All 497 Lines • ▼ Show 20 Lines | const float *DRW_viewport_size_get(void) | ||||
| return DST.size; | return DST.size; | ||||
| } | } | ||||
| const float *DRW_viewport_invert_size_get(void) | const float *DRW_viewport_invert_size_get(void) | ||||
| { | { | ||||
| return DST.inv_size; | return DST.inv_size; | ||||
| } | } | ||||
| const float *DRW_viewport_render_size_get(void) | |||||
| { | |||||
| return DST.render_size; | |||||
| } | |||||
| float DRW_viewport_render_scale_get(void) | |||||
| { | |||||
| return DST.render_size[0] * DST.inv_size[0]; | |||||
| } | |||||
| const float *DRW_viewport_invert_render_size_get(void) | |||||
| { | |||||
| return DST.inv_render_size; | |||||
| } | |||||
| const float *DRW_viewport_screenvecs_get(void) | const float *DRW_viewport_screenvecs_get(void) | ||||
| { | { | ||||
| return &DST.screenvecs[0][0]; | return &DST.screenvecs[0][0]; | ||||
| } | } | ||||
| const float *DRW_viewport_pixelsize_get(void) | const float *DRW_viewport_pixelsize_get(void) | ||||
| { | { | ||||
| return &DST.pixsize; | return &DST.pixsize; | ||||
| ▲ Show 20 Lines • Show All 50 Lines • ▼ Show 20 Lines | if (DST.draw_ctx.rv3d && DST.draw_ctx.rv3d->rflag & RV3D_CLIPPING) { | ||||
| DST.draw_ctx.sh_cfg = GPU_SHADER_CFG_CLIPPED; | DST.draw_ctx.sh_cfg = GPU_SHADER_CFG_CLIPPED; | ||||
| } | } | ||||
| } | } | ||||
| /* It also stores viewport variable to an immutable place: DST | /* It also stores viewport variable to an immutable place: DST | ||||
| * This is because a cache uniform only store reference | * This is because a cache uniform only store reference | ||||
| * to its value. And we don't want to invalidate the cache | * to its value. And we don't want to invalidate the cache | ||||
| * if this value change per viewport */ | * if this value change per viewport */ | ||||
| static void drw_viewport_var_init(void) | static void drw_viewport_var_init(bool use_render_scale) | ||||
| { | { | ||||
| RegionView3D *rv3d = DST.draw_ctx.rv3d; | RegionView3D *rv3d = DST.draw_ctx.rv3d; | ||||
| /* Refresh DST.size */ | /* Refresh DST.size */ | ||||
| if (DST.viewport) { | if (DST.viewport) { | ||||
| int size[2]; | int size[2]; | ||||
| GPU_viewport_size_get(DST.viewport, size); | GPU_viewport_size_get(DST.viewport, size); | ||||
| DST.size[0] = size[0]; | DST.size[0] = size[0]; | ||||
| DST.size[1] = size[1]; | DST.size[1] = size[1]; | ||||
| DST.inv_size[0] = 1.0f / size[0]; | DST.inv_size[0] = 1.0f / size[0]; | ||||
| DST.inv_size[1] = 1.0f / size[1]; | DST.inv_size[1] = 1.0f / size[1]; | ||||
| if (use_render_scale) { | |||||
| /* Lower the internal resolution */ | |||||
| float scale = U.gpu_viewport_scale; | |||||
| /* As a precaution to an invalid scale value */ | |||||
| if (!(scale >= 0.0f && scale <= 2.0f)) { | |||||
| scale = 1.0; | |||||
| } | |||||
| DST.render_size[0] = (int)ceil(DST.size[0] * scale); | |||||
| DST.render_size[1] = (int)ceil(DST.size[1] * scale); | |||||
| } | |||||
| else { | |||||
| DST.render_size[0] = DST.size[0]; | |||||
| DST.render_size[1] = DST.size[1]; | |||||
| } | |||||
| DST.inv_render_size[0] = 1.0f / DST.render_size[0]; | |||||
| DST.inv_render_size[1] = 1.0f / DST.render_size[1]; | |||||
| DefaultFramebufferList *fbl = (DefaultFramebufferList *)GPU_viewport_framebuffer_list_get( | DefaultFramebufferList *fbl = (DefaultFramebufferList *)GPU_viewport_framebuffer_list_get( | ||||
| DST.viewport); | DST.viewport); | ||||
| DST.default_framebuffer = fbl->default_fb; | DST.default_framebuffer = fbl->default_fb; | ||||
| DST.vmempool = GPU_viewport_mempool_get(DST.viewport); | DST.vmempool = GPU_viewport_mempool_get(DST.viewport); | ||||
| if (DST.vmempool->calls == NULL) { | if (DST.vmempool->calls == NULL) { | ||||
| DST.vmempool->calls = BLI_mempool_create(sizeof(DRWCall), 0, 512, 0); | DST.vmempool->calls = BLI_mempool_create(sizeof(DRWCall), 0, 512, 0); | ||||
| ▲ Show 20 Lines • Show All 916 Lines • ▼ Show 20 Lines | DST.draw_ctx = (DRWContextState){ | ||||
| .obact = OBACT(view_layer), | .obact = OBACT(view_layer), | ||||
| .engine_type = engine_type, | .engine_type = engine_type, | ||||
| .depsgraph = depsgraph, | .depsgraph = depsgraph, | ||||
| /* reuse if caller sets */ | /* reuse if caller sets */ | ||||
| .evil_C = DST.draw_ctx.evil_C, | .evil_C = DST.draw_ctx.evil_C, | ||||
| }; | }; | ||||
| drw_context_state_init(); | drw_context_state_init(); | ||||
| drw_viewport_var_init(); | drw_viewport_var_init(true); | ||||
| /* Get list of enabled engines */ | /* Get list of enabled engines */ | ||||
| drw_engines_enable(view_layer, engine_type); | drw_engines_enable(view_layer, engine_type); | ||||
| /* Update ubos */ | /* Update ubos */ | ||||
| DRW_globals_update(); | DRW_globals_update(); | ||||
| drw_debug_init(); | drw_debug_init(); | ||||
| ▲ Show 20 Lines • Show All 298 Lines • ▼ Show 20 Lines | DST.draw_ctx = (DRWContextState){ | ||||
| .object_mode = OB_MODE_OBJECT, | .object_mode = OB_MODE_OBJECT, | ||||
| }; | }; | ||||
| drw_context_state_init(); | drw_context_state_init(); | ||||
| DST.viewport = GPU_viewport_create(); | DST.viewport = GPU_viewport_create(); | ||||
| const int size[2] = {(r->size * r->xsch) / 100, (r->size * r->ysch) / 100}; | const int size[2] = {(r->size * r->xsch) / 100, (r->size * r->ysch) / 100}; | ||||
| GPU_viewport_size_set(DST.viewport, size); | GPU_viewport_size_set(DST.viewport, size); | ||||
| drw_viewport_var_init(); | drw_viewport_var_init(false); | ||||
| /* Main rendering. */ | /* Main rendering. */ | ||||
| rctf view_rect; | rctf view_rect; | ||||
| rcti render_rect; | rcti render_rect; | ||||
| RE_GetViewPlane(render, &view_rect, &render_rect); | RE_GetViewPlane(render, &view_rect, &render_rect); | ||||
| if (BLI_rcti_is_empty(&render_rect)) { | if (BLI_rcti_is_empty(&render_rect)) { | ||||
| BLI_rcti_init(&render_rect, 0, size[0], 0, size[1]); | BLI_rcti_init(&render_rect, 0, size[0], 0, size[1]); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 64 Lines • ▼ Show 20 Lines | DST.draw_ctx = (DRWContextState){ | ||||
| .object_mode = OB_MODE_OBJECT, | .object_mode = OB_MODE_OBJECT, | ||||
| }; | }; | ||||
| drw_context_state_init(); | drw_context_state_init(); | ||||
| DST.viewport = GPU_viewport_create(); | DST.viewport = GPU_viewport_create(); | ||||
| const int size[2] = {engine->resolution_x, engine->resolution_y}; | const int size[2] = {engine->resolution_x, engine->resolution_y}; | ||||
| GPU_viewport_size_set(DST.viewport, size); | GPU_viewport_size_set(DST.viewport, size); | ||||
| drw_viewport_var_init(); | drw_viewport_var_init(false); | ||||
| ViewportEngineData *data = drw_viewport_engine_data_ensure(draw_engine_type); | ViewportEngineData *data = drw_viewport_engine_data_ensure(draw_engine_type); | ||||
| /* set default viewport */ | /* set default viewport */ | ||||
| glViewport(0, 0, size[0], size[1]); | glViewport(0, 0, size[0], size[1]); | ||||
| /* Main rendering. */ | /* Main rendering. */ | ||||
| rctf view_rect; | rctf view_rect; | ||||
| ▲ Show 20 Lines • Show All 109 Lines • ▼ Show 20 Lines | DST.draw_ctx = (DRWContextState){ | ||||
| .object_mode = OB_MODE_OBJECT, | .object_mode = OB_MODE_OBJECT, | ||||
| }; | }; | ||||
| drw_context_state_init(); | drw_context_state_init(); | ||||
| DST.viewport = GPU_viewport_create(); | DST.viewport = GPU_viewport_create(); | ||||
| const int size[2] = {1, 1}; | const int size[2] = {1, 1}; | ||||
| GPU_viewport_size_set(DST.viewport, size); | GPU_viewport_size_set(DST.viewport, size); | ||||
| drw_viewport_var_init(); | drw_viewport_var_init(false); | ||||
| DRW_hair_init(); | DRW_hair_init(); | ||||
| ViewportEngineData *data = drw_viewport_engine_data_ensure(draw_engine_type); | ViewportEngineData *data = drw_viewport_engine_data_ensure(draw_engine_type); | ||||
| /* Execute the callback */ | /* Execute the callback */ | ||||
| callback(data, user_data); | callback(data, user_data); | ||||
| DST.buffer_finish_called = false; | DST.buffer_finish_called = false; | ||||
| ▲ Show 20 Lines • Show All 166 Lines • ▼ Show 20 Lines | DST.draw_ctx = (DRWContextState){ | ||||
| .v3d = v3d, | .v3d = v3d, | ||||
| .scene = scene, | .scene = scene, | ||||
| .view_layer = view_layer, | .view_layer = view_layer, | ||||
| .obact = obact, | .obact = obact, | ||||
| .engine_type = engine_type, | .engine_type = engine_type, | ||||
| .depsgraph = depsgraph, | .depsgraph = depsgraph, | ||||
| }; | }; | ||||
| drw_context_state_init(); | drw_context_state_init(); | ||||
| drw_viewport_var_init(); | drw_viewport_var_init(false); | ||||
| /* Update ubos */ | /* Update ubos */ | ||||
| DRW_globals_update(); | DRW_globals_update(); | ||||
| /* Init engines */ | /* Init engines */ | ||||
| drw_engines_init(); | drw_engines_init(); | ||||
| DRW_hair_init(); | DRW_hair_init(); | ||||
| ▲ Show 20 Lines • Show All 111 Lines • ▼ Show 20 Lines | static void drw_draw_depth_loop_imp(void) | ||||
| /* Setup framebuffer */ | /* Setup framebuffer */ | ||||
| DefaultFramebufferList *fbl = (DefaultFramebufferList *)GPU_viewport_framebuffer_list_get( | DefaultFramebufferList *fbl = (DefaultFramebufferList *)GPU_viewport_framebuffer_list_get( | ||||
| DST.viewport); | DST.viewport); | ||||
| GPU_framebuffer_bind(fbl->depth_only_fb); | GPU_framebuffer_bind(fbl->depth_only_fb); | ||||
| GPU_framebuffer_clear_depth(fbl->depth_only_fb, 1.0f); | GPU_framebuffer_clear_depth(fbl->depth_only_fb, 1.0f); | ||||
| /* Setup viewport */ | /* Setup viewport */ | ||||
| drw_context_state_init(); | drw_context_state_init(); | ||||
| drw_viewport_var_init(); | drw_viewport_var_init(false); | ||||
| /* Update ubos */ | /* Update ubos */ | ||||
| DRW_globals_update(); | DRW_globals_update(); | ||||
| /* Init engines */ | /* Init engines */ | ||||
| drw_engines_init(); | drw_engines_init(); | ||||
| DRW_hair_init(); | DRW_hair_init(); | ||||
| ▲ Show 20 Lines • Show All 616 Lines • Show Last 20 Lines | |||||