From 1b7d4f1940ca1609c511902c33f49a3fa8069328 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Thu, 20 Aug 2020 16:25:14 -0400 Subject: [PATCH] panfrost: Remove midgard1 bitfield It is now entirely XML, including for decoding. Woo! Signed-off-by: Alyssa Rosenzweig Reviewed-by: Tomeu Vizoso Part-of: --- src/gallium/drivers/panfrost/pan_cmdstream.c | 6 +- src/panfrost/include/panfrost-job.h | 58 +------------------- src/panfrost/lib/decode.c | 54 +++--------------- src/panfrost/lib/pan_blit.c | 26 +++++---- 4 files changed, 27 insertions(+), 117 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index 6926de6b82d..6ab809091a0 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -337,7 +337,7 @@ panfrost_emit_compute_shader(struct panfrost_context *ctx, cfg.suppress_inf_nan = true; /* XXX */ } - memcpy(&meta->midgard1, &prop, sizeof(prop)); + memcpy(&meta->midgard_props, &prop, sizeof(prop)); } } @@ -616,7 +616,7 @@ panfrost_emit_frag_shader(struct panfrost_context *ctx, cfg.reads_depth_stencil = zs_enabled && fs->can_discard; } - memcpy(&fragmeta->midgard1, &prop, sizeof(prop)); + memcpy(&fragmeta->midgard_props, &prop, sizeof(prop)); } bool msaa = rast->multisample; @@ -695,7 +695,7 @@ panfrost_emit_frag_shader(struct panfrost_context *ctx, cfg.early_z_enable = true; } - memcpy(&fragmeta->midgard1, &prop, sizeof(prop)); + memcpy(&fragmeta->midgard_props, &prop, sizeof(prop)); } if (dev->quirks & MIDGARD_SFBD) { diff --git a/src/panfrost/include/panfrost-job.h b/src/panfrost/include/panfrost-job.h index d5a48fd344b..ae1578589ea 100644 --- a/src/panfrost/include/panfrost-job.h +++ b/src/panfrost/include/panfrost-job.h @@ -193,54 +193,6 @@ struct mali_blend_mode { #define MALI_CHANNEL_FLOAT 7 #define MALI_EXTRACT_BITS(fmt) (fmt & 0x7) -/* Applies to midgard1.flags_lo */ - -/* Should be set when the fragment shader updates the depth value. */ -#define MALI_WRITES_Z (1 << 4) - -/* Should the hardware perform early-Z testing? Set if the shader does not use - * discard, alpha-to-coverage, shader depth writes, and if the shader has no - * side effects (writes to global memory or images) unless early-z testing is - * forced in the shader. - */ - -#define MALI_EARLY_Z (1 << 6) - -/* Should the hardware calculate derivatives (via helper invocations)? Set in a - * fragment shader that uses texturing or derivative functions */ - -#define MALI_HELPER_INVOCATIONS (1 << 7) - -/* Flags denoting the fragment shader's use of tilebuffer readback. If the - * shader might read any part of the tilebuffer, set MALI_READS_TILEBUFFER. If - * it might read depth/stencil in particular, also set MALI_READS_ZS */ - -#define MALI_READS_ZS (1 << 8) - -/* The shader might write to global memory (via OpenCL, SSBOs, or images). - * Reading is okay, as are ordinary writes to the tilebuffer/varyings. Setting - * incurs a performance penalty. On a fragment shader, this bit implies there - * are side effects, hence it interacts with early-z. */ -#define MALI_WRITES_GLOBAL (1 << 9) - -#define MALI_READS_TILEBUFFER (1 << 10) - -/* Applies to midgard1.flags_hi */ - -/* Should be set when the fragment shader updates the stencil value. */ -#define MALI_WRITES_S (1 << 2) - -/* Mode to suppress generation of Infinity and NaN values by clamping inf - * (-inf) to MAX_FLOAT (-MIN_FLOAT) and flushing NaN to 0.0 - * - * Compare suppress_inf/suppress_nan flags on the Bifrost clause header for the - * same functionality. - * - * This is not conformant on GLES3 or OpenCL, but is optional on GLES2, where - * it works around app bugs (e.g. in glmark2-es2 -bterrain with FP16). - */ -#define MALI_SUPPRESS_INF_NAN (1 << 3) - /* Flags for bifrost1.unk1 */ /* Shader uses less than 32 registers, partitioned as [R0, R15] U [R48, R63], @@ -374,15 +326,7 @@ struct mali_shader_meta { u32 uniform_buffer_count : 4; u32 unk1 : 28; // = 0x800000 for vertex, 0x958020 for tiler } bifrost1; - struct { - unsigned uniform_buffer_count : 4; - unsigned flags_lo : 12; - - /* vec4 units */ - unsigned work_count : 5; - unsigned uniform_count : 5; - unsigned flags_hi : 6; - } midgard1; + struct mali_midgard_properties_packed midgard_props; }; /* Same as glPolygoOffset() arguments */ diff --git a/src/panfrost/lib/decode.c b/src/panfrost/lib/decode.c index e7716aeb11c..53f6f301b9c 100644 --- a/src/panfrost/lib/decode.c +++ b/src/panfrost/lib/decode.c @@ -279,23 +279,6 @@ static const struct pandecode_flag_info mfbd_extra_flag_lo_info[] = { }; #undef FLAG_INFO -#define FLAG_INFO(flag) { MALI_##flag, "MALI_" #flag } -static const struct pandecode_flag_info shader_midgard1_flag_lo_info [] = { - FLAG_INFO(WRITES_Z), - FLAG_INFO(EARLY_Z), - FLAG_INFO(READS_TILEBUFFER), - FLAG_INFO(WRITES_GLOBAL), - FLAG_INFO(READS_ZS), - {} -}; - -static const struct pandecode_flag_info shader_midgard1_flag_hi_info [] = { - FLAG_INFO(WRITES_S), - FLAG_INFO(SUPPRESS_INF_NAN), - {} -}; -#undef FLAG_INFO - #define FLAG_INFO(flag) { MALI_BIFROST_##flag, "MALI_BIFROST_" #flag } static const struct pandecode_flag_info shader_bifrost_info [] = { FLAG_INFO(FULL_THREAD), @@ -1756,6 +1739,8 @@ pandecode_vertex_tiler_postfix_pre( if (s->shader & ~0xF) info = pandecode_shader_disassemble(s->shader & ~0xF, job_no, job_type, is_bifrost, gpu_id); + struct MALI_MIDGARD_PROPERTIES midg_props; + pandecode_log("struct mali_shader_meta shader_meta_%"PRIx64"_%d%s = {\n", p->shader, job_no, suffix); pandecode_indent++; @@ -1769,8 +1754,11 @@ pandecode_vertex_tiler_postfix_pre( uniform_count = s->bifrost2.uniform_count; uniform_buffer_count = s->bifrost1.uniform_buffer_count; } else { - uniform_count = s->midgard1.uniform_count; - uniform_buffer_count = s->midgard1.uniform_buffer_count; + uint32_t opaque = s->midgard_props.opaque[0]; + MALI_MIDGARD_PROPERTIES_unpack((const uint8_t *) &opaque, &midg_props); + + uniform_count = midg_props.uniform_count; + uniform_buffer_count = midg_props.uniform_buffer_count; } pandecode_shader_address("shader", s->shader); @@ -1779,39 +1767,13 @@ pandecode_vertex_tiler_postfix_pre( pandecode_shader_prop("sampler_count", s->sampler_count, info.sampler_count, false); pandecode_shader_prop("attribute_count", s->attribute_count, info.attribute_count, false); pandecode_shader_prop("varying_count", s->varying_count, info.varying_count, false); - pandecode_shader_prop("uniform_buffer_count", - uniform_buffer_count, - info.uniform_buffer_count, true); - - if (!is_bifrost) { - pandecode_shader_prop("uniform_count", - uniform_count, - info.uniform_count, false); - - pandecode_shader_prop("work_count", - s->midgard1.work_count, info.work_count, false); - } if (is_bifrost) { pandecode_log("bifrost1.unk1 = "); pandecode_log_decoded_flags(shader_bifrost_info, s->bifrost1.unk1); pandecode_log_cont(",\n"); } else { - bool helpers = s->midgard1.flags_lo & MALI_HELPER_INVOCATIONS; - - if (helpers != info.helper_invocations) { - pandecode_msg("XXX: expected helpers %u but got %u\n", - info.helper_invocations, helpers); - } - - pandecode_log(".midgard1.flags_lo = "); - pandecode_log_decoded_flags(shader_midgard1_flag_lo_info, - s->midgard1.flags_lo & ~MALI_HELPER_INVOCATIONS); - pandecode_log_cont(",\n"); - - pandecode_log(".midgard1.flags_hi = "); - pandecode_log_decoded_flags(shader_midgard1_flag_hi_info, s->midgard1.flags_hi); - pandecode_log_cont(",\n"); + MALI_MIDGARD_PROPERTIES_print(pandecode_dump_stream, &midg_props, 2); } if (s->depth_units || s->depth_factor) { diff --git a/src/panfrost/lib/pan_blit.c b/src/panfrost/lib/pan_blit.c index a9e6d6d0f0c..d7c178949c9 100644 --- a/src/panfrost/lib/pan_blit.c +++ b/src/panfrost/lib/pan_blit.c @@ -249,10 +249,6 @@ panfrost_load_midg( .sampler_count = 1, .texture_count = 1, .varying_count = 1, - .midgard1 = { - .flags_lo = 0x20, - .work_count = 4, - }, .coverage_mask = ~0, .unknown2_3 = MALI_DEPTH_FUNC(MALI_FUNC_ALWAYS) | 0x10, .unknown2_4 = 0x4e0, @@ -265,6 +261,19 @@ panfrost_load_midg( } }; + struct mali_midgard_properties_packed midgard_props; + + pan_pack(&midgard_props, MIDGARD_PROPERTIES, cfg) { + cfg.work_register_count = 4; + cfg.early_z_enable = (loc >= FRAG_RESULT_DATA0); + cfg.stencil_from_shader = (loc == FRAG_RESULT_STENCIL); + cfg.depth_source = (loc == FRAG_RESULT_DEPTH) ? + MALI_DEPTH_SOURCE_SHADER : + MALI_DEPTH_SOURCE_FIXED_FUNCTION; + } + + memcpy(&shader_meta.midgard_props, &midgard_props, sizeof(midgard_props)); + if (ms) shader_meta.unknown2_3 |= MALI_HAS_MSAA | MALI_PER_SAMPLE; else @@ -277,15 +286,10 @@ panfrost_load_midg( shader_meta.blend = replace; } - if (loc == FRAG_RESULT_DEPTH) { - shader_meta.midgard1.flags_lo |= MALI_WRITES_Z; + if (loc == FRAG_RESULT_DEPTH) shader_meta.unknown2_3 |= MALI_DEPTH_WRITEMASK; - } else if (loc == FRAG_RESULT_STENCIL) { - shader_meta.midgard1.flags_hi |= MALI_WRITES_S; + else if (loc == FRAG_RESULT_STENCIL) shader_meta.unknown2_4 |= MALI_STENCIL_TEST; - } else { - shader_meta.midgard1.flags_lo |= MALI_EARLY_Z; - } /* Create the texture descriptor. We partially compute the base address * ourselves to account for layer, such that the texture descriptor -- 2.30.2