[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