Commit: 21f08e5cafd29dae841324424e7debc7f51009c0
Parent: 75749fdbd8cf925b803f0b1452d8c098fd09f87e
Author: Randy Palamar
Date: Wed, 30 Oct 2024 06:23:19 -0600
apply global reverse video mask in the render shader
Diffstat:
3 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/frag_render.glsl b/frag_render.glsl
@@ -28,6 +28,8 @@ layout(std140, binding = 0) uniform parameters {
float underline_min;
float underline_max;
+
+ uint reverse_video_mask;
};
layout(location = 3) uniform sampler2D u_bitmap_texture;
@@ -63,8 +65,8 @@ void main()
RenderCell cell = cells[term_size_in_cells.x * cell_index.y + cell_index.x];
uint attr = cell.fg & ATTR_MASK;
- vec3 fg = unpackUnorm4x8(cell.fg).wzy;
- vec3 bg = unpackUnorm4x8(cell.bg).wzy;
+ vec3 fg = unpackUnorm4x8(cell.fg ^ reverse_video_mask).wzy;
+ vec3 bg = unpackUnorm4x8(cell.bg ^ reverse_video_mask).wzy;
vec2 glyph_pos = unpack_glyph_position(cell.gpu_glyph) * cell_size;
vec2 tex_coord = (glyph_pos + cell_pos) / vec2(textureSize(u_bitmap_texture, 0));
@@ -89,7 +91,7 @@ void main()
cell_pos.y >= strike_min && cell_pos.y < strike_max)
result = fg;
} else {
- result = unpackUnorm4x8(margin_colour).wzy;
+ result = unpackUnorm4x8(margin_colour ^ reverse_video_mask).wzy;
}
/* NOTE: set to true to see the glyph cache texture */
diff --git a/util.h b/util.h
@@ -253,7 +253,9 @@ typedef struct {
f32 underline_min;
f32 underline_max;
- u32 _pad[2];
+ u32 reverse_video_mask;
+
+ u32 _pad[1];
} ShaderParameters;
typedef struct {
diff --git a/vtgl.c b/vtgl.c
@@ -26,10 +26,9 @@ normalize_colour(Colour c)
}
static void
-clear_colour(b32 reverse)
+clear_colour(void)
{
Colour c = g_colours.data[g_colours.bgidx];
- if (reverse) c.rgba ^= REVERSE_VIDEO_MASK;
v4 cc = normalize_colour(c);
glClearColor(cc.r, cc.g, cc.b, cc.a);
glClear(GL_COLOR_BUFFER_BIT);
@@ -345,10 +344,8 @@ render_framebuffer(Term *t, RenderCell *render_buf)
CachedGlyph *cg;
rc->gpu_glyph = get_gpu_glyph_index(t->arena_for_frame, &t->gl, &t->fa,
c->cp, 0, c->bg & FS_MASK, &cg);
-
- u32 rmask = (t->gl.mode & WIN_MODE_REVERSE)? REVERSE_VIDEO_MASK : 0;
- rc->fg = c->fg ^ rmask;
- rc->bg = c->bg ^ rmask;
+ rc->fg = c->fg;
+ rc->bg = c->bg;
/* TODO: there is probably a better way to do this */
u32 tiles = cg->tile_count;
@@ -871,7 +868,7 @@ do_terminal(Term *t, f32 dt)
glUseProgram(t->gl.programs[SHADER_RENDER]);
glBindFramebuffer(GL_FRAMEBUFFER, t->gl.fb);
- clear_colour(t->gl.mode & WIN_MODE_REVERSE);
+ clear_colour();
if (t->gl.flags & UPDATE_RENDER_BUFFER) {
u32 cell_count = t->size.h * t->size.w;
@@ -892,6 +889,8 @@ do_terminal(Term *t, f32 dt)
sp->underline_min = (0.89 * t->fa.info.h);
sp->underline_max = (0.96 * t->fa.info.h);
+ sp->reverse_video_mask = REVERSE_VIDEO_MASK * !!(t->gl.mode & WIN_MODE_REVERSE);
+
glBindBuffer(GL_UNIFORM_BUFFER, t->gl.render_shader_ubo);
glBindBufferBase(GL_UNIFORM_BUFFER, 0, t->gl.render_shader_ubo);
glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(*sp), sp);
@@ -907,7 +906,7 @@ do_terminal(Term *t, f32 dt)
glBindFramebuffer(GL_FRAMEBUFFER, 0);
- clear_colour(t->gl.mode & WIN_MODE_REVERSE);
+ clear_colour();
glUseProgram(t->gl.programs[SHADER_POST]);
glUniform1i(t->gl.post.texslot, t->gl.fb_tex_unit);
glUniform1f(t->gl.post.param, param);