Blender  V2.93
draw_manager.c
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * Copyright 2016, Blender Foundation.
17  */
18 
23 #include <stdio.h>
24 
25 #include "BLI_alloca.h"
26 #include "BLI_listbase.h"
27 #include "BLI_memblock.h"
28 #include "BLI_rect.h"
29 #include "BLI_string.h"
30 #include "BLI_task.h"
31 #include "BLI_threads.h"
32 
33 #include "BLF_api.h"
34 
35 #include "BKE_colortools.h"
36 #include "BKE_context.h"
37 #include "BKE_curve.h"
38 #include "BKE_duplilist.h"
39 #include "BKE_editmesh.h"
40 #include "BKE_global.h"
41 #include "BKE_gpencil.h"
42 #include "BKE_hair.h"
43 #include "BKE_lattice.h"
44 #include "BKE_main.h"
45 #include "BKE_mball.h"
46 #include "BKE_mesh.h"
47 #include "BKE_modifier.h"
48 #include "BKE_object.h"
49 #include "BKE_paint.h"
50 #include "BKE_particle.h"
51 #include "BKE_pbvh.h"
52 #include "BKE_pointcache.h"
53 #include "BKE_pointcloud.h"
54 #include "BKE_volume.h"
55 
56 #include "DNA_camera_types.h"
57 #include "DNA_mesh_types.h"
58 #include "DNA_meshdata_types.h"
59 #include "DNA_world_types.h"
60 #include "draw_manager.h"
61 
62 #include "ED_gpencil.h"
63 #include "ED_screen.h"
64 #include "ED_space_api.h"
65 #include "ED_view3d.h"
66 
67 #include "GPU_capabilities.h"
68 #include "GPU_framebuffer.h"
69 #include "GPU_immediate.h"
70 #include "GPU_matrix.h"
71 #include "GPU_state.h"
72 #include "GPU_uniform_buffer.h"
73 #include "GPU_viewport.h"
74 
75 #include "IMB_colormanagement.h"
76 
77 #include "RE_engine.h"
78 #include "RE_pipeline.h"
79 
80 #include "UI_resources.h"
81 #include "UI_view2d.h"
82 
83 #include "WM_api.h"
84 #include "wm_window.h"
85 
86 #include "draw_color_management.h"
87 #include "draw_manager_profiling.h"
88 #include "draw_manager_testing.h"
89 #include "draw_manager_text.h"
90 
91 /* only for callbacks */
92 #include "draw_cache_impl.h"
93 
102 
103 #include "GPU_context.h"
104 
105 #include "DEG_depsgraph.h"
106 #include "DEG_depsgraph_query.h"
107 
108 #include "DRW_select_buffer.h"
109 
112 
114 
116 {
117  memset(dst, 0x0, offsetof(DRWManager, gl_context));
118 }
119 
120 /* This function is used to reset draw manager to a state
121  * where we don't re-use data by accident across different
122  * draw calls.
123  */
124 #ifdef DEBUG
125 static void drw_state_ensure_not_reused(DRWManager *dst)
126 {
127  memset(dst, 0xff, offsetof(DRWManager, gl_context));
128 }
129 #endif
130 
131 static bool drw_draw_show_annotation(void)
132 {
133  if (DST.draw_ctx.space_data == NULL) {
134  View3D *v3d = DST.draw_ctx.v3d;
135  return (v3d && ((v3d->flag2 & V3D_SHOW_ANNOTATION) != 0) &&
136  ((v3d->flag2 & V3D_HIDE_OVERLAYS) == 0));
137  }
138 
139  switch (DST.draw_ctx.space_data->spacetype) {
140  case SPACE_IMAGE: {
142  return (sima->flag & SI_SHOW_GPENCIL) != 0;
143  }
144  case SPACE_NODE:
145  /* Don't draw the annotation for the node editor. Annotations are handled by space_image as
146  * the draw manager is only used to draw the background. */
147  return false;
148  default:
149  BLI_assert("");
150  return false;
151  }
152 }
153 
154 /* -------------------------------------------------------------------- */
158 static void drw_task_graph_init(void)
159 {
163 }
164 
165 static void drw_task_graph_deinit(void)
166 {
168 
172 
174  DST.task_graph = NULL;
175 }
176 
179 /* -------------------------------------------------------------------- */
184 {
186 
187  if (ob->type == OB_MESH) {
188  if ((ob == DST.draw_ctx.object_edit) || DRW_object_is_in_edit_mode(ob)) {
189  View3D *v3d = DST.draw_ctx.v3d;
190  if (v3d && v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_OCCLUDE_WIRE) {
191  return false;
192  }
193  }
194  }
195 
196  return true;
197 }
198 
199 /* Does `ob` needs to be rendered in edit mode.
200  *
201  * When using duplicate linked meshes, objects that are not in edit-mode will be drawn as
202  * it is in edit mode, when another object with the same mesh is in edit mode.
203  * This will not be the case when one of the objects are influenced by modifiers. */
205 {
206  if (BKE_object_is_in_editmode(ob)) {
207  if (ob->type == OB_MESH) {
208  if ((ob->mode & OB_MODE_EDIT) == 0) {
209  Mesh *me = (Mesh *)ob->data;
210  BMEditMesh *embm = me->edit_mesh;
211  /* Sanity check when rendering in multiple windows. */
212  if (embm && embm->mesh_eval_final == NULL) {
213  return false;
214  }
215  /* Do not draw ob with edit overlay when edit data is present and is modified. */
216  if (embm && embm->mesh_eval_cage && (embm->mesh_eval_cage != embm->mesh_eval_final)) {
217  return false;
218  }
219  /* Check if the object that we are drawing is modified. */
220  if (!DEG_is_original_id(&me->id)) {
221  return false;
222  }
223  return true;
224  }
225  }
226  return true;
227  }
228  return false;
229 }
230 
236 {
238  return BKE_object_visibility(ob, mode);
239 }
240 
242 {
243  if (ob->type == OB_MESH) {
244  const Mesh *me = ob->data;
245  if (me->mpoly && me->mpoly[0].flag & ME_SMOOTH) {
246  return false;
247  }
248  }
249  return true;
250 }
251 
252 bool DRW_object_use_hide_faces(const struct Object *ob)
253 {
254  if (ob->type == OB_MESH) {
255  const Mesh *me = ob->data;
256 
257  switch (ob->mode) {
258  case OB_MODE_SCULPT:
259  return true;
261  return (me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0;
265  }
266  }
267 
268  return false;
269 }
270 
272 {
273  const bool for_render = DRW_state_is_image_render();
274  /* NOTE: psys_check_enabled is using object and particle system for only
275  * reading, but is using some other functions which are more generic and
276  * which are hard to make const-pointer. */
277  if (!psys_check_enabled((Object *)object, (ParticleSystem *)psys, for_render)) {
278  return false;
279  }
280  const DRWContextState *draw_ctx = DRW_context_state_get();
281  const Scene *scene = draw_ctx->scene;
282  if (object == draw_ctx->object_edit) {
283  return false;
284  }
285  const ParticleSettings *part = psys->part;
287  if (object->mode == OB_MODE_PARTICLE_EDIT) {
288  if (psys_in_edit_mode(draw_ctx->depsgraph, psys)) {
289  if ((pset->flag & PE_DRAW_PART) == 0) {
290  return false;
291  }
292  if ((part->childtype == 0) &&
293  (psys->flag & PSYS_HAIR_DYNAMICS && psys->pointcache->flag & PTCACHE_BAKED) == 0) {
294  return false;
295  }
296  }
297  }
298  return true;
299 }
300 
302 {
303  return DST.dupli_parent;
304 }
305 
307 {
308  return DST.dupli_source;
309 }
310 
313 /* -------------------------------------------------------------------- */
317 /* TODO(fclem): This should be a render engine callback to determine if we need CM or not. */
319 {
321  View3D *v3d = DST.draw_ctx.v3d;
322 
323  ColorManagedDisplaySettings *display_settings = &scene->display_settings;
324  ColorManagedViewSettings view_settings;
325  float dither = 0.0f;
326 
327  bool use_render_settings = false;
328  bool use_view_transform = false;
329 
330  if (v3d) {
331  bool use_workbench = BKE_scene_uses_blender_workbench(scene);
332 
333  bool use_scene_lights = (!v3d ||
334  ((v3d->shading.type == OB_MATERIAL) &&
336  ((v3d->shading.type == OB_RENDER) &&
338  bool use_scene_world = (!v3d ||
339  ((v3d->shading.type == OB_MATERIAL) &&
341  ((v3d->shading.type == OB_RENDER) &&
343  use_view_transform = v3d && (v3d->shading.type >= OB_MATERIAL);
344  use_render_settings = v3d && ((use_workbench && use_view_transform) || use_scene_lights ||
345  use_scene_world);
346  }
349  Image *image = sima->image;
350 
351  /* Use inverse logic as there isn't a setting for `Color And Alpha`. */
352  const eSpaceImage_Flag display_channels_mode = sima->flag;
353  const bool display_color_channel = (display_channels_mode & (SI_SHOW_ALPHA | SI_SHOW_ZBUF)) ==
354  0;
355  if (display_color_channel && image && (image->source != IMA_SRC_GENERATED) &&
356  ((image->flag & IMA_VIEW_AS_RENDER) != 0)) {
357  use_render_settings = true;
358  }
359  }
362  const eSpaceNode_Flag display_channels_mode = snode->flag;
363  const bool display_color_channel = (display_channels_mode & SNODE_SHOW_ALPHA) == 0;
364  if (display_color_channel) {
365  use_render_settings = true;
366  }
367  }
368  else {
369  use_render_settings = true;
370  use_view_transform = false;
371  }
372 
373  if (use_render_settings) {
374  /* Use full render settings, for renders with scene lighting. */
375  view_settings = scene->view_settings;
376  dither = scene->r.dither_intensity;
377  }
378  else if (use_view_transform) {
379  /* Use only view transform + look and nothing else for lookdev without
380  * scene lighting, as exposure depends on scene light intensity. */
381  BKE_color_managed_view_settings_init_render(&view_settings, display_settings, NULL);
383  STRNCPY(view_settings.look, scene->view_settings.look);
384  dither = scene->r.dither_intensity;
385  }
386  else {
387  /* For workbench use only default view transform in configuration,
388  * using no scene settings. */
389  BKE_color_managed_view_settings_init_render(&view_settings, display_settings, NULL);
390  }
391 
392  GPU_viewport_colorspace_set(DST.viewport, &view_settings, display_settings, dither);
393 }
394 
397 /* -------------------------------------------------------------------- */
401 void *drw_viewport_engine_data_ensure(void *engine_type)
402 {
403  void *data = GPU_viewport_engine_data_get(DST.viewport, engine_type);
404 
405  if (data == NULL) {
407  }
408  return data;
409 }
410 
412  const void *engine_type_v, int *r_fbl_len, int *r_txl_len, int *r_psl_len, int *r_stl_len)
413 {
414  const DrawEngineType *engine_type = engine_type_v;
415 
416  if (r_fbl_len) {
417  *r_fbl_len = engine_type->vedata_size->fbl_len;
418  }
419  if (r_txl_len) {
420  *r_txl_len = engine_type->vedata_size->txl_len;
421  }
422  if (r_psl_len) {
423  *r_psl_len = engine_type->vedata_size->psl_len;
424  }
425  if (r_stl_len) {
426  *r_stl_len = engine_type->vedata_size->stl_len;
427  }
428 }
429 
430 /* WARNING: only use for custom pipeline. 99% of the time, you don't want to use this. */
432 {
433  DST.size[0] = size[0];
434  DST.size[1] = size[1];
435  DST.inv_size[0] = 1.0f / size[0];
436  DST.inv_size[1] = 1.0f / size[1];
437 }
438 
439 const float *DRW_viewport_size_get(void)
440 {
441  return DST.size;
442 }
443 
445 {
446  return DST.inv_size;
447 }
448 
449 const float *DRW_viewport_screenvecs_get(void)
450 {
451  return &DST.screenvecs[0][0];
452 }
453 
454 const float *DRW_viewport_pixelsize_get(void)
455 {
456  return &DST.pixsize;
457 }
458 
459 static void drw_viewport_cache_resize(void)
460 {
461  /* Release the memiter before clearing the mempools that references them */
463 
464  if (DST.vmempool != NULL) {
465  /* Release Image textures. */
466  BLI_memblock_iter iter;
467  GPUTexture **tex;
469  while ((tex = BLI_memblock_iterstep(&iter))) {
471  }
472 
484 
486  }
487 
490 }
491 
492 /* Not a viewport variable, we could split this out. */
493 static void drw_context_state_init(void)
494 {
495  if (DST.draw_ctx.obact) {
497  }
498  else {
500  }
501 
502  /* Edit object. */
505  }
506  else {
508  }
509 
510  /* Pose object. */
513  }
516  }
517  else {
519  }
520 
524  }
525 }
526 
527 static void draw_unit_state_create(void)
528 {
532 
533  unit_m4(mats->model);
534  unit_m4(mats->modelinverse);
535 
536  copy_v3_fl(infos->orcotexfac[0], 0.0f);
537  copy_v3_fl(infos->orcotexfac[1], 1.0f);
538 
539  infos->ob_index = 0;
540  infos->ob_random = 0.0f;
541  infos->ob_flag = 1.0f;
542  copy_v3_fl(infos->ob_color, 1.0f);
543 
544  /* TODO(fclem): get rid of this. */
545  culling->bsphere.radius = -1.0f;
546  culling->user_data = NULL;
547 
549 }
550 
551 /* It also stores viewport variable to an immutable place: DST
552  * This is because a cache uniform only store reference
553  * to its value. And we don't want to invalidate the cache
554  * if this value change per viewport */
555 static void drw_viewport_var_init(void)
556 {
557  RegionView3D *rv3d = DST.draw_ctx.rv3d;
558  ARegion *region = DST.draw_ctx.region;
559 
560  /* Refresh DST.size */
561  if (DST.viewport) {
562  int size[2];
564  DST.size[0] = size[0];
565  DST.size[1] = size[1];
566  DST.inv_size[0] = 1.0f / size[0];
567  DST.inv_size[1] = 1.0f / size[1];
568 
570  DST.viewport);
572 
574 
575  if (DST.vmempool->commands == NULL) {
577  }
578  if (DST.vmempool->commands_small == NULL) {
580  }
581  if (DST.vmempool->callbuffers == NULL) {
583  }
584  if (DST.vmempool->obmats == NULL) {
585  uint chunk_len = sizeof(DRWObjectMatrix) * DRW_RESOURCE_CHUNK_LEN;
587  }
588  if (DST.vmempool->obinfos == NULL) {
589  uint chunk_len = sizeof(DRWObjectInfos) * DRW_RESOURCE_CHUNK_LEN;
591  }
592  if (DST.vmempool->cullstates == NULL) {
593  uint chunk_len = sizeof(DRWCullingState) * DRW_RESOURCE_CHUNK_LEN;
595  }
596  if (DST.vmempool->shgroups == NULL) {
598  }
599  if (DST.vmempool->uniforms == NULL) {
601  }
602  if (DST.vmempool->views == NULL) {
604  }
605  if (DST.vmempool->passes == NULL) {
606  uint chunk_len = sizeof(DRWPass) * DRW_RESOURCE_CHUNK_LEN;
607  DST.vmempool->passes = BLI_memblock_create_ex(sizeof(DRWPass), chunk_len);
608  }
609  if (DST.vmempool->images == NULL) {
611  }
612  if (DST.vmempool->obattrs_ubo_pool == NULL) {
614  }
615 
616  DST.resource_handle = 0;
617  DST.pass_handle = 0;
618 
620 
623  }
624  else {
625  DST.size[0] = 0;
626  DST.size[1] = 0;
627 
628  DST.inv_size[0] = 0;
629  DST.inv_size[1] = 0;
630 
632  DST.vmempool = NULL;
633  }
634 
635  DST.primary_view_ct = 0;
636 
637  if (rv3d != NULL) {
638  normalize_v3_v3(DST.screenvecs[0], rv3d->viewinv[0]);
639  normalize_v3_v3(DST.screenvecs[1], rv3d->viewinv[1]);
640 
641  DST.pixsize = rv3d->pixsize;
644 
646  int plane_len = (RV3D_LOCK_FLAGS(rv3d) & RV3D_BOXCLIP) ? 4 : 6;
647  DRW_view_clip_planes_set(DST.view_default, rv3d->clip, plane_len);
648  }
649 
652  }
653  else if (region) {
654  View2D *v2d = &region->v2d;
655  float viewmat[4][4];
656  float winmat[4][4];
657 
658  rctf region_space = {0.0f, 1.0f, 0.0f, 1.0f};
659  BLI_rctf_transform_calc_m4_pivot_min(&v2d->cur, &region_space, viewmat);
660 
661  unit_m4(winmat);
662  winmat[0][0] = 2.0f;
663  winmat[1][1] = 2.0f;
664  winmat[3][0] = -1.0f;
665  winmat[3][1] = -1.0f;
666 
667  DST.view_default = DRW_view_create(viewmat, winmat, NULL, NULL, NULL);
670  }
671  else {
672  zero_v3(DST.screenvecs[0]);
673  zero_v3(DST.screenvecs[1]);
674 
675  DST.pixsize = 1.0f;
677  DST.view_active = NULL;
679  }
680 
681  /* fclem: Is this still needed ? */
682  if (DST.draw_ctx.object_edit && rv3d) {
684  }
685 
686  if (G_draw.view_ubo == NULL) {
687  G_draw.view_ubo = GPU_uniformbuf_create_ex(sizeof(DRWViewUboStorage), NULL, "G_draw.view_ubo");
688  }
689 
690  if (DST.draw_list == NULL) {
692  }
693 
694  memset(DST.object_instance_data, 0x0, sizeof(DST.object_instance_data));
695 }
696 
698 {
700 }
701 
703 {
705 }
706 
708 {
710 }
711 
714 /* -------------------------------------------------------------------- */
718 static void drw_duplidata_load(DupliObject *dupli)
719 {
720  if (dupli == NULL) {
721  return;
722  }
723 
724  if (DST.dupli_origin != dupli->ob) {
725  DST.dupli_origin = dupli->ob;
726  }
727  else {
728  /* Same data as previous iter. No need to poll ghash for this. */
729  return;
730  }
731 
732  if (DST.dupli_ghash == NULL) {
733  DST.dupli_ghash = BLI_ghash_ptr_new(__func__);
734  }
735 
736  void **value;
738  *value = MEM_callocN(sizeof(void *) * DST.enabled_engine_count, __func__);
739 
740  /* TODO: Meh a bit out of place but this is nice as it is
741  * only done once per "original" object. */
743  }
744  DST.dupli_datas = *(void ***)value;
745 }
746 
747 static void duplidata_value_free(void *val)
748 {
749  void **dupli_datas = val;
750  for (int i = 0; i < DST.enabled_engine_count; i++) {
751  MEM_SAFE_FREE(dupli_datas[i]);
752  }
753  MEM_freeN(val);
754 }
755 
756 static void drw_duplidata_free(void)
757 {
758  if (DST.dupli_ghash != NULL) {
760  (void (*)(void *key))drw_batch_cache_generate_requested,
762  DST.dupli_ghash = NULL;
763  }
764 }
765 
766 /* Return NULL if not a dupli or a pointer of pointer to the engine data */
767 void **DRW_duplidata_get(void *vedata)
768 {
769  if (DST.dupli_source == NULL) {
770  return NULL;
771  }
772  /* XXX Search engine index by using vedata array */
773  for (int i = 0; i < DST.enabled_engine_count; i++) {
774  if (DST.vedata_array[i] == vedata) {
775  return &DST.dupli_datas[i];
776  }
777  }
778  return NULL;
779 }
780 
783 /* -------------------------------------------------------------------- */
788 {
790  if (sled->engine_type == engine_type) {
791  return sled->storage;
792  }
793  }
794  return NULL;
795 }
796 
798  DrawEngineType *engine_type,
799  void (*callback)(void *storage))
800 {
801  ViewLayerEngineData *sled;
802 
803  for (sled = view_layer->drawdata.first; sled; sled = sled->next) {
804  if (sled->engine_type == engine_type) {
805  return &sled->storage;
806  }
807  }
808 
809  sled = MEM_callocN(sizeof(ViewLayerEngineData), "ViewLayerEngineData");
810  sled->engine_type = engine_type;
811  sled->free = callback;
812  BLI_addtail(&view_layer->drawdata, sled);
813 
814  return &sled->storage;
815 }
816 
818  void (*callback)(void *storage))
819 {
821 }
822 
825 /* -------------------------------------------------------------------- */
829 /* Used for DRW_drawdata_from_id()
830  * All ID-data-blocks which have their own 'local' DrawData
831  * should have the same arrangement in their structs.
832  */
833 typedef struct IdDdtTemplate {
835  struct AnimData *adt;
838 
839 /* Check if ID can have AnimData */
840 static bool id_type_can_have_drawdata(const short id_type)
841 {
842  /* Only some ID-blocks have this info for now */
843  /* TODO: finish adding this for the other blocktypes */
844  switch (id_type) {
845  /* has DrawData */
846  case ID_OB:
847  case ID_WO:
848  return true;
849 
850  /* no DrawData */
851  default:
852  return false;
853  }
854 }
855 
856 static bool id_can_have_drawdata(const ID *id)
857 {
858  /* sanity check */
859  if (id == NULL) {
860  return false;
861  }
862 
864 }
865 
866 /* Get DrawData from the given ID-block. In order for this to work, we assume that
867  * the DrawData pointer is stored in the struct in the same fashion as in IdDdtTemplate.
868  */
870 {
871  /* only some ID-blocks have this info for now, so we cast the
872  * types that do to be of type IdDdtTemplate, and extract the
873  * DrawData that way
874  */
875  if (id_can_have_drawdata(id)) {
876  IdDdtTemplate *idt = (IdDdtTemplate *)id;
877  return &idt->drawdata;
878  }
879 
880  return NULL;
881 }
882 
884 {
885  DrawDataList *drawdata = DRW_drawdatalist_from_id(id);
886 
887  if (drawdata == NULL) {
888  return NULL;
889  }
890 
891  LISTBASE_FOREACH (DrawData *, dd, drawdata) {
892  if (dd->engine_type == engine_type) {
893  return dd;
894  }
895  }
896  return NULL;
897 }
898 
900  DrawEngineType *engine_type,
901  size_t size,
902  DrawDataInitCb init_cb,
903  DrawDataFreeCb free_cb)
904 {
905  BLI_assert(size >= sizeof(DrawData));
907  /* Try to re-use existing data. */
908  DrawData *dd = DRW_drawdata_get(id, engine_type);
909  if (dd != NULL) {
910  return dd;
911  }
912 
913  DrawDataList *drawdata = DRW_drawdatalist_from_id(id);
914 
915  /* Allocate new data. */
916  if ((GS(id->name) == ID_OB) && (((Object *)id)->base_flag & BASE_FROM_DUPLI) != 0) {
917  /* NOTE: data is not persistent in this case. It is reset each redraw. */
918  BLI_assert(free_cb == NULL); /* No callback allowed. */
919  /* Round to sizeof(float) for DRW_instance_data_request(). */
920  const size_t t = sizeof(float) - 1;
921  size = (size + t) & ~t;
922  size_t fsize = size / sizeof(float);
924  if (DST.object_instance_data[fsize] == NULL) {
926  }
928  memset(dd, 0, size);
929  }
930  else {
931  dd = MEM_callocN(size, "DrawData");
932  }
933  dd->engine_type = engine_type;
934  dd->free = free_cb;
935  /* Perform user-side initialization, if needed. */
936  if (init_cb != NULL) {
937  init_cb(dd);
938  }
939  /* Register in the list. */
940  BLI_addtail((ListBase *)drawdata, dd);
941  return dd;
942 }
943 
945 {
946  DrawDataList *drawdata = DRW_drawdatalist_from_id(id);
947 
948  if (drawdata == NULL) {
949  return;
950  }
951 
952  LISTBASE_FOREACH (DrawData *, dd, drawdata) {
953  if (dd->free != NULL) {
954  dd->free(dd);
955  }
956  }
957 
958  BLI_freelistN((ListBase *)drawdata);
959 }
960 
961 /* Unlink (but don't free) the drawdata from the DrawDataList if the ID is an OB from dupli. */
963 {
964  if ((GS(id->name) == ID_OB) && (((Object *)id)->base_flag & BASE_FROM_DUPLI) != 0) {
965  DrawDataList *drawdata = DRW_drawdatalist_from_id(id);
966 
967  if (drawdata == NULL) {
968  return;
969  }
970 
971  BLI_listbase_clear((ListBase *)drawdata);
972  }
973 }
974 
977 /* -------------------------------------------------------------------- */
982 {
983  Scene *scene;
984  ViewLayer *view_layer;
985  static int lasttime = 0;
986  int ctime = (int)PIL_check_seconds_timer();
987 
988  if (U.vbotimeout == 0 || (ctime - lasttime) < U.vbocollectrate || ctime == lasttime) {
989  return;
990  }
991 
992  lasttime = ctime;
993 
994  for (scene = bmain->scenes.first; scene; scene = scene->id.next) {
995  for (view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) {
997  if (depsgraph == NULL) {
998  continue;
999  }
1000 
1001  /* TODO(fclem): This is not optimal since it iter over all dupli instances.
1002  * In this case only the source object should be tagged. */
1004  DRW_batch_cache_free_old(ob, ctime);
1005  }
1007  }
1008  }
1009 }
1010 
1013 /* -------------------------------------------------------------------- */
1017 static void drw_engines_init(void)
1018 {
1020  DrawEngineType *engine = link->data;
1022  PROFILE_START(stime);
1023 
1024  if (engine->engine_init) {
1025  engine->engine_init(data);
1026  }
1027 
1028  PROFILE_END_UPDATE(data->init_time, stime);
1029  }
1030 }
1031 
1032 static void drw_engines_cache_init(void)
1033 {
1035  DST.vedata_array = MEM_mallocN(sizeof(void *) * DST.enabled_engine_count, __func__);
1036 
1037  int i = 0;
1038  for (LinkData *link = DST.enabled_engines.first; link; link = link->next, i++) {
1039  DrawEngineType *engine = link->data;
1041  DST.vedata_array[i] = data;
1042 
1043  if (data->text_draw_cache) {
1044  DRW_text_cache_destroy(data->text_draw_cache);
1045  data->text_draw_cache = NULL;
1046  }
1047  if (DST.text_store_p == NULL) {
1048  DST.text_store_p = &data->text_draw_cache;
1049  }
1050 
1051  if (engine->cache_init) {
1052  engine->cache_init(data);
1053  }
1054  }
1055 }
1056 
1058 {
1059  if (scene->world == NULL) {
1060  return;
1061  }
1062 
1064  DrawEngineType *engine = link->data;
1066 
1067  if (engine->id_update) {
1068  engine->id_update(data, &scene->world->id);
1069  }
1070  }
1071 }
1072 
1074 {
1075  DST.ob_handle = 0;
1076 
1077  /* HACK: DrawData is copied by COW from the duplicated object.
1078  * This is valid for IDs that cannot be instantiated but this
1079  * is not what we want in this case so we clear the pointer
1080  * ourselves here. */
1082 
1083  /* Validation for dupli objects happen elsewhere. */
1084  if (!DST.dupli_source) {
1086  }
1087 
1088  int i = 0;
1089  for (LinkData *link = DST.enabled_engines.first; link; link = link->next, i++) {
1090  DrawEngineType *engine = link->data;
1092 
1093  if (engine->id_update) {
1094  engine->id_update(data, &ob->id);
1095  }
1096 
1097  if (engine->cache_populate) {
1098  engine->cache_populate(data, ob);
1099  }
1100  }
1101 
1102  /* TODO: in the future it would be nice to generate once for all viewports.
1103  * But we need threaded DRW manager first. */
1104  if (!DST.dupli_source) {
1106  }
1107 
1108  /* ... and clearing it here too because this draw data is
1109  * from a mempool and must not be free individually by depsgraph. */
1111 }
1112 
1113 static void drw_engines_cache_finish(void)
1114 {
1115  int i = 0;
1116  for (LinkData *link = DST.enabled_engines.first; link; link = link->next, i++) {
1117  DrawEngineType *engine = link->data;
1119 
1120  if (engine->cache_finish) {
1121  engine->cache_finish(data);
1122  }
1123  }
1125 }
1126 
1127 static void drw_engines_draw_scene(void)
1128 {
1130  DrawEngineType *engine = link->data;
1132  PROFILE_START(stime);
1133 
1134  if (engine->draw_scene) {
1135  DRW_stats_group_start(engine->idname);
1136  engine->draw_scene(data);
1137  /* Restore for next engine */
1138  if (DRW_state_is_fbo()) {
1140  }
1142  }
1143 
1144  PROFILE_END_UPDATE(data->render_time, stime);
1145  }
1146  /* Reset state after drawing */
1147  DRW_state_reset();
1148 }
1149 
1150 static void drw_engines_draw_text(void)
1151 {
1153  DrawEngineType *engine = link->data;
1155  PROFILE_START(stime);
1156 
1157  if (data->text_draw_cache) {
1158  DRW_text_cache_draw(data->text_draw_cache, DST.draw_ctx.region, DST.draw_ctx.v3d);
1159  }
1160 
1161  PROFILE_END_UPDATE(data->render_time, stime);
1162  }
1163 }
1164 
1165 /* Draw render engine info. */
1166 void DRW_draw_region_engine_info(int xoffset, int *yoffset, int line_height)
1167 {
1169  DrawEngineType *engine = link->data;
1171 
1172  if (data->info[0] != '\0') {
1173  char *chr_current = data->info;
1174  char *chr_start = chr_current;
1175  int line_len = 0;
1176 
1177  const int font_id = BLF_default();
1178  UI_FontThemeColor(font_id, TH_TEXT_HI);
1179 
1180  BLF_enable(font_id, BLF_SHADOW);
1181  BLF_shadow(font_id, 5, (const float[4]){0.0f, 0.0f, 0.0f, 1.0f});
1182  BLF_shadow_offset(font_id, 1, -1);
1183 
1184  while (*chr_current++ != '\0') {
1185  line_len++;
1186  if (*chr_current == '\n') {
1187  char info[GPU_INFO_SIZE];
1188  BLI_strncpy(info, chr_start, line_len + 1);
1189  *yoffset -= line_height;
1190  BLF_draw_default(xoffset, *yoffset, 0.0f, info, sizeof(info));
1191 
1192  /* Re-start counting. */
1193  chr_start = chr_current + 1;
1194  line_len = -1;
1195  }
1196  }
1197 
1198  char info[GPU_INFO_SIZE];
1199  BLI_strncpy(info, chr_start, line_len + 1);
1200  *yoffset -= line_height;
1201  BLF_draw_default(xoffset, *yoffset, 0.0f, info, sizeof(info));
1202 
1203  BLF_disable(font_id, BLF_SHADOW);
1204  }
1205  }
1206 }
1207 
1208 static void use_drw_engine(DrawEngineType *engine)
1209 {
1210  LinkData *ld = MEM_callocN(sizeof(LinkData), "enabled engine link data");
1211  ld->data = engine;
1213 }
1214 
1215 /* Gather all draw engines needed and store them in DST.enabled_engines
1216  * That also define the rendering order of engines */
1217 static void drw_engines_enable_from_engine(const RenderEngineType *engine_type, eDrawType drawtype)
1218 {
1219  switch (drawtype) {
1220  case OB_WIRE:
1221  case OB_SOLID:
1223  break;
1224  case OB_MATERIAL:
1225  case OB_RENDER:
1226  default:
1227  if (engine_type->draw_engine != NULL) {
1228  use_drw_engine(engine_type->draw_engine);
1229  }
1230  else if ((engine_type->flag & RE_INTERNAL) == 0) {
1232  }
1233  break;
1234  }
1235 }
1236 
1238 {
1240 }
1244 static void drw_engines_enable_basic(void)
1245 {
1247 }
1248 
1250 {
1251  SpaceLink *space_data = DST.draw_ctx.space_data;
1252  if (!space_data) {
1253  return;
1254  }
1255 
1256  if (space_data->spacetype == SPACE_IMAGE) {
1259  }
1260  else if (space_data->spacetype == SPACE_NODE) {
1261  /* Only enable when drawing the space image backdrop. */
1262  SpaceNode *snode = (SpaceNode *)space_data;
1263  if ((snode->flag & SNODE_BACKDRAW) != 0) {
1266  }
1267  }
1268 }
1269 
1270 static void drw_engines_enable(ViewLayer *UNUSED(view_layer),
1271  RenderEngineType *engine_type,
1272  bool gpencil_engine_needed)
1273 {
1274  View3D *v3d = DST.draw_ctx.v3d;
1275  const eDrawType drawtype = v3d->shading.type;
1276  const bool use_xray = XRAY_ENABLED(v3d);
1277 
1278  drw_engines_enable_from_engine(engine_type, drawtype);
1279  if (gpencil_engine_needed && ((drawtype >= OB_SOLID) || !use_xray)) {
1281  }
1283 }
1284 
1285 static void drw_engines_disable(void)
1286 {
1288 }
1289 
1290 static void drw_engines_data_validate(void)
1291 {
1292  int enabled_engines = BLI_listbase_count(&DST.enabled_engines);
1293  void **engine_handle_array = BLI_array_alloca(engine_handle_array, enabled_engines + 1);
1294  int i = 0;
1295 
1297  DrawEngineType *engine = link->data;
1298  engine_handle_array[i++] = engine;
1299  }
1300  engine_handle_array[i] = NULL;
1301 
1302  GPU_viewport_engines_data_validate(DST.viewport, engine_handle_array);
1303 }
1304 
1305 /* Fast check to see if gpencil drawing engine is needed.
1306  * For slow exact check use `DRW_render_check_grease_pencil` */
1308 {
1309  const bool exclude_gpencil_rendering = v3d ? (v3d->object_type_exclude_viewport &
1310  (1 << OB_GPENCIL)) != 0 :
1311  false;
1312  return (!exclude_gpencil_rendering) && DEG_id_type_any_exists(depsgraph, ID_GD);
1313 }
1314 
1315 /* -------------------------------------------------------------------- */
1320 {
1321  RenderEngineType *engine_type = update_ctx->engine_type;
1322  ARegion *region = update_ctx->region;
1323  View3D *v3d = update_ctx->v3d;
1324  RegionView3D *rv3d = region->regiondata;
1325  Depsgraph *depsgraph = update_ctx->depsgraph;
1326  Scene *scene = update_ctx->scene;
1327  ViewLayer *view_layer = update_ctx->view_layer;
1328 
1329  const bool gpencil_engine_needed = drw_gpencil_engine_needed(depsgraph, v3d);
1330 
1331  /* Separate update for each stereo view. */
1332  for (int view = 0; view < 2; view++) {
1333  GPUViewport *viewport = WM_draw_region_get_viewport(region);
1334  if (!viewport) {
1335  continue;
1336  }
1337 
1338  /* XXX Really nasty locking. But else this could
1339  * be executed by the material previews thread
1340  * while rendering a viewport. */
1342 
1343  /* Reset before using it. */
1345 
1346  DST.viewport = viewport;
1349  .region = region,
1350  .rv3d = rv3d,
1351  .v3d = v3d,
1352  .scene = scene,
1353  .view_layer = view_layer,
1354  .obact = OBACT(view_layer),
1355  .engine_type = engine_type,
1356  .depsgraph = depsgraph,
1357  .object_mode = OB_MODE_OBJECT,
1358  };
1359 
1360  drw_engines_enable(view_layer, engine_type, gpencil_engine_needed);
1362 
1364  DrawEngineType *draw_engine = link->data;
1366 
1367  if (draw_engine->view_update) {
1368  draw_engine->view_update(data);
1369  }
1370  }
1371 
1372  DST.viewport = NULL;
1373 
1375 
1377  }
1378 }
1379 
1382 /* -------------------------------------------------------------------- */
1387 {
1388  RegionView3D *rv3d = DST.draw_ctx.rv3d;
1389 
1391  GPU_matrix_set(rv3d->viewmat);
1392 
1393  if (DST.draw_ctx.evil_C) {
1395  /* Callback can be nasty and do whatever they want with the state.
1396  * Don't trust them! */
1397  DRW_state_reset();
1398  }
1399 }
1400 
1402 {
1403  RegionView3D *rv3d = DST.draw_ctx.rv3d;
1404  ARegion *region = DST.draw_ctx.region;
1405  View3D *v3d = DST.draw_ctx.v3d;
1407 
1408  const bool do_annotations = drw_draw_show_annotation();
1409 
1410  if (DST.draw_ctx.evil_C) {
1412 
1413  DRW_state_reset();
1414 
1416 
1418  GPU_matrix_set(rv3d->viewmat);
1419 
1420  /* annotations - temporary drawing buffer (3d space) */
1421  /* XXX: Or should we use a proper draw/overlay engine for this case? */
1422  if (do_annotations) {
1424  /* XXX: as scene->gpd is not copied for COW yet */
1427  }
1428 
1429  drw_debug_draw();
1430 
1432  /* Apply state for callbacks. */
1433  GPU_apply_state();
1434 
1436 
1437  /* Callback can be nasty and do whatever they want with the state.
1438  * Don't trust them! */
1439  DRW_state_reset();
1440 
1441  /* needed so gizmo isn't obscured */
1442  if ((v3d->gizmo_flag & V3D_GIZMO_HIDE) == 0) {
1445  }
1446 
1449 
1451 
1452  /* annotations - temporary drawing buffer (screenspace) */
1453  /* XXX: Or should we use a proper draw/overlay engine for this case? */
1454  if (((v3d->flag2 & V3D_HIDE_OVERLAYS) == 0) && (do_annotations)) {
1456  /* XXX: as scene->gpd is not copied for COW yet */
1458  }
1459 
1460  if ((v3d->gizmo_flag & V3D_GIZMO_HIDE) == 0) {
1461  /* Draw 2D after region info so we can draw on top of the camera passepartout overlay.
1462  * 'DRW_draw_region_info' sets the projection in pixel-space. */
1465  }
1466 
1467  if (G.debug_value > 20 && G.debug_value < 30) {
1469  /* local coordinate visible rect inside region, to accommodate overlapping ui */
1471  DRW_stats_draw(rect);
1472  }
1473 
1475  }
1476 }
1477 
1479 {
1481  if (*DST.text_store_p == NULL) {
1483  }
1484  return *DST.text_store_p;
1485 }
1486 
1489 /* -------------------------------------------------------------------- */
1493 /* Everything starts here.
1494  * This function takes care of calling all cache and rendering functions
1495  * for each relevant engine / mode engine. */
1497 {
1498  View3D *v3d = CTX_wm_view3d(C);
1499  if (v3d) {
1501  ARegion *region = CTX_wm_region(C);
1504  GPUViewport *viewport = WM_draw_region_get_bound_viewport(region);
1505 
1506  /* Reset before using it. */
1508  DST.options.draw_text = ((v3d->flag2 & V3D_HIDE_OVERLAYS) == 0 &&
1509  (v3d->overlay.flag & V3D_OVERLAY_HIDE_TEXT) != 0);
1511  (v3d->shading.type != OB_RENDER);
1513  DRW_draw_render_loop_ex(depsgraph, engine_type, region, v3d, viewport, C);
1514  }
1515  else {
1517  ARegion *region = CTX_wm_region(C);
1518  GPUViewport *viewport = WM_draw_region_get_bound_viewport(region);
1520  DRW_draw_render_loop_2d_ex(depsgraph, region, viewport, C);
1521  }
1522 }
1523 
1529  RenderEngineType *engine_type,
1530  ARegion *region,
1531  View3D *v3d,
1532  GPUViewport *viewport,
1533  const bContext *evil_C)
1534 {
1535 
1538  RegionView3D *rv3d = region->regiondata;
1539 
1540  DST.draw_ctx.evil_C = evil_C;
1541  DST.viewport = viewport;
1542  /* Setup viewport */
1544  .region = region,
1545  .rv3d = rv3d,
1546  .v3d = v3d,
1547  .scene = scene,
1548  .view_layer = view_layer,
1549  .obact = OBACT(view_layer),
1550  .engine_type = engine_type,
1551  .depsgraph = depsgraph,
1552 
1553  /* reuse if caller sets */
1554  .evil_C = DST.draw_ctx.evil_C,
1555  };
1558 
1561 
1562  const int object_type_exclude_viewport = v3d->object_type_exclude_viewport;
1563  /* Check if scene needs to perform the populate loop */
1564  const bool internal_engine = (engine_type->flag & RE_INTERNAL) != 0;
1565  const bool draw_type_render = v3d->shading.type == OB_RENDER;
1566  const bool overlays_on = (v3d->flag2 & V3D_HIDE_OVERLAYS) == 0;
1567  const bool gpencil_engine_needed = drw_gpencil_engine_needed(depsgraph, v3d);
1568  const bool do_populate_loop = internal_engine || overlays_on || !draw_type_render ||
1569  gpencil_engine_needed;
1570 
1571  /* Get list of enabled engines */
1572  drw_engines_enable(view_layer, engine_type, gpencil_engine_needed);
1574 
1575  /* Update UBO's */
1577 
1578  drw_debug_init();
1579  DRW_hair_init();
1580 
1581  /* No frame-buffer allowed before drawing. */
1583 
1584  /* Init engines */
1585  drw_engines_init();
1586 
1587  /* Cache filling */
1588  {
1589  PROFILE_START(stime);
1592 
1593  /* Only iterate over objects for internal engines or when overlays are enabled */
1594  if (do_populate_loop) {
1595  DST.dupli_origin = NULL;
1597  if ((object_type_exclude_viewport & (1 << ob->type)) != 0) {
1598  continue;
1599  }
1600  if (!BKE_object_is_visible_in_viewport(v3d, ob)) {
1601  continue;
1602  }
1603  DST.dupli_parent = data_.dupli_parent;
1604  DST.dupli_source = data_.dupli_object_current;
1607  }
1609  }
1610 
1613 
1616 
1617 #ifdef USE_PROFILE
1618  double *cache_time = GPU_viewport_cache_time_get(DST.viewport);
1619  PROFILE_END_UPDATE(*cache_time, stime);
1620 #endif
1621  }
1622 
1623  DRW_stats_begin();
1624 
1626 
1627  /* Start Drawing */
1628  DRW_state_reset();
1629 
1631  GPU_framebuffer_clear_depth_stencil(DST.default_framebuffer, 1.0f, 0xFF);
1632 
1633  DRW_hair_update();
1634 
1636 
1638 
1639  /* Fix 3D view being "laggy" on macos and win+nvidia. (See T56996, T61474) */
1640  GPU_flush();
1641 
1642  DRW_stats_reset();
1643 
1645 
1646  if (WM_draw_region_get_bound_viewport(region)) {
1647  /* Don't unbind the frame-buffer yet in this case and let
1648  * GPU_viewport_unbind do it, so that we can still do further
1649  * drawing of action zones on top. */
1650  }
1651  else {
1653  }
1654 
1655  DRW_state_reset();
1657 
1659 
1660 #ifdef DEBUG
1661  /* Avoid accidental reuse. */
1662  drw_state_ensure_not_reused(&DST);
1663 #endif
1664 }
1665 
1667  ARegion *region,
1668  View3D *v3d,
1669  GPUViewport *viewport)
1670 {
1671  /* Reset before using it. */
1673 
1676 
1677  DRW_draw_render_loop_ex(depsgraph, engine_type, region, v3d, viewport, NULL);
1678 }
1679 
1684  RenderEngineType *engine_type,
1685  ARegion *region,
1686  View3D *v3d,
1687  const bool is_image_render,
1688  const bool draw_background,
1689  const bool do_color_management,
1690  GPUOffScreen *ofs,
1691  GPUViewport *viewport)
1692 {
1693  /* Create temporary viewport if needed. */
1694  GPUViewport *render_viewport = viewport;
1695  if (viewport == NULL) {
1696  render_viewport = GPU_viewport_create();
1697  }
1698 
1699  GPU_viewport_bind_from_offscreen(render_viewport, ofs);
1700 
1701  /* Reset before using it. */
1703  DST.options.is_image_render = is_image_render;
1704  DST.options.do_color_management = do_color_management;
1706  DRW_draw_render_loop_ex(depsgraph, engine_type, region, v3d, render_viewport, NULL);
1707 
1708  if (draw_background) {
1709  /* HACK(fclem): In this case we need to make sure the final alpha is 1.
1710  * We use the blend mode to ensure that. A better way to fix that would
1711  * be to do that in the color-management shader. */
1712  GPU_offscreen_bind(ofs, false);
1713  GPU_clear_color(0.0f, 0.0f, 0.0f, 1.0f);
1714  /* Premult Alpha over black background. */
1716  }
1717 
1720  const bool do_overlays = (v3d->flag2 & V3D_HIDE_OVERLAYS) == 0 ||
1721  (ELEM(v3d->shading.type, OB_WIRE, OB_SOLID)) ||
1722  (ELEM(v3d->shading.type, OB_MATERIAL) &&
1723  (v3d->shading.flag & V3D_SHADING_SCENE_WORLD) == 0) ||
1724  (ELEM(v3d->shading.type, OB_RENDER) &&
1726  GPU_viewport_unbind_from_offscreen(render_viewport, ofs, do_color_management, do_overlays);
1727 
1728  if (draw_background) {
1729  /* Reset default. */
1731  }
1732 
1733  /* Free temporary viewport. */
1734  if (viewport == NULL) {
1735  GPU_viewport_free(render_viewport);
1736  }
1737 }
1738 
1739 /* Helper to check if exit object type to render. */
1741 {
1743  return false;
1744  }
1745 
1747  if (ob->type == OB_GPENCIL) {
1749  return true;
1750  }
1751  }
1752  }
1754 
1755  return false;
1756 }
1757 
1759  struct RenderLayer *render_layer,
1760  const rcti *rect)
1761 {
1764  draw_engine_gpencil_type.render_to_image(gpdata, engine, render_layer, rect);
1765  }
1766 }
1767 
1769 {
1770  /* This function should only be called if there are are grease pencil objects,
1771  * especially important to avoid failing in background renders without OpenGL context. */
1773 
1776  RenderEngineType *engine_type = engine->type;
1777  Render *render = engine->re;
1778 
1779  DRW_render_context_enable(render);
1780 
1781  /* Reset before using it. */
1783  DST.options.is_image_render = true;
1784  DST.options.is_scene_render = true;
1786  DST.buffer_finish_called = true;
1787 
1789  .scene = scene,
1790  .view_layer = view_layer,
1791  .engine_type = engine_type,
1792  .depsgraph = depsgraph,
1793  .object_mode = OB_MODE_OBJECT,
1794  };
1796 
1798  const int size[2] = {engine->resolution_x, engine->resolution_y};
1800 
1802 
1803  /* Main rendering. */
1804  rctf view_rect;
1805  rcti render_rect;
1806  RE_GetViewPlane(render, &view_rect, &render_rect);
1807  if (BLI_rcti_is_empty(&render_rect)) {
1808  BLI_rcti_init(&render_rect, 0, size[0], 0, size[1]);
1809  }
1810 
1811  RenderResult *render_result = RE_engine_get_result(engine);
1812  RenderLayer *render_layer = RE_GetRenderLayer(render_result, view_layer->name);
1813  for (RenderView *render_view = render_result->views.first; render_view != NULL;
1814  render_view = render_view->next) {
1815  RE_SetActiveRenderView(render, render_view->name);
1816  DRW_view_reset();
1817  DST.buffer_finish_called = false;
1818  DRW_render_gpencil_to_image(engine, render_layer, &render_rect);
1819  }
1820 
1821  /* Force cache to reset. */
1824  DRW_state_reset();
1825 
1827 
1828  /* Restore Drawing area. */
1830 
1832 
1833  DST.buffer_finish_called = false;
1834 }
1835 
1836 /* Callback function for RE_engine_update_render_passes to ensure all
1837  * render passes are registered. */
1839  struct Scene *UNUSED(scene),
1840  struct ViewLayer *view_layer,
1841  const char *name,
1842  int channels,
1843  const char *chanid,
1845 {
1846  RenderEngine *engine = user_data;
1847  RE_engine_add_pass(engine, name, channels, chanid, view_layer->name);
1848 }
1849 
1851 {
1854  RenderEngineType *engine_type = engine->type;
1855  DrawEngineType *draw_engine_type = engine_type->draw_engine;
1856  Render *render = engine->re;
1857 
1858  /* IMPORTANT: We don't support immediate mode in render mode!
1859  * This shall remain in effect until immediate mode supports
1860  * multiple threads. */
1861 
1862  /* Reset before using it. */
1864  DST.options.is_image_render = true;
1865  DST.options.is_scene_render = true;
1868  .scene = scene,
1869  .view_layer = view_layer,
1870  .engine_type = engine_type,
1871  .depsgraph = depsgraph,
1872  .object_mode = OB_MODE_OBJECT,
1873  };
1875 
1877  const int size[2] = {engine->resolution_x, engine->resolution_y};
1879 
1881 
1883 
1884  /* Main rendering. */
1885  rctf view_rect;
1886  rcti render_rect;
1887  RE_GetViewPlane(render, &view_rect, &render_rect);
1888  if (BLI_rcti_is_empty(&render_rect)) {
1889  BLI_rcti_init(&render_rect, 0, size[0], 0, size[1]);
1890  }
1891 
1892  /* Reset state before drawing */
1893  DRW_state_reset();
1894 
1895  /* set default viewport */
1896  GPU_viewport(0, 0, size[0], size[1]);
1897 
1898  /* Update the render passes. This needs to be done before acquiring the render result. */
1900  engine, scene, view_layer, draw_render_result_ensure_pass_cb, engine);
1901 
1902  /* Init render result. */
1903  RenderResult *render_result = RE_engine_begin_result(engine,
1904  0,
1905  0,
1906  size[0],
1907  size[1],
1908  view_layer->name,
1909  /* RR_ALL_VIEWS */ NULL);
1910  RenderLayer *render_layer = render_result->layers.first;
1911  for (RenderView *render_view = render_result->views.first; render_view != NULL;
1912  render_view = render_view->next) {
1913  RE_SetActiveRenderView(render, render_view->name);
1914  DRW_view_reset();
1915  engine_type->draw_engine->render_to_image(data, engine, render_layer, &render_rect);
1916  DST.buffer_finish_called = false;
1917  }
1918 
1919  RE_engine_end_result(engine, render_result, false, false, false);
1920 
1921  if (engine_type->draw_engine->store_metadata) {
1922  RenderResult *final_render_result = RE_engine_get_result(engine);
1923  engine_type->draw_engine->store_metadata(data, final_render_result);
1924  }
1925 
1926  /* Force cache to reset. */
1928 
1931 
1932 #ifdef DEBUG
1933  /* Avoid accidental reuse. */
1934  drw_state_ensure_not_reused(&DST);
1935 #endif
1936 
1937  /* Reset state after drawing */
1938  DRW_state_reset();
1939 }
1940 
1942  void *vedata,
1943  RenderEngine *engine,
1944  struct Depsgraph *depsgraph,
1945  void (*callback)(void *vedata, Object *ob, RenderEngine *engine, struct Depsgraph *depsgraph))
1946 {
1947  const DRWContextState *draw_ctx = DRW_context_state_get();
1948  DRW_hair_init();
1949 
1951  const int object_type_exclude_viewport = draw_ctx->v3d ?
1952  draw_ctx->v3d->object_type_exclude_viewport :
1953  0;
1954  DST.dupli_origin = NULL;
1956  if ((object_type_exclude_viewport & (1 << ob->type)) == 0) {
1957  DST.dupli_parent = data_.dupli_parent;
1958  DST.dupli_source = data_.dupli_object_current;
1959  DST.ob_handle = 0;
1961 
1962  if (!DST.dupli_source) {
1964  }
1965  callback(vedata, ob, engine, depsgraph);
1966  if (!DST.dupli_source) {
1968  }
1969  }
1970  }
1972 
1975 }
1976 
1977 /* Assume a valid gl context is bound (and that the gl_context_mutex has been acquired).
1978  * This function only setup DST and execute the given function.
1979  * Warning: similar to DRW_render_to_image you cannot use default lists (dfbl & dtxl). */
1980 void DRW_custom_pipeline(DrawEngineType *draw_engine_type,
1981  struct Depsgraph *depsgraph,
1982  void (*callback)(void *vedata, void *user_data),
1983  void *user_data)
1984 {
1987 
1988  /* Reset before using it. */
1990  DST.options.is_image_render = true;
1991  DST.options.is_scene_render = true;
1992  DST.options.draw_background = false;
1993 
1995  .scene = scene,
1996  .view_layer = view_layer,
1997  .engine_type = NULL,
1998  .depsgraph = depsgraph,
1999  .object_mode = OB_MODE_OBJECT,
2000  };
2002 
2004  const int size[2] = {1, 1};
2006 
2008 
2009  DRW_hair_init();
2010 
2012 
2013  /* Execute the callback */
2015  DST.buffer_finish_called = false;
2016 
2019 
2020  /* The use of custom pipeline in other thread using the same
2021  * resources as the main thread (viewport) may lead to data
2022  * races and undefined behavior on certain drivers. Using
2023  * GPU_finish to sync seems to fix the issue. (see T62997) */
2024  GPU_finish();
2025 
2026 #ifdef DEBUG
2027  /* Avoid accidental reuse. */
2028  drw_state_ensure_not_reused(&DST);
2029 #endif
2030 }
2031 
2032 /* Used when the render engine want to redo another cache populate inside the same render frame.
2033  */
2035 {
2036  /* Save viewport size. */
2037  float size[2], inv_size[2];
2038  copy_v2_v2(size, DST.size);
2039  copy_v2_v2(inv_size, DST.inv_size);
2040 
2041  /* Force cache to reset. */
2043 
2045 
2046  DST.buffer_finish_called = false;
2047 
2048  DRW_hair_init();
2049 
2050  /* Restore. */
2051  copy_v2_v2(DST.size, size);
2052  copy_v2_v2(DST.inv_size, inv_size);
2053 }
2054 
2056  ARegion *region,
2057  GPUViewport *viewport,
2058  const bContext *evil_C)
2059 {
2062 
2063  DST.draw_ctx.evil_C = evil_C;
2064  DST.viewport = viewport;
2065 
2066  /* Setup viewport */
2068  .region = region,
2069  .scene = scene,
2070  .view_layer = view_layer,
2071  .obact = OBACT(view_layer),
2072  .depsgraph = depsgraph,
2073  .space_data = CTX_wm_space_data(evil_C),
2074 
2075  /* reuse if caller sets */
2076  .evil_C = DST.draw_ctx.evil_C,
2077  };
2078 
2082 
2083  /* TODO(jbakker): Only populate when editor needs to draw object.
2084  * for the image editor this is when showing UV's.*/
2085  const bool do_populate_loop = (DST.draw_ctx.space_data->spacetype == SPACE_IMAGE);
2086  const bool do_annotations = drw_draw_show_annotation();
2087  const bool do_draw_gizmos = (DST.draw_ctx.space_data->spacetype != SPACE_IMAGE);
2088 
2089  /* Get list of enabled engines */
2092 
2093  /* Update UBO's */
2095 
2096  drw_debug_init();
2097 
2098  /* No frame-buffer allowed before drawing. */
2101  GPU_framebuffer_clear_depth_stencil(DST.default_framebuffer, 1.0f, 0xFF);
2102 
2103  /* Init engines */
2104  drw_engines_init();
2106 
2107  /* Cache filling */
2108  {
2109  PROFILE_START(stime);
2111 
2112  /* Only iterate over objects when overlay uses object data. */
2113  if (do_populate_loop) {
2116  }
2118  }
2119 
2121 
2123 
2124 #ifdef USE_PROFILE
2125  double *cache_time = GPU_viewport_cache_time_get(DST.viewport);
2126  PROFILE_END_UPDATE(*cache_time, stime);
2127 #endif
2128  }
2130 
2131  DRW_stats_begin();
2132 
2134 
2135  /* Start Drawing */
2136  DRW_state_reset();
2137 
2138  if (DST.draw_ctx.evil_C) {
2140  }
2141 
2143 
2144  /* Fix 3D view being "laggy" on macos and win+nvidia. (See T56996, T61474) */
2145  GPU_flush();
2146 
2147  if (DST.draw_ctx.evil_C) {
2149  DRW_state_reset();
2150 
2152 
2155  wmOrtho2(
2156  region->v2d.cur.xmin, region->v2d.cur.xmax, region->v2d.cur.ymin, region->v2d.cur.ymax);
2157  if (do_annotations) {
2159  }
2163  /* Callback can be nasty and do whatever they want with the state.
2164  * Don't trust them! */
2165  DRW_state_reset();
2166 
2169 
2170  if (do_annotations) {
2173  }
2174  }
2175 
2178 
2179  if (do_draw_gizmos) {
2182  }
2183 
2184  DRW_stats_reset();
2185 
2186  if (G.debug_value > 20 && G.debug_value < 30) {
2188  /* local coordinate visible rect inside region, to accommodate overlapping ui */
2190  DRW_stats_draw(rect);
2191  }
2192 
2194 
2195  if (WM_draw_region_get_bound_viewport(region)) {
2196  /* Don't unbind the frame-buffer yet in this case and let
2197  * GPU_viewport_unbind do it, so that we can still do further
2198  * drawing of action zones on top. */
2199  }
2200  else {
2202  }
2203 
2204  DRW_state_reset();
2206 
2208 
2209 #ifdef DEBUG
2210  /* Avoid accidental reuse. */
2211  drw_state_ensure_not_reused(&DST);
2212 #endif
2213 }
2214 
2215 static struct DRWSelectBuffer {
2219 
2221 {
2224  }
2225 
2226  if ((g_select_buffer.texture_depth != NULL) &&
2231  }
2232 
2235  "select_depth", size[0], size[1], 1, GPU_DEPTH_COMPONENT24, NULL);
2236 
2239 
2241  }
2242 }
2243 
2244 /* Must run after all instance datas have been added. */
2246 {
2247  BLI_assert(!DST.buffer_finish_called && "DRW_render_instance_buffer_finish called twice!");
2248  DST.buffer_finish_called = true;
2251 }
2252 
2253 /* WARNING: Changing frame might free the ViewLayerEngineData */
2254 void DRW_render_set_time(RenderEngine *engine, Depsgraph *depsgraph, int frame, float subframe)
2255 {
2256  RE_engine_frame_set(engine, frame, subframe);
2259 }
2260 
2265  ARegion *region,
2266  View3D *v3d,
2267  bool use_obedit_skip,
2268  bool draw_surface,
2269  bool UNUSED(use_nearest),
2270  const rcti *rect,
2271  DRW_SelectPassFn select_pass_fn,
2272  void *select_pass_user_data,
2273  DRW_ObjectFilterFn object_filter_fn,
2274  void *object_filter_user_data)
2275 {
2279  Object *obact = OBACT(view_layer);
2280  Object *obedit = use_obedit_skip ? NULL : OBEDIT_FROM_OBACT(obact);
2281 #ifndef USE_GPU_SELECT
2282  UNUSED_VARS(scene, view_layer, v3d, region, rect);
2283 #else
2284  RegionView3D *rv3d = region->regiondata;
2285 
2286  /* Reset before using it. */
2288 
2289  bool use_obedit = false;
2290  /* obedit_ctx_mode is used for selecting the right draw engines */
2291  // eContextObjectMode obedit_ctx_mode;
2292  /* object_mode is used for filtering objects in the depsgraph */
2293  eObjectMode object_mode;
2294  int object_type = 0;
2295  if (obedit != NULL) {
2296  object_type = obedit->type;
2297  object_mode = obedit->mode;
2298  if (obedit->type == OB_MBALL) {
2299  use_obedit = true;
2300  // obedit_ctx_mode = CTX_MODE_EDIT_METABALL;
2301  }
2302  else if (obedit->type == OB_ARMATURE) {
2303  use_obedit = true;
2304  // obedit_ctx_mode = CTX_MODE_EDIT_ARMATURE;
2305  }
2306  }
2307  if (v3d->overlay.flag & V3D_OVERLAY_BONE_SELECT) {
2308  if (!(v3d->flag2 & V3D_HIDE_OVERLAYS)) {
2309  /* Note: don't use "BKE_object_pose_armature_get" here, it breaks selection. */
2310  Object *obpose = OBPOSE_FROM_OBACT(obact);
2311  if (obpose == NULL) {
2312  Object *obweight = OBWEIGHTPAINT_FROM_OBACT(obact);
2313  if (obweight) {
2314  /* Only use Armature pose selection, when connected armature is in pose mode. */
2315  Object *ob_armature = BKE_modifiers_is_deformed_by_armature(obweight);
2316  if (ob_armature && ob_armature->mode == OB_MODE_POSE) {
2317  obpose = ob_armature;
2318  }
2319  }
2320  }
2321 
2322  if (obpose) {
2323  use_obedit = true;
2324  object_type = obpose->type;
2325  object_mode = obpose->mode;
2326  // obedit_ctx_mode = CTX_MODE_POSE;
2327  }
2328  }
2329  }
2330 
2331  const int viewport_size[2] = {BLI_rcti_size_x(rect), BLI_rcti_size_y(rect)};
2332  struct GPUViewport *viewport = GPU_viewport_create();
2333  GPU_viewport_size_set(viewport, viewport_size);
2334 
2335  DST.viewport = viewport;
2336  DST.options.is_select = true;
2338  /* Get list of enabled engines */
2339  if (use_obedit) {
2341  }
2342  else if (!draw_surface) {
2343  /* grease pencil selection */
2346  }
2347 
2349  }
2350  else {
2351  /* Draw surface for occlusion. */
2353  /* grease pencil selection */
2356  }
2357 
2359  }
2361 
2362  /* Setup viewport */
2363 
2364  /* Instead of 'DRW_context_state_init(C, &DST.draw_ctx)', assign from args */
2366  .region = region,
2367  .rv3d = rv3d,
2368  .v3d = v3d,
2369  .scene = scene,
2370  .view_layer = view_layer,
2371  .obact = obact,
2372  .engine_type = engine_type,
2373  .depsgraph = depsgraph,
2374  };
2377 
2378  /* Update UBO's */
2380 
2381  /* Init engines */
2382  drw_engines_init();
2383  DRW_hair_init();
2384 
2385  {
2388 
2389  if (use_obedit) {
2390  FOREACH_OBJECT_IN_MODE_BEGIN (view_layer, v3d, object_type, object_mode, ob_iter) {
2391  drw_engines_cache_populate(ob_iter);
2392  }
2394  }
2395  else {
2396  /* When selecting pose-bones in pose mode, check for visibility not select-ability
2397  * as pose-bones have their own selection restriction flag. */
2398  const bool use_pose_exception = (DST.draw_ctx.object_pose != NULL);
2399 
2400  const int object_type_exclude_select = (v3d->object_type_exclude_viewport |
2402  bool filter_exclude = false;
2403  DST.dupli_origin = NULL;
2405  if (!BKE_object_is_visible_in_viewport(v3d, ob)) {
2406  continue;
2407  }
2408 
2409  if (use_pose_exception && (ob->mode & OB_MODE_POSE)) {
2410  if ((ob->base_flag & BASE_VISIBLE_VIEWLAYER) == 0) {
2411  continue;
2412  }
2413  }
2414  else {
2415  if ((ob->base_flag & BASE_SELECTABLE) == 0) {
2416  continue;
2417  }
2418  }
2419 
2420  if ((object_type_exclude_select & (1 << ob->type)) == 0) {
2421  if (object_filter_fn != NULL) {
2422  if (ob->base_flag & BASE_FROM_DUPLI) {
2423  /* pass (use previous filter_exclude value) */
2424  }
2425  else {
2426  filter_exclude = (object_filter_fn(ob, object_filter_user_data) == false);
2427  }
2428  if (filter_exclude) {
2429  continue;
2430  }
2431  }
2432 
2433  DRW_select_load_id(ob->runtime.select_id);
2434  DST.dupli_parent = data_.dupli_parent;
2435  DST.dupli_source = data_.dupli_object_current;
2438  }
2439  }
2441  }
2442 
2446 
2448  }
2449 
2450  /* Setup frame-buffer. */
2453  GPU_framebuffer_clear_depth(g_select_buffer.framebuffer_depth_only, 1.0f);
2454 
2455  /* Start Drawing */
2456  DRW_state_reset();
2458 
2459  DRW_hair_update();
2460 
2461  /* Only 1-2 passes. */
2462  while (true) {
2463  if (!select_pass_fn(DRW_SELECT_PASS_PRE, select_pass_user_data)) {
2464  break;
2465  }
2467 
2469 
2470  DRW_state_lock(0);
2471 
2472  if (!select_pass_fn(DRW_SELECT_PASS_POST, select_pass_user_data)) {
2473  break;
2474  }
2475  }
2476 
2477  DRW_state_reset();
2479 
2480 # ifdef DEBUG
2481  /* Avoid accidental reuse. */
2482  drw_state_ensure_not_reused(&DST);
2483 # endif
2485 
2486  /* Cleanup for selection state */
2487  GPU_viewport_free(viewport);
2488 #endif /* USE_GPU_SELECT */
2489 }
2490 
2495  ARegion *region,
2496  View3D *v3d,
2497  GPUViewport *viewport,
2498  const bool use_opengl_context)
2499 {
2503  RegionView3D *rv3d = region->regiondata;
2504 
2505  if (use_opengl_context) {
2507  }
2508 
2509  DST.viewport = viewport;
2510  DST.options.is_depth = true;
2511 
2512  /* Instead of 'DRW_context_state_init(C, &DST.draw_ctx)', assign from args */
2514  .region = region,
2515  .rv3d = rv3d,
2516  .v3d = v3d,
2517  .scene = scene,
2518  .view_layer = view_layer,
2519  .obact = OBACT(view_layer),
2520  .engine_type = engine_type,
2521  .depsgraph = depsgraph,
2522  };
2525 
2526  /* Setup frame-buffer. */
2528  DST.viewport);
2530  GPU_framebuffer_clear_depth(fbl->depth_only_fb, 1.0f);
2531 
2532  /* Setup viewport */
2535 
2536  /* Update UBO's */
2538 
2539  /* Init engines */
2540  drw_engines_init();
2541  DRW_hair_init();
2542 
2543  {
2546 
2547  const int object_type_exclude_viewport = v3d->object_type_exclude_viewport;
2548  DST.dupli_origin = NULL;
2550  if ((object_type_exclude_viewport & (1 << ob->type)) != 0) {
2551  continue;
2552  }
2553  if (!BKE_object_is_visible_in_viewport(v3d, ob)) {
2554  continue;
2555  }
2556  DST.dupli_parent = data_.dupli_parent;
2557  DST.dupli_source = data_.dupli_object_current;
2560  }
2562 
2565 
2568  }
2569 
2570  /* Start Drawing */
2571  DRW_state_reset();
2572 
2573  DRW_hair_update();
2574 
2576 
2577  DRW_state_reset();
2578 
2579  /* TODO: Reading depth for operators should be done here. */
2580 
2582 
2584 
2586 
2587 #ifdef DEBUG
2588  /* Avoid accidental reuse. */
2589  drw_state_ensure_not_reused(&DST);
2590 #endif
2591 
2592  /* Changing context. */
2593  if (use_opengl_context) {
2595  }
2596 }
2597 
2602  ARegion *region,
2603  View3D *v3d,
2604  GPUViewport *viewport)
2605 {
2606  /* Reset before using it. */
2608 
2609  /* Get list of enabled engines */
2610  {
2611  /* Required by `DRW_state_draw_support()` */
2612  DST.draw_ctx.v3d = v3d;
2613 
2615  if (DRW_state_draw_support()) {
2617  }
2618  }
2619 
2620  drw_draw_depth_loop_impl(depsgraph, region, v3d, viewport, false);
2621 }
2622 
2627  ARegion *region,
2628  View3D *v3d,
2629  GPUViewport *viewport)
2630 {
2631  /* Reset before using it. */
2633 
2635 
2636  drw_draw_depth_loop_impl(depsgraph, region, v3d, viewport, false);
2637 }
2638 
2639 void DRW_draw_select_id(Depsgraph *depsgraph, ARegion *region, View3D *v3d, const rcti *rect)
2640 {
2642  GPUViewport *viewport = WM_draw_region_get_viewport(region);
2643  if (!viewport) {
2644  /* Selection engine requires a viewport.
2645  * TODO(germano): This should be done internally in the engine. */
2646  sel_ctx->is_dirty = true;
2647  sel_ctx->objects_drawn_len = 0;
2648  sel_ctx->index_drawn_len = 1;
2649  return;
2650  }
2651 
2654 
2655  /* Reset before using it. */
2657 
2658  /* Instead of 'DRW_context_state_init(C, &DST.draw_ctx)', assign from args */
2660  .region = region,
2661  .rv3d = region->regiondata,
2662  .v3d = v3d,
2663  .scene = scene,
2664  .view_layer = view_layer,
2665  .obact = OBACT(view_layer),
2666  .depsgraph = depsgraph,
2667  };
2670 
2671  /* Setup viewport */
2672  DST.viewport = viewport;
2674 
2675  /* Update UBO's */
2677 
2678  /* Init Select Engine */
2679  sel_ctx->last_rect = *rect;
2680 
2682  drw_engines_init();
2683  {
2685 
2686  Object **obj = &sel_ctx->objects[0];
2687  for (uint remaining = sel_ctx->objects_len; remaining--; obj++) {
2688  Object *obj_eval = DEG_get_evaluated_object(depsgraph, *obj);
2689  drw_engines_cache_populate(obj_eval);
2690  }
2691 
2693 
2695 #if 0 /* This is a workaround to a nasty bug that seems to be a nasty driver bug. (See T69377) */
2697 #else
2698  DST.buffer_finish_called = true;
2699  // DRW_instance_buffer_finish(DST.idatalist);
2701 #endif
2702  }
2703 
2704  /* Start Drawing */
2705  DRW_state_reset();
2707  DRW_state_reset();
2708 
2710 
2712 
2713 #ifdef DEBUG
2714  /* Avoid accidental reuse. */
2715  drw_state_ensure_not_reused(&DST);
2716 #endif
2717 }
2718 
2723  Scene *scene, ARegion *region, View3D *v3d, GPUViewport *viewport, Object *object)
2724 {
2725  RegionView3D *rv3d = region->regiondata;
2726 
2728  GPU_matrix_set(rv3d->viewmat);
2729  GPU_matrix_mul(object->obmat);
2730 
2731  /* Setup frame-buffer. */
2733 
2735  GPU_framebuffer_clear_depth(fbl->depth_only_fb, 1.0f);
2737 
2738  const float(*world_clip_planes)[4] = NULL;
2739  if (RV3D_CLIPPING_ENABLED(v3d, rv3d)) {
2740  GPU_clip_distances(6);
2741  ED_view3d_clipping_local(rv3d, object->obmat);
2742  world_clip_planes = rv3d->clip_local;
2743  }
2744 
2745  drw_batch_cache_validate(object);
2746 
2747  switch (object->type) {
2748  case OB_MESH: {
2749  GPUBatch *batch;
2750 
2751  Mesh *me = object->data;
2752 
2753  if (object->mode & OB_MODE_EDIT) {
2755  }
2756  else {
2758  }
2759  struct TaskGraph *task_graph = BLI_task_graph_create();
2760  DRW_mesh_batch_cache_create_requested(task_graph, object, me, scene, false, true);
2761  BLI_task_graph_work_and_wait(task_graph);
2762  BLI_task_graph_free(task_graph);
2763 
2764  const eGPUShaderConfig sh_cfg = world_clip_planes ? GPU_SHADER_CFG_CLIPPED :
2767  if (world_clip_planes != NULL) {
2768  GPU_batch_uniform_4fv_array(batch, "WorldClipPlanes", 6, world_clip_planes);
2769  }
2770 
2772  } break;
2773  case OB_CURVE:
2774  case OB_SURF:
2775  break;
2776  }
2777 
2778  if (RV3D_CLIPPING_ENABLED(v3d, rv3d)) {
2779  GPU_clip_distances(0);
2780  }
2781 
2782  GPU_matrix_set(rv3d->viewmat);
2785 }
2786 
2789 /* -------------------------------------------------------------------- */
2798 {
2801 }
2802 
2807 {
2808  return DST.options.is_select;
2809 }
2810 
2812 {
2813  return DST.options.is_depth;
2814 }
2815 
2820 {
2821  return DST.options.is_image_render;
2822 }
2823 
2828 {
2830 }
2831 
2837 {
2839  return DST.options.is_scene_render;
2840 }
2841 
2846 {
2848 }
2849 
2851 {
2852  if (DST.draw_ctx.evil_C != NULL) {
2854  return ED_screen_animation_playing(wm) != NULL;
2855  }
2856  return false;
2857 }
2858 
2863 {
2864  const RegionView3D *rv3d = DST.draw_ctx.rv3d;
2865  return (rv3d) && (rv3d->rflag & (RV3D_NAVIGATING | RV3D_PAINTING));
2866 }
2867 
2872 {
2873  return (DST.options.is_select) == 0 && (DST.options.is_depth) == 0 &&
2874  (DST.options.is_scene_render) == 0 && (DST.options.draw_text) == 0;
2875 }
2876 
2882 {
2883  View3D *v3d = DST.draw_ctx.v3d;
2884  return (DRW_state_is_scene_render() == false) && (v3d != NULL) &&
2885  ((v3d->flag2 & V3D_HIDE_OVERLAYS) == 0);
2886 }
2887 
2892 {
2893  return DST.options.draw_background;
2894 }
2895 
2898 /* -------------------------------------------------------------------- */
2903 {
2904  return &DST.draw_ctx;
2905 }
2906 
2909 /* -------------------------------------------------------------------- */
2914 {
2915  return draw_engine_type->render_to_image;
2916 }
2917 
2918 void DRW_engine_register(DrawEngineType *draw_engine_type)
2919 {
2920  BLI_addtail(&DRW_engines, draw_engine_type);
2921 }
2922 
2924 {
2927 
2929 
2933 
2936 
2937  /* setup callbacks */
2938  {
2941 
2944 
2947 
2950 
2953 
2956 
2959 
2962 
2965  }
2966 }
2967 
2969 {
2970  if (DST.gl_context == NULL) {
2971  /* Nothing has been setup. Nothing to clear.
2972  * Otherwise, DRW_opengl_context_enable can
2973  * create a context in background mode. (see T62355) */
2974  return;
2975  }
2976 
2978 
2981 
2982  DRW_hair_free();
2984  DRW_stats_free();
2985  DRW_globals_free();
2986 
2989  next = type->next;
2991 
2992  if (type->engine_free) {
2993  type->engine_free();
2994  }
2995  }
2996 
3001 
3002  if (DST.draw_list) {
3004  }
3005 
3007 }
3008 
3010 {
3011  if (G.background && DST.gl_context == NULL) {
3012  WM_init_opengl();
3013  }
3014 
3018  return;
3019  }
3020 
3021  void *re_gl_context = RE_gl_context_get(render);
3022 
3023  /* Changing Context */
3024  if (re_gl_context != NULL) {
3025  DRW_opengl_render_context_enable(re_gl_context);
3026  /* We need to query gpu context after a gl context has been bound. */
3027  void *re_gpu_context = NULL;
3028  re_gpu_context = RE_gpu_context_get(render);
3029  DRW_gpu_render_context_enable(re_gpu_context);
3030  }
3031  else {
3033  }
3034 }
3035 
3037 {
3041  return;
3042  }
3043 
3044  void *re_gl_context = RE_gl_context_get(render);
3045 
3046  if (re_gl_context != NULL) {
3047  void *re_gpu_context = NULL;
3048  re_gpu_context = RE_gpu_context_get(render);
3049  DRW_gpu_render_context_disable(re_gpu_context);
3050  DRW_opengl_render_context_disable(re_gl_context);
3051  }
3052  else {
3054  }
3055 }
3056 
3059 /* -------------------------------------------------------------------- */
3064 {
3065  BLI_assert(DST.gl_context == NULL); /* Ensure it's called once */
3066 
3068  /* This changes the active context. */
3071  /* Be sure to create gpu_context too. */
3073  /* So we activate the window's one afterwards. */
3075 }
3076 
3078 {
3080  if (DST.gl_context != NULL) {
3086  }
3087 }
3088 
3090 {
3091  if (DST.gl_context != NULL) {
3092  /* IMPORTANT: We don't support immediate mode in render mode!
3093  * This shall remain in effect until immediate mode supports
3094  * multiple threads. */
3098  }
3099 }
3100 
3102 {
3103  if (DST.gl_context != NULL) {
3104 #ifdef __APPLE__
3105  /* Need to flush before disabling draw context, otherwise it does not
3106  * always finish drawing and viewport can be empty or partially drawn */
3107  GPU_flush();
3108 #endif
3109 
3110  if (BLI_thread_is_main() && restore) {
3112  }
3113  else {
3116  }
3117 
3119  }
3120 }
3121 
3123 {
3124  if (G.background && DST.gl_context == NULL) {
3125  WM_init_opengl();
3126  }
3128 }
3129 
3131 {
3133 }
3134 
3135 void DRW_opengl_render_context_enable(void *re_gl_context)
3136 {
3137  /* If thread is main you should use DRW_opengl_context_enable(). */
3139 
3140  /* TODO get rid of the blocking. Only here because of the static global DST. */
3142  WM_opengl_context_activate(re_gl_context);
3143 }
3144 
3145 void DRW_opengl_render_context_disable(void *re_gl_context)
3146 {
3147  WM_opengl_context_release(re_gl_context);
3148  /* TODO get rid of the blocking. */
3150 }
3151 
3152 /* Needs to be called AFTER DRW_opengl_render_context_enable() */
3153 void DRW_gpu_render_context_enable(void *re_gpu_context)
3154 {
3155  /* If thread is main you should use DRW_opengl_context_enable(). */
3157 
3158  GPU_context_active_set(re_gpu_context);
3159 }
3160 
3161 /* Needs to be called BEFORE DRW_opengl_render_context_disable() */
3162 void DRW_gpu_render_context_disable(void *UNUSED(re_gpu_context))
3163 {
3164  GPU_flush();
3166 }
3167 
3170 #ifdef WITH_XR_OPENXR
3171 
3172 /* XXX
3173  * There should really be no such getter, but for VR we currently can't easily avoid it. OpenXR
3174  * needs some low level info for the OpenGL context that will be used for submitting the
3175  * final framebuffer. VR could in theory create its own context, but that would mean we have to
3176  * switch to it just to submit the final frame, which has notable performance impact.
3177  *
3178  * We could "inject" a context through DRW_opengl_render_context_enable(), but that would have to
3179  * work from the main thread, which is tricky to get working too. The preferable solution would
3180  * be using a separate thread for VR drawing where a single context can stay active. */
3181 void *DRW_xr_opengl_context_get(void)
3182 {
3183  return DST.gl_context;
3184 }
3185 
3186 /* XXX See comment on DRW_xr_opengl_context_get(). */
3187 void *DRW_xr_gpu_context_get(void)
3188 {
3189  return DST.gpu_context;
3190 }
3191 
3192 /* XXX See comment on DRW_xr_opengl_context_get(). */
3193 void DRW_xr_drawing_begin(void)
3194 {
3196 }
3197 
3198 /* XXX See comment on DRW_xr_opengl_context_get(). */
3199 void DRW_xr_drawing_end(void)
3200 {
3202 }
3203 
3204 #endif
3205 
3206 /* -------------------------------------------------------------------- */
3210 #ifdef WITH_OPENGL_DRAW_TESTS
3211 
3212 void DRW_draw_state_init_gtests(eGPUShaderConfig sh_cfg)
3213 {
3214  DST.draw_ctx.sh_cfg = sh_cfg;
3215 }
3216 
3217 #endif
3218 
typedef float(TangentPoint)[2]
void BKE_color_managed_view_settings_init_render(struct ColorManagedViewSettings *settings, const struct ColorManagedDisplaySettings *display_settings, const char *view_transform)
struct wmWindowManager * CTX_wm_manager(const bContext *C)
Definition: context.c:689
struct View3D * CTX_wm_view3d(const bContext *C)
Definition: context.c:760
struct Depsgraph * CTX_data_expect_evaluated_depsgraph(const bContext *C)
Definition: context.c:1415
struct SpaceLink * CTX_wm_space_data(const bContext *C)
Definition: context.c:719
struct ARegion * CTX_wm_region(const bContext *C)
Definition: context.c:725
void(* BKE_curve_batch_cache_free_cb)(struct Curve *cu)
Definition: curve.c:5616
void(* BKE_curve_batch_cache_dirty_tag_cb)(struct Curve *cu, int mode)
Definition: curve.c:5615
void(* BKE_gpencil_batch_cache_dirty_tag_cb)(struct bGPdata *gpd)
Definition: gpencil.c:340
void(* BKE_gpencil_batch_cache_free_cb)(struct bGPdata *gpd)
Definition: gpencil.c:341
General operations for hairs.
void(* BKE_hair_batch_cache_free_cb)(struct Hair *hair)
Definition: hair.c:411
void(* BKE_hair_batch_cache_dirty_tag_cb)(struct Hair *hair, int mode)
Definition: hair.c:410
void(* BKE_lattice_batch_cache_free_cb)(struct Lattice *lt)
Definition: lattice.c:791
void(* BKE_lattice_batch_cache_dirty_tag_cb)(struct Lattice *lt, int mode)
Definition: lattice.c:790
#define FOREACH_OBJECT_IN_MODE_END
Definition: BKE_layer.h:284
bool BKE_object_is_visible_in_viewport(const struct View3D *v3d, const struct Object *ob)
#define FOREACH_OBJECT_IN_MODE_BEGIN(_view_layer, _v3d, _object_type, _object_mode, _instance)
Definition: BKE_layer.h:280
void(* BKE_mball_batch_cache_dirty_tag_cb)(struct MetaBall *mb, int mode)
Definition: mball.c:745
void(* BKE_mball_batch_cache_free_cb)(struct MetaBall *mb)
Definition: mball.c:746
void(* BKE_mesh_batch_cache_dirty_tag_cb)(struct Mesh *me, eMeshBatchDirtyMode mode)
Definition: mesh_runtime.c:248
void(* BKE_mesh_batch_cache_free_cb)(struct Mesh *me)
Definition: mesh_runtime.c:249
struct Object * BKE_modifiers_is_deformed_by_armature(struct Object *ob)
General operations, lookup, etc. for blender objects.
struct Object * BKE_object_pose_armature_get(struct Object *ob)
Definition: object.c:2487
@ OB_VISIBLE_SELF
Definition: BKE_object.h:125
int BKE_object_visibility(const struct Object *ob, const int dag_eval_mode)
bool BKE_object_is_in_editmode(const struct Object *ob)
void(* BKE_particle_batch_cache_dirty_tag_cb)(struct ParticleSystem *psys, int mode)
Definition: particle.c:5240
bool psys_in_edit_mode(struct Depsgraph *depsgraph, const struct ParticleSystem *psys)
bool psys_check_enabled(struct Object *ob, struct ParticleSystem *psys, const bool use_render_params)
Definition: particle.c:789
void(* BKE_particle_batch_cache_free_cb)(struct ParticleSystem *psys)
Definition: particle.c:5241
A BVH for high poly meshes.
General operations for point-clouds.
void(* BKE_pointcloud_batch_cache_free_cb)(struct PointCloud *pointcloud)
Definition: pointcloud.cc:422
void(* BKE_pointcloud_batch_cache_dirty_tag_cb)(struct PointCloud *pointcloud, int mode)
Definition: pointcloud.cc:421
struct Depsgraph * BKE_scene_get_depsgraph(const struct Scene *scene, const struct ViewLayer *view_layer)
bool BKE_scene_uses_blender_workbench(const struct Scene *scene)
Volume datablock.
void(* BKE_volume_batch_cache_dirty_tag_cb)(struct Volume *volume, int mode)
Definition: volume.cc:1118
void(* BKE_volume_batch_cache_free_cb)(struct Volume *volume)
Definition: volume.cc:1119
void BLF_draw_default(float x, float y, float z, const char *str, size_t len) ATTR_NONNULL()
Definition: blf_default.c:71
int BLF_default(void)
Definition: blf_default.c:55
void BLF_shadow_offset(int fontid, int x, int y)
Definition: blf.c:841
void BLF_shadow(int fontid, int level, const float rgba[4]) ATTR_NONNULL(3)
Definition: blf.c:831
void BLF_disable(int fontid, int option)
Definition: blf.c:283
void BLF_enable(int fontid, int option)
Definition: blf.c:274
#define BLF_SHADOW
Definition: BLF_api.h:271
#define BLI_array_alloca(arr, realsize)
Definition: BLI_alloca.h:36
#define BLI_assert(a)
Definition: BLI_assert.h:58
GSet * BLI_gset_ptr_new(const char *info)
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
Definition: BLI_ghash.c:1008
void BLI_gset_free(GSet *gs, GSetKeyFreeFP keyfreefp)
Definition: BLI_ghash.c:1253
GHash * BLI_ghash_ptr_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
bool BLI_ghash_ensure_p(GHash *gh, void *key, void ***r_val) ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.c:851
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:172
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
Definition: BLI_listbase.h:128
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
Definition: listbase.c:547
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:110
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:133
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void unit_m4(float m[4][4])
Definition: rct.c:1140
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE float normalize_v3_v3(float r[3], const float a[3])
MINLINE void copy_v3_fl(float r[3], float f)
MINLINE void zero_v3(float r[3])
#define BLI_memblock_create(elem_size)
Definition: BLI_memblock.h:44
void BLI_memblock_iternew(BLI_memblock *mblk, BLI_memblock_iter *iter) ATTR_NONNULL()
Definition: BLI_memblock.c:163
BLI_memblock * BLI_memblock_create_ex(uint elem_size, uint chunk_size) ATTR_WARN_UNUSED_RESULT
Definition: BLI_memblock.c:63
void * BLI_memblock_iterstep(BLI_memblock_iter *iter) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition: BLI_memblock.c:175
void * BLI_memblock_alloc(BLI_memblock *mblk) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition: BLI_memblock.c:133
void BLI_memblock_clear(BLI_memblock *mblk, MemblockValFreeFP free_callback) ATTR_NONNULL(1)
Definition: BLI_memblock.c:104
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
Definition: BLI_rect.h:157
void BLI_rcti_init(struct rcti *rect, int xmin, int xmax, int ymin, int ymax)
Definition: rct.c:446
void BLI_rctf_transform_calc_m4_pivot_min(const rctf *dst, const rctf *src, float matrix[4][4])
Definition: rct.c:592
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
Definition: BLI_rect.h:153
bool BLI_rcti_is_empty(const struct rcti *rect)
#define STRNCPY(dst, src)
Definition: BLI_string.h:163
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, const size_t maxncpy) ATTR_NONNULL()
Definition: string.c:108
unsigned int uint
Definition: BLI_sys_types.h:83
struct TaskGraph * BLI_task_graph_create(void)
Definition: task_graph.cc:112
void BLI_task_graph_free(struct TaskGraph *task_graph)
Definition: task_graph.cc:117
void BLI_task_graph_work_and_wait(struct TaskGraph *task_graph)
Definition: task_graph.cc:122
void BLI_ticket_mutex_unlock(TicketMutex *ticket)
Definition: threads.cc:590
void BLI_ticket_mutex_lock(TicketMutex *ticket)
Definition: threads.cc:576
void BLI_ticket_mutex_free(TicketMutex *ticket)
Definition: threads.cc:569
int BLI_thread_is_main(void)
Definition: threads.cc:234
TicketMutex * BLI_ticket_mutex_alloc(void)
Definition: threads.cc:558
#define UNUSED_VARS(...)
#define UNUSED(x)
#define ELEM(...)
struct Depsgraph Depsgraph
Definition: DEG_depsgraph.h:51
eEvaluationMode
Definition: DEG_depsgraph.h:60
@ DAG_EVAL_RENDER
Definition: DEG_depsgraph.h:62
@ DAG_EVAL_VIEWPORT
Definition: DEG_depsgraph.h:61
struct Scene * DEG_get_input_scene(const Depsgraph *graph)
bool DEG_id_type_any_exists(const struct Depsgraph *depsgraph, short id_type)
#define DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN(graph_, instance_)
bool DEG_is_original_id(const struct ID *id)
struct ViewLayer * DEG_get_evaluated_view_layer(const struct Depsgraph *graph)
#define DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END
struct Object * DEG_get_evaluated_object(const struct Depsgraph *depsgraph, struct Object *object)
struct Scene * DEG_get_evaluated_scene(const struct Depsgraph *graph)
void(* DrawDataFreeCb)(struct DrawData *engine_data)
Definition: DNA_ID.h:45
void(* DrawDataInitCb)(struct DrawData *engine_data)
Definition: DNA_ID.h:44
@ ID_GD
Definition: DNA_ID_enums.h:83
@ ID_WO
Definition: DNA_ID_enums.h:71
@ ID_OB
Definition: DNA_ID_enums.h:59
@ IMA_VIEW_AS_RENDER
@ IMA_SRC_GENERATED
@ BASE_FROM_DUPLI
@ BASE_SELECTABLE
@ BASE_VISIBLE_VIEWLAYER
@ BASE_VISIBLE_DEPSGRAPH
@ ME_EDIT_PAINT_VERT_SEL
@ ME_EDIT_PAINT_FACE_SEL
@ ME_SMOOTH
eNodeSocketDatatype
eDrawType
@ OB_WIRE
@ OB_SOLID
@ OB_RENDER
@ OB_MATERIAL
#define OB_MODE_ALL_WEIGHT_PAINT
eObjectMode
@ OB_MODE_PARTICLE_EDIT
@ OB_MODE_EDIT
@ OB_MODE_WEIGHT_PAINT
@ OB_MODE_SCULPT
@ OB_MODE_POSE
@ OB_MODE_TEXTURE_PAINT
@ OB_MODE_OBJECT
@ OB_MODE_VERTEX_PAINT
@ OB_MBALL
@ OB_SURF
@ OB_ARMATURE
@ OB_MESH
@ OB_CURVE
@ OB_GPENCIL
#define PSYS_HAIR_DYNAMICS
#define PTCACHE_BAKED
#define OBPOSE_FROM_OBACT(ob)
@ R_ADDSKY
#define OBEDIT_FROM_OBACT(ob)
#define PE_DRAW_PART
#define OBWEIGHTPAINT_FROM_OBACT(ob)
#define OBACT(_view_layer)
eSpaceImage_Flag
@ SI_SHOW_ZBUF
@ SI_SHOW_GPENCIL
@ SI_SHOW_ALPHA
eSpaceNode_Flag
@ SNODE_BACKDRAW
@ SNODE_SHOW_ALPHA
@ SPACE_NODE
@ SPACE_IMAGE
#define V3D_SHOW_ANNOTATION
@ V3D_OVERLAY_EDIT_OCCLUDE_WIRE
#define RV3D_LOCK_FLAGS(rv3d)
#define RV3D_CLIPPING_ENABLED(v3d, rv3d)
@ RV3D_BOXCLIP
#define RV3D_PAINTING
#define V3D_HIDE_OVERLAYS
@ V3D_OVERLAY_HIDE_TEXT
@ V3D_OVERLAY_BONE_SELECT
@ V3D_SHADING_SCENE_WORLD_RENDER
@ V3D_SHADING_SCENE_WORLD
@ V3D_SHADING_SCENE_LIGHTS
@ V3D_SHADING_SCENE_LIGHTS_RENDER
#define RV3D_NAVIGATING
@ V3D_GIZMO_HIDE
@ DRW_SELECT_PASS_POST
Definition: DRW_engine.h:76
@ DRW_SELECT_PASS_PRE
Definition: DRW_engine.h:75
bool(* DRW_ObjectFilterFn)(struct Object *ob, void *user_data)
Definition: DRW_engine.h:79
bool(* DRW_SelectPassFn)(eDRWSelectStage stage, void *user_data)
Definition: DRW_engine.h:78
@ DRW_STATE_WRITE_DEPTH
Definition: DRW_render.h:314
#define DRW_UBO_FREE_SAFE(ubo)
Definition: DRW_render.h:188
struct DRWPass DRWPass
Definition: DRW_render.h:79
#define DRW_STATE_DEPTH_TEST_ENABLED
Definition: DRW_render.h:369
struct DRWContextState DRWContextState
#define DRW_TEXTURE_FREE_SAFE(tex)
Definition: DRW_render.h:180
void ED_region_pixelspace(struct ARegion *region)
Definition: area.c:137
bScreen * ED_screen_animation_playing(const struct wmWindowManager *wm)
const rcti * ED_region_visible_rect(ARegion *region)
Definition: area.c:3682
#define REGION_DRAW_POST_VIEW
Definition: ED_space_api.h:66
void ED_region_draw_cb_draw(const struct bContext *, struct ARegion *, int)
#define REGION_DRAW_PRE_VIEW
Definition: ED_space_api.h:68
#define XRAY_ENABLED(v3d)
Definition: ED_view3d.h:710
struct RenderEngineType * ED_view3d_engine_type(const struct Scene *scene, int drawtype)
void ED_view3d_init_mats_rv3d(struct Object *ob, struct RegionView3D *rv3d)
Definition: space_view3d.c:190
void ED_view3d_clipping_local(struct RegionView3D *rv3d, const float mat[4][4])
Definition: view3d_edit.c:4921
static AppView * view
GPUBatch
Definition: GPU_batch.h:93
void GPU_batch_program_set_builtin_with_config(GPUBatch *batch, eGPUBuiltinShader shader_id, eGPUShaderConfig sh_cfg)
Definition: gpu_batch.cc:291
#define GPU_batch_uniform_4fv_array(batch, name, len, val)
Definition: GPU_batch.h:145
void GPU_batch_draw(GPUBatch *batch)
Definition: gpu_batch.cc:234
bool GPU_use_main_context_workaround(void)
void GPU_context_main_lock(void)
Definition: gpu_context.cc:149
void GPU_context_discard(GPUContext *)
Definition: gpu_context.cc:113
GPUContext * GPU_context_create(void *ghost_window)
Definition: gpu_context.cc:99
void GPU_context_active_set(GPUContext *)
Definition: gpu_context.cc:121
void GPU_context_main_unlock(void)
Definition: gpu_context.cc:154
GPUDrawList * GPU_draw_list_create(int length)
Definition: gpu_drawlist.cc:37
void GPU_draw_list_discard(GPUDrawList *list)
Definition: gpu_drawlist.cc:43
GPUFrameBuffer * GPU_framebuffer_back_get(void)
struct GPUFrameBuffer GPUFrameBuffer
#define GPU_FRAMEBUFFER_FREE_SAFE(fb)
bool GPU_framebuffer_check_valid(GPUFrameBuffer *fb, char err_out[256])
void GPU_framebuffer_restore(void)
GPUFrameBuffer * GPU_framebuffer_active_get(void)
void GPU_framebuffer_bind(GPUFrameBuffer *fb)
GPUFrameBuffer * GPU_framebuffer_create(const char *name)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble t
void GPU_matrix_identity_projection_set(void)
Definition: gpu_matrix.cc:170
void GPU_matrix_pop_projection(void)
Definition: gpu_matrix.cc:156
#define GPU_matrix_set(x)
Definition: GPU_matrix.h:224
#define GPU_matrix_mul(x)
Definition: GPU_matrix.h:223
#define GPU_matrix_projection_set(x)
Definition: GPU_matrix.h:225
void GPU_matrix_identity_set(void)
Definition: gpu_matrix.cc:184
void GPU_matrix_push_projection(void)
Definition: gpu_matrix.cc:149
eGPUShaderConfig
Definition: GPU_shader.h:391
@ GPU_SHADER_CFG_DEFAULT
Definition: GPU_shader.h:392
@ GPU_SHADER_CFG_CLIPPED
Definition: GPU_shader.h:393
@ GPU_SHADER_3D_DEPTH_ONLY
Definition: GPU_shader.h:247
@ GPU_BLEND_NONE
Definition: GPU_state.h:55
@ GPU_BLEND_ALPHA_PREMULT
Definition: GPU_state.h:58
void GPU_blend(eGPUBlend blend)
Definition: gpu_state.cc:55
void GPU_apply_state(void)
Definition: gpu_state.cc:321
void GPU_flush(void)
Definition: gpu_state.cc:311
void GPU_finish(void)
Definition: gpu_state.cc:316
void GPU_viewport(int x, int y, int width, int height)
Definition: gpu_state.cc:210
@ GPU_DEPTH_LESS_EQUAL
Definition: GPU_state.h:81
@ GPU_DEPTH_NONE
Definition: GPU_state.h:78
void GPU_depth_test(eGPUDepthTest test)
Definition: gpu_state.cc:75
void GPU_clip_distances(int distances_enabled)
Definition: gpu_state.cc:131
int GPU_texture_height(const GPUTexture *tex)
Definition: gpu_texture.cc:532
struct GPUTexture GPUTexture
Definition: GPU_texture.h:33
int GPU_texture_width(const GPUTexture *tex)
Definition: gpu_texture.cc:527
void GPU_texture_free(GPUTexture *tex)
Definition: gpu_texture.cc:508
GPUTexture * GPU_texture_create_2d(const char *name, int w, int h, int mip_len, eGPUTextureFormat format, const float *data)
Definition: gpu_texture.cc:250
@ GPU_DEPTH_COMPONENT24
Definition: GPU_texture.h:167
GPUUniformBuf * GPU_uniformbuf_create_ex(size_t size, const void *data, const char *name)
double * GPU_viewport_cache_time_get(GPUViewport *viewport)
Definition: gpu_viewport.c:351
void GPU_viewport_active_view_set(GPUViewport *viewport, int view)
Definition: gpu_viewport.c:321
void GPU_viewport_colorspace_set(GPUViewport *viewport, ColorManagedViewSettings *view_settings, ColorManagedDisplaySettings *display_settings, float dither)
Definition: gpu_viewport.c:557
void * GPU_viewport_engine_data_get(GPUViewport *viewport, void *engine_handle)
Definition: gpu_viewport.c:294
struct DRWInstanceDataList * GPU_viewport_instance_data_list_get(GPUViewport *viewport)
Definition: gpu_viewport.c:311
bool GPU_viewport_engines_data_validate(GPUViewport *viewport, void **engine_handle_array)
Definition: gpu_viewport.c:428
GPUViewport * GPU_viewport_create(void)
Definition: gpu_viewport.c:144
void GPU_viewport_unbind_from_offscreen(GPUViewport *viewport, struct GPUOffScreen *ofs, bool display_colorspace, bool do_overlay_merge)
Definition: gpu_viewport.c:875
void * GPU_viewport_texture_list_get(GPUViewport *viewport)
Definition: gpu_viewport.c:331
void GPU_viewport_bind_from_offscreen(GPUViewport *viewport, struct GPUOffScreen *ofs)
Definition: gpu_viewport.c:536
void GPU_viewport_free(GPUViewport *viewport)
Definition: gpu_viewport.c:978
void GPU_viewport_size_set(GPUViewport *viewport, const int size[2])
Definition: gpu_viewport.c:346
void GPU_viewport_tag_update(GPUViewport *viewport)
Definition: gpu_viewport.c:132
void * GPU_viewport_framebuffer_list_get(GPUViewport *viewport)
Definition: gpu_viewport.c:326
void GPU_viewport_cache_release(GPUViewport *viewport)
Definition: gpu_viewport.c:439
void * GPU_viewport_engine_data_create(GPUViewport *viewport, void *engine_type)
Definition: gpu_viewport.c:222
ViewportMemoryPool * GPU_viewport_mempool_get(GPUViewport *viewport)
Definition: gpu_viewport.c:306
void GPU_viewport_size_get(const GPUViewport *viewport, int size[2])
Definition: gpu_viewport.c:336
#define MEM_SAFE_FREE(v)
#define RE_INTERNAL
Definition: RE_engine.h:57
#define C
Definition: RandGen.cpp:39
@ TH_TEXT_HI
Definition: UI_resources.h:59
void UI_FontThemeColor(int fontid, int colorid)
Definition: resources.c:1156
void ED_annotation_draw_view2d(const bContext *C, bool onlyv2d)
void ED_annotation_draw_view3d(Scene *scene, struct Depsgraph *depsgraph, View3D *v3d, ARegion *region, bool only3d)
DrawEngineType draw_engine_basic_type
Definition: basic_engine.c:249
return(oflags[bm->toolflag_index].f &oflag) !=0
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition: btDbvt.cpp:52
unsigned int U
Definition: btGjkEpa3.h:78
Scene scene
const Depsgraph * depsgraph
void * user_data
DEGForeachIDComponentCallback callback
void drw_batch_cache_generate_requested(Object *ob)
Definition: draw_cache.c:3573
void DRW_shape_cache_free(void)
Definition: draw_cache.c:156
void DRW_batch_cache_free_old(Object *ob, int ctime)
Definition: draw_cache.c:3613
void DRW_particle_batch_cache_free(struct ParticleSystem *psys)
void DRW_hair_batch_cache_dirty_tag(struct Hair *hair, int mode)
void DRW_hair_batch_cache_free(struct Hair *hair)
void DRW_mesh_batch_cache_create_requested(struct TaskGraph *task_graph, struct Object *ob, struct Mesh *me, const struct Scene *scene, const bool is_paint_mode, const bool use_hide)
void DRW_curve_batch_cache_free(struct Curve *cu)
void DRW_lattice_batch_cache_free(struct Lattice *lt)
void DRW_gpencil_batch_cache_dirty_tag(struct bGPdata *gpd)
void DRW_lattice_batch_cache_dirty_tag(struct Lattice *lt, int mode)
void DRW_gpencil_batch_cache_free(struct bGPdata *gpd)
void DRW_volume_batch_cache_free(struct Volume *volume)
void DRW_particle_batch_cache_dirty_tag(struct ParticleSystem *psys, int mode)
void DRW_mball_batch_cache_dirty_tag(struct MetaBall *mb, int mode)
void DRW_mesh_batch_cache_dirty_tag(struct Mesh *me, eMeshBatchDirtyMode mode)
void DRW_mball_batch_cache_free(struct MetaBall *mb)
void DRW_pointcloud_batch_cache_dirty_tag(struct PointCloud *pointcloud, int mode)
void DRW_volume_batch_cache_dirty_tag(struct Volume *volume, int mode)
void DRW_pointcloud_batch_cache_free(struct PointCloud *pointcloud)
struct GPUBatch * DRW_mesh_batch_cache_get_edit_triangles(struct Mesh *me)
void DRW_mesh_batch_cache_free(struct Mesh *me)
void DRW_curve_batch_cache_dirty_tag(struct Curve *cu, int mode)
struct GPUBatch * DRW_mesh_batch_cache_get_surface(struct Mesh *me)
void DRW_globals_update(void)
Definition: draw_common.c:52
struct DRW_Global G_draw
Definition: draw_common.c:45
void DRW_globals_free(void)
Definition: draw_common.c:267
void DRW_hair_update(void)
Definition: draw_hair.c:300
void DRW_hair_init(void)
Definition: draw_hair.c:103
void DRW_hair_free(void)
Definition: draw_hair.c:376
void drw_debug_draw(void)
Definition: draw_debug.c:221
void drw_debug_init(void)
Definition: draw_debug.c:227
void * DRW_instance_data_next(DRWInstanceData *idata)
void DRW_instance_data_list_free_unused(DRWInstanceDataList *idatalist)
DRWInstanceData * DRW_instance_data_request(DRWInstanceDataList *idatalist, uint attr_size)
GHash * DRW_uniform_attrs_pool_new()
void DRW_instance_buffer_finish(DRWInstanceDataList *idatalist)
void DRW_uniform_attrs_pool_clear_all(GHash *table)
void DRW_instance_data_list_reset(DRWInstanceDataList *idatalist)
void DRW_instance_data_list_resize(DRWInstanceDataList *idatalist)
#define MAX_INSTANCE_DATA_SIZE
void DRW_drawdata_free(ID *id)
Definition: draw_manager.c:944
const float * DRW_viewport_pixelsize_get(void)
Definition: draw_manager.c:454
bool DRW_state_is_opengl_render(void)
static void drw_viewport_var_init(void)
Definition: draw_manager.c:555
struct Object * DRW_object_get_dupli_parent(const Object *UNUSED(ob))
Definition: draw_manager.c:301
void DRW_opengl_context_create(void)
void DRW_gpu_render_context_enable(void *re_gpu_context)
bool DRW_state_is_playback(void)
static void drw_engines_enable_overlays(void)
void DRW_draw_depth_loop_gpencil(struct Depsgraph *depsgraph, ARegion *region, View3D *v3d, GPUViewport *viewport)
bool DRW_render_check_grease_pencil(Depsgraph *depsgraph)
void ** DRW_duplidata_get(void *vedata)
Definition: draw_manager.c:767
bool DRW_state_is_select(void)
static void drw_engines_world_update(Scene *scene)
static void drw_engines_draw_text(void)
void DRW_draw_region_engine_info(int xoffset, int *yoffset, int line_height)
static void drw_engines_enable(ViewLayer *UNUSED(view_layer), RenderEngineType *engine_type, bool gpencil_engine_needed)
void DRW_draw_view(const bContext *C)
DrawData * DRW_drawdata_ensure(ID *id, DrawEngineType *engine_type, size_t size, DrawDataInitCb init_cb, DrawDataFreeCb free_cb)
Definition: draw_manager.c:899
bool DRW_state_show_text(void)
void DRW_draw_select_id(Depsgraph *depsgraph, ARegion *region, View3D *v3d, const rcti *rect)
static void drw_engines_cache_finish(void)
void DRW_engines_free(void)
bool DRW_state_is_navigating(void)
void DRW_opengl_context_enable(void)
bool DRW_state_is_depth(void)
bool DRW_engine_render_support(DrawEngineType *draw_engine_type)
void DRW_draw_select_loop(struct Depsgraph *depsgraph, ARegion *region, View3D *v3d, bool use_obedit_skip, bool draw_surface, bool UNUSED(use_nearest), const rcti *rect, DRW_SelectPassFn select_pass_fn, void *select_pass_user_data, DRW_ObjectFilterFn object_filter_fn, void *object_filter_user_data)
struct IdDdtTemplate IdDdtTemplate
void * DRW_view_layer_engine_data_get(DrawEngineType *engine_type)
Definition: draw_manager.c:787
static void drw_task_graph_deinit(void)
Definition: draw_manager.c:165
void ** DRW_view_layer_engine_data_ensure(DrawEngineType *engine_type, void(*callback)(void *storage))
Definition: draw_manager.c:817
void DRW_notify_view_update(const DRWUpdateContext *update_ctx)
static void drw_engines_init(void)
static void drw_engines_data_validate(void)
bool DRW_object_is_in_edit_mode(const Object *ob)
Definition: draw_manager.c:204
void DRW_render_viewport_size_set(const int size[2])
Definition: draw_manager.c:431
static void drw_engines_draw_scene(void)
static void duplidata_value_free(void *val)
Definition: draw_manager.c:747
void DRW_opengl_render_context_disable(void *re_gl_context)
static void use_drw_engine(DrawEngineType *engine)
DefaultFramebufferList * DRW_viewport_framebuffer_list_get(void)
Definition: draw_manager.c:697
void DRW_draw_depth_loop(struct Depsgraph *depsgraph, ARegion *region, View3D *v3d, GPUViewport *viewport)
void DRW_render_instance_buffer_finish(void)
static void DRW_render_gpencil_to_image(RenderEngine *engine, struct RenderLayer *render_layer, const rcti *rect)
bool DRW_state_do_color_management(void)
void DRW_engines_register(void)
void DRW_draw_render_loop_ex(struct Depsgraph *depsgraph, RenderEngineType *engine_type, ARegion *region, View3D *v3d, GPUViewport *viewport, const bContext *evil_C)
static void drw_state_prepare_clean_for_draw(DRWManager *dst)
Definition: draw_manager.c:115
bool DRW_object_is_renderable(const Object *ob)
Definition: draw_manager.c:183
void DRW_opengl_context_disable_ex(bool restore)
static void drw_context_state_init(void)
Definition: draw_manager.c:493
void DRW_cache_free_old_batches(Main *bmain)
Definition: draw_manager.c:981
void DRW_draw_render_loop_offscreen(struct Depsgraph *depsgraph, RenderEngineType *engine_type, ARegion *region, View3D *v3d, const bool is_image_render, const bool draw_background, const bool do_color_management, GPUOffScreen *ofs, GPUViewport *viewport)
DRWManager DST
Definition: draw_manager.c:111
void DRW_render_gpencil(struct RenderEngine *engine, struct Depsgraph *depsgraph)
void * drw_viewport_engine_data_ensure(void *engine_type)
Definition: draw_manager.c:401
void DRW_draw_depth_object(Scene *scene, ARegion *region, View3D *v3d, GPUViewport *viewport, Object *object)
void ** DRW_view_layer_engine_data_ensure_ex(ViewLayer *view_layer, DrawEngineType *engine_type, void(*callback)(void *storage))
Definition: draw_manager.c:797
int DRW_object_visibility_in_active_context(const Object *ob)
Definition: draw_manager.c:235
void DRW_draw_callbacks_post_scene(void)
static void drw_engines_enable_basic(void)
static bool drw_draw_show_annotation(void)
Definition: draw_manager.c:131
bool DRW_state_draw_support(void)
void DRW_render_context_disable(Render *render)
bool DRW_state_is_fbo(void)
static void drw_duplidata_load(DupliObject *dupli)
Definition: draw_manager.c:718
struct DupliObject * DRW_object_get_dupli(const Object *UNUSED(ob))
Definition: draw_manager.c:306
static void drw_engines_cache_populate(Object *ob)
bool DRW_object_is_visible_psys_in_active_context(const Object *object, const ParticleSystem *psys)
Definition: draw_manager.c:271
const DRWContextState * DRW_context_state_get(void)
void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph)
void DRW_draw_callbacks_pre_scene(void)
static void drw_draw_depth_loop_impl(struct Depsgraph *depsgraph, ARegion *region, View3D *v3d, GPUViewport *viewport, const bool use_opengl_context)
bool DRW_state_draw_background(void)
static void draw_unit_state_create(void)
Definition: draw_manager.c:527
bool DRW_object_is_flat_normal(const Object *ob)
Definition: draw_manager.c:241
static void drw_engines_enable_from_engine(const RenderEngineType *engine_type, eDrawType drawtype)
static void drw_engines_enable_editors(void)
void DRW_opengl_context_enable_ex(bool UNUSED(restore))
void DRW_opengl_render_context_enable(void *re_gl_context)
void DRW_cache_restart(void)
DrawData * DRW_drawdata_get(ID *id, DrawEngineType *engine_type)
Definition: draw_manager.c:883
static void drw_engines_cache_init(void)
static void draw_render_result_ensure_pass_cb(void *user_data, struct Scene *UNUSED(scene), struct ViewLayer *view_layer, const char *name, int channels, const char *chanid, eNodeSocketDatatype UNUSED(type))
static void drw_task_graph_init(void)
Definition: draw_manager.c:158
const float * DRW_viewport_size_get(void)
Definition: draw_manager.c:439
void DRW_draw_render_loop_2d_ex(struct Depsgraph *depsgraph, ARegion *region, GPUViewport *viewport, const bContext *evil_C)
static bool drw_gpencil_engine_needed(Depsgraph *depsgraph, View3D *v3d)
bool DRW_object_use_hide_faces(const struct Object *ob)
Definition: draw_manager.c:252
void DRW_engine_register(DrawEngineType *draw_engine_type)
static struct DRWSelectBuffer g_select_buffer
const float * DRW_viewport_screenvecs_get(void)
Definition: draw_manager.c:449
void DRW_opengl_context_disable(void)
void DRW_render_set_time(RenderEngine *engine, Depsgraph *depsgraph, int frame, float subframe)
static void drw_engines_disable(void)
bool DRW_state_is_image_render(void)
void DRW_opengl_context_destroy(void)
void DRW_custom_pipeline(DrawEngineType *draw_engine_type, struct Depsgraph *depsgraph, void(*callback)(void *vedata, void *user_data), void *user_data)
const float * DRW_viewport_invert_size_get(void)
Definition: draw_manager.c:444
DrawDataList * DRW_drawdatalist_from_id(ID *id)
Definition: draw_manager.c:869
static void drw_duplidata_free(void)
Definition: draw_manager.c:756
static bool id_can_have_drawdata(const ID *id)
Definition: draw_manager.c:856
void DRW_engine_viewport_data_size_get(const void *engine_type_v, int *r_fbl_len, int *r_txl_len, int *r_psl_len, int *r_stl_len)
Definition: draw_manager.c:411
void DRW_render_context_enable(Render *render)
static ListBase DRW_engines
Definition: draw_manager.c:113
static void drw_viewport_colormanagement_set(void)
Definition: draw_manager.c:318
void DRW_gpu_render_context_disable(void *UNUSED(re_gpu_context))
bool DRW_state_is_scene_render(void)
static void draw_select_framebuffer_depth_only_setup(const int size[2])
void DRW_viewport_request_redraw(void)
Definition: draw_manager.c:707
struct DRWTextStore * DRW_text_cache_ensure(void)
DefaultTextureList * DRW_viewport_texture_list_get(void)
Definition: draw_manager.c:702
void DRW_render_object_iter(void *vedata, RenderEngine *engine, struct Depsgraph *depsgraph, void(*callback)(void *vedata, Object *ob, RenderEngine *engine, struct Depsgraph *depsgraph))
static void drw_drawdata_unlink_dupli(ID *id)
Definition: draw_manager.c:962
static void drw_viewport_cache_resize(void)
Definition: draw_manager.c:459
void DRW_draw_render_loop(struct Depsgraph *depsgraph, ARegion *region, View3D *v3d, GPUViewport *viewport)
static bool id_type_can_have_drawdata(const short id_type)
Definition: draw_manager.c:840
#define PROFILE_END_UPDATE(time_update, time_start)
Definition: draw_manager.h:79
#define PROFILE_START(time_start)
Definition: draw_manager.h:68
#define DRW_DRAWLIST_LEN
Definition: draw_manager.h:486
#define DRW_RESOURCE_CHUNK_LEN
Definition: draw_manager.h:115
struct DRWObjectInfos DRWObjectInfos
struct DRWObjectMatrix DRWObjectMatrix
BLI_INLINE void DRW_handle_increment(DRWResourceHandle *handle)
Definition: draw_manager.h:148
struct DRWCullingState DRWCullingState
void drw_resource_buffer_finish(ViewportMemoryPool *vmempool)
DRWView * DRW_view_create(const float viewmat[4][4], const float winmat[4][4], const float(*culling_viewmat)[4], const float(*culling_winmat)[4], DRWCallVisibilityFn *visibility_fn)
void DRW_view_clip_planes_set(DRWView *view, float(*planes)[4], int plane_len)
void DRW_view_camtexco_set(DRWView *view, float texco[4])
void DRW_view_reset(void)
void DRW_state_reset(void)
void DRW_state_lock(DRWState state)
void DRW_select_load_id(uint id)
void DRW_stats_begin(void)
void DRW_stats_group_start(const char *name)
void DRW_stats_reset(void)
void DRW_stats_draw(const rcti *rect)
void DRW_stats_group_end(void)
void DRW_stats_free(void)
void DRW_text_cache_draw(DRWTextStore *dt, ARegion *region, struct View3D *v3d)
DRWTextStore * DRW_text_cache_create(void)
void DRW_text_cache_destroy(struct DRWTextStore *dt)
void DRW_draw_cursor_2d(void)
Definition: draw_view.c:220
void DRW_draw_gizmo_2d(void)
Definition: draw_view.c:274
void DRW_draw_region_info(void)
Definition: draw_view.c:51
void DRW_draw_gizmo_3d(void)
Definition: draw_view.c:263
GPUBatch * batch
Definition: drawnode.c:3779
RenderEngineType DRW_engine_viewport_eevee_type
Definition: eevee_engine.c:639
void RE_engine_frame_set(RenderEngine *engine, int frame, float subframe)
Definition: engine.c:711
void RE_engine_update_render_passes(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer, update_render_passes_cb_t callback, void *callback_data)
Definition: engine.c:1071
void RE_engine_add_pass(RenderEngine *engine, const char *name, int channels, const char *chan_id, const char *layername)
Definition: engine.c:359
void RE_engines_register(RenderEngineType *render_type)
Definition: engine.c:100
RenderResult * RE_engine_get_result(RenderEngine *engine)
Definition: engine.c:428
void RE_engine_end_result(RenderEngine *engine, RenderResult *result, bool cancel, bool highlight, bool merge_results)
Definition: engine.c:374
ListBase R_engines
Definition: engine.c:72
RenderResult * RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h, const char *layername, const char *viewname)
Definition: engine.c:279
T * data_
RenderEngineType DRW_engine_viewport_external_type
DrawEngineType draw_engine_gpencil_type
void GPU_framebuffer_texture_attach(GPUFrameBuffer *fb, GPUTexture *tex, int slot, int mip)
void GPU_clear_color(float red, float green, float blue, float alpha)
void GPU_offscreen_bind(GPUOffScreen *ofs, bool save)
DrawEngineType draw_engine_image_type
Definition: image_engine.c:429
void RE_GetViewPlane(Render *re, rctf *r_viewplane, rcti *r_disprect)
Definition: initrender.c:235
#define GS(x)
Definition: iris.c:241
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:41
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:45
void *(* MEM_mallocN)(size_t len, const char *str)
Definition: mallocn.c:47
static ulong * next
void drw_batch_cache_validate(Object *custom)
Definition: draw_cache.c:3538
DrawEngineType draw_engine_overlay_type
void * RE_gpu_context_get(Render *re)
Definition: pipeline.c:996
void * RE_gl_context_get(Render *re)
Definition: pipeline.c:991
RenderLayer * RE_GetRenderLayer(RenderResult *rr, const char *name)
Definition: pipeline.c:276
void RE_SetActiveRenderView(Render *re, const char *viewname)
Definition: pipeline.c:1741
DrawEngineType draw_engine_select_type
struct SELECTID_Context * DRW_select_engine_context_get(void)
void * regiondata
float radius
Definition: DRW_render.h:87
struct Object * obact
Definition: DRW_render.h:749
struct Scene * scene
Definition: DRW_render.h:745
struct SpaceLink * space_data
Definition: DRW_render.h:743
const struct bContext * evil_C
Definition: DRW_render.h:763
struct Depsgraph * depsgraph
Definition: DRW_render.h:753
eGPUShaderConfig sh_cfg
Definition: DRW_render.h:759
struct ViewLayer * view_layer
Definition: DRW_render.h:746
eObjectMode object_mode
Definition: DRW_render.h:757
struct View3D * v3d
Definition: DRW_render.h:742
struct ARegion * region
Definition: DRW_render.h:740
struct Object * object_pose
Definition: DRW_render.h:768
struct Object * object_edit
Definition: DRW_render.h:769
struct RegionView3D * rv3d
Definition: DRW_render.h:741
BoundSphere bsphere
Definition: draw_manager.h:106
uint is_image_render
Definition: draw_manager.h:531
struct DupliObject * dupli_source
Definition: draw_manager.h:502
DRWResourceHandle ob_handle
Definition: draw_manager.h:493
uint draw_background
Definition: draw_manager.h:534
DRWResourceHandle pass_handle
Definition: draw_manager.h:499
DRWView * view_active
Definition: draw_manager.h:551
struct TaskGraph * task_graph
Definition: draw_manager.h:562
DRWContextState draw_ctx
Definition: draw_manager.h:539
DRWView * view_previous
Definition: draw_manager.h:552
float size[2]
Definition: draw_manager.h:523
bool buffer_finish_called
Definition: draw_manager.h:548
DRWResourceHandle resource_handle
Definition: draw_manager.h:497
float inv_size[2]
Definition: draw_manager.h:524
uint primary_view_ct
Definition: draw_manager.h:553
void ** dupli_datas
Definition: draw_manager.h:510
GPUViewport * viewport
Definition: draw_manager.h:521
ListBase enabled_engines
Definition: draw_manager.h:544
void ** vedata_array
Definition: draw_manager.h:545
float screenvecs[2][3]
Definition: draw_manager.h:525
struct DRWTextStore ** text_store_p
Definition: draw_manager.h:542
DRWInstanceData * object_instance_data[MAX_INSTANCE_DATA_SIZE]
Definition: draw_manager.h:508
float pixsize
Definition: draw_manager.h:526
struct Object * dupli_parent
Definition: draw_manager.h:503
struct GSet * delayed_extraction
Definition: draw_manager.h:564
uint do_color_management
Definition: draw_manager.h:533
struct GHash * dupli_ghash
Definition: draw_manager.h:506
ViewportMemoryPool * vmempool
Definition: draw_manager.h:490
struct GPUFrameBuffer * default_framebuffer
Definition: draw_manager.h:522
uint is_scene_render
Definition: draw_manager.h:532
struct DRWManager::@295 options
uint is_select
Definition: draw_manager.h:529
GPUDrawList * draw_list
Definition: draw_manager.h:576
struct Object * dupli_origin
Definition: draw_manager.h:504
int enabled_engine_count
Definition: draw_manager.h:546
uint draw_text
Definition: draw_manager.h:535
DRWInstanceDataList * idatalist
Definition: draw_manager.h:491
TicketMutex * gl_context_mutex
Definition: draw_manager.h:574
DRWView * view_default
Definition: draw_manager.h:550
GPUContext * gpu_context
Definition: draw_manager.h:572
void * gl_context
Definition: draw_manager.h:571
float orcotexfac[2][4]
Definition: draw_manager.h:172
float ob_color[4]
Definition: draw_manager.h:173
float modelinverse[4][4]
Definition: draw_manager.h:168
float model[4][4]
Definition: draw_manager.h:167
struct GPUFrameBuffer * framebuffer_depth_only
struct GPUTexture * texture_depth
struct Scene * scene
Definition: DRW_engine.h:66
struct View3D * v3d
Definition: DRW_engine.h:69
struct ARegion * region
Definition: DRW_engine.h:68
struct RenderEngineType * engine_type
Definition: DRW_engine.h:70
struct ViewLayer * view_layer
Definition: DRW_engine.h:67
struct Depsgraph * depsgraph
Definition: DRW_engine.h:65
struct GPUUniformBuf * block_ubo
Definition: draw_common.h:210
struct GPUTexture * weight_ramp
Definition: draw_common.h:213
struct GPUTexture * ramp
Definition: draw_common.h:212
struct GPUUniformBuf * view_ubo
Definition: draw_common.h:215
struct GPUFrameBuffer * depth_only_fb
struct GPUFrameBuffer * overlay_fb
struct GPUFrameBuffer * default_fb
struct DrawEngineType * engine_type
Definition: DNA_ID.h:51
DrawDataFreeCb free
Definition: DNA_ID.h:53
void(* store_metadata)(void *vedata, struct RenderResult *render_result)
Definition: DRW_render.h:134
void(* cache_populate)(void *vedata, struct Object *ob)
Definition: DRW_render.h:122
char idname[32]
Definition: DRW_render.h:114
void(* id_update)(void *vedata, struct ID *id)
Definition: DRW_render.h:128
void(* render_to_image)(void *vedata, struct RenderEngine *engine, struct RenderLayer *layer, const struct rcti *rect)
Definition: DRW_render.h:130
void(* engine_init)(void *vedata)
Definition: DRW_render.h:118
const DrawEngineDataSize * vedata_size
Definition: DRW_render.h:116
void(* draw_scene)(void *vedata)
Definition: DRW_render.h:125
void(* view_update)(void *vedata)
Definition: DRW_render.h:127
void(* cache_init)(void *vedata)
Definition: DRW_render.h:121
void(* cache_finish)(void *vedata)
Definition: DRW_render.h:123
struct Object * ob
Definition: BKE_duplilist.h:45
DefaultFramebufferList * fbl
Definition: gpu_viewport.c:98
Definition: DNA_ID.h:273
void * next
Definition: DNA_ID.h:274
char name[66]
Definition: DNA_ID.h:283
struct AnimData * adt
Definition: draw_manager.c:835
DrawDataList drawdata
Definition: draw_manager.c:836
void * data
Definition: DNA_listBase.h:42
void * first
Definition: DNA_listBase.h:47
Definition: BKE_main.h:116
ListBase scenes
Definition: BKE_main.h:146
struct BMEditMesh * edit_mesh
char editflag
struct MPoly * mpoly
short base_flag
float obmat[4][4]
void * data
ParticleSettings * part
struct PointCache * pointcache
float viewcamtexcofac[4]
float clip[6][4]
float viewmat[4][4]
float clip_local[6][4]
float viewinv[4][4]
float winmat[4][4]
float dither_intensity
struct DrawEngineType * draw_engine
Definition: RE_engine.h:111
RenderEngineType * type
Definition: RE_engine.h:126
struct Render * re
Definition: RE_engine.h:136
int resolution_x
Definition: RE_engine.h:140
int resolution_y
Definition: RE_engine.h:140
ListBase views
Definition: RE_pipeline.h:138
ListBase layers
Definition: RE_pipeline.h:135
char name[RE_MAXNAME]
Definition: render_types.h:72
struct Object ** objects
struct ToolSettings * toolsettings
ColorManagedViewSettings view_settings
struct RenderData r
ListBase view_layers
struct World * world
ColorManagedDisplaySettings display_settings
struct Image * image
struct ParticleEditSettings particle
View3DOverlay overlay
int object_type_exclude_select
int object_type_exclude_viewport
char gizmo_flag
View3DShading shading
struct DrawEngineType * engine_type
struct ViewLayerEngineData * next
void(* free)(void *storage)
ListBase drawdata
struct ViewLayer * next
char name[64]
struct BLI_memblock * commands_small
Definition: GPU_viewport.h:49
struct BLI_memblock * obmats
Definition: GPU_viewport.h:51
struct BLI_memblock * cullstates
Definition: GPU_viewport.h:53
struct BLI_memblock * views
Definition: GPU_viewport.h:56
struct BLI_memblock * obinfos
Definition: GPU_viewport.h:52
struct BLI_memblock * passes
Definition: GPU_viewport.h:57
struct BLI_memblock * images
Definition: GPU_viewport.h:58
struct GHash * obattrs_ubo_pool
Definition: GPU_viewport.h:61
struct BLI_memblock * callbuffers
Definition: GPU_viewport.h:50
struct BLI_memblock * shgroups
Definition: GPU_viewport.h:54
struct BLI_memblock * commands
Definition: GPU_viewport.h:48
struct BLI_memblock * uniforms
Definition: GPU_viewport.h:55
float xmax
Definition: DNA_vec_types.h:85
float xmin
Definition: DNA_vec_types.h:85
float ymax
Definition: DNA_vec_types.h:86
float ymin
Definition: DNA_vec_types.h:86
double PIL_check_seconds_timer(void)
Definition: time.c:80
static void draw_background(const rcti *rect)
Definition: time_scrub_ui.c:63
#define G(x, y, z)
GPUViewport * WM_draw_region_get_viewport(ARegion *region)
Definition: wm_draw.c:634
GPUViewport * WM_draw_region_get_bound_viewport(ARegion *region)
Definition: wm_draw.c:644
void WM_init_opengl(void)
Definition: wm_init_exit.c:178
void wmOrtho2(float x1, float x2, float y1, float y2)
Definition: wm_subwindow.c:100
void * WM_opengl_context_create(void)
Definition: wm_window.c:2421
void wm_window_reset_drawable(void)
Definition: wm_window.c:1074
void WM_opengl_context_activate(void *context)
Definition: wm_window.c:2443
void WM_opengl_context_release(void *context)
Definition: wm_window.c:2449
void WM_opengl_context_dispose(void *context)
Definition: wm_window.c:2437
RenderEngineType DRW_engine_viewport_workbench_type