vc4: clamp gl_PointSize to a minimum of 1.0
authorIago Toral Quiroga <itoral@igalia.com>
Wed, 31 Jul 2019 08:33:08 +0000 (10:33 +0200)
committerIago Toral Quiroga <itoral@igalia.com>
Tue, 13 Aug 2019 07:44:54 +0000 (09:44 +0200)
The OpenGL ES spec requires that the value of gl_PointSize is clamped
to an implementation-dependent range matching what is advertised by
GL_ALIASED_POINT_SIZE_RANGE. For VC4 this is [1.0, 512.0], but the
hardware won't clamp to the minimum side of the range and won't render
points with a size strictly smaller than 1.0 either, so we need to
clamp manually. For points larger than the maximum size of the range
the hardware clamps automatically.

Fixes piglit test:
spec/!opengl 2.0/vs-point_size-zero

Reviewed-by: Eric Anholt <eric@anholt.net>
src/gallium/drivers/vc4/vc4_program.c

index 7fb25ba782e4b4bba9c36a0b28d818a82d3f1d9b..1d55b87e1efb821b27b1e2fa6397ccd45c11fa69 100644 (file)
@@ -1441,11 +1441,6 @@ emit_point_size_write(struct vc4_compile *c)
         else
                 point_size = qir_uniform_f(c, 1.0);
 
-        /* Workaround: HW-2726 PTB does not handle zero-size points (BCM2835,
-         * BCM21553).
-         */
-        point_size = qir_FMAX(c, point_size, qir_uniform_f(c, .125));
-
         qir_VPM_WRITE(c, point_size);
 }
 
@@ -2456,6 +2451,9 @@ vc4_shader_state_create(struct pipe_context *pctx,
                 s = tgsi_to_nir(cso->tokens, pctx->screen);
         }
 
+        if (s->info.stage == MESA_SHADER_VERTEX)
+                NIR_PASS_V(s, nir_lower_point_size, 1.0f, 0.0f);
+
         NIR_PASS_V(s, nir_lower_io, nir_var_all, type_size,
                    (nir_lower_io_options)0);