static void draw_impl(struct fd_context *ctx, struct fd_ringbuffer *ring, struct fd3_emit *emit) { const struct pipe_draw_info *info = emit->info; enum pc_di_primtype primtype = ctx->primtypes[info->mode]; fd3_emit_state(ctx, ring, emit); if (emit->dirty & (FD_DIRTY_VTXBUF | FD_DIRTY_VTXSTATE)) fd3_emit_vertex_bufs(ring, emit); OUT_PKT0(ring, REG_A3XX_PC_VERTEX_REUSE_BLOCK_CNTL, 1); OUT_RING(ring, 0x0000000b); /* PC_VERTEX_REUSE_BLOCK_CNTL */ OUT_PKT0(ring, REG_A3XX_VFD_INDEX_MIN, 4); OUT_RING(ring, add_sat(info->min_index, info->index_bias)); /* VFD_INDEX_MIN */ OUT_RING(ring, add_sat(info->max_index, info->index_bias)); /* VFD_INDEX_MAX */ OUT_RING(ring, info->start_instance); /* VFD_INSTANCEID_OFFSET */ OUT_RING(ring, info->indexed ? info->index_bias : info->start); /* VFD_INDEX_OFFSET */ OUT_PKT0(ring, REG_A3XX_PC_RESTART_INDEX, 1); OUT_RING(ring, info->primitive_restart ? /* PC_RESTART_INDEX */ info->restart_index : 0xffffffff); if (ctx->rasterizer && ctx->rasterizer->point_size_per_vertex && info->mode == PIPE_PRIM_POINTS) primtype = DI_PT_POINTLIST_A2XX; fd_draw_emit(ctx, ring, primtype, emit->key.binning_pass ? IGNORE_VISIBILITY : USE_VISIBILITY, info); }
static void draw_impl(struct fd_context *ctx, struct fd_ringbuffer *ring, struct fd3_emit *emit) { const struct pipe_draw_info *info = emit->info; fd3_emit_state(ctx, ring, emit); if (emit->dirty & (FD_DIRTY_VTXBUF | FD_DIRTY_VTXSTATE)) fd3_emit_vertex_bufs(ring, emit); OUT_PKT0(ring, REG_A3XX_PC_VERTEX_REUSE_BLOCK_CNTL, 1); OUT_RING(ring, 0x0000000b); /* PC_VERTEX_REUSE_BLOCK_CNTL */ OUT_PKT0(ring, REG_A3XX_VFD_INDEX_MIN, 4); OUT_RING(ring, add_sat(info->min_index, info->index_bias)); /* VFD_INDEX_MIN */ OUT_RING(ring, add_sat(info->max_index, info->index_bias)); /* VFD_INDEX_MAX */ OUT_RING(ring, info->start_instance); /* VFD_INSTANCEID_OFFSET */ OUT_RING(ring, info->indexed ? info->index_bias : info->start); /* VFD_INDEX_OFFSET */ OUT_PKT0(ring, REG_A3XX_PC_RESTART_INDEX, 1); OUT_RING(ring, info->primitive_restart ? /* PC_RESTART_INDEX */ info->restart_index : 0xffffffff); fd_draw_emit(ctx, ring, emit->key.binning_pass ? IGNORE_VISIBILITY : USE_VISIBILITY, info); }
ushort16 add_sat(ushort16 x, ushort16 y){ ushort16 rst; for (int i = 0; i < 16; i++) { rst[i] = add_sat(x[i], y[i]); } return rst; }
ushort4 add_sat(ushort4 x, ushort4 y){ ushort4 rst; for (int i = 0; i < 4; i++) { rst[i] = add_sat(x[i], y[i]); } return rst; }
ushort8 add_sat(ushort8 x, ushort8 y){ ushort8 rst; for (int i = 0; i < 8; i++) { rst[i] = add_sat(x[i], y[i]); } return rst; }
ushort2 add_sat(ushort2 x, ushort2 y){ ushort2 rst; for (int i = 0; i < 2; i++) { rst[i] = add_sat(x[i], y[i]); } return rst; }
ushort3 add_sat(ushort3 x, ushort3 y){ ushort3 rst; for (int i = 0; i < 3; i++) { rst[i] = add_sat(x[i], y[i]); } return rst; }
char16 add_sat(char16 x, char16 y){ char16 rst; for (int i = 0; i < 16; i++) { rst[i] = add_sat(x[i], y[i]); } return rst; }
char8 add_sat(char8 x, char8 y){ char8 rst; for (int i = 0; i < 8; i++) { rst[i] = add_sat(x[i], y[i]); } return rst; }
char4 add_sat(char4 x, char4 y){ char4 rst; for (int i = 0; i < 4; i++) { rst[i] = add_sat(x[i], y[i]); } return rst; }
char3 add_sat(char3 x, char3 y){ char3 rst; for (int i = 0; i < 3; i++) { rst[i] = add_sat(x[i], y[i]); } return rst; }
char2 add_sat(char2 x, char2 y){ char2 rst; for (int i = 0; i < 2; i++) { rst[i] = add_sat(x[i], y[i]); } return rst; }