From: Marek Olšák <marek.ol...@amd.com> --- src/gallium/auxiliary/hud/hud_context.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
diff --git a/src/gallium/auxiliary/hud/hud_context.c b/src/gallium/auxiliary/hud/hud_context.c index fb9c8c6..8ab998e 100644 --- a/src/gallium/auxiliary/hud/hud_context.c +++ b/src/gallium/auxiliary/hud/hud_context.c @@ -35,20 +35,21 @@ #include <signal.h> #include <stdio.h> #include "hud/hud_context.h" #include "hud/hud_private.h" #include "hud/font.h" #include "cso_cache/cso_context.h" #include "util/u_draw_quad.h" +#include "util/u_format.h" #include "util/u_inlines.h" #include "util/u_memory.h" #include "util/u_math.h" #include "util/u_sampler.h" #include "util/u_simple_shaders.h" #include "util/u_string.h" #include "util/u_upload_mgr.h" #include "tgsi/tgsi_text.h" #include "tgsi/tgsi_dump.h" @@ -90,20 +91,22 @@ struct hud_context { unsigned fb_width, fb_height; /* vertices for text and background drawing are accumulated here and then * drawn all at once */ struct vertex_queue { float *vertices; struct pipe_vertex_buffer vbuf; unsigned max_num_vertices; unsigned num_vertices; } text, bg, whitelines; + + bool has_srgb; }; #ifdef PIPE_OS_UNIX static void signal_visible_handler(int sig, siginfo_t *siginfo, void *context) { huds_visible = !huds_visible; } #endif @@ -477,20 +480,32 @@ hud_draw(struct hud_context *hud, struct pipe_resource *tex) CSO_BIT_VERTEX_SHADER | CSO_BIT_VERTEX_ELEMENTS | CSO_BIT_AUX_VERTEX_BUFFER_SLOT | CSO_BIT_PAUSE_QUERIES | CSO_BIT_RENDER_CONDITION)); cso_save_constant_buffer_slot0(cso, PIPE_SHADER_VERTEX); /* set states */ memset(&surf_templ, 0, sizeof(surf_templ)); surf_templ.format = tex->format; + + /* Without this, AA lines look thinner if they are between 2 pixels + * because the alpha is 0.5 on both pixels. (it's ugly) + * + * sRGB makes the width of all AA lines look the same. + */ + if (hud->has_srgb) { + enum pipe_format srgb_format = util_format_srgb(tex->format); + + if (srgb_format != PIPE_FORMAT_NONE) + surf_templ.format = srgb_format; + } surf = pipe->create_surface(pipe, tex, &surf_templ); memset(&fb, 0, sizeof(fb)); fb.nr_cbufs = 1; fb.cbufs[0] = surf; fb.zsbuf = NULL; fb.width = hud->fb_width; fb.height = hud->fb_height; viewport.scale[0] = 0.5f * hud->fb_width; @@ -1131,20 +1146,21 @@ print_help(struct pipe_screen *screen) } } puts(""); fflush(stdout); } struct hud_context * hud_create(struct pipe_context *pipe, struct cso_context *cso) { + struct pipe_screen *screen = pipe->screen; struct hud_context *hud; struct pipe_sampler_view view_templ; unsigned i; const char *env = debug_get_option("GALLIUM_HUD", NULL); unsigned signo = debug_get_num_option("GALLIUM_HUD_TOGGLE_SIGNAL", 0); #ifdef PIPE_OS_UNIX static boolean sig_handled = FALSE; struct sigaction action = {}; #endif huds_visible = debug_get_bool_option("GALLIUM_HUD_VISIBLE", TRUE); @@ -1166,20 +1182,25 @@ hud_create(struct pipe_context *pipe, struct cso_context *cso) hud->uploader = u_upload_create(pipe, 256 * 1024, PIPE_BIND_VERTEX_BUFFER, PIPE_USAGE_STREAM); /* font */ if (!util_font_create(pipe, UTIL_FONT_FIXED_8X13, &hud->font)) { u_upload_destroy(hud->uploader); FREE(hud); return NULL; } + hud->has_srgb = screen->is_format_supported(screen, + PIPE_FORMAT_B8G8R8A8_SRGB, + PIPE_TEXTURE_2D, 0, + PIPE_BIND_RENDER_TARGET) != 0; + /* blend state */ hud->no_blend.rt[0].colormask = PIPE_MASK_RGBA; hud->alpha_blend.rt[0].colormask = PIPE_MASK_RGBA; hud->alpha_blend.rt[0].blend_enable = 1; hud->alpha_blend.rt[0].rgb_func = PIPE_BLEND_ADD; hud->alpha_blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_SRC_ALPHA; hud->alpha_blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_INV_SRC_ALPHA; hud->alpha_blend.rt[0].alpha_func = PIPE_BLEND_ADD; hud->alpha_blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ZERO; -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev