diff options
-rw-r--r-- | src/gallium/drivers/panfrost/pan_context.c | 4 | ||||
-rw-r--r-- | src/panfrost/pandecode/decode.c | 51 |
2 files changed, 32 insertions, 23 deletions
diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index e8cedb96187..b7b77715fc8 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -1047,7 +1047,9 @@ panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data) * additionally need to signal CAN_DISCARD for nontrivial blend * modes (so we're able to read back the destination buffer) */ - if (!blend[0].is_shader) { + if (blend[0].is_shader) { + ctx->fragment_shader_core.unknown2_3 |= MALI_HAS_BLEND_SHADER; + } else { ctx->fragment_shader_core.blend.equation = *blend[0].equation.equation; ctx->fragment_shader_core.blend.constant = diff --git a/src/panfrost/pandecode/decode.c b/src/panfrost/pandecode/decode.c index 7c1d681d018..94b640c54d6 100644 --- a/src/panfrost/pandecode/decode.c +++ b/src/panfrost/pandecode/decode.c @@ -2069,6 +2069,30 @@ pandecode_shader_prop(const char *name, unsigned claim, signed truth, bool fuzzy } static void +pandecode_blend_shader_disassemble(mali_ptr shader, int job_no, int job_type, + bool is_bifrost) +{ + struct midgard_disasm_stats stats = + pandecode_shader_disassemble(shader, job_no, job_type, is_bifrost); + + bool has_texture = (stats.texture_count > 0); + bool has_sampler = (stats.sampler_count > 0); + bool has_attribute = (stats.attribute_count > 0); + bool has_varying = (stats.varying_count > 0); + bool has_uniform = (stats.uniform_count > 0); + bool has_ubo = (stats.uniform_buffer_count > 0); + + if (has_texture || has_sampler) + pandecode_msg("XXX: blend shader accessing textures\n"); + + if (has_attribute || has_varying) + pandecode_msg("XXX: blend shader accessing interstage\n"); + + if (has_uniform || has_ubo) + pandecode_msg("XXX: blend shader accessing uniforms\n"); +} + +static void pandecode_vertex_tiler_postfix_pre( const struct mali_vertex_tiler_postfix *p, int job_no, enum mali_job_type job_type, @@ -2245,9 +2269,10 @@ pandecode_vertex_tiler_postfix_pre( if (!is_bifrost) { /* TODO: Blend shaders routing/disasm */ - union midgard_blend blend = s->blend; - pandecode_midgard_blend(&blend, false); + mali_ptr shader = pandecode_midgard_blend(&blend, s->unknown2_3 & MALI_HAS_BLEND_SHADER); + if (shader & ~0xF) + pandecode_blend_shader_disassemble(shader, job_no, job_type, false); } pandecode_indent--; @@ -2267,26 +2292,8 @@ pandecode_vertex_tiler_postfix_pre( else shader = pandecode_midgard_blend_mrt(blend_base, job_no, i); - if (shader & ~0xF) { - struct midgard_disasm_stats stats = - pandecode_shader_disassemble(shader, job_no, job_type, false); - - bool has_texture = (stats.texture_count > 0); - bool has_sampler = (stats.sampler_count > 0); - bool has_attribute = (stats.attribute_count > 0); - bool has_varying = (stats.varying_count > 0); - bool has_uniform = (stats.uniform_count > 0); - bool has_ubo = (stats.uniform_buffer_count > 0); - - if (has_texture || has_sampler) - pandecode_msg("XXX: blend shader accessing textures\n"); - - if (has_attribute || has_varying) - pandecode_msg("XXX: blend shader accessing interstage\n"); - - if (has_uniform || has_ubo) - pandecode_msg("XXX: blend shader accessing uniforms\n"); - } + if (shader & ~0xF) + pandecode_blend_shader_disassemble(shader, job_no, job_type, false); } } |