freedreno/a3xx: fix gl_PointSize
authorRob Clark <robclark@freedesktop.org>
Wed, 26 Feb 2014 17:15:25 +0000 (12:15 -0500)
committerRob Clark <robclark@freedesktop.org>
Sun, 2 Mar 2014 16:26:35 +0000 (11:26 -0500)
If vertex writes pointsize, there are a few extra bits we need to turn
on in the cmdstream here and there.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
src/gallium/drivers/freedreno/a3xx/fd3_compiler.c
src/gallium/drivers/freedreno/a3xx/fd3_compiler_old.c
src/gallium/drivers/freedreno/a3xx/fd3_emit.c
src/gallium/drivers/freedreno/a3xx/fd3_program.c
src/gallium/drivers/freedreno/a3xx/fd3_program.h

index 905af54..14d95ba 100644 (file)
@@ -1997,8 +1997,10 @@ decl_out(struct fd3_compile_context *ctx, struct tgsi_full_declaration *decl)
                switch (name) {
                case TGSI_SEMANTIC_POSITION:
                        so->writes_pos = true;
-                       /* fallthrough */
+                       break;
                case TGSI_SEMANTIC_PSIZE:
+                       so->writes_psize = true;
+                       break;
                case TGSI_SEMANTIC_COLOR:
                case TGSI_SEMANTIC_GENERIC:
                case TGSI_SEMANTIC_FOG:
@@ -2013,7 +2015,7 @@ decl_out(struct fd3_compile_context *ctx, struct tgsi_full_declaration *decl)
                case TGSI_SEMANTIC_POSITION:
                        comp = 2;  /* tgsi will write to .z component */
                        so->writes_pos = true;
-                       /* fallthrough */
+                       break;
                case TGSI_SEMANTIC_COLOR:
                        break;
                default:
index 998b8e9..d40ee5c 100644 (file)
@@ -1377,8 +1377,10 @@ decl_out(struct fd3_compile_context *ctx, struct tgsi_full_declaration *decl)
                switch (name) {
                case TGSI_SEMANTIC_POSITION:
                        so->writes_pos = true;
-                       /* fallthrough */
+                       break;
                case TGSI_SEMANTIC_PSIZE:
+                       so->writes_psize = true;
+                       break;
                case TGSI_SEMANTIC_COLOR:
                case TGSI_SEMANTIC_GENERIC:
                case TGSI_SEMANTIC_FOG:
@@ -1393,7 +1395,7 @@ decl_out(struct fd3_compile_context *ctx, struct tgsi_full_declaration *decl)
                case TGSI_SEMANTIC_POSITION:
                        comp = 2;  /* tgsi will write to .z component */
                        so->writes_pos = true;
-                       /* fallthrough */
+                       break;
                case TGSI_SEMANTIC_COLOR:
                        break;
                default:
index 50271fa..619ac1e 100644 (file)
@@ -448,19 +448,20 @@ fd3_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
        }
 
        if (dirty & (FD_DIRTY_RASTERIZER | FD_DIRTY_PROG)) {
-               struct fd3_rasterizer_stateobj *rasterizer =
-                               fd3_rasterizer_stateobj(ctx->rasterizer);
-               uint32_t stride_in_vpc = 0;
+               uint32_t val = fd3_rasterizer_stateobj(ctx->rasterizer)
+                               ->pc_prim_vtx_cntl;
 
                if (!key.binning_pass) {
-                       stride_in_vpc = align(fp->total_in, 4) / 4;
+                       uint32_t stride_in_vpc = align(fp->total_in, 4) / 4;
                        if (stride_in_vpc > 0)
                                stride_in_vpc = MAX2(stride_in_vpc, 2);
+                       val |= A3XX_PC_PRIM_VTX_CNTL_STRIDE_IN_VPC(stride_in_vpc);
                }
 
+               val |= COND(vp->writes_psize, A3XX_PC_PRIM_VTX_CNTL_PSIZE);
+
                OUT_PKT0(ring, REG_A3XX_PC_PRIM_VTX_CNTL, 1);
-               OUT_RING(ring, rasterizer->pc_prim_vtx_cntl |
-                               A3XX_PC_PRIM_VTX_CNTL_STRIDE_IN_VPC(stride_in_vpc));
+               OUT_RING(ring, val);
        }
 
        if (dirty & FD_DIRTY_SCISSOR) {
index 6fc39a9..4cdd938 100644 (file)
@@ -494,13 +494,15 @@ fd3_program_emit(struct fd_ringbuffer *ring,
        if (key.binning_pass) {
                OUT_PKT0(ring, REG_A3XX_VPC_ATTR, 2);
                OUT_RING(ring, A3XX_VPC_ATTR_THRDASSIGN(1) |
-                               A3XX_VPC_ATTR_LMSIZE(1));
+                               A3XX_VPC_ATTR_LMSIZE(1) |
+                               COND(vp->writes_psize, A3XX_VPC_ATTR_PSIZE));
                OUT_RING(ring, 0x00000000);
        } else {
                OUT_PKT0(ring, REG_A3XX_VPC_ATTR, 2);
                OUT_RING(ring, A3XX_VPC_ATTR_TOTALATTR(fp->total_in) |
                                A3XX_VPC_ATTR_THRDASSIGN(1) |
-                               A3XX_VPC_ATTR_LMSIZE(1));
+                               A3XX_VPC_ATTR_LMSIZE(1) |
+                               COND(vp->writes_psize, A3XX_VPC_ATTR_PSIZE));
                OUT_RING(ring, A3XX_VPC_PACK_NUMFPNONPOSVAR(fp->total_in) |
                                A3XX_VPC_PACK_NUMNONPOSVSVAR(fp->total_in));
 
index 8f491b0..8d4fd57 100644 (file)
@@ -92,7 +92,7 @@ struct fd3_shader_variant {
                fd3_semantic semantic;
                uint8_t regid;
        } outputs[16];
-       bool writes_pos;
+       bool writes_pos, writes_psize;
 
        /* vertices/inputs: */
        unsigned inputs_count;