[Bf-blender-cvs] [acd8cf549e1] temp-gpu-image-engine: Added Border back.

Jeroen Bakker noreply at git.blender.org
Mon Dec 6 14:45:56 CET 2021


Commit: acd8cf549e10f41970548756be8a5172827a7e41
Author: Jeroen Bakker
Date:   Mon Dec 6 13:55:06 2021 +0100
Branches: temp-gpu-image-engine
https://developer.blender.org/rBacd8cf549e10f41970548756be8a5172827a7e41

Added Border back.

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

M	source/blender/draw/engines/image/image_drawing_mode_screen_space.hh
M	source/blender/draw/engines/image/image_private.hh
M	source/blender/draw/engines/image/shaders/engine_image_frag.glsl
M	source/blender/draw/engines/image/shaders/engine_image_vert.glsl

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

diff --git a/source/blender/draw/engines/image/image_drawing_mode_screen_space.hh b/source/blender/draw/engines/image/image_drawing_mode_screen_space.hh
index 8797b124373..797a327add0 100644
--- a/source/blender/draw/engines/image/image_drawing_mode_screen_space.hh
+++ b/source/blender/draw/engines/image/image_drawing_mode_screen_space.hh
@@ -30,6 +30,87 @@ namespace blender::draw::image_engine {
 
 constexpr float EPSILON_UV_BOUNDS = 0.00001f;
 
+/** \brief Create GPUBatch for a IMAGE_ScreenSpaceTextureInfo. */
+class BatchUpdater {
+  IMAGE_ScreenSpaceTextureInfo &info;
+
+  GPUVertFormat format = {0};
+  int pos_id;
+  int uv_id;
+
+ public:
+  BatchUpdater(IMAGE_ScreenSpaceTextureInfo &info) : info(info)
+  {
+  }
+
+  void update_batch()
+  {
+    ensure_clear_batch();
+    ensure_format();
+    init_batch();
+  }
+
+  void discard_batch()
+  {
+    GPU_BATCH_DISCARD_SAFE(info.batch);
+  }
+
+ private:
+  void ensure_clear_batch()
+  {
+    GPU_BATCH_CLEAR_SAFE(info.batch);
+    if (info.batch == nullptr) {
+      info.batch = GPU_batch_calloc();
+    }
+  }
+
+  void init_batch()
+  {
+    GPUVertBuf *vbo = create_vbo();
+    GPU_batch_init_ex(info.batch, GPU_PRIM_TRI_FAN, vbo, nullptr, GPU_BATCH_OWNS_VBO);
+  }
+
+  GPUVertBuf *create_vbo()
+  {
+    GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&format);
+    GPU_vertbuf_data_alloc(vbo, 4);
+    float pos[4][2];
+    fill_tri_fan_from_rctf(pos, info.clipping_bounds);
+    float uv[4][2];
+    fill_tri_fan_from_rctf(uv, info.uv_bounds);
+
+    for (int i = 0; i < 4; i++) {
+      GPU_vertbuf_attr_set(vbo, pos_id, i, pos[i]);
+      GPU_vertbuf_attr_set(vbo, uv_id, i, uv[i]);
+    }
+
+    return vbo;
+  }
+
+  static void fill_tri_fan_from_rctf(float result[4][2], rctf &rect)
+  {
+    result[0][0] = rect.xmin;
+    result[0][1] = rect.ymin;
+    result[1][0] = rect.xmax;
+    result[1][1] = rect.ymin;
+    result[2][0] = rect.xmax;
+    result[2][1] = rect.ymax;
+    result[3][0] = rect.xmin;
+    result[3][1] = rect.ymax;
+  }
+
+  void ensure_format()
+  {
+    if (format.attr_len == 0) {
+      GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+      GPU_vertformat_attr_add(&format, "uv", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+
+      pos_id = GPU_vertformat_attr_id_get(&format, "pos");
+      uv_id = GPU_vertformat_attr_id_get(&format, "uv");
+    }
+  }
+};
+
 /**
  * \brief Accessor to texture slots.
  *
@@ -39,6 +120,7 @@ constexpr float EPSILON_UV_BOUNDS = 0.00001f;
 struct PrivateDataAccessor {
   IMAGE_PrivateData *pd;
   IMAGE_TextureList *txl;
+
   PrivateDataAccessor(IMAGE_PrivateData *pd, IMAGE_TextureList *txl) : pd(pd), txl(txl)
   {
   }
@@ -109,6 +191,18 @@ struct PrivateDataAccessor {
     info->uv_to_texture[3][0] = translate_x;
     info->uv_to_texture[3][1] = translate_y;
   }
+
+  void update_batches()
+  {
+    for (int i = 0; i < SCREEN_SPACE_DRAWING_MODE_TEXTURE_LEN; i++) {
+      IMAGE_ScreenSpaceTextureInfo &info = pd->screen_space.texture_infos[i];
+      if (!info.dirty) {
+        continue;
+      }
+      BatchUpdater batch_updater(info);
+      batch_updater.update_batch();
+    }
+  }
 };
 
 struct ImageTileAccessor {
@@ -153,7 +247,6 @@ class ScreenSpaceDrawingMode : public AbstractDrawingMode {
                     IMAGE_PrivateData *pd,
                     const ShaderParameters &sh_params) const
   {
-    GPUBatch *geom = DRW_cache_quad_get();
     GPUShader *shader = IMAGE_shader_image_get(false);
 
     DRWShadingGroup *shgrp = DRW_shgroup_create(shader, psl->image_pass);
@@ -165,17 +258,20 @@ class ScreenSpaceDrawingMode : public AbstractDrawingMode {
     float image_mat[4][4];
     unit_m4(image_mat);
     for (int i = 0; i < SCREEN_SPACE_DRAWING_MODE_TEXTURE_LEN; i++) {
-      if (!pd->screen_space.texture_infos[i].visible) {
+      IMAGE_ScreenSpaceTextureInfo &info = pd->screen_space.texture_infos[i];
+      if (!info.visible) {
         continue;
       }
-
-      image_mat[0][0] = pd->screen_space.texture_infos[i].clipping_bounds.xmax;
-      image_mat[1][1] = pd->screen_space.texture_infos[i].clipping_bounds.ymax;
+      /*
+        Should be space relative translation.
+        image_mat[0][0] = info.clipping_bounds.xmax;
+        image_mat[1][1] = info.clipping_bounds.ymax;
+      */
 
       DRWShadingGroup *shgrp_sub = DRW_shgroup_create_sub(shgrp);
       DRW_shgroup_uniform_texture_ex(
           shgrp_sub, "imageTexture", txl->screen_space.textures[i], GPU_SAMPLER_DEFAULT);
-      DRW_shgroup_call_obmat(shgrp_sub, geom, image_mat);
+      DRW_shgroup_call_obmat(shgrp_sub, info.batch, image_mat);
     }
   }
 
@@ -263,7 +359,7 @@ class ScreenSpaceDrawingMode : public AbstractDrawingMode {
           mark_all_texture_slots_dirty(pd);
         }
         else {
-          do_partial_update(changes, txl, pd, image);
+          do_partial_update(changes, txl, pd);
         }
         break;
     }
@@ -272,8 +368,7 @@ class ScreenSpaceDrawingMode : public AbstractDrawingMode {
 
   void do_partial_update(PartialUpdateChecker<ImageTileData>::CollectResult &iterator,
                          IMAGE_TextureList *txl,
-                         IMAGE_PrivateData *pd,
-                         Image *image) const
+                         IMAGE_PrivateData *pd) const
   {
     while (iterator.get_next_change() == ePartialUpdateIterResult::ChangeAvailable) {
       /* Quick exit when tile_buffer isn't availble. */
@@ -472,7 +567,7 @@ class ScreenSpaceDrawingMode : public AbstractDrawingMode {
     IMB_transform(&tile_buffer,
                   &texture_buffer,
                   pd.flags.do_tile_drawing ? IMB_TRANSFORM_MODE_WRAP_REPEAT :
-                                            IMB_TRANSFORM_MODE_REGULAR,
+                                             IMB_TRANSFORM_MODE_REGULAR,
                   IMB_FILTER_NEAREST,
                   uv_to_texel,
                   nullptr);
@@ -510,6 +605,7 @@ class ScreenSpaceDrawingMode : public AbstractDrawingMode {
     pda.clear_dirty_flag();
     pda.update_screen_space_bounds(region);
     pda.update_uv_bounds();
+    pda.update_batches();
     update_texture_slot_allocation(txl, pd);
 
     // Step: Update the GPU textures based on the changes in the image.
diff --git a/source/blender/draw/engines/image/image_private.hh b/source/blender/draw/engines/image/image_private.hh
index c2a7c7cef1a..c95e063fc69 100644
--- a/source/blender/draw/engines/image/image_private.hh
+++ b/source/blender/draw/engines/image/image_private.hh
@@ -71,6 +71,14 @@ struct IMAGE_ScreenSpaceTextureInfo {
   rctf uv_bounds;
   /** \brief Transform matrix to convert a normalized uv coordinate to texture space. */
   float uv_to_texture[4][4];
+  /**
+   * \brief Batch to draw the associated texton the screen.
+   *
+   * contans a VBO with `pos` and 'uv'.
+   * `pos` (2xF32) is relative to the origin of the space.
+   * `uv` (2xF32) reflect the uv bounds.
+   */
+  GPUBatch *batch;
 };
 
 struct IMAGE_PrivateData {
diff --git a/source/blender/draw/engines/image/shaders/engine_image_frag.glsl b/source/blender/draw/engines/image/shaders/engine_image_frag.glsl
index 55a2f2a72f1..c48ad42016e 100644
--- a/source/blender/draw/engines/image/shaders/engine_image_frag.glsl
+++ b/source/blender/draw/engines/image/shaders/engine_image_frag.glsl
@@ -7,12 +7,7 @@
 #define IMAGE_DRAW_FLAG_DEPTH (1 << 3)
 #define IMAGE_DRAW_FLAG_DO_REPEAT (1 << 4)
 
-#ifdef TILED_IMAGE
-uniform sampler2DArray imageTileArray;
-uniform sampler1DArray imageTileData;
-#else
 uniform sampler2D imageTexture;
-#endif
 
 uniform bool imgPremultiplied;
 uniform int drawFlags;
@@ -23,72 +18,42 @@ uniform vec4 shuffle;
 #define FAR_DISTANCE farNearDistances.x
 #define NEAR_DISTANCE farNearDistances.y
 
-in vec2 uvs;
+#define Z_DEPTH_BORDER 1.0
+#define Z_DEPTH_IMAGE 0.75
+
+in vec2 uv_screen;
+in vec2 uv_image;
 
 out vec4 fragColor;
 
-#ifdef TILED_IMAGE
-/* TODO(fclem): deduplicate code. */
-bool node_tex_tile_lookup(inout vec3 co, sampler2DArray ima, sampler1DArray map)
+bool is_border(vec2 uv)
 {
-  vec2 tile_pos = floor(co.xy);
-
-  if (tile_pos.x < 0 || tile_pos.y < 0 || tile_pos.x >= 10) {
-    return false;
-  }
-
-  float tile = 10.0 * tile_pos.y + tile_pos.x;
-  if (tile >= textureSize(map, 0).x) {
-    return false;
-  }
-
-  /* Fetch tile information. */
-  float tile_layer = texelFetch(map, ivec2(tile, 0), 0).x;
-  if (tile_layer < 0.0) {
-    return false;
-  }
-
-  vec4 tile_info = texelFetch(map, ivec2(tile, 1), 0);
-
-  co = vec3(((co.xy - tile_pos) * tile_info.zw) + tile_info.xy, tile_layer);
-  return true;
+  return (uv.x < 0.0 || uv.y < 0.0 || uv.x > 1.0 || uv.y > 1.0);
 }
-#endif
 
 void main()
 {
-  vec4 tex_color;
-  /* Read texture */
-#ifdef TILED_IMAGE
-  vec3 co = vec3(uvs, 0.0);
-  if (node_tex_tile_lookup(co, imageTileArray, imageTileData)) {
-    tex_color = texture(imageTileArray, co);
-  }
-  else {
-    tex_color = vec4(1.0, 0.0, 1.0, 1.0);
-  }
-#else
-  vec2 uvs_clamped = ((drawFlags & IMAGE_DRAW_FLAG_DO_REPEAT) != 0) ?
-                         fract(uvs) :
-                         clamp(uvs, vec2(0.0), vec2(1.0));
-  tex_color = texture(imageTexture, uvs_clamped);
-#endif
-
-  if ((drawFlags & IMAGE_DRAW_FLAG_APPLY_ALPHA) != 0) {
-    if (!imgPremultiplied) {
-      tex_color.rgb *= tex_color.a;
+  ivec2 uvs_clamped = ivec2(uv_screen);
+  vec4 tex_color = texelFetch(imageTexture, uvs_clamped, 0);
+
+  bool border = is_border(uv_image);
+  if (!border) {
+    if ((drawFlags & IMAGE_DRAW_FLAG_APPLY_ALPHA) != 0) {
+      if (!imgPremultiplied) {
+        tex_color.rgb *= tex_color.a;
+      }
+    }
+    if ((drawFlags & IMAGE_DRAW_FLAG_DEPTH) != 0) {
+      tex_color = smoothstep(FAR_DISTANCE, NEAR_DISTANCE, tex_color);
     }
-  }
-  if ((drawFlags & IMAGE_DRAW_FLAG_DEPTH) != 0) {
-    tex_color = smoothstep(FAR_DISTANCE, NEAR_DISTANCE, tex_color);
-  }
 
-  if ((drawFlags & IMAGE_DRAW_FLAG_SHUFFLING) != 0) {
-    tex_color = color * dot(tex_color, shuffle);
-  }
-  if ((drawFlags & IMAGE_DRAW_FLAG_SHOW_ALPHA) == 0) {
-    tex_color.a = 1.0;
+    if ((drawFlags & IMAGE_DRAW_FLAG_SHUFFLING) != 0) {
+      tex_color = color * dot(tex_color, shuffle);
+    }
+    if ((drawFlags & IMAGE_DRAW_FLAG_SHOW_ALPHA) =

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list