cfg.depth_pass = MALI_STENCIL_OP_REPLACE;
};
+ struct mali_blend_equation_packed eq;
+
+ pan_pack(&eq, BLEND_EQUATION, cfg) {
+ cfg.rgb_mode = 0x122;
+ cfg.alpha_mode = 0x122;
+
+ if (loc < FRAG_RESULT_DATA0)
+ cfg.color_mask = 0x0;
+ }
+
union midgard_blend replace = {
- .equation = {
- .rgb_mode = 0x122,
- .alpha_mode = 0x122,
- .color_mask = MALI_MASK_R | MALI_MASK_G | MALI_MASK_B | MALI_MASK_A,
- }
+ .equation = eq
};
if (blend_shader)
bool ms = image->nr_samples > 1;
+ struct mali_shader_packed shader;
+
+ pan_pack(&shader, SHADER, cfg) {
+ cfg.shader = pool->dev->blit_shaders.loads[loc][T][ms];
+ cfg.varying_count = 1;
+ cfg.texture_count = 1;
+ cfg.sampler_count = 1;
+
+ assert(cfg.shader);
+ }
+
struct mali_shader_meta shader_meta = {
- .shader = pool->dev->blit_shaders.loads[loc][T][ms],
- .sampler_count = 1,
- .texture_count = 1,
- .varying_count = 1,
- .midgard1 = {
- .flags_lo = 0x20,
- .work_count = 4,
- },
+ .shader = shader,
.coverage_mask = ~0,
.unknown2_3 = MALI_DEPTH_FUNC(MALI_FUNC_ALWAYS) | 0x10,
.unknown2_4 = 0x4e0,
}
};
+ 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
shader_meta.unknown2_4 |= MALI_NO_MSAA;
- assert(shader_meta.shader);
-
if (pool->dev->quirks & MIDGARD_SFBD) {
shader_meta.unknown2_4 |= (0x10 | MALI_NO_DITHER);
shader_meta.blend = replace;
-
- if (loc < FRAG_RESULT_DATA0)
- shader_meta.blend.equation.color_mask = 0x0;
}
- 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