r600: partly fix sampleMaskIn value
authorRoland Scheidegger <sroland@vmware.com>
Sun, 4 Feb 2018 22:54:26 +0000 (23:54 +0100)
committerRoland Scheidegger <sroland@vmware.com>
Thu, 8 Feb 2018 03:07:52 +0000 (04:07 +0100)
commitb936f4d1ca0d2ab1e828ff6a6e617f12469687fa
treed10124e13dbb3fe6cd6d0f48848f6629aaa01bfc
parent07d724326aba79451133337e5ee3711df7f73dfb
r600: partly fix sampleMaskIn value

The hw gives us coverage for pixel, not for individual fragment shader
invocations, in case execution isn't per pixel (eg, unlike cm, actually
cannot do "real" minSampleShading, it's either per-pixel or per-fragment,
but it doesn't really make a difference here).
Also, with msaa disabled, the hw still gives us a mask corresponding to
the number of samples, where GL requires this to be 1.
Fix this up by masking the sampleMaskIn bits with the bit corresponding to
the sampleID, if we know this shader is always executed at per-sample
granularity. (In case of a per-sample frequency shader and msaa disabled,
the sampleID will always be 0, so this works just fine there.)
Fixing this for the minSampleShading case will need a shader key (radeonsi
uses the prolog part for) (for eg, could get away with a single bit, cm
would need more bits depending on sample/invocation ratio, or read the
bits from a uniform), unless we'd want to always use a sample mask uniform
(which is probably not a good idea, as it would make the ordinary common
msaa case slower for no good reason).
This fixes some parts of piglit arb_sample_shading-samplemask (with fixed
test), in particular those which use a sampleID, still failing others
as expected.

Reviewed-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/r600/r600_shader.c