Blender  V3.3
draw_view_data.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2021 Blender Foundation. */
3 
8 #include "BLI_vector.hh"
9 
10 #include "GPU_viewport.h"
11 
12 #include "DRW_render.h"
13 
14 #include "draw_instance_data.h"
15 
16 #include "draw_manager_text.h"
17 
18 #include "draw_manager.h"
19 #include "draw_view_data.h"
20 
21 using namespace blender;
22 
23 struct DRWViewData {
25  DefaultTextureList dtxl = {};
27  bool from_viewport = false;
30  int texture_list_size[2] = {0, 0};
31 
32  double cache_time = 0.0;
33 
36 };
37 
39 {
40  const int engine_types_len = BLI_listbase_count(engine_types);
41 
42  DRWViewData *view_data = new DRWViewData();
43  view_data->engines.reserve(engine_types_len);
44  LISTBASE_FOREACH (DRWRegisteredDrawEngine *, type, engine_types) {
45  ViewportEngineData engine = {};
46  engine.engine_type = type;
47  view_data->engines.append(engine);
48  }
49  return view_data;
50 }
51 
53 {
54  int active_view = GPU_viewport_active_view_get(viewport);
55  view_data->from_viewport = true;
56 
57  DefaultFramebufferList *dfbl = &view_data->dfbl;
58  DefaultTextureList *dtxl = &view_data->dtxl;
59  /* Depth texture is shared between both stereo views. */
60  dtxl->depth = GPU_viewport_depth_texture(viewport);
61  dtxl->color = GPU_viewport_color_texture(viewport, active_view);
62  dtxl->color_overlay = GPU_viewport_overlay_texture(viewport, active_view);
63 
64  GPU_framebuffer_ensure_config(&dfbl->default_fb,
65  {
66  GPU_ATTACHMENT_TEXTURE(dtxl->depth),
67  GPU_ATTACHMENT_TEXTURE(dtxl->color),
68  });
69  GPU_framebuffer_ensure_config(&dfbl->overlay_fb,
70  {
71  GPU_ATTACHMENT_TEXTURE(dtxl->depth),
72  GPU_ATTACHMENT_TEXTURE(dtxl->color_overlay),
73  });
74  GPU_framebuffer_ensure_config(&dfbl->depth_only_fb,
75  {
76  GPU_ATTACHMENT_TEXTURE(dtxl->depth),
77  GPU_ATTACHMENT_NONE,
78  });
79  GPU_framebuffer_ensure_config(&dfbl->color_only_fb,
80  {
81  GPU_ATTACHMENT_NONE,
82  GPU_ATTACHMENT_TEXTURE(dtxl->color),
83  });
84  GPU_framebuffer_ensure_config(&dfbl->overlay_only_fb,
85  {
86  GPU_ATTACHMENT_NONE,
87  GPU_ATTACHMENT_TEXTURE(dtxl->color_overlay),
88  });
89 }
90 
91 static void draw_viewport_engines_data_clear(ViewportEngineData *data, bool clear_instance_data)
92 {
93  DrawEngineType *engine_type = data->engine_type->draw_engine;
94  const DrawEngineDataSize *data_size = engine_type->vedata_size;
95 
96  for (int i = 0; data->fbl && i < data_size->fbl_len; i++) {
97  GPU_FRAMEBUFFER_FREE_SAFE(data->fbl->framebuffers[i]);
98  }
99  for (int i = 0; data->txl && i < data_size->txl_len; i++) {
100  GPU_TEXTURE_FREE_SAFE(data->txl->textures[i]);
101  }
102  for (int i = 0; data->stl && i < data_size->stl_len; i++) {
103  MEM_SAFE_FREE(data->stl->storage[i]);
104  }
105 
106  if (clear_instance_data && data->instance_data) {
107  BLI_assert(engine_type->instance_free != nullptr);
108  engine_type->instance_free(data->instance_data);
109  data->instance_data = nullptr;
110  }
111 
112  MEM_SAFE_FREE(data->fbl);
113  MEM_SAFE_FREE(data->txl);
114  MEM_SAFE_FREE(data->psl);
115  MEM_SAFE_FREE(data->stl);
116 
117  if (data->text_draw_cache) {
118  DRW_text_cache_destroy(data->text_draw_cache);
119  data->text_draw_cache = nullptr;
120  }
121 }
122 
123 static void draw_view_data_clear(DRWViewData *view_data, bool free_instance_data)
124 {
125  GPU_FRAMEBUFFER_FREE_SAFE(view_data->dfbl.default_fb);
126  GPU_FRAMEBUFFER_FREE_SAFE(view_data->dfbl.overlay_fb);
127  GPU_FRAMEBUFFER_FREE_SAFE(view_data->dfbl.in_front_fb);
128  GPU_FRAMEBUFFER_FREE_SAFE(view_data->dfbl.color_only_fb);
129  GPU_FRAMEBUFFER_FREE_SAFE(view_data->dfbl.depth_only_fb);
130  GPU_FRAMEBUFFER_FREE_SAFE(view_data->dfbl.overlay_only_fb);
131 
132  if (!view_data->from_viewport) {
133  GPU_TEXTURE_FREE_SAFE(view_data->dtxl.color);
135  GPU_TEXTURE_FREE_SAFE(view_data->dtxl.depth);
136  }
138 
139  for (ViewportEngineData &engine : view_data->engines) {
140  draw_viewport_engines_data_clear(&engine, free_instance_data);
141  }
142 }
143 
145 {
146  draw_view_data_clear(view_data, true);
147  delete view_data;
148 }
149 
151 {
152  if (!equals_v2v2_int(view_data->texture_list_size, size)) {
153  draw_view_data_clear(view_data, false);
155  }
156 }
157 
159  DrawEngineType *engine_type)
160 {
161  for (ViewportEngineData &engine : view_data->engines) {
162  if (engine.engine_type->draw_engine == engine_type) {
163  if (engine.fbl == nullptr) {
164  const DrawEngineDataSize *data_size = engine_type->vedata_size;
166  data_size->fbl_len, sizeof(GPUFrameBuffer *), "FramebufferList");
167  engine.txl = (TextureList *)MEM_calloc_arrayN(
168  data_size->txl_len, sizeof(GPUTexture *), "TextureList");
169  engine.psl = (PassList *)MEM_calloc_arrayN(
170  data_size->psl_len, sizeof(DRWPass *), "PassList");
171  engine.stl = (StorageList *)MEM_calloc_arrayN(
172  data_size->stl_len, sizeof(void *), "StorageList");
173  }
174  return &engine;
175  }
176  }
177  return nullptr;
178 }
179 
181 {
182  ViewportEngineData *engine = DRW_view_data_engine_data_get_ensure(view_data, engine_type);
183  view_data->enabled_engines.append(engine);
184 }
185 
187 {
188  view_data->enabled_engines.clear();
189 }
190 
192 {
193  for (ViewportEngineData &engine : view_data->engines) {
194  if (view_data->enabled_engines.first_index_of_try(&engine) == -1) {
195  draw_viewport_engines_data_clear(&engine, false);
196  }
197  }
198 }
199 
201 {
202  return &view_data->cache_time;
203 }
204 
206 {
207  return &view_data->dfbl;
208 }
209 
211 {
212  return &view_data->dtxl;
213 }
214 
216 {
217  iterator->id = 0;
218  iterator->end = view_data->enabled_engines.size();
219  iterator->engines = view_data->enabled_engines.data();
220 }
221 
223 {
224  if (iterator->id >= iterator->end) {
225  return nullptr;
226  }
227  ViewportEngineData *engine = iterator->engines[iterator->id++];
228  return engine;
229 }
#define BLI_assert(a)
Definition: BLI_assert.h:46
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:336
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
MINLINE void copy_v2_v2_int(int r[2], const int a[2])
MINLINE bool equals_v2v2_int(const int v1[2], const int v2[2]) ATTR_WARN_UNUSED_RESULT
struct GPUFrameBuffer GPUFrameBuffer
_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
struct GPUTexture GPUTexture
Definition: GPU_texture.h:17
#define GPU_TEXTURE_FREE_SAFE(texture)
Definition: GPU_texture.h:40
GPUTexture * GPU_viewport_color_texture(GPUViewport *viewport, int view)
Definition: gpu_viewport.c:559
int GPU_viewport_active_view_get(GPUViewport *viewport)
Definition: gpu_viewport.c:549
GPUTexture * GPU_viewport_overlay_texture(GPUViewport *viewport, int view)
Definition: gpu_viewport.c:564
GPUTexture * GPU_viewport_depth_texture(GPUViewport *viewport)
Definition: gpu_viewport.c:569
#define MEM_SAFE_FREE(v)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition: btDbvt.cpp:52
int64_t size() const
Definition: BLI_vector.hh:694
void append(const T &value)
Definition: BLI_vector.hh:433
void reserve(const int64_t min_capacity)
Definition: BLI_vector.hh:340
int64_t first_index_of_try(const T &value) const
Definition: BLI_vector.hh:812
void DRW_text_cache_destroy(struct DRWTextStore *dt)
void DRW_view_data_use_engine(DRWViewData *view_data, DrawEngineType *engine_type)
ViewportEngineData * DRW_view_data_engine_data_get_ensure(DRWViewData *view_data, DrawEngineType *engine_type)
ViewportEngineData * DRW_view_data_enabled_engine_iter_step(DRWEngineIterator *iterator)
DRWViewData * DRW_view_data_create(ListBase *engine_types)
static void draw_view_data_clear(DRWViewData *view_data, bool free_instance_data)
void DRW_view_data_free(DRWViewData *view_data)
DefaultTextureList * DRW_view_data_default_texture_list_get(DRWViewData *view_data)
void DRW_view_data_default_lists_from_viewport(DRWViewData *view_data, GPUViewport *viewport)
double * DRW_view_data_cache_time_get(DRWViewData *view_data)
void DRW_view_data_enabled_engine_iter_begin(DRWEngineIterator *iterator, DRWViewData *view_data)
DefaultFramebufferList * DRW_view_data_default_framebuffer_list_get(DRWViewData *view_data)
static void draw_viewport_engines_data_clear(ViewportEngineData *data, bool clear_instance_data)
void DRW_view_data_texture_list_size_validate(DRWViewData *view_data, const int size[2])
void DRW_view_data_reset(DRWViewData *view_data)
void DRW_view_data_free_unused(DRWViewData *view_data)
struct DRWViewData DRWViewData
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
Definition: mallocn.c:32
ViewportEngineData ** engines
DrawEngineType * draw_engine
Definition: draw_manager.h:92
int texture_list_size[2]
Vector< ViewportEngineData * > enabled_engines
DefaultTextureList dtxl
DefaultFramebufferList dfbl
Vector< ViewportEngineData > engines
double cache_time
struct GPUFrameBuffer * overlay_only_fb
struct GPUFrameBuffer * in_front_fb
struct GPUFrameBuffer * depth_only_fb
struct GPUFrameBuffer * overlay_fb
struct GPUFrameBuffer * default_fb
struct GPUFrameBuffer * color_only_fb
struct GPUTexture * depth
struct GPUTexture * depth_in_front
struct GPUTexture * color_overlay
struct GPUTexture * color
void(* instance_free)(void *instance_data)
Definition: DRW_render.h:120
const DrawEngineDataSize * vedata_size
Definition: DRW_render.h:115
TextureList * txl
FramebufferList * fbl
StorageList * stl
struct DRWRegisteredDrawEngine * engine_type