[Bf-blender-cvs] [b41f858752e] uvimage-editor-drawing: Use DrawManager for Image/UV Editor

Jeroen Bakker noreply at git.blender.org
Sat Aug 15 09:30:41 CEST 2020


Commit: b41f858752ec49908d1b8c37c67096cee6640da3
Author: Jeroen Bakker
Date:   Sat Aug 15 09:29:06 2020 +0200
Branches: uvimage-editor-drawing
https://developer.blender.org/rBb41f858752ec49908d1b8c37c67096cee6640da3

Use DrawManager for Image/UV Editor

This project moves the current UV/Image editor drawing to the draw manager. Why would we do this:
**Performance**:
- current implementation would draw each texel per time. Multiple texels could be drawn per pixel what would overwrite the previous result. You can notice this when working with large textures.
- repeat image drawing made this visible by drawing for a small period of time and stop drawing the rest.

**Alpha drawing**:
Current implementation would draw directly in display space. Giving incorrect results when displaying alpha transparent images.
Old:
{F8780114}

New:
{F8780113}

This addresses {T52680}

**Current Limitations**
- The project can be activated in the user preferences as experimental features. When support of huge textures is implemented we can switch over.
- Using images that are larger than supported by your GPU are resized (larger than 16000x16000). This leaves some blurring artifacts. We want to solve this after this patch has been reviewed and committed. Users will notice that the image is blurred a bit when zoomed in and looking at actual pixels.

**TODO**
* [ ] drawing of image unavailable grid. Need to check the use case for the current grid thing.
* [x] drawing of masking + render info etc.
* [ ] painting does not update the GPU textures.

**Future**
* Use smaller GPU textures when zoomed in.
* Support huge texture sizes.
* Migrate mask drawing to draw manager.

Maniphest Tasks: T67530

Differential Revision: https://developer.blender.org/D8234

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

M	release/scripts/startup/bl_ui/space_userpref.py
M	source/blender/blenkernel/BKE_image.h
M	source/blender/blenkernel/intern/image_gpu.c
M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/DRW_engine.h
A	source/blender/draw/engines/editors/editors_batches.c
A	source/blender/draw/engines/editors/editors_engine.c
A	source/blender/draw/engines/editors/editors_engine.h
A	source/blender/draw/engines/editors/editors_image.c
A	source/blender/draw/engines/editors/editors_private.h
A	source/blender/draw/engines/editors/editors_shaders.c
A	source/blender/draw/engines/editors/shaders/editors_image_frag.glsl
A	source/blender/draw/engines/editors/shaders/editors_image_vert.glsl
A	source/blender/draw/engines/overlay2d/overlay2d_background.c
A	source/blender/draw/engines/overlay2d/overlay2d_engine.c
A	source/blender/draw/engines/overlay2d/overlay2d_engine.h
A	source/blender/draw/engines/overlay2d/overlay2d_image_tiling.c
A	source/blender/draw/engines/overlay2d/overlay2d_private.h
A	source/blender/draw/engines/overlay2d/overlay2d_shaders.c
A	source/blender/draw/engines/overlay2d/overlay2d_uv.c
A	source/blender/draw/engines/overlay2d/overlay2d_uv_shadow.c
A	source/blender/draw/engines/overlay2d/overlay2d_uv_stretching.c
A	source/blender/draw/engines/overlay2d/shaders/common_overlay2d_lib.glsl
A	source/blender/draw/engines/overlay2d/shaders/overlay2d_background_frag.glsl
A	source/blender/draw/engines/overlay2d/shaders/overlay2d_image_tiling_border_vert.glsl
A	source/blender/draw/engines/overlay2d/shaders/overlay2d_uv_stretching_vert.glsl
A	source/blender/draw/engines/overlay2d/shaders/overlay2d_wireframe_frag.glsl
A	source/blender/draw/engines/overlay2d/shaders/overlay2d_wireframe_geom.glsl
A	source/blender/draw/engines/overlay2d/shaders/overlay2d_wireframe_vert.glsl
A	source/blender/draw/engines/overlay2d/shaders/uv_face_dots_vert.glsl
A	source/blender/draw/engines/overlay2d/shaders/uv_faces_vert.glsl
A	source/blender/draw/engines/overlay2d/shaders/uv_verts_frag.glsl
A	source/blender/draw/engines/overlay2d/shaders/uv_verts_vert.glsl
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_cache.h
M	source/blender/draw/intern/draw_common.c
M	source/blender/draw/intern/draw_common.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/intern/draw_manager_text.c
M	source/blender/draw/intern/draw_view.c
M	source/blender/draw/intern/draw_view.h
M	source/blender/draw/intern/shaders/common_globals_lib.glsl
M	source/blender/editors/render/render_internal.c
M	source/blender/editors/space_image/image_draw.c
M	source/blender/editors/space_image/image_intern.h
M	source/blender/editors/space_image/space_image.c
M	source/blender/makesdna/DNA_userdef_types.h
M	source/blender/makesrna/intern/rna_userdef.c

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

diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py
index 03f85578b6e..22447f2cd50 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -2171,6 +2171,7 @@ class USERPREF_PT_experimental_prototypes(ExperimentalPanel, Panel):
         self._draw_items(
             context, (
                 ({"property": "use_new_hair_type"}, "T68981"),
+                ({"property": "use_drw_image_editor"}, "T67530"),
             ),
         )
 
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index f052ba400fc..a9b731717d5 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -382,6 +382,7 @@ struct GPUTexture *BKE_image_get_gpu_tiles(struct Image *image,
 struct GPUTexture *BKE_image_get_gpu_tilemap(struct Image *image,
                                              struct ImageUser *iuser,
                                              struct ImBuf *ibuf);
+struct GPUBatch *BKE_image_tiled_gpu_instance_batch_create(struct Image *image);
 
 void BKE_image_update_gputexture(
     struct Image *ima, struct ImageUser *iuser, int x, int y, int w, int h);
diff --git a/source/blender/blenkernel/intern/image_gpu.c b/source/blender/blenkernel/intern/image_gpu.c
index 78a705ae145..a8261c8e5f9 100644
--- a/source/blender/blenkernel/intern/image_gpu.c
+++ b/source/blender/blenkernel/intern/image_gpu.c
@@ -39,6 +39,7 @@
 #include "BKE_image.h"
 #include "BKE_main.h"
 
+#include "GPU_batch.h"
 #include "GPU_extensions.h"
 #include "GPU_state.h"
 #include "GPU_texture.h"
@@ -285,7 +286,10 @@ static GPUTexture *image_get_gpu_texture(Image *ima,
   BKE_image_tag_time(ima);
 
   /* Test if we already have a texture. */
-  GPUTexture **tex = get_image_gpu_texture_ptr(ima, textarget, iuser ? iuser->multiview_eye : 0);
+  const int current_view = iuser ? ((iuser->flag & IMA_SHOW_STEREO) != 0 ? iuser->multiview_eye :
+                                                                           iuser->view) :
+                                   0;
+  GPUTexture **tex = get_image_gpu_texture_ptr(ima, textarget, current_view);
   if (*tex) {
     return *tex;
   }
@@ -398,6 +402,39 @@ void BKE_image_free_unused_gpu_textures()
 
 /** \} */
 
+/* -------------------------------------------------------------------- */
+/** \name GPU batch creation
+ * \{ */
+GPUBatch *BKE_image_tiled_gpu_instance_batch_create(Image *image)
+{
+  BLI_assert(image);
+  BLI_assert(image->source == IMA_SRC_TILED);
+
+  static GPUVertFormat format = {0};
+  if (format.attr_len == 0) {
+    GPU_vertformat_attr_add(&format, "local_pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
+  }
+
+  GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&format);
+
+  int32_t num_instances = BLI_listbase_count(&image->tiles);
+
+  GPU_vertbuf_data_alloc(vbo, num_instances);
+
+  float local_pos[3] = {0.0f, 0.0f, 0.0f};
+  int vbo_index = 0;
+
+  LISTBASE_FOREACH (ImageTile *, tile, &image->tiles) {
+    local_pos[0] = ((tile->tile_number - 1001) % 10);
+    local_pos[1] = ((tile->tile_number - 1001) / 10);
+    GPU_vertbuf_vert_set(vbo, vbo_index++, &local_pos);
+  }
+
+  GPUBatch *batch = GPU_batch_create_ex(GPU_PRIM_POINTS, vbo, NULL, GPU_BATCH_OWNS_VBO);
+  return batch;
+}
+/** \} */
+
 /* -------------------------------------------------------------------- */
 /** \name Deletion
  * \{ */
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index f85b03dc517..d1bf4533d08 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -77,6 +77,10 @@ set(SRC
   intern/draw_select_buffer.c
   intern/draw_view.c
   engines/basic/basic_engine.c
+  engines/editors/editors_batches.c
+  engines/editors/editors_engine.c
+  engines/editors/editors_image.c
+  engines/editors/editors_shaders.c
   engines/eevee/eevee_bloom.c
   engines/eevee/eevee_data.c
   engines/eevee/eevee_depth_of_field.c
@@ -147,6 +151,13 @@ set(SRC
   engines/overlay/overlay_sculpt.c
   engines/overlay/overlay_shader.c
   engines/overlay/overlay_wireframe.c
+  engines/overlay2d/overlay2d_background.c
+  engines/overlay2d/overlay2d_engine.c
+  engines/overlay2d/overlay2d_image_tiling.c
+  engines/overlay2d/overlay2d_shaders.c
+  engines/overlay2d/overlay2d_uv.c
+  engines/overlay2d/overlay2d_uv_shadow.c
+  engines/overlay2d/overlay2d_uv_stretching.c
 
   DRW_engine.h
   DRW_engine_types.h
@@ -401,6 +412,21 @@ data_to_c_simple(engines/overlay/shaders/wireframe_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/wireframe_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/xray_fade_frag.glsl SRC)
 
+data_to_c_simple(engines/overlay2d/shaders/common_overlay2d_lib.glsl SRC)
+data_to_c_simple(engines/overlay2d/shaders/overlay2d_background_frag.glsl SRC)
+data_to_c_simple(engines/overlay2d/shaders/overlay2d_image_tiling_border_vert.glsl SRC)
+data_to_c_simple(engines/overlay2d/shaders/overlay2d_wireframe_frag.glsl SRC)
+data_to_c_simple(engines/overlay2d/shaders/overlay2d_wireframe_geom.glsl SRC)
+data_to_c_simple(engines/overlay2d/shaders/overlay2d_wireframe_vert.glsl SRC)
+data_to_c_simple(engines/overlay2d/shaders/overlay2d_uv_stretching_vert.glsl SRC)
+data_to_c_simple(engines/overlay2d/shaders/uv_faces_vert.glsl SRC)
+data_to_c_simple(engines/overlay2d/shaders/uv_face_dots_vert.glsl SRC)
+data_to_c_simple(engines/overlay2d/shaders/uv_verts_vert.glsl SRC)
+data_to_c_simple(engines/overlay2d/shaders/uv_verts_frag.glsl SRC)
+
+data_to_c_simple(engines/editors/shaders/editors_image_vert.glsl SRC)
+data_to_c_simple(engines/editors/shaders/editors_image_frag.glsl SRC)
+
 list(APPEND INC
 )
 
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index 6db3bb39643..ca5c2c94b40 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -99,6 +99,10 @@ void DRW_draw_render_loop_offscreen(struct Depsgraph *depsgraph,
                                     const bool do_color_management,
                                     struct GPUOffScreen *ofs,
                                     struct GPUViewport *viewport);
+void DRW_draw_render_loop_2d_ex(struct Depsgraph *depsgraph,
+                                struct ARegion *region,
+                                struct GPUViewport *viewport,
+                                const struct bContext *evil_C);
 void DRW_draw_select_loop(struct Depsgraph *depsgraph,
                           struct ARegion *region,
                           struct View3D *v3d,
diff --git a/source/blender/draw/engines/editors/editors_batches.c b/source/blender/draw/engines/editors/editors_batches.c
new file mode 100644
index 00000000000..15256488160
--- /dev/null
+++ b/source/blender/draw/engines/editors/editors_batches.c
@@ -0,0 +1,62 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright 2020, Blender Foundation.
+ */
+
+/** \file
+ * \ingroup draw_engine
+ */
+#include "DRW_render.h"
+
+#include "BLI_rect.h"
+
+#include "GPU_batch.h"
+
+#include "editors_private.h"
+
+static GPUVertFormat *editors_batches_image_instance_format(void)
+{
+  static GPUVertFormat format = {0};
+  if (format.attr_len == 0) {
+    GPU_vertformat_attr_add(&format, "local_pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
+  }
+  return &format;
+}
+
+GPUBatch *EDITORS_batches_image_instance_create(rcti *rect)
+{
+  GPUVertFormat *format = editors_batches_image_instance_format();
+  GPUVertBuf *vbo = GPU_vertbuf_create_with_format(format);
+
+  int32_t num_instances_x = (rect->xmax - rect->xmin) + 1;
+  int32_t num_instances_y = (rect->ymax - rect->ymin) + 1;
+  int32_t num_instances = num_instances_x * num_instances_y;
+
+  GPU_vertbuf_data_alloc(vbo, num_instances);
+
+  int v = 0;
+  for (int y = rect->ymin; y <= rect->ymax; y++) {
+    float yf = (float)y;
+    for (int x = rect->xmin; x <= rect->xmax; x++) {
+      float xf = (float)x;
+      float local_pos[3] = {xf, yf, 0.0f};
+      GPU_vertbuf_vert_set(vbo, v++, &local_pos);
+    }
+  }
+
+  GPUBatch *batch = GPU_batch_create_ex(GPU_PRIM_POINTS, vbo, NULL, GPU_BATCH_OWNS_VBO);
+  return batch;
+}
diff --git a/source/blender/draw/engines/editors/editors_engine.c b/source/blender/draw/engines/editors/editors_engine.c
new file mode 100644
index 00000000000..1c4d2bebec9
--- /dev/null
+++ b/source/blender/draw/engines/editors/editors_engine.c
@@ -0,0 +1,85 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright 2020, Blender Foundation.
+ */
+
+/** \file
+ * \ingroup draw_editors
+ *
+ * Draw engine to draw the Image/UV editor
+ */
+
+#include "DRW_render.h"
+
+#include "BKE_object.h"
+
+#include "editors_engine.h"
+#include "editors_private.h"
+
+/* Shaders */
+
+/* Default image width and height when image is not available *

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list