count = u_stream_outputs_for_vertices(ctx->active_prim,
ctx->vertex_count);
- ctx->streamout.offsets[i] += count;
+ pan_so_target(ctx->streamout.targets[i])->offset += count;
}
}
d->samplers = panfrost_emit_sampler_descriptors(batch, st);
}
+static enum mali_index_type
+panfrost_translate_index_size(unsigned size)
+{
+ switch (size) {
+ case 1: return MALI_INDEX_TYPE_UINT8;
+ case 2: return MALI_INDEX_TYPE_UINT16;
+ case 4: return MALI_INDEX_TYPE_UINT32;
+ default: unreachable("Invalid index size");
+ }
+}
+
static void
panfrost_draw_vbo(
struct pipe_context *pipe,
struct mali_vertex_tiler_prefix vertex_prefix = { 0 }, tiler_prefix = { 0 };
struct mali_draw_packed vertex_postfix, tiler_postfix;
+ struct mali_primitive_packed primitive;
+ struct mali_invocation_packed invocation;
union midgard_primitive_size primitive_size;
- unsigned vertex_count;
+ unsigned vertex_count = ctx->vertex_count;
mali_ptr shared_mem = (device->quirks & IS_BIFROST) ?
panfrost_vt_emit_shared_memory(batch) :
panfrost_batch_reserve_framebuffer(batch);
struct pipe_rasterizer_state *rast = &ctx->rasterizer->base;
- SET_BIT(tiler_prefix.unknown_draw, MALI_DRAW_FLATSHADE_FIRST,
- rast->flatshade_first);
-
- tiler_prefix.draw_mode = pan_draw_mode(mode);
-
- unsigned draw_flags = 0x3000;
-
- if (panfrost_writes_point_size(ctx))
- draw_flags |= MALI_DRAW_VARYING_SIZE;
-
- if (info->primitive_restart)
- draw_flags |= MALI_DRAW_PRIMITIVE_RESTART_FIXED_INDEX;
-
- if (info->index_size) {
- unsigned min_index = 0, max_index = 0;
-
- tiler_prefix.indices = panfrost_get_index_buffer_bounded(ctx,
- info,
- &min_index,
- &max_index);
-
- /* Use the corresponding values */
- vertex_count = max_index - min_index + 1;
- ctx->offset_start = min_index + info->index_bias;
- tiler_prefix.offset_bias_correction = -min_index;
- tiler_prefix.index_count = MALI_POSITIVE(info->count);
- draw_flags |= panfrost_translate_index_size(info->index_size);
- } else {
- vertex_count = ctx->vertex_count;
- ctx->offset_start = info->start;
- tiler_prefix.index_count = MALI_POSITIVE(ctx->vertex_count);
+ unsigned min_index = 0, max_index = 0;
+
+ pan_pack(&primitive, PRIMITIVE, cfg) {
+ cfg.draw_mode = pan_draw_mode(mode);
+ cfg.point_size_array = panfrost_writes_point_size(ctx);
+ cfg.first_provoking_vertex = rast->flatshade_first;
+ cfg.primitive_restart = info->primitive_restart;
+ cfg.unknown_3 = 6;
+
+ if (info->index_size) {
+ cfg.index_type = panfrost_translate_index_size(info->index_size);
+ cfg.indices = panfrost_get_index_buffer_bounded(ctx, info,
+ &min_index, &max_index);
+
+ /* Use the corresponding values */
+ vertex_count = max_index - min_index + 1;
+ ctx->offset_start = min_index + info->index_bias;
+
+ cfg.base_vertex_offset = -min_index;
+ cfg.index_count = info->count;
+ } else {
+ ctx->offset_start = info->start;
+ cfg.index_count = info->count_from_stream_output ?
+ pan_so_target(info->count_from_stream_output)->offset :
+ ctx->vertex_count;
+ }
}
- tiler_prefix.unknown_draw = draw_flags;
+ vertex_prefix.primitive.opaque[0] = (5) << 26; /* XXX */
+ memcpy(&tiler_prefix.primitive, &primitive, sizeof(primitive));
/* Encode the padded vertex count */
panfrost_statistics_record(ctx, info);
- panfrost_pack_work_groups_fused(&vertex_prefix, &tiler_prefix,
+ panfrost_pack_work_groups_compute(&invocation,
1, vertex_count, info->instance_count,
- 1, 1, 1);
+ 1, 1, 1, true);
+
+ vertex_prefix.invocation = invocation;
+ tiler_prefix.invocation = invocation;
/* Emit all sort of descriptors. */
mali_ptr varyings = 0, vs_vary = 0, fs_vary = 0, pos = 0, psiz = 0;
}
primitive_size.pointer = psiz;
- panfrost_vt_update_primitive_size(ctx, &tiler_prefix, &primitive_size);
+ panfrost_vt_update_primitive_size(ctx, info->mode == PIPE_PRIM_POINTS, &primitive_size);
/* Fire off the draw itself */
panfrost_emit_vertex_tiler_jobs(batch, &vertex_prefix, &vertex_postfix,
void *hwcso)
{
struct panfrost_context *ctx = pan_context(pctx);
-
ctx->rasterizer = hwcso;
-
- if (!hwcso)
- return;
-
- /* Point sprites are emulated */
-
- struct panfrost_shader_state *variant = panfrost_get_shader_state(ctx, PIPE_SHADER_FRAGMENT);
-
- if (ctx->rasterizer->base.sprite_coord_enable || (variant && variant->point_sprite_mask))
- ctx->base.bind_fs_state(&ctx->base, ctx->shader[PIPE_SHADER_FRAGMENT]);
}
static void *
enum pipe_shader_type type)
{
struct panfrost_device *dev = pan_device(ctx->base.screen);
- struct pipe_rasterizer_state *rasterizer = &ctx->rasterizer->base;
-
- bool is_fragment = (type == PIPE_SHADER_FRAGMENT);
if (variant->outputs_read) {
struct pipe_framebuffer_state *fb = &ctx->pipe_framebuffer;
}
}
- /* Point sprites TODO on bifrost, always pass */
- if (is_fragment && rasterizer && (rasterizer->sprite_coord_enable |
- variant->point_sprite_mask)
- && !(dev->quirks & IS_BIFROST)) {
- /* Ensure the same varyings are turned to point sprites */
- if (rasterizer->sprite_coord_enable != variant->point_sprite_mask)
- return false;
-
- /* Ensure the orientation is correct */
- bool upper_left =
- rasterizer->sprite_coord_mode ==
- PIPE_SPRITE_COORD_UPPER_LEFT;
-
- if (variant->point_sprite_upper_left != upper_left)
- return false;
- }
-
/* Otherwise, we're good to go */
return true;
}
v->rt_formats[i] = fmt;
}
-
- /* Point sprites are TODO on Bifrost */
- if (ctx->rasterizer && !(dev->quirks & IS_BIFROST)) {
- v->point_sprite_mask = ctx->rasterizer->base.sprite_coord_enable;
- v->point_sprite_upper_left =
- ctx->rasterizer->base.sprite_coord_mode ==
- PIPE_SPRITE_COORD_UPPER_LEFT;
- }
}
}
{
struct pipe_stream_output_target *target;
- target = rzalloc(pctx, struct pipe_stream_output_target);
+ target = &rzalloc(pctx, struct panfrost_streamout_target)->base;
if (!target)
return NULL;
for (unsigned i = 0; i < num_targets; i++) {
if (offsets[i] != -1)
- so->offsets[i] = offsets[i];
+ pan_so_target(targets[i])->offset = offsets[i];
pipe_so_target_reference(&so->targets[i], targets[i]);
}