summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/panfrost/pan_varyings.c
diff options
context:
space:
mode:
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>2019-08-22 11:29:23 -0700
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>2019-08-22 13:31:39 -0700
commit2c5ba2ee6ea68aa3062156d1a4abfc3b2556775d (patch)
tree8fa38beca758dbf3f5d50eb845716969d31e3435 /src/gallium/drivers/panfrost/pan_varyings.c
parenteeebf5c2dfbf68e8db5a9926bba7ae55ed7c1b54 (diff)
panfrost: Implement gl_FragCoord correctly
Rather than passing through the transformed gl_Position, we can use the hardware-level varying for this, which will correctly handle gl_FragCoord.w Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Diffstat (limited to 'src/gallium/drivers/panfrost/pan_varyings.c')
-rw-r--r--src/gallium/drivers/panfrost/pan_varyings.c31
1 files changed, 14 insertions, 17 deletions
diff --git a/src/gallium/drivers/panfrost/pan_varyings.c b/src/gallium/drivers/panfrost/pan_varyings.c
index 0ac3b9d8854..113043b699d 100644
--- a/src/gallium/drivers/panfrost/pan_varyings.c
+++ b/src/gallium/drivers/panfrost/pan_varyings.c
@@ -73,19 +73,6 @@ panfrost_emit_streamout(
slot->elements = addr;
}
-static void
-panfrost_emit_point_coord(union mali_attr *slot)
-{
- slot->elements = MALI_VARYING_POINT_COORD | MALI_ATTR_LINEAR;
- slot->stride = slot->size = slot->shift = slot->extra_flags = 0;
-}
-
-static void
-panfrost_emit_front_face(union mali_attr *slot)
-{
- slot->elements = MALI_VARYING_FRONT_FACING | MALI_ATTR_INTERNAL;
-}
-
/* Given a shader and buffer indices, link varying metadata together */
static bool
@@ -250,6 +237,7 @@ panfrost_emit_varying_descriptor(
memcpy(trans.cpu + vs_size, fs->varyings, fs_size);
union mali_attr varyings[PIPE_MAX_ATTRIBS];
+ memset(varyings, 0, sizeof(varyings));
/* Figure out how many streamout buffers could be bound */
unsigned so_count = ctx->streamout.num_targets;
@@ -269,6 +257,7 @@ panfrost_emit_varying_descriptor(
signed gl_PointSize = vs->writes_point_size ? (idx++) : -1;
signed gl_PointCoord = reads_point_coord ? (idx++) : -1;
signed gl_FrontFacing = fs->reads_face ? (idx++) : -1;
+ signed gl_FragCoord = fs->reads_frag_coord ? (idx++) : -1;
/* Emit the stream out buffers */
@@ -305,20 +294,25 @@ panfrost_emit_varying_descriptor(
2, vertex_count);
if (reads_point_coord)
- panfrost_emit_point_coord(&varyings[gl_PointCoord]);
+ varyings[gl_PointCoord].elements = MALI_VARYING_POINT_COORD;
if (fs->reads_face)
- panfrost_emit_front_face(&varyings[gl_FrontFacing]);
+ varyings[gl_FrontFacing].elements = MALI_VARYING_FRONT_FACING;
+
+ if (fs->reads_frag_coord)
+ varyings[gl_FragCoord].elements = MALI_VARYING_FRAG_COORD;
/* Let's go ahead and link varying meta to the buffer in question, now
- * that that information is available */
+ * that that information is available. VARYING_SLOT_POS is mapped to
+ * gl_FragCoord for fragment shaders but gl_Positionf or vertex shaders
+ * */
panfrost_emit_varying_meta(trans.cpu, vs,
general, gl_Position, gl_PointSize,
gl_PointCoord, gl_FrontFacing);
panfrost_emit_varying_meta(trans.cpu + vs_size, fs,
- general, gl_Position, gl_PointSize,
+ general, gl_FragCoord, gl_PointSize,
gl_PointCoord, gl_FrontFacing);
/* Replace streamout */
@@ -376,6 +370,9 @@ panfrost_emit_varying_descriptor(
/* Fix up unaligned addresses */
for (unsigned i = 0; i < so_count; ++i) {
+ if (varyings[i].elements < MALI_VARYING_SPECIAL)
+ continue;
+
unsigned align = (varyings[i].elements & 63);
/* While we're at it, the SO buffers are linear */