VSE timeline, when many (hundreds/thousands) of thumbnails were visible, was very slow to redraw. This PR makes them 3-10x faster to redraw, by stopping doing things that are slow :) Part of #126087 thumbnail improvements task. - No longer do mute semitransparency or corner rounding on the CPU, do it in shader instead. - Stop creating a separate GPU texture for each thumbnail, on every repaint, and drawing each thumbnail as a separate draw call. Instead, put thumbnails into a single texture atlas (using a simple shelf packing algorithm), and draw them in batch, passing data via UBO. The atlas is still re-created every frame, but that does not seem to be a performance issue. Thumbnails are cropped horizontally based on how much of their parts are visible (e.g. a narrow strip on screen), so realistically the atlas size is kinda proportional to screen size, and ends up being just several megabytes of data transfer between CPU -> GPU each frame. On this Sprite Fright edit timeline view (612 visible thumbnails), time taken to repaint the timeline window: - Mac (M1 Max, Metal): 68.1ms -> 4.7ms - Windows (Ryzen 5950X, RTX 3080Ti, OpenGL): 23.7ms -> 6.8ms This also fixes a visual issue with thumbnails, where when strips are very tall, the "rounded corners" that were poked right into the thumbnail bitmap on the CPU were showing up due to actual bitmap being scaled up a lot. Pull Request: https://projects.blender.org/blender/blender/pulls/126972
37 lines
719 B
GLSL
37 lines
719 B
GLSL
/* SPDX-FileCopyrightText: 2024 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
void main()
|
|
{
|
|
int id = gl_InstanceID;
|
|
thumb_id = id;
|
|
int vid = gl_VertexID;
|
|
SeqStripThumbData thumb = thumb_data[id];
|
|
vec4 coords = vec4(thumb.x1, thumb.y1, thumb.x2, thumb.y2);
|
|
vec4 uvs = vec4(thumb.u1, thumb.v1, thumb.u2, thumb.v2);
|
|
|
|
vec2 co;
|
|
vec2 uv;
|
|
if (vid == 0) {
|
|
co = coords.xw;
|
|
uv = uvs.xw;
|
|
}
|
|
else if (vid == 1) {
|
|
co = coords.xy;
|
|
uv = uvs.xy;
|
|
}
|
|
else if (vid == 2) {
|
|
co = coords.zw;
|
|
uv = uvs.zw;
|
|
}
|
|
else {
|
|
co = coords.zy;
|
|
uv = uvs.zy;
|
|
}
|
|
|
|
pos_interp = co;
|
|
texCoord_interp = uv;
|
|
gl_Position = ModelViewProjectionMatrix * vec4(co, 0.0f, 1.0f);
|
|
}
|