summaryrefslogtreecommitdiffstats
path: root/src/mesa/state_tracker/st_atom_rasterizer.c
diff options
context:
space:
mode:
authorIlia Mirkin <imirkin@alum.mit.edu>2016-05-28 22:38:24 -0400
committerIlia Mirkin <imirkin@alum.mit.edu>2016-05-29 09:34:03 -0400
commitf2e7268a550e84e1f3c036effdeca3f8f9237044 (patch)
tree3eb92a7bacfb729276420ed134d04544872ed445 /src/mesa/state_tracker/st_atom_rasterizer.c
parent04a78068ff6a1399cd6891b4ef34a480de28b07c (diff)
downloadexternal_mesa3d-f2e7268a550e84e1f3c036effdeca3f8f9237044.zip
external_mesa3d-f2e7268a550e84e1f3c036effdeca3f8f9237044.tar.gz
external_mesa3d-f2e7268a550e84e1f3c036effdeca3f8f9237044.tar.bz2
st/mesa: fix setting of point_size_per_vertex in ES contexts
GL ES 2.0+ does not have a GL_PROGRAM_POINT_SIZE enable, unlike desktop GL. So we have to go and check the last pre-rasterizer stage to see whether it outputs a point size or not. This fixes a number of dEQP tests that use a geometry or tessellation shader to emit points primitives. Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Reviewed-by: Marek Olšák <marek.olsak@amd.com> Cc: "11.1 11.2" <mesa-stable@lists.freedesktop.org>
Diffstat (limited to 'src/mesa/state_tracker/st_atom_rasterizer.c')
-rw-r--r--src/mesa/state_tracker/st_atom_rasterizer.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/mesa/state_tracker/st_atom_rasterizer.c b/src/mesa/state_tracker/st_atom_rasterizer.c
index ed9deb0..ab5fa8f 100644
--- a/src/mesa/state_tracker/st_atom_rasterizer.c
+++ b/src/mesa/state_tracker/st_atom_rasterizer.c
@@ -204,10 +204,24 @@ static void update_raster_state( struct st_context *st )
raster->point_size_per_vertex = TRUE;
}
}
- else if (ctx->VertexProgram.PointSizeEnabled) {
- /* user-defined program and GL_VERTEX_PROGRAM_POINT_SIZE set */
+ else if (ctx->API != API_OPENGLES2) {
+ /* PointSizeEnabled is always set in ES2 contexts */
raster->point_size_per_vertex = ctx->VertexProgram.PointSizeEnabled;
}
+ else {
+ /* ST_NEW_TESSEVAL_PROGRAM | ST_NEW_GEOMETRY_PROGRAM */
+ /* We have to check the last bound stage and see if it writes psize */
+ struct gl_program *last = NULL;
+ if (ctx->GeometryProgram._Current)
+ last = &ctx->GeometryProgram._Current->Base;
+ else if (ctx->TessEvalProgram._Current)
+ last = &ctx->TessEvalProgram._Current->Base;
+ else if (ctx->VertexProgram._Current)
+ last = &ctx->VertexProgram._Current->Base;
+ if (last)
+ raster->point_size_per_vertex =
+ !!(last->OutputsWritten & BITFIELD64_BIT(VARYING_SLOT_PSIZ));
+ }
}
if (!raster->point_size_per_vertex) {
/* clamp size now */
@@ -293,6 +307,8 @@ const struct st_tracked_state st_update_rasterizer = {
_NEW_FRAG_CLAMP |
_NEW_TRANSFORM), /* mesa state dependencies*/
(ST_NEW_VERTEX_PROGRAM |
+ ST_NEW_TESSEVAL_PROGRAM |
+ ST_NEW_GEOMETRY_PROGRAM |
ST_NEW_RASTERIZER), /* state tracker dependencies */
},
update_raster_state /* update function */