panfrost: Implement sRGB blend shaders
We use the lowering in nir_format_convert. There are native ops for this so this is far from optimal and not remotely efficient but as with most blend shader things right now, it's hard enough to get it working, so let's focus on that for now. We'll make it fast later (once we have GLES3 stable, we can start optimizing these things). Fixes dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.* Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> Reviewed-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
This commit is contained in:
@@ -338,6 +338,22 @@ nir_lower_framebuffer(nir_shader *shader, enum pipe_format format,
|
||||
/* Grab the input color */
|
||||
nir_ssa_def *c_nir = nir_ssa_for_src(&b, intr->src[1], 4);
|
||||
|
||||
/* Apply sRGB transform */
|
||||
|
||||
if (format_desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
|
||||
nir_ssa_def *rgb = nir_channels(&b, c_nir, 0x7);
|
||||
nir_ssa_def *trans = nir_format_linear_to_srgb(&b, rgb);
|
||||
|
||||
nir_ssa_def *comp[4] = {
|
||||
nir_channel(&b, trans, 0),
|
||||
nir_channel(&b, trans, 1),
|
||||
nir_channel(&b, trans, 2),
|
||||
nir_channel(&b, c_nir, 3),
|
||||
};
|
||||
|
||||
c_nir = nir_vec(&b, comp, 4);
|
||||
}
|
||||
|
||||
/* Format convert */
|
||||
nir_ssa_def *converted = nir_shader_to_native(&b, c_nir, format_desc, bits, homogenous_bits);
|
||||
|
||||
|
||||
@@ -1037,14 +1037,6 @@ panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data)
|
||||
SET_BIT(rts[i].flags, MALI_BLEND_SRGB, is_srgb);
|
||||
SET_BIT(rts[i].flags, MALI_BLEND_NO_DITHER, !ctx->blend->base.dither);
|
||||
|
||||
/* TODO: sRGB in blend shaders is currently
|
||||
* unimplemented. Contact me (Alyssa) if you're
|
||||
* interested in working on this. We have
|
||||
* native Midgard ops for helping here, but
|
||||
* they're not well-understood yet. */
|
||||
|
||||
assert(!(is_srgb && blend[i].is_shader));
|
||||
|
||||
if (blend[i].is_shader) {
|
||||
rts[i].blend.shader = blend[i].shader.gpu | blend[i].shader.first_tag;
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user