From be6151730dac8a5f14887d4770285e885d944d2f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 23 Nov 2017 19:56:07 +0530 Subject: [PATCH] Fix SPECIAL stage in interleaved rendering --- kitty/cell_fragment.glsl | 4 ++-- kitty/cell_vertex.glsl | 18 ++++++++++++------ kitty/shaders.c | 4 +++- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/kitty/cell_fragment.glsl b/kitty/cell_fragment.glsl index f58106dea..f1b07b9c7 100644 --- a/kitty/cell_fragment.glsl +++ b/kitty/cell_fragment.glsl @@ -12,7 +12,7 @@ #ifdef NEEDS_BACKROUND in vec3 background; -#ifdef TRANSPARENT +#if defined(TRANSPARENT) || defined(SPECIAL) in float bg_alpha; #endif #endif @@ -63,7 +63,7 @@ vec4 calculate_foreground() { void main() { #if defined(BACKGROUND) || defined(SPECIAL) -#ifdef TRANSPARENT +#if defined(TRANSPARENT) || defined(SPECIAL) final_color = vec4(background.rgb * bg_alpha, bg_alpha); #else final_color = vec4(background.rgb, 1.0f); diff --git a/kitty/cell_vertex.glsl b/kitty/cell_vertex.glsl index c628f5ce9..d0b800e00 100644 --- a/kitty/cell_vertex.glsl +++ b/kitty/cell_vertex.glsl @@ -41,7 +41,7 @@ const uvec2 cell_pos_map[] = uvec2[4]( #ifdef NEEDS_BACKROUND out vec3 background; -#ifdef TRANSPARENT +#if defined(TRANSPARENT) || defined(SPECIAL) out float bg_alpha; #endif #endif @@ -173,18 +173,24 @@ void main() { #if defined(BACKGROUND) background = bg; -#else - // Selection and cursor - bg = choose_color(is_selected, color_to_vec(highlight_bg), bg); - background = choose_color(cursor, color_to_vec(cursor_color), bg); #endif -#ifdef TRANSPARENT +#if defined(TRANSPARENT) && !defined(SPECIAL) // If the background color is default, set its opacity to background_opacity, otherwise it should be opaque bg_alpha = step(0.5, float(colors[bg_index] & BYTE_MASK)); bg_alpha = bg_alpha + (1.0f - bg_alpha) * background_opacity; #endif +#if defined(SPECIAL) || defined(SIMPLE) + // Selection and cursor + bg = choose_color(is_selected, color_to_vec(highlight_bg), bg); + background = choose_color(cursor, color_to_vec(cursor_color), bg); +#ifdef SPECIAL + // bg_alpha should be 1 if cursor/selection otherwise 0 + bg_alpha = mix(0.0, 1.0, step(0.5, is_selected + cursor)); +#endif +#endif + #endif // }}} diff --git a/kitty/shaders.c b/kitty/shaders.c index e6e709b9b..0a9798c57 100644 --- a/kitty/shaders.c +++ b/kitty/shaders.c @@ -279,8 +279,8 @@ cell_prepare_to_render(ssize_t vao_idx, ssize_t gvao_idx, Screen *screen, GLfloa static void draw_graphics(int program, ssize_t vao_idx, ssize_t gvao_idx, ImageRenderData *data, GLuint start, GLuint count) { - bind_vertex_array(gvao_idx); bind_program(program); + bind_vertex_array(gvao_idx); static bool graphics_constants_set = false; if (!graphics_constants_set) { glUniform1i(glGetUniformLocation(program_id(GRAPHICS_PROGRAM), "image"), GRAPHICS_UNIT); @@ -332,6 +332,7 @@ draw_cells_interleaved(ssize_t vao_idx, ssize_t gvao_idx, Screen *screen, OSWind glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, screen->lines * screen->columns); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); // blending of pre-multiplied colors + if (screen->grman->num_of_negative_refs) draw_graphics(GRAPHICS_PREMULT_PROGRAM, vao_idx, gvao_idx, screen->grman->render_data, 0, screen->grman->num_of_negative_refs); bind_program(CELL_SPECIAL_PROGRAM); @@ -341,6 +342,7 @@ draw_cells_interleaved(ssize_t vao_idx, ssize_t gvao_idx, Screen *screen, OSWind glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, screen->lines * screen->columns); if (screen->grman->num_of_positive_refs) draw_graphics(GRAPHICS_PREMULT_PROGRAM, vao_idx, gvao_idx, screen->grman->render_data, screen->grman->num_of_negative_refs, screen->grman->num_of_positive_refs); + glDisable(GL_BLEND); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);