panfrost: Inline panfrost_vt_set_draw_info

Not happy about the monster routine, but we'll get simplification having
everything together. (I hope.)

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 13:25:29 -04:00 committed by Marge Bot
parent 3f61da79c3
commit 3a4d930571
3 changed files with 57 additions and 85 deletions

View File

@ -89,7 +89,7 @@ panfrost_vt_update_primitive_size(struct panfrost_context *ctx,
}
}
static unsigned
unsigned
panfrost_translate_index_size(unsigned size)
{
switch (size) {
@ -113,7 +113,7 @@ panfrost_translate_index_size(unsigned size)
* these operations together because there are natural optimizations which
* require them to be together. */
static mali_ptr
mali_ptr
panfrost_get_index_buffer_bounded(struct panfrost_context *ctx,
const struct pipe_draw_info *info,
unsigned *min_index, unsigned *max_index)
@ -169,74 +169,6 @@ panfrost_get_index_buffer_bounded(struct panfrost_context *ctx,
return out;
}
void
panfrost_vt_set_draw_info(struct panfrost_context *ctx,
const struct pipe_draw_info *info,
enum mali_draw_mode draw_mode,
struct mali_vertex_tiler_postfix *vertex_postfix,
struct mali_vertex_tiler_prefix *tiler_prefix,
struct mali_vertex_tiler_postfix *tiler_postfix,
unsigned *vertex_count,
unsigned *padded_count)
{
tiler_prefix->draw_mode = draw_mode;
unsigned draw_flags = 0;
if (panfrost_writes_point_size(ctx))
draw_flags |= MALI_DRAW_VARYING_SIZE;
if (info->primitive_restart)
draw_flags |= MALI_DRAW_PRIMITIVE_RESTART_FIXED_INDEX;
/* These doesn't make much sense */
draw_flags |= 0x3000;
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;
tiler_postfix->offset_start = vertex_postfix->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 {
tiler_prefix->indices = 0;
*vertex_count = ctx->vertex_count;
tiler_postfix->offset_start = vertex_postfix->offset_start = info->start;
tiler_prefix->offset_bias_correction = 0;
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) {
*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 {
*padded_count = *vertex_count;
/* Reset instancing state */
tiler_postfix->instance_shift = vertex_postfix->instance_shift = 0;
tiler_postfix->instance_odd = vertex_postfix->instance_odd = 0;
}
}
static unsigned
translate_tex_wrap(enum pipe_tex_wrap w)
{

View File

@ -35,16 +35,6 @@
void panfrost_sampler_desc_init(const struct pipe_sampler_state *cso, struct mali_midgard_sampler_packed *hw);
void panfrost_sampler_desc_init_bifrost(const struct pipe_sampler_state *cso, struct mali_bifrost_sampler_packed *hw);
void
panfrost_vt_set_draw_info(struct panfrost_context *ctx,
const struct pipe_draw_info *info,
enum mali_draw_mode draw_mode,
struct mali_vertex_tiler_postfix *vertex_postfix,
struct mali_vertex_tiler_prefix *tiler_prefix,
struct mali_vertex_tiler_postfix *tiler_postfix,
unsigned *vertex_count,
unsigned *padded_count);
mali_ptr
panfrost_emit_compute_shader_meta(struct panfrost_batch *batch, enum pipe_shader_type stage);
@ -78,6 +68,14 @@ panfrost_emit_vertex_data(struct panfrost_batch *batch,
mali_ptr
panfrost_vt_emit_shared_memory(struct panfrost_batch *batch);
unsigned
panfrost_translate_index_size(unsigned size);
mali_ptr
panfrost_get_index_buffer_bounded(struct panfrost_context *ctx,
const struct pipe_draw_info *info,
unsigned *min_index, unsigned *max_index);
void
panfrost_emit_varying_descriptor(struct panfrost_batch *batch,
unsigned vertex_count,

View File

@ -183,7 +183,7 @@ panfrost_texture_barrier(struct pipe_context *pipe, unsigned flags)
#define DEFINE_CASE(c) case PIPE_PRIM_##c: return MALI_DRAW_MODE_##c;
static int
g2m_draw_mode(enum pipe_prim_type mode)
pan_draw_mode(enum pipe_prim_type mode)
{
switch (mode) {
DEFINE_CASE(POINTS);
@ -336,10 +336,52 @@ panfrost_draw_vbo(
SET_BIT(tiler_prefix.unknown_draw, MALI_DRAW_FLATSHADE_FIRST,
rast->flatshade_first);
panfrost_vt_set_draw_info(ctx, info, g2m_draw_mode(mode),
&vertex_postfix, &tiler_prefix,
&tiler_postfix, &vertex_count,
&ctx->padded_count);
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;
tiler_postfix.offset_start = vertex_postfix.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;
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) {
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 {
ctx->padded_count = vertex_count;
}
panfrost_statistics_record(ctx, info);