summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/auxiliary/util/u_screen.c1
-rw-r--r--src/gallium/docs/source/screen.rst2
-rw-r--r--src/gallium/include/pipe/p_defines.h1
-rw-r--r--src/mesa/state_tracker/st_atom_shader.c5
-rw-r--r--src/mesa/state_tracker/st_context.c5
-rw-r--r--src/mesa/state_tracker/st_context.h1
-rw-r--r--src/mesa/state_tracker/st_program.c9
-rw-r--r--src/mesa/state_tracker/st_program.h3
8 files changed, 26 insertions, 1 deletions
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;
};