From: Erik Faye-Lund Date: Thu, 3 Oct 2019 20:49:15 +0000 (-0400) Subject: mesa/gallium: automatically lower point-size X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3b4fc2401bc71051ed0f4bae967d6f9405a315ab;p=mesa.git mesa/gallium: automatically lower point-size Reviewed-by: Marek Olšák --- diff --git a/src/gallium/auxiliary/util/u_screen.c b/src/gallium/auxiliary/util/u_screen.c index ec43f9b7971..4c52874f3a5 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 a18f481f212..f280ad1cfec 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 8a0a86a8c42..e5a68ca7cf7 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 f79c401e3e7..0f4b3b48387 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 8d4705bcc68..6997e70035a 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 99f43828f44..433e27160da 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 f1d3f7b3ce7..857a5444fcc 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 b84d219e3c8..85934ee1df5 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; };