freedreno/a3xx+a4xx: fix GL_POINTS lockup w/ GLES
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>
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user