radeonsi: hard-code pixel center for interpolateAtSample without multisample buffers
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Sun, 10 Sep 2017 17:46:31 +0000 (19:46 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 13 Sep 2017 16:25:45 +0000 (18:25 +0200)
commite4af4433fc802fafcb6050e290c514ff40c8735d
tree8208f4f8058d1aa18048f22fb8decdc326f73415
parent92c4277990799641d4986ce66a62366228713945
radeonsi: hard-code pixel center for interpolateAtSample without multisample buffers

The GLSL rules for interpolateAtSample are unfortunate:

   "Returns the value of the input interpolant variable at
    the location of sample number sample. If
    multisample buffers are not available, the input
    variable will be evaluated at the center of the pixel.
    If sample sample does not exist, the position used to
    interpolate the input variable is undefined."

This fix will fallback to monolithic shader compilation when
interpolateAtSample is used without multisampling.

One alternative would be to always upload 16 sample positions,
filling the buffer up with repetition when the actual number of
samples is less, and then ANDing the sample ID with 0xf. However,
that punishes all well-behaving users of interpolateAtSample,
when in reality, only conformance tests should be affected by
the issue.

Fixes
dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_sample.non_multisample_buffer.*

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeonsi/si_shader.c
src/gallium/drivers/radeonsi/si_shader.h
src/gallium/drivers/radeonsi/si_state_shaders.c