From 3b4fc2401bc71051ed0f4bae967d6f9405a315ab Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Thu, 3 Oct 2019 16:49:15 -0400 Subject: [PATCH] mesa/gallium: automatically lower point-size MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reviewed-by: Marek Olšák --- src/gallium/auxiliary/util/u_screen.c | 1 + src/gallium/docs/source/screen.rst | 2 ++ src/gallium/include/pipe/p_defines.h | 1 + src/mesa/state_tracker/st_atom_shader.c | 5 +++++ src/mesa/state_tracker/st_context.c | 5 ++++- src/mesa/state_tracker/st_context.h | 1 + src/mesa/state_tracker/st_program.c | 9 +++++++++ src/mesa/state_tracker/st_program.h | 3 +++ 8 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/gallium/auxiliary/util/u_screen.c b/src/gallium/auxiliary/util/u_screen.c index ec43f9b..4c52874 100644 --- a/src/gallium/auxiliary/util/u_screen.c +++ b/src/gallium/auxiliary/util/u_screen.c @@ -396,6 +396,7 @@ u_pipe_screen_get_param_defaults(struct pipe_screen *pscreen, case PIPE_CAP_FLATSHADE: case PIPE_CAP_ALPHA_TEST: + case PIPE_CAP_POINT_SIZE_FIXED: return 1; default: diff --git a/src/gallium/docs/source/screen.rst b/src/gallium/docs/source/screen.rst index a18f481..f280ad1 100644 --- a/src/gallium/docs/source/screen.rst +++ b/src/gallium/docs/source/screen.rst @@ -560,6 +560,8 @@ The integer capabilities: * ``PIPE_CAP_TGSI_TG4_COMPONENT_IN_SWIZZLE``: True if driver wants the TG4 component encoded in sampler swizzle rather than as a separate source. * ``PIPE_CAP_FLATSHADE``: Driver supports pipe_rasterizer_state::flatshade. * ``PIPE_CAP_ALPHA_TEST``: Driver supports alpha-testing. +* ``PIPE_CAP_POINT_SIZE_FIXED``: Driver supports point-sizes that are fixed, + as opposed to writing gl_PointSize for every point. .. _pipe_capf: diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h index 8a0a86a..e5a68ca 100644 --- a/src/gallium/include/pipe/p_defines.h +++ b/src/gallium/include/pipe/p_defines.h @@ -906,6 +906,7 @@ enum pipe_cap PIPE_CAP_TGSI_TG4_COMPONENT_IN_SWIZZLE, PIPE_CAP_FLATSHADE, PIPE_CAP_ALPHA_TEST, + PIPE_CAP_POINT_SIZE_FIXED, }; /** diff --git a/src/mesa/state_tracker/st_atom_shader.c b/src/mesa/state_tracker/st_atom_shader.c index f79c401..0f4b3b4 100644 --- a/src/mesa/state_tracker/st_atom_shader.c +++ b/src/mesa/state_tracker/st_atom_shader.c @@ -52,6 +52,7 @@ #include "st_atom.h" #include "st_program.h" #include "st_texture.h" +#include "st_util.h" static unsigned @@ -216,6 +217,10 @@ st_update_vp( struct st_context *st ) key.clip_negative_one_to_one = st->ctx->Transform.ClipDepthMode == GL_NEGATIVE_ONE_TO_ONE; + /* _NEW_POINT */ + key.lower_point_size = st->lower_point_size && + !st_point_size_per_vertex(st->ctx); + st->vp_variant = st_get_vp_variant(st, stvp, &key); } diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index 8d4705b..6997e70 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -677,6 +677,8 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe, !screen->get_param(screen, PIPE_CAP_FLATSHADE); st->lower_alpha_test = !screen->get_param(screen, PIPE_CAP_ALPHA_TEST); + st->lower_point_size = + !screen->get_param(screen, PIPE_CAP_POINT_SIZE_FIXED); st->has_hw_atomics = screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, @@ -740,7 +742,8 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe, st->shader_has_one_variant[MESA_SHADER_VERTEX] = st->has_shareable_shaders && !st->clamp_frag_depth_in_shader && - !st->clamp_vert_color_in_shader; + !st->clamp_vert_color_in_shader && + !st->lower_point_size; st->shader_has_one_variant[MESA_SHADER_FRAGMENT] = st->has_shareable_shaders && diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index 99f4382..433e271 100644 --- a/src/mesa/state_tracker/st_context.h +++ b/src/mesa/state_tracker/st_context.h @@ -149,6 +149,7 @@ struct st_context boolean has_signed_vertex_buffer_offset; boolean lower_flatshade; boolean lower_alpha_test; + boolean lower_point_size; /** * If a shader can be created when we get its source. diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index f1d3f7b..857a544 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -647,6 +647,9 @@ st_create_vp_variant(struct st_context *st, { struct st_vp_variant *vpv = CALLOC_STRUCT(st_vp_variant); struct pipe_context *pipe = st->pipe; + + static const gl_state_index16 point_size_state[STATE_LENGTH] = + { STATE_INTERNAL, STATE_POINT_SIZE_CLAMPED, 0 }; struct gl_program_parameter_list *params = stvp->Base.Parameters; vpv->key = *key; @@ -671,6 +674,12 @@ st_create_vp_variant(struct st_context *st, vpv->num_inputs++; } + if (key->lower_point_size) { + _mesa_add_state_reference(params, point_size_state); + NIR_PASS_V(vpv->tgsi.ir.nir, nir_lower_point_size_mov, + point_size_state); + } + st_finalize_nir(st, &stvp->Base, stvp->shader_program, vpv->tgsi.ir.nir); diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h index b84d219..85934ee 100644 --- a/src/mesa/state_tracker/st_program.h +++ b/src/mesa/state_tracker/st_program.h @@ -193,6 +193,9 @@ struct st_vp_variant_key /** both for ARB_depth_clamp */ bool lower_depth_clamp; bool clip_negative_one_to_one; + + /** lower glPointSize to gl_PointSize */ + boolean lower_point_size; }; -- 2.7.4