[Bf-blender-cvs] [3085b945958] temp-gizmo-decoupled-redraws: Get draw-layers to work with multiple viewports

Julian Eisel noreply at git.blender.org
Mon Jan 27 16:17:35 CET 2020


Commit: 3085b945958bf11fb52457d6317aa890665b562e
Author: Julian Eisel
Date:   Mon Jan 27 15:14:53 2020 +0100
Branches: temp-gizmo-decoupled-redraws
https://developer.blender.org/rB3085b945958bf11fb52457d6317aa890665b562e

Get draw-layers to work with multiple viewports

===================================================================

M	source/blender/draw/intern/draw_manager_layer.c

===================================================================

diff --git a/source/blender/draw/intern/draw_manager_layer.c b/source/blender/draw/intern/draw_manager_layer.c
index f07978b8049..9773edd2c58 100644
--- a/source/blender/draw/intern/draw_manager_layer.c
+++ b/source/blender/draw/intern/draw_manager_layer.c
@@ -31,6 +31,9 @@ typedef struct DRWLayer {
   struct DRWLayer *next, *prev;
 
   const DRWLayerType *type;
+  /* Store which viewport this layer was created for, so we invalidate these buffers if the
+   * viewport changed. */
+  const GPUViewport *viewport;
 
   GPUFrameBuffer *framebuffer;
   GPUTexture *color;
@@ -47,11 +50,12 @@ static void drw_layer_recreate_textures(DRWLayer *layer)
                                 {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(layer->color)});
 }
 
-static DRWLayer *drw_layer_create(const DRWLayerType *type)
+static DRWLayer *drw_layer_create(const DRWLayerType *type, const GPUViewport *viewport)
 {
   DRWLayer *layer = MEM_callocN(sizeof(*layer), __func__);
 
   layer->type = type;
+  layer->viewport = viewport;
   drw_layer_recreate_textures(layer);
 
   return layer;
@@ -70,31 +74,44 @@ static void drw_layer_free_cb(void *layer)
   drw_layer_free(layer);
 }
 
-static void drw_layer_ensure_updated_textures(DRWLayer *layer)
+static void drw_layer_ensure_updated(DRWLayer *layer)
 {
   const float *size = DRW_viewport_size_get();
 
   BLI_assert(layer->color);
 
+  layer->viewport = DST.viewport;
+
+  /* Ensure updated texture dimensions. */
   if ((GPU_texture_width(layer->color) != size[0]) ||
       (GPU_texture_height(layer->color) != size[1])) {
     drw_layer_recreate_textures(layer);
   }
 }
 
+static bool drw_layer_needs_cache_update(const DRWLayer *layer)
+{
+  const float *size = DRW_viewport_size_get();
+
+  if ((DST.viewport != layer->viewport) || (GPU_texture_width(layer->color) != size[0]) ||
+      (GPU_texture_height(layer->color) != size[1])) {
+    /* Always update after viewport changed. */
+    return true;
+  }
+
+  return (layer->type->may_skip == NULL) || (layer->type->may_skip() == false);
+}
+
 static DRWLayer *drw_layer_for_type_updated_ensure(const DRWLayerType *type)
 {
   if (DRW_layers_hash == NULL) {
     DRW_layers_hash = BLI_ghash_ptr_new_ex("DRW_layers_hash", DRW_layer_types_count);
   }
+
   DRWLayer *layer = BLI_ghash_lookup(DRW_layers_hash, type);
 
-  if (layer) {
-    /* Ensure updated texture dimensions. */
-    drw_layer_ensure_updated_textures(layer);
-  }
-  else {
-    layer = drw_layer_create(type);
+  if (!layer) {
+    layer = drw_layer_create(type, DST.viewport);
     BLI_ghash_insert(DRW_layers_hash, (void *)type, layer);
   }
 
@@ -138,6 +155,8 @@ void DRW_layers_draw_combined_cached(void)
   /* Store if poll succeeded, to avoid calling it twice. */
   bool *is_layer_visible = BLI_array_alloca(is_layer_visible, DRW_layer_types_count);
 
+  BLI_assert(!DRW_layers_hash || (DRW_layer_types_count >= BLI_ghash_len(DRW_layers_hash)));
+
   GPU_framebuffer_bind(DST.default_framebuffer);
   DRW_clear_background();
 
@@ -151,14 +170,17 @@ void DRW_layers_draw_combined_cached(void)
     }
     is_layer_visible[i] = true;
 
-    if (layer_type->may_skip && layer_type->may_skip()) {
+    DRWLayer *layer = drw_layer_for_type_updated_ensure(layer_type);
+
+    if (!drw_layer_needs_cache_update(layer)) {
       continue;
     }
 
-    DRWLayer *layer = drw_layer_for_type_updated_ensure(layer_type);
+    drw_layer_ensure_updated(layer);
 
     DRW_clear_background();
     DRW_state_reset();
+
     layer_type->draw_layer();
 
     /* Blit the default framebuffer into the layer framebuffer cache. */



More information about the Bf-blender-cvs mailing list