freedreno: Cleanup primtypes/primtypes_mask
authorRob Clark <robdclark@chromium.org>
Sun, 12 Sep 2021 22:49:02 +0000 (15:49 -0700)
committerMarge Bot <eric+marge@anholt.net>
Mon, 13 Sep 2021 17:21:14 +0000 (17:21 +0000)
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 <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12820>

19 files changed:
src/gallium/drivers/freedreno/a2xx/fd2_context.c
src/gallium/drivers/freedreno/a2xx/fd2_draw.c
src/gallium/drivers/freedreno/a2xx/fd2_screen.c
src/gallium/drivers/freedreno/a3xx/fd3_context.c
src/gallium/drivers/freedreno/a3xx/fd3_draw.c
src/gallium/drivers/freedreno/a3xx/fd3_screen.c
src/gallium/drivers/freedreno/a4xx/fd4_context.c
src/gallium/drivers/freedreno/a4xx/fd4_draw.c
src/gallium/drivers/freedreno/a4xx/fd4_screen.c
src/gallium/drivers/freedreno/a5xx/fd5_context.c
src/gallium/drivers/freedreno/a5xx/fd5_draw.c
src/gallium/drivers/freedreno/a5xx/fd5_screen.c
src/gallium/drivers/freedreno/a6xx/fd6_context.c
src/gallium/drivers/freedreno/a6xx/fd6_draw.c
src/gallium/drivers/freedreno/a6xx/fd6_screen.c
src/gallium/drivers/freedreno/freedreno_context.c
src/gallium/drivers/freedreno/freedreno_context.h
src/gallium/drivers/freedreno/freedreno_screen.c
src/gallium/drivers/freedreno/freedreno_screen.h

index 2c9118f..3429fb0 100644 (file)
@@ -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;
 
index 2a53632..797daf3 100644 (file)
@@ -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 */
index 65d9fbe..c55aa6b 100644 (file)
@@ -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;
    }
 }
index d85ed79..ec73d22 100644 (file)
@@ -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;
 
index 786c954..ece70a7 100644 (file)
@@ -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);
 
index 854d73d..f9fe811 100644 (file)
@@ -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;
 }
index 6074fbc..3d65198 100644 (file)
@@ -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;
 
index 7647388..ad569c4 100644 (file)
@@ -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);
 
index f5e62ba..8d42677 100644 (file)
@@ -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;
 }
index 2eddc0d..26d0bd5 100644 (file)
@@ -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;
 
index 0530245..5885c05 100644 (file)
@@ -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);
 
index aa6856f..bf54f37 100644 (file)
@@ -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;
 }
index 9b12c38..3bafe3c 100644 (file)
@@ -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;
 
index c6493b4..ec1716c 100644 (file)
@@ -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,
    };
index 90e36a3..a0f1aeb 100644 (file)
@@ -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;
 }
index de4d42f..661817d 100644 (file)
@@ -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
index 6c6385f..3d5df5b 100644 (file)
@@ -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);
 
index 7b5729b..5c077f2 100644 (file)
@@ -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);
index 596d810..ca15d3e 100644 (file)
@@ -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 *