From 0ee0972a0db9704581b5c199f62d0a245f1aed22 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Sun, 12 Sep 2021 15:49:02 -0700 Subject: [PATCH] freedreno: Cleanup primtypes/primtypes_mask Move primtypes/primtypes_mask to screen to remove duplicated introduced by 744ef862b8d30d2037b8826153d2d2366e99844b. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/5299 Signed-off-by: Rob Clark Part-of: --- src/gallium/drivers/freedreno/a2xx/fd2_context.c | 25 +--------------- src/gallium/drivers/freedreno/a2xx/fd2_draw.c | 4 +-- src/gallium/drivers/freedreno/a2xx/fd2_screen.c | 36 +++++++++++++++-------- src/gallium/drivers/freedreno/a3xx/fd3_context.c | 15 +--------- src/gallium/drivers/freedreno/a3xx/fd3_draw.c | 2 +- src/gallium/drivers/freedreno/a3xx/fd3_screen.c | 21 ++++++++----- src/gallium/drivers/freedreno/a4xx/fd4_context.c | 15 +--------- src/gallium/drivers/freedreno/a4xx/fd4_draw.c | 2 +- src/gallium/drivers/freedreno/a4xx/fd4_screen.c | 21 ++++++++----- src/gallium/drivers/freedreno/a5xx/fd5_context.c | 15 +--------- src/gallium/drivers/freedreno/a5xx/fd5_draw.c | 2 +- src/gallium/drivers/freedreno/a5xx/fd5_screen.c | 21 ++++++++----- src/gallium/drivers/freedreno/a6xx/fd6_context.c | 20 +------------ src/gallium/drivers/freedreno/a6xx/fd6_draw.c | 2 +- src/gallium/drivers/freedreno/a6xx/fd6_screen.c | 31 +++++++++++-------- src/gallium/drivers/freedreno/freedreno_context.c | 11 ++----- src/gallium/drivers/freedreno/freedreno_context.h | 10 +------ src/gallium/drivers/freedreno/freedreno_screen.c | 9 +++++- src/gallium/drivers/freedreno/freedreno_screen.h | 12 +++++++- 19 files changed, 117 insertions(+), 157 deletions(-) diff --git a/src/gallium/drivers/freedreno/a2xx/fd2_context.c b/src/gallium/drivers/freedreno/a2xx/fd2_context.c index 2c9118f..3429fb0 100644 --- a/src/gallium/drivers/freedreno/a2xx/fd2_context.c +++ b/src/gallium/drivers/freedreno/a2xx/fd2_context.c @@ -70,27 +70,6 @@ create_solid_vertexbuf(struct pipe_context *pctx) return prsc; } -/* clang-format off */ -static const uint8_t a22x_primtypes[PIPE_PRIM_MAX] = { - [PIPE_PRIM_POINTS] = DI_PT_POINTLIST_PSIZE, - [PIPE_PRIM_LINES] = DI_PT_LINELIST, - [PIPE_PRIM_LINE_STRIP] = DI_PT_LINESTRIP, - [PIPE_PRIM_LINE_LOOP] = DI_PT_LINELOOP, - [PIPE_PRIM_TRIANGLES] = DI_PT_TRILIST, - [PIPE_PRIM_TRIANGLE_STRIP] = DI_PT_TRISTRIP, - [PIPE_PRIM_TRIANGLE_FAN] = DI_PT_TRIFAN, -}; - -static const uint8_t a20x_primtypes[PIPE_PRIM_MAX] = { - [PIPE_PRIM_POINTS] = DI_PT_POINTLIST_PSIZE, - [PIPE_PRIM_LINES] = DI_PT_LINELIST, - [PIPE_PRIM_LINE_STRIP] = DI_PT_LINESTRIP, - [PIPE_PRIM_TRIANGLES] = DI_PT_TRILIST, - [PIPE_PRIM_TRIANGLE_STRIP] = DI_PT_TRISTRIP, - [PIPE_PRIM_TRIANGLE_FAN] = DI_PT_TRIFAN, -}; -/* clang-format on */ - struct pipe_context * fd2_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) { @@ -118,9 +97,7 @@ fd2_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) fd2_prog_init(pctx); fd2_emit_init(pctx); - pctx = fd_context_init( - &fd2_ctx->base, pscreen, - (screen->gpu_id >= 220) ? a22x_primtypes : a20x_primtypes, priv, flags); + pctx = fd_context_init(&fd2_ctx->base, pscreen, priv, flags); if (!pctx) return NULL; diff --git a/src/gallium/drivers/freedreno/a2xx/fd2_draw.c b/src/gallium/drivers/freedreno/a2xx/fd2_draw.c index 2a53632..797daf3 100644 --- a/src/gallium/drivers/freedreno/a2xx/fd2_draw.c +++ b/src/gallium/drivers/freedreno/a2xx/fd2_draw.c @@ -136,8 +136,8 @@ draw_impl(struct fd_context *ctx, const struct pipe_draw_info *info, if (binning || info->mode == PIPE_PRIM_POINTS) vismode = IGNORE_VISIBILITY; - fd_draw_emit(ctx->batch, ring, ctx->primtypes[info->mode], vismode, info, - draw, index_offset); + fd_draw_emit(ctx->batch, ring, ctx->screen->primtypes[info->mode], + vismode, info, draw, index_offset); if (is_a20x(ctx->screen)) { /* not sure why this is required, but it fixes some hangs */ diff --git a/src/gallium/drivers/freedreno/a2xx/fd2_screen.c b/src/gallium/drivers/freedreno/a2xx/fd2_screen.c index 65d9fbe..c55aa6b 100644 --- a/src/gallium/drivers/freedreno/a2xx/fd2_screen.c +++ b/src/gallium/drivers/freedreno/a2xx/fd2_screen.c @@ -93,6 +93,27 @@ fd2_screen_is_format_supported(struct pipe_screen *pscreen, return retval == usage; } +/* clang-format off */ +static const uint8_t a22x_primtypes[PIPE_PRIM_MAX] = { + [PIPE_PRIM_POINTS] = DI_PT_POINTLIST_PSIZE, + [PIPE_PRIM_LINES] = DI_PT_LINELIST, + [PIPE_PRIM_LINE_STRIP] = DI_PT_LINESTRIP, + [PIPE_PRIM_LINE_LOOP] = DI_PT_LINELOOP, + [PIPE_PRIM_TRIANGLES] = DI_PT_TRILIST, + [PIPE_PRIM_TRIANGLE_STRIP] = DI_PT_TRISTRIP, + [PIPE_PRIM_TRIANGLE_FAN] = DI_PT_TRIFAN, +}; + +static const uint8_t a20x_primtypes[PIPE_PRIM_MAX] = { + [PIPE_PRIM_POINTS] = DI_PT_POINTLIST_PSIZE, + [PIPE_PRIM_LINES] = DI_PT_LINELIST, + [PIPE_PRIM_LINE_STRIP] = DI_PT_LINESTRIP, + [PIPE_PRIM_TRIANGLES] = DI_PT_TRILIST, + [PIPE_PRIM_TRIANGLE_STRIP] = DI_PT_TRISTRIP, + [PIPE_PRIM_TRIANGLE_FAN] = DI_PT_TRIFAN, +}; +/* clang-format on */ + void fd2_screen_init(struct pipe_screen *pscreen) { @@ -109,19 +130,8 @@ fd2_screen_init(struct pipe_screen *pscreen) fd2_emit_init_screen(pscreen); if (screen->gpu_id >= 220) { - screen->primtypes = BITFIELD_BIT(PIPE_PRIM_POINTS) | - BITFIELD_BIT(PIPE_PRIM_LINES) | - BITFIELD_BIT(PIPE_PRIM_LINE_STRIP) | - BITFIELD_BIT(PIPE_PRIM_LINE_LOOP) | - BITFIELD_BIT(PIPE_PRIM_TRIANGLES) | - BITFIELD_BIT(PIPE_PRIM_TRIANGLE_STRIP) | - BITFIELD_BIT(PIPE_PRIM_TRIANGLE_FAN); + screen->primtypes = a22x_primtypes; } else { - screen->primtypes = BITFIELD_BIT(PIPE_PRIM_POINTS) | - BITFIELD_BIT(PIPE_PRIM_LINES) | - BITFIELD_BIT(PIPE_PRIM_LINE_STRIP) | - BITFIELD_BIT(PIPE_PRIM_TRIANGLES) | - BITFIELD_BIT(PIPE_PRIM_TRIANGLE_STRIP) | - BITFIELD_BIT(PIPE_PRIM_TRIANGLE_FAN); + screen->primtypes = a20x_primtypes; } } diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_context.c b/src/gallium/drivers/freedreno/a3xx/fd3_context.c index d85ed79..ec73d22 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_context.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_context.c @@ -58,19 +58,6 @@ fd3_context_destroy(struct pipe_context *pctx) in_dt free(fd3_ctx); } -/* clang-format off */ -static const uint8_t primtypes[] = { - [PIPE_PRIM_POINTS] = DI_PT_POINTLIST, - [PIPE_PRIM_LINES] = DI_PT_LINELIST, - [PIPE_PRIM_LINE_STRIP] = DI_PT_LINESTRIP, - [PIPE_PRIM_LINE_LOOP] = DI_PT_LINELOOP, - [PIPE_PRIM_TRIANGLES] = DI_PT_TRILIST, - [PIPE_PRIM_TRIANGLE_STRIP] = DI_PT_TRISTRIP, - [PIPE_PRIM_TRIANGLE_FAN] = DI_PT_TRIFAN, - [PIPE_PRIM_MAX] = DI_PT_RECTLIST, /* internal clear blits */ -}; -/* clang-format on */ - struct pipe_context * fd3_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) in_dt @@ -100,7 +87,7 @@ fd3_context_create(struct pipe_screen *pscreen, void *priv, fd3_prog_init(pctx); fd3_emit_init(pctx); - pctx = fd_context_init(&fd3_ctx->base, pscreen, primtypes, priv, flags); + pctx = fd_context_init(&fd3_ctx->base, pscreen, priv, flags); if (!pctx) return NULL; diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c index 786c954..ece70a7 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c @@ -56,7 +56,7 @@ draw_impl(struct fd_context *ctx, struct fd_ringbuffer *ring, struct fd3_emit *emit, unsigned index_offset) assert_dt { const struct pipe_draw_info *info = emit->info; - enum pc_di_primtype primtype = ctx->primtypes[info->mode]; + enum pc_di_primtype primtype = ctx->screen->primtypes[info->mode]; fd3_emit_state(ctx, ring, emit); diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_screen.c b/src/gallium/drivers/freedreno/a3xx/fd3_screen.c index 854d73d..f9fe811 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_screen.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_screen.c @@ -94,6 +94,19 @@ fd3_screen_is_format_supported(struct pipe_screen *pscreen, return retval == usage; } +/* clang-format off */ +static const uint8_t primtypes[] = { + [PIPE_PRIM_POINTS] = DI_PT_POINTLIST, + [PIPE_PRIM_LINES] = DI_PT_LINELIST, + [PIPE_PRIM_LINE_STRIP] = DI_PT_LINESTRIP, + [PIPE_PRIM_LINE_LOOP] = DI_PT_LINELOOP, + [PIPE_PRIM_TRIANGLES] = DI_PT_TRILIST, + [PIPE_PRIM_TRIANGLE_STRIP] = DI_PT_TRISTRIP, + [PIPE_PRIM_TRIANGLE_FAN] = DI_PT_TRIFAN, + [PIPE_PRIM_MAX] = DI_PT_RECTLIST, /* internal clear blits */ +}; +/* clang-format on */ + void fd3_screen_init(struct pipe_screen *pscreen) { @@ -108,11 +121,5 @@ fd3_screen_init(struct pipe_screen *pscreen) if (FD_DBG(TTILE)) screen->tile_mode = fd3_tile_mode; - screen->primtypes = BITFIELD_BIT(PIPE_PRIM_POINTS) | - BITFIELD_BIT(PIPE_PRIM_LINES) | - BITFIELD_BIT(PIPE_PRIM_LINE_STRIP) | - BITFIELD_BIT(PIPE_PRIM_LINE_LOOP) | - BITFIELD_BIT(PIPE_PRIM_TRIANGLES) | - BITFIELD_BIT(PIPE_PRIM_TRIANGLE_STRIP) | - BITFIELD_BIT(PIPE_PRIM_TRIANGLE_FAN); + screen->primtypes = primtypes; } diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_context.c b/src/gallium/drivers/freedreno/a4xx/fd4_context.c index 6074fbc..3d65198 100644 --- a/src/gallium/drivers/freedreno/a4xx/fd4_context.c +++ b/src/gallium/drivers/freedreno/a4xx/fd4_context.c @@ -58,19 +58,6 @@ fd4_context_destroy(struct pipe_context *pctx) in_dt free(fd4_ctx); } -/* clang-format off */ -static const uint8_t primtypes[] = { - [PIPE_PRIM_POINTS] = DI_PT_POINTLIST, - [PIPE_PRIM_LINES] = DI_PT_LINELIST, - [PIPE_PRIM_LINE_STRIP] = DI_PT_LINESTRIP, - [PIPE_PRIM_LINE_LOOP] = DI_PT_LINELOOP, - [PIPE_PRIM_TRIANGLES] = DI_PT_TRILIST, - [PIPE_PRIM_TRIANGLE_STRIP] = DI_PT_TRISTRIP, - [PIPE_PRIM_TRIANGLE_FAN] = DI_PT_TRIFAN, - [PIPE_PRIM_MAX] = DI_PT_RECTLIST, /* internal clear blits */ -}; -/* clang-format on */ - struct pipe_context * fd4_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) in_dt @@ -100,7 +87,7 @@ fd4_context_create(struct pipe_screen *pscreen, void *priv, fd4_prog_init(pctx); fd4_emit_init(pctx); - pctx = fd_context_init(&fd4_ctx->base, pscreen, primtypes, priv, flags); + pctx = fd_context_init(&fd4_ctx->base, pscreen, priv, flags); if (!pctx) return NULL; diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_draw.c b/src/gallium/drivers/freedreno/a4xx/fd4_draw.c index 7647388..ad569c4 100644 --- a/src/gallium/drivers/freedreno/a4xx/fd4_draw.c +++ b/src/gallium/drivers/freedreno/a4xx/fd4_draw.c @@ -44,7 +44,7 @@ draw_impl(struct fd_context *ctx, struct fd_ringbuffer *ring, struct fd4_emit *emit, unsigned index_offset) assert_dt { const struct pipe_draw_info *info = emit->info; - enum pc_di_primtype primtype = ctx->primtypes[info->mode]; + enum pc_di_primtype primtype = ctx->screen->primtypes[info->mode]; fd4_emit_state(ctx, ring, emit); diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_screen.c b/src/gallium/drivers/freedreno/a4xx/fd4_screen.c index f5e62ba..8d42677 100644 --- a/src/gallium/drivers/freedreno/a4xx/fd4_screen.c +++ b/src/gallium/drivers/freedreno/a4xx/fd4_screen.c @@ -98,6 +98,19 @@ fd4_screen_is_format_supported(struct pipe_screen *pscreen, return retval == usage; } +/* clang-format off */ +static const uint8_t primtypes[] = { + [PIPE_PRIM_POINTS] = DI_PT_POINTLIST, + [PIPE_PRIM_LINES] = DI_PT_LINELIST, + [PIPE_PRIM_LINE_STRIP] = DI_PT_LINESTRIP, + [PIPE_PRIM_LINE_LOOP] = DI_PT_LINELOOP, + [PIPE_PRIM_TRIANGLES] = DI_PT_TRILIST, + [PIPE_PRIM_TRIANGLE_STRIP] = DI_PT_TRISTRIP, + [PIPE_PRIM_TRIANGLE_FAN] = DI_PT_TRIFAN, + [PIPE_PRIM_MAX] = DI_PT_RECTLIST, /* internal clear blits */ +}; +/* clang-format on */ + void fd4_screen_init(struct pipe_screen *pscreen) { @@ -109,11 +122,5 @@ fd4_screen_init(struct pipe_screen *pscreen) fd4_emit_init_screen(pscreen); ir3_screen_init(pscreen); - screen->primtypes = BITFIELD_BIT(PIPE_PRIM_POINTS) | - BITFIELD_BIT(PIPE_PRIM_LINES) | - BITFIELD_BIT(PIPE_PRIM_LINE_STRIP) | - BITFIELD_BIT(PIPE_PRIM_LINE_LOOP) | - BITFIELD_BIT(PIPE_PRIM_TRIANGLES) | - BITFIELD_BIT(PIPE_PRIM_TRIANGLE_STRIP) | - BITFIELD_BIT(PIPE_PRIM_TRIANGLE_FAN); + screen->primtypes = primtypes; } diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_context.c b/src/gallium/drivers/freedreno/a5xx/fd5_context.c index 2eddc0d..26d0bd5 100644 --- a/src/gallium/drivers/freedreno/a5xx/fd5_context.c +++ b/src/gallium/drivers/freedreno/a5xx/fd5_context.c @@ -57,19 +57,6 @@ fd5_context_destroy(struct pipe_context *pctx) in_dt free(fd5_ctx); } -/* clang-format off */ -static const uint8_t primtypes[] = { - [PIPE_PRIM_POINTS] = DI_PT_POINTLIST, - [PIPE_PRIM_LINES] = DI_PT_LINELIST, - [PIPE_PRIM_LINE_STRIP] = DI_PT_LINESTRIP, - [PIPE_PRIM_LINE_LOOP] = DI_PT_LINELOOP, - [PIPE_PRIM_TRIANGLES] = DI_PT_TRILIST, - [PIPE_PRIM_TRIANGLE_STRIP] = DI_PT_TRISTRIP, - [PIPE_PRIM_TRIANGLE_FAN] = DI_PT_TRIFAN, - [PIPE_PRIM_MAX] = DI_PT_RECTLIST, /* internal clear blits */ -}; -/* clang-format on */ - struct pipe_context * fd5_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) disable_thread_safety_analysis @@ -103,7 +90,7 @@ fd5_context_create(struct pipe_screen *pscreen, void *priv, if (!FD_DBG(NOBLIT)) fd5_ctx->base.blit = fd5_blitter_blit; - pctx = fd_context_init(&fd5_ctx->base, pscreen, primtypes, priv, flags); + pctx = fd_context_init(&fd5_ctx->base, pscreen, priv, flags); if (!pctx) return NULL; diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_draw.c b/src/gallium/drivers/freedreno/a5xx/fd5_draw.c index 0530245..5885c05 100644 --- a/src/gallium/drivers/freedreno/a5xx/fd5_draw.c +++ b/src/gallium/drivers/freedreno/a5xx/fd5_draw.c @@ -44,7 +44,7 @@ draw_impl(struct fd_context *ctx, struct fd_ringbuffer *ring, struct fd5_emit *emit, unsigned index_offset) assert_dt { const struct pipe_draw_info *info = emit->info; - enum pc_di_primtype primtype = ctx->primtypes[info->mode]; + enum pc_di_primtype primtype = ctx->screen->primtypes[info->mode]; fd5_emit_state(ctx, ring, emit); diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_screen.c b/src/gallium/drivers/freedreno/a5xx/fd5_screen.c index aa6856f..bf54f37 100644 --- a/src/gallium/drivers/freedreno/a5xx/fd5_screen.c +++ b/src/gallium/drivers/freedreno/a5xx/fd5_screen.c @@ -115,6 +115,19 @@ fd5_screen_is_format_supported(struct pipe_screen *pscreen, return retval == usage; } +/* clang-format off */ +static const uint8_t primtypes[] = { + [PIPE_PRIM_POINTS] = DI_PT_POINTLIST, + [PIPE_PRIM_LINES] = DI_PT_LINELIST, + [PIPE_PRIM_LINE_STRIP] = DI_PT_LINESTRIP, + [PIPE_PRIM_LINE_LOOP] = DI_PT_LINELOOP, + [PIPE_PRIM_TRIANGLES] = DI_PT_TRILIST, + [PIPE_PRIM_TRIANGLE_STRIP] = DI_PT_TRISTRIP, + [PIPE_PRIM_TRIANGLE_FAN] = DI_PT_TRIFAN, + [PIPE_PRIM_MAX] = DI_PT_RECTLIST, /* internal clear blits */ +}; +/* clang-format on */ + void fd5_screen_init(struct pipe_screen *pscreen) { @@ -130,11 +143,5 @@ fd5_screen_init(struct pipe_screen *pscreen) fd5_emit_init_screen(pscreen); ir3_screen_init(pscreen); - screen->primtypes = BITFIELD_BIT(PIPE_PRIM_POINTS) | - BITFIELD_BIT(PIPE_PRIM_LINES) | - BITFIELD_BIT(PIPE_PRIM_LINE_STRIP) | - BITFIELD_BIT(PIPE_PRIM_LINE_LOOP) | - BITFIELD_BIT(PIPE_PRIM_TRIANGLES) | - BITFIELD_BIT(PIPE_PRIM_TRIANGLE_STRIP) | - BITFIELD_BIT(PIPE_PRIM_TRIANGLE_FAN); + screen->primtypes = primtypes; } diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_context.c b/src/gallium/drivers/freedreno/a6xx/fd6_context.c index 9b12c38..3bafe3c 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_context.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_context.c @@ -66,24 +66,6 @@ fd6_context_destroy(struct pipe_context *pctx) in_dt free(fd6_ctx); } -/* clang-format off */ -static const uint8_t primtypes[] = { - [PIPE_PRIM_POINTS] = DI_PT_POINTLIST, - [PIPE_PRIM_LINES] = DI_PT_LINELIST, - [PIPE_PRIM_LINE_STRIP] = DI_PT_LINESTRIP, - [PIPE_PRIM_LINE_LOOP] = DI_PT_LINELOOP, - [PIPE_PRIM_TRIANGLES] = DI_PT_TRILIST, - [PIPE_PRIM_TRIANGLE_STRIP] = DI_PT_TRISTRIP, - [PIPE_PRIM_TRIANGLE_FAN] = DI_PT_TRIFAN, - [PIPE_PRIM_LINES_ADJACENCY] = DI_PT_LINE_ADJ, - [PIPE_PRIM_LINE_STRIP_ADJACENCY] = DI_PT_LINESTRIP_ADJ, - [PIPE_PRIM_TRIANGLES_ADJACENCY] = DI_PT_TRI_ADJ, - [PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY] = DI_PT_TRISTRIP_ADJ, - [PIPE_PRIM_PATCHES] = DI_PT_PATCHES0, - [PIPE_PRIM_MAX] = DI_PT_RECTLIST, /* internal clear blits */ -}; -/* clang-format on */ - static void * fd6_vertex_state_create(struct pipe_context *pctx, unsigned num_elements, const struct pipe_vertex_element *elements) @@ -245,7 +227,7 @@ fd6_context_create(struct pipe_screen *pscreen, void *priv, setup_state_map(&fd6_ctx->base); - pctx = fd_context_init(&fd6_ctx->base, pscreen, primtypes, priv, flags); + pctx = fd_context_init(&fd6_ctx->base, pscreen, priv, flags); if (!pctx) return NULL; diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_draw.c b/src/gallium/drivers/freedreno/a6xx/fd6_draw.c index c6493b4..ec1716c 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_draw.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_draw.c @@ -236,7 +236,7 @@ fd6_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info, struct fd_ringbuffer *ring = ctx->batch->draw; struct CP_DRAW_INDX_OFFSET_0 draw0 = { - .prim_type = ctx->primtypes[info->mode], + .prim_type = ctx->screen->primtypes[info->mode], .vis_cull = USE_VISIBILITY, .gs_enable = !!emit.key.gs, }; diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_screen.c b/src/gallium/drivers/freedreno/a6xx/fd6_screen.c index 90e36a3..a0f1aeb 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_screen.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_screen.c @@ -121,6 +121,24 @@ fd6_screen_is_format_supported(struct pipe_screen *pscreen, return retval == usage; } +/* clang-format off */ +static const uint8_t primtypes[] = { + [PIPE_PRIM_POINTS] = DI_PT_POINTLIST, + [PIPE_PRIM_LINES] = DI_PT_LINELIST, + [PIPE_PRIM_LINE_STRIP] = DI_PT_LINESTRIP, + [PIPE_PRIM_LINE_LOOP] = DI_PT_LINELOOP, + [PIPE_PRIM_TRIANGLES] = DI_PT_TRILIST, + [PIPE_PRIM_TRIANGLE_STRIP] = DI_PT_TRISTRIP, + [PIPE_PRIM_TRIANGLE_FAN] = DI_PT_TRIFAN, + [PIPE_PRIM_LINES_ADJACENCY] = DI_PT_LINE_ADJ, + [PIPE_PRIM_LINE_STRIP_ADJACENCY] = DI_PT_LINESTRIP_ADJ, + [PIPE_PRIM_TRIANGLES_ADJACENCY] = DI_PT_TRI_ADJ, + [PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY] = DI_PT_TRISTRIP_ADJ, + [PIPE_PRIM_PATCHES] = DI_PT_PATCHES0, + [PIPE_PRIM_MAX] = DI_PT_RECTLIST, /* internal clear blits */ +}; +/* clang-format on */ + void fd6_screen_init(struct pipe_screen *pscreen) { @@ -144,16 +162,5 @@ fd6_screen_init(struct pipe_screen *pscreen) fd6_emit_init_screen(pscreen); ir3_screen_init(pscreen); - screen->primtypes = BITFIELD_BIT(PIPE_PRIM_POINTS) | - BITFIELD_BIT(PIPE_PRIM_LINES) | - BITFIELD_BIT(PIPE_PRIM_LINE_STRIP) | - BITFIELD_BIT(PIPE_PRIM_LINE_LOOP) | - BITFIELD_BIT(PIPE_PRIM_TRIANGLES) | - BITFIELD_BIT(PIPE_PRIM_TRIANGLE_STRIP) | - BITFIELD_BIT(PIPE_PRIM_TRIANGLE_FAN) | - BITFIELD_BIT(PIPE_PRIM_LINES_ADJACENCY) | - BITFIELD_BIT(PIPE_PRIM_LINE_STRIP_ADJACENCY) | - BITFIELD_BIT(PIPE_PRIM_TRIANGLES_ADJACENCY) | - BITFIELD_BIT(PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY) | - BITFIELD_BIT(PIPE_PRIM_PATCHES); + screen->primtypes = primtypes; } diff --git a/src/gallium/drivers/freedreno/freedreno_context.c b/src/gallium/drivers/freedreno/freedreno_context.c index de4d42f..661817d 100644 --- a/src/gallium/drivers/freedreno/freedreno_context.c +++ b/src/gallium/drivers/freedreno/freedreno_context.c @@ -589,13 +589,12 @@ fd_context_cleanup_common_vbos(struct fd_context *ctx) struct pipe_context * fd_context_init(struct fd_context *ctx, struct pipe_screen *pscreen, - const uint8_t *primtypes, void *priv, - unsigned flags) disable_thread_safety_analysis + void *priv, unsigned flags) + disable_thread_safety_analysis { struct fd_screen *screen = fd_screen(pscreen); struct pipe_context *pctx; unsigned prio = 1; - int i; /* lower numerical value == higher priority: */ if (FD_DBG(HIPRIO)) @@ -621,12 +620,6 @@ fd_context_init(struct fd_context *ctx, struct pipe_screen *pscreen, ctx->global_reset_count = fd_get_reset_count(ctx, false); } - ctx->primtypes = primtypes; - ctx->primtype_mask = 0; - for (i = 0; i <= PIPE_PRIM_MAX; i++) - if (primtypes[i]) - ctx->primtype_mask |= (1 << i); - simple_mtx_init(&ctx->gmem_lock, mtx_plain); /* need some sane default in case gallium frontends don't diff --git a/src/gallium/drivers/freedreno/freedreno_context.h b/src/gallium/drivers/freedreno/freedreno_context.h index 6c6385f..3d5df5b 100644 --- a/src/gallium/drivers/freedreno/freedreno_context.h +++ b/src/gallium/drivers/freedreno/freedreno_context.h @@ -260,13 +260,6 @@ struct fd_context { */ bool active_queries dt; - /* table with PIPE_PRIM_MAX entries mapping PIPE_PRIM_x to - * DI_PT_x value to use for draw initiator. There are some - * slight differences between generation: - */ - const uint8_t *primtypes; - uint32_t primtype_mask; - /* shaders used by clear, and gmem->mem blits: */ struct fd_program_stateobj solid_prog; // TODO move to screen? struct fd_program_stateobj solid_layered_prog; @@ -725,8 +718,7 @@ void fd_emit_string5(struct fd_ringbuffer *ring, const char *string, int len); struct pipe_context *fd_context_init(struct fd_context *ctx, struct pipe_screen *pscreen, - const uint8_t *primtypes, void *priv, - unsigned flags); + void *priv, unsigned flags); struct pipe_context *fd_context_init_tc(struct pipe_context *pctx, unsigned flags); diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c index 7b5729b..5c077f2 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.c +++ b/src/gallium/drivers/freedreno/freedreno_screen.c @@ -241,7 +241,7 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_SUPPORTED_PRIM_MODES: case PIPE_CAP_SUPPORTED_PRIM_MODES_WITH_RESTART: - return screen->primtypes; + return screen->primtypes_mask; case PIPE_CAP_FRAGMENT_SHADER_TEXTURE_LOD: case PIPE_CAP_FRAGMENT_SHADER_DERIVATIVES: @@ -1075,6 +1075,13 @@ fd_screen_create(struct fd_device *dev, struct renderonly *ro, screen->info->num_ccu * A6XX_CCU_GMEM_COLOR_SIZE); } + /* fdN_screen_init() should set this: */ + assert(screen->primtypes); + screen->primtypes_mask = 0; + for (unsigned i = 0; i <= PIPE_PRIM_MAX; i++) + if (screen->primtypes[i]) + screen->primtypes_mask |= (1 << i); + if (FD_DBG(PERFC)) { screen->perfcntr_groups = fd_perfcntrs(screen->dev_id, &screen->num_perfcntr_groups); diff --git a/src/gallium/drivers/freedreno/freedreno_screen.h b/src/gallium/drivers/freedreno/freedreno_screen.h index 596d810..ca15d3e 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.h +++ b/src/gallium/drivers/freedreno/freedreno_screen.h @@ -89,7 +89,6 @@ struct fd_screen { uint32_t ram_size; uint32_t max_rts; /* max # of render targets */ uint32_t priority_mask; - uint32_t primtypes; bool has_timestamp; bool has_robustness; bool has_syncobj; @@ -149,6 +148,17 @@ struct fd_screen { const uint64_t *supported_modifiers; struct renderonly *ro; + + /* table with PIPE_PRIM_MAX+1 entries mapping PIPE_PRIM_x to + * DI_PT_x value to use for draw initiator. There are some + * slight differences between generation. + * + * Note that primtypes[PRIM_TYPE_MAX] is used to map to the + * internal RECTLIST primtype, if available, used for blits/ + * clears. + */ + const uint8_t *primtypes; + uint32_t primtypes_mask; }; static inline struct fd_screen * -- 2.7.4