freedreno/a3xx+a4xx: fix GL_POINTS lockup w/ GLES
authorRob Clark <robclark@freedesktop.org>
Mon, 16 Nov 2015 19:58:50 +0000 (14:58 -0500)
committerRob Clark <robclark@freedesktop.org>
Wed, 18 Nov 2015 19:31:13 +0000 (14:31 -0500)
point_size_per_vertex is always TRUE for GLES, causing us to configure
the hw as if gl_PointSize was written, even if it was not.  Which makes
for grumpy hw.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
src/gallium/drivers/freedreno/a3xx/fd3_draw.c
src/gallium/drivers/freedreno/a4xx/fd4_draw.c
src/gallium/drivers/freedreno/a4xx/fd4_draw.h

index 3906c9b996ecca9053076d3eaf32b564b7b5d04a..b8a31d84b3ff0d1deb9d38b58ddf40b2e36b4155 100644 (file)
@@ -81,7 +81,9 @@ draw_impl(struct fd_context *ctx, struct fd_ringbuffer *ring,
        OUT_RING(ring, info->primitive_restart ? /* PC_RESTART_INDEX */
                        info->restart_index : 0xffffffff);
 
+       /* points + psize -> spritelist: */
        if (ctx->rasterizer->point_size_per_vertex &&
+                       fd3_emit_get_vp(emit)->writes_psize &&
                        (info->mode == PIPE_PRIM_POINTS))
                primtype = DI_PT_POINTLIST_PSIZE;
 
index 7bd5163529a2173a99c3dd6aba35e2aa528294e5..54bd445d43bd96cce11cb11e12ea9ac2106de6ea 100644 (file)
@@ -47,6 +47,7 @@ draw_impl(struct fd_context *ctx, struct fd_ringbuffer *ring,
                struct fd4_emit *emit)
 {
        const struct pipe_draw_info *info = emit->info;
+       enum pc_di_primtype primtype = ctx->primtypes[info->mode];
 
        if (!(fd4_emit_get_vp(emit) && fd4_emit_get_fp(emit)))
                return;
@@ -64,7 +65,14 @@ draw_impl(struct fd_context *ctx, struct fd_ringbuffer *ring,
        OUT_RING(ring, info->primitive_restart ? /* PC_RESTART_INDEX */
                        info->restart_index : 0xffffffff);
 
+       /* points + psize -> spritelist: */
+       if (ctx->rasterizer->point_size_per_vertex &&
+                       fd4_emit_get_vp(emit)->writes_psize &&
+                       (info->mode == PIPE_PRIM_POINTS))
+               primtype = DI_PT_POINTLIST_PSIZE;
+
        fd4_draw_emit(ctx, ring,
+                       primtype,
                        emit->key.binning_pass ? IGNORE_VISIBILITY : USE_VISIBILITY,
                        info);
 }
index b89a30a7c4b0884d11d7ab682bb407ae4caa0473..a6c56404a8af2f9d22abcb60dc9665f76d3f0e77 100644 (file)
@@ -101,12 +101,12 @@ fd4_size2indextype(unsigned index_size)
 }
 static inline void
 fd4_draw_emit(struct fd_context *ctx, struct fd_ringbuffer *ring,
+               enum pc_di_primtype primtype,
                enum pc_di_vis_cull_mode vismode,
                const struct pipe_draw_info *info)
 {
        struct pipe_index_buffer *idx = &ctx->indexbuf;
        struct fd_bo *idx_bo = NULL;
-       enum pc_di_primtype primtype = ctx->primtypes[info->mode];
        enum a4xx_index_size idx_type;
        enum pc_di_src_sel src_sel;
        uint32_t idx_size, idx_offset;
@@ -127,11 +127,6 @@ fd4_draw_emit(struct fd_context *ctx, struct fd_ringbuffer *ring,
                src_sel = DI_SRC_SEL_AUTO_INDEX;
        }
 
-       /* points + psize -> spritelist: */
-       if (ctx->rasterizer && ctx->rasterizer->point_size_per_vertex &&
-                       (info->mode == PIPE_PRIM_POINTS))
-               primtype = DI_PT_POINTLIST_PSIZE;
-
        fd4_draw(ctx, ring, primtype, vismode, src_sel,
                        info->count, info->instance_count,
                        idx_type, idx_size, idx_offset, idx_bo);