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)
{
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;
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 */
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)
{
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;
}
}
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
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;
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);
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)
{
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;
}
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
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;
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);
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)
{
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;
}
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
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;
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);
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)
{
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;
}
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)
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;
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,
};
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)
{
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;
}
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))
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
*/
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;
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);
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:
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);
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;
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 *