[Mesa-stable] [PATCH 2/2] i965: Ignore 'centroid' interpolation qualifier in case of persample shading
Anuj Phogat
anuj.phogat at gmail.com
Wed Jan 29 17:31:05 PST 2014
This patch handles the use of 'centroid' qualifier with 'in' variables
in a fragment shader when persample shading is enabled. Per sample
shading for the whole fragment shader can be enabled by:
glEnable(GL_SAMPLE_SHADING) or using {gl_SamplePosition, gl_SampleID}
builtin variables in fragment shader. Explaining it below in more
detail.
/* Enable sample shading using OpenGL API */
glEnable(GL_SAMPLE_SHADING);
glMinSampleShading(1.0);
Example fragment shader:
in vec4 a;
centroid in vec4 b;
main()
{
...
}
Variable 'a' will be interpolated at sample location. But, what
interpolation should we use for variable 'b' ?
ARB_sample_shading recommends interpolation at sample position for
all the variables. GLSL 400 (and earlier) spec says that:
"When an interpolation qualifier is used, it overrides settings
established through the OpenGL API."
But, this text got deleted in later versions of GLSL.
NVIDIA's and AMD's proprietary linux drivers (at OpenGL 4.3)
interpolates at sample position. This convinces me to use
the similar approach on intel hardware.
Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
Reviewed-by: Chris Forbes <chrisf at ijw.co.nz>
(cherry picked from commit f5cfb4ae21df8eebfc6b86c0ce858b1c0a9160dd)
and
i965: Ignore 'centroid' interpolation qualifier in case of persample shading
I missed this change in commit f5cfb4a. It fixes the incorrect
rendering caused in Dolphin Emulator.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=73915
Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
Tested-by: Markus Wick <wickmarkus at web.de>
Reviewed-by: Matt Turner <mattst88 at gmail.com>
(cherry picked from commit dc2f94bc786768329973403248820a2e5249f102)
---
src/mesa/drivers/dri/i965/brw_fs.cpp | 2 +-
src/mesa/drivers/dri/i965/brw_wm.c | 3 ++-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index a006740..89343eb 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -1099,7 +1099,7 @@ fs_visitor::emit_general_interpolation(ir_variable *ir)
*/
struct brw_reg interp = interp_reg(location, k);
emit_linterp(attr, fs_reg(interp), interpolation_mode,
- ir->centroid,
+ ir->centroid && !c->key.persample_shading,
c->key.persample_shading);
if (brw->needs_unlit_centroid_workaround && ir->centroid) {
diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c
index 464e826..a350ebd 100644
--- a/src/mesa/drivers/dri/i965/brw_wm.c
+++ b/src/mesa/drivers/dri/i965/brw_wm.c
@@ -61,7 +61,8 @@ brw_compute_barycentric_interp_modes(struct brw_context *brw,
for (attr = 0; attr < VARYING_SLOT_MAX; ++attr) {
enum glsl_interp_qualifier interp_qualifier =
fprog->InterpQualifier[attr];
- bool is_centroid = fprog->IsCentroid & BITFIELD64_BIT(attr);
+ bool is_centroid = (fprog->IsCentroid & BITFIELD64_BIT(attr)) &&
+ !persample_shading;
bool is_sample = persample_shading;
bool is_gl_Color = attr == VARYING_SLOT_COL0 || attr == VARYING_SLOT_COL1;
--
1.8.3.1
More information about the mesa-stable
mailing list