panfrost: Use pack for draw descriptor

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6476>
This commit is contained in:
Alyssa Rosenzweig 2020-08-25 14:59:30 -04:00 committed by Marge Bot
parent 33895ac2c8
commit 90cc815628
3 changed files with 62 additions and 66 deletions

View File

@ -1806,9 +1806,9 @@ panfrost_emit_varying_descriptor(struct panfrost_batch *batch,
void
panfrost_emit_vertex_tiler_jobs(struct panfrost_batch *batch,
struct mali_vertex_tiler_prefix *vertex_prefix,
struct mali_vertex_tiler_postfix *vertex_postfix,
struct mali_draw_packed *vertex_draw,
struct mali_vertex_tiler_prefix *tiler_prefix,
struct mali_vertex_tiler_postfix *tiler_postfix,
struct mali_draw_packed *tiler_draw,
union midgard_primitive_size *primitive_size)
{
struct panfrost_context *ctx = batch->ctx;
@ -1823,24 +1823,24 @@ panfrost_emit_vertex_tiler_jobs(struct panfrost_batch *batch,
if (device->quirks & IS_BIFROST) {
bifrost_vertex.prefix = *vertex_prefix;
bifrost_vertex.postfix = *vertex_postfix;
memcpy(&bifrost_vertex.postfix, vertex_draw, MALI_DRAW_LENGTH);
vp = &bifrost_vertex;
vp_size = sizeof(bifrost_vertex);
bifrost_tiler.prefix = *tiler_prefix;
bifrost_tiler.tiler.primitive_size = *primitive_size;
bifrost_tiler.tiler.tiler_meta = panfrost_batch_get_tiler_meta(batch, ~0);
bifrost_tiler.postfix = *tiler_postfix;
memcpy(&bifrost_tiler.postfix, tiler_draw, MALI_DRAW_LENGTH);
tp = &bifrost_tiler;
tp_size = sizeof(bifrost_tiler);
} else {
midgard_vertex.prefix = *vertex_prefix;
midgard_vertex.postfix = *vertex_postfix;
memcpy(&midgard_vertex.postfix, vertex_draw, MALI_DRAW_LENGTH);
vp = &midgard_vertex;
vp_size = sizeof(midgard_vertex);
midgard_tiler.prefix = *tiler_prefix;
midgard_tiler.postfix = *tiler_postfix;
memcpy(&midgard_tiler.postfix, tiler_draw, MALI_DRAW_LENGTH);
midgard_tiler.primitive_size = *primitive_size;
tp = &midgard_tiler;
tp_size = sizeof(midgard_tiler);

View File

@ -88,9 +88,9 @@ panfrost_emit_varying_descriptor(struct panfrost_batch *batch,
void
panfrost_emit_vertex_tiler_jobs(struct panfrost_batch *batch,
struct mali_vertex_tiler_prefix *vertex_prefix,
struct mali_vertex_tiler_postfix *vertex_postfix,
struct mali_draw_packed *vertex_draw,
struct mali_vertex_tiler_prefix *tiler_prefix,
struct mali_vertex_tiler_postfix *tiler_postfix,
struct mali_draw_packed *tiler_draw,
union midgard_primitive_size *primitive_size);
void

View File

@ -249,6 +249,19 @@ panfrost_update_streamout_offsets(struct panfrost_context *ctx)
}
}
static inline void
pan_emit_draw_descs(struct panfrost_batch *batch,
struct MALI_DRAW *d, enum pipe_shader_type st)
{
d->offset_start = batch->ctx->offset_start;
d->instances = batch->ctx->instance_count > 1 ?
batch->ctx->padded_count : 1;
d->uniform_buffers = panfrost_emit_const_buf(batch, st, &d->push_uniforms);
d->textures = panfrost_emit_texture_descriptors(batch, st);
d->samplers = panfrost_emit_sampler_descriptors(batch, st);
}
static void
panfrost_draw_vbo(
struct pipe_context *pipe,
@ -301,38 +314,15 @@ panfrost_draw_vbo(
ctx->active_prim = info->mode;
struct mali_vertex_tiler_prefix vertex_prefix = { 0 }, tiler_prefix = { 0 };
struct mali_vertex_tiler_postfix vertex_postfix = { 0 }, tiler_postfix = { 0 };
struct mali_draw_packed vertex_postfix, tiler_postfix;
union midgard_primitive_size primitive_size;
unsigned vertex_count;
if (device->quirks & IS_BIFROST) {
vertex_postfix.gl_enables = 0x2;
tiler_postfix.gl_enables = 0x3;
vertex_postfix.shared_memory = panfrost_vt_emit_shared_memory(batch);
} else {
vertex_postfix.gl_enables = 0x6;
tiler_postfix.gl_enables = 0x7;
vertex_postfix.shared_memory = panfrost_batch_reserve_framebuffer(batch);
}
tiler_postfix.shared_memory = vertex_postfix.shared_memory;
if (ctx->occlusion_query) {
tiler_postfix.gl_enables |= MALI_OCCLUSION_QUERY;
tiler_postfix.occlusion_counter = ctx->occlusion_query->bo->gpu;
panfrost_batch_add_bo(ctx->batch, ctx->occlusion_query->bo,
PAN_BO_ACCESS_SHARED |
PAN_BO_ACCESS_RW |
PAN_BO_ACCESS_FRAGMENT);
}
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_postfix.gl_enables, MALI_FRONT_CCW_TOP,
rast->front_ccw);
SET_BIT(tiler_postfix.gl_enables, MALI_CULL_FACE_FRONT,
(rast->cull_face & PIPE_FACE_FRONT));
SET_BIT(tiler_postfix.gl_enables, MALI_CULL_FACE_BACK,
(rast->cull_face & PIPE_FACE_BACK));
SET_BIT(tiler_prefix.unknown_draw, MALI_DRAW_FLATSHADE_FIRST,
rast->flatshade_first);
@ -356,32 +346,24 @@ panfrost_draw_vbo(
/* Use the corresponding values */
vertex_count = max_index - min_index + 1;
tiler_postfix.offset_start = vertex_postfix.offset_start = min_index + info->index_bias;
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;
tiler_postfix.offset_start = vertex_postfix.offset_start = info->start;
ctx->offset_start = info->start;
tiler_prefix.index_count = MALI_POSITIVE(ctx->vertex_count);
}
tiler_prefix.unknown_draw = draw_flags;
ctx->offset_start = vertex_postfix.offset_start;
/* Encode the padded vertex count */
if (info->instance_count > 1) {
if (info->instance_count > 1)
ctx->padded_count = panfrost_padded_vertex_count(vertex_count);
unsigned shift = __builtin_ctz(ctx->padded_count);
unsigned k = ctx->padded_count >> (shift + 1);
tiler_postfix.instance_shift = vertex_postfix.instance_shift = shift;
tiler_postfix.instance_odd = vertex_postfix.instance_odd = k;
} else {
else
ctx->padded_count = vertex_count;
}
panfrost_statistics_record(ctx, info);
@ -390,33 +372,47 @@ panfrost_draw_vbo(
1, 1, 1);
/* Emit all sort of descriptors. */
mali_ptr push_vert = 0, push_frag = 0, attribs = 0;
mali_ptr varyings = 0, vs_vary = 0, fs_vary = 0, pos = 0, psiz = 0;
vertex_postfix.attribute_meta = panfrost_emit_vertex_data(batch, &attribs);
vertex_postfix.attributes = attribs;
panfrost_emit_varying_descriptor(batch,
ctx->padded_count *
ctx->instance_count,
&vs_vary, &fs_vary, &varyings,
&pos, &psiz);
vertex_postfix.varyings = varyings;
tiler_postfix.varyings = varyings;
vertex_postfix.varying_meta = vs_vary;
tiler_postfix.varying_meta = fs_vary;
tiler_postfix.position_varying = pos;
vertex_postfix.sampler_descriptor = panfrost_emit_sampler_descriptors(batch, PIPE_SHADER_VERTEX);
tiler_postfix.sampler_descriptor = panfrost_emit_sampler_descriptors(batch, PIPE_SHADER_FRAGMENT);
vertex_postfix.textures = panfrost_emit_texture_descriptors(batch, PIPE_SHADER_VERTEX);
tiler_postfix.textures = panfrost_emit_texture_descriptors(batch, PIPE_SHADER_FRAGMENT);
vertex_postfix.uniform_buffers = panfrost_emit_const_buf(batch, PIPE_SHADER_VERTEX, &push_vert);
tiler_postfix.uniform_buffers = panfrost_emit_const_buf(batch, PIPE_SHADER_FRAGMENT, &push_frag);
vertex_postfix.uniforms = push_vert;
tiler_postfix.uniforms = push_frag;
tiler_postfix.viewport = panfrost_emit_viewport(batch);
vertex_postfix.shader = panfrost_emit_compute_shader_meta(batch, PIPE_SHADER_VERTEX);
tiler_postfix.shader = panfrost_emit_frag_shader_meta(batch);
pan_pack(&vertex_postfix, DRAW, cfg) {
cfg.unknown_1 = (device->quirks & IS_BIFROST) ? 0x2 : 0x6;
cfg.state = panfrost_emit_compute_shader_meta(batch, PIPE_SHADER_VERTEX);
cfg.attributes = panfrost_emit_vertex_data(batch, &cfg.attribute_buffers);
cfg.varyings = vs_vary;
cfg.varying_buffers = varyings;
cfg.shared = shared_mem;
pan_emit_draw_descs(batch, &cfg, PIPE_SHADER_VERTEX);
}
pan_pack(&tiler_postfix, DRAW, cfg) {
cfg.unknown_1 = (device->quirks & IS_BIFROST) ? 0x3 : 0x7;
cfg.front_face_ccw = rast->front_ccw;
cfg.cull_front_face = rast->cull_face & PIPE_FACE_FRONT;
cfg.cull_back_face = rast->cull_face & PIPE_FACE_BACK;
cfg.position = pos;
cfg.state = panfrost_emit_frag_shader_meta(batch);
cfg.viewport = panfrost_emit_viewport(batch);
cfg.varyings = fs_vary;
cfg.varying_buffers = varyings;
cfg.shared = shared_mem;
pan_emit_draw_descs(batch, &cfg, PIPE_SHADER_FRAGMENT);
if (ctx->occlusion_query) {
cfg.occlusion_query = MALI_OCCLUSION_MODE_PREDICATE;
cfg.occlusion = ctx->occlusion_query->bo->gpu;
panfrost_batch_add_bo(ctx->batch, ctx->occlusion_query->bo,
PAN_BO_ACCESS_SHARED |
PAN_BO_ACCESS_RW |
PAN_BO_ACCESS_FRAGMENT);
}
}
primitive_size.pointer = psiz;
panfrost_vt_update_primitive_size(ctx, &tiler_prefix, &primitive_size);