<p>Oh, okay. And we want to do this for Gallium as well, not GL?</p>
<p>If somebody else acks this, I'll merge it, but I am not super-up-to-date on FP buffer trickery.</p>
<p>Sending from a mobile, pardon my terseness. ~ C.</p>
<div class="gmail_quote">On Nov 6, 2011 6:21 AM, "Morgan Armand" <<a href="mailto:morgan.devel@gmail.com">morgan.devel@gmail.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Unless I'm missing something, no there is no ROPs defined for floating points operands.<br>
The ARB_color_buffer_float specification says:<br>
<br>
36. Should logical operations be disabled for floating-point color buffers?<br>
RESOLVED: Yes. This matches the behavior in the ATI specification.<br>
<br>
Besides that, the result of the blending equation is no longer clamped when dealing<br>
with FP buffers.<br>
<br>
On 11/6/2011 3:08 PM, Corbin Simpson wrote:<br>
> It's entirely possible that I'm still asleep, but what problem does this solve? Are ROPs not defined for FP operands?<br>
><br>
> Sending from a mobile, pardon my terseness. ~ C.<br>
><br>
> On Nov 6, 2011 4:31 AM, "Morgan Armand" <<a href="mailto:morgan.devel@gmail.com">morgan.devel@gmail.com</a> <mailto:<a href="mailto:morgan.devel@gmail.com">morgan.devel@gmail.com</a>>> wrote:<br>
><br>
> ---<br>
> src/gallium/drivers/softpipe/sp_quad_blend.c | 78 ++++++++++++++++++-------<br>
> 1 files changed, 56 insertions(+), 22 deletions(-)<br>
><br>
> diff --git a/src/gallium/drivers/softpipe/sp_quad_blend.c b/src/gallium/drivers/softpipe/sp_quad_blend.c<br>
> index 598df26..4813ada 100644<br>
> --- a/src/gallium/drivers/softpipe/sp_quad_blend.c<br>
> +++ b/src/gallium/drivers/softpipe/sp_quad_blend.c<br>
> @@ -702,19 +702,19 @@ blend_quad(struct quad_stage *qs,<br>
> */<br>
> switch (softpipe->blend->rt[blend_index].rgb_func) {<br>
> case PIPE_BLEND_ADD:<br>
> - VEC4_ADD_SAT(quadColor[0], source[0], blend_dest[0]); /* R */<br>
> - VEC4_ADD_SAT(quadColor[1], source[1], blend_dest[1]); /* G */<br>
> - VEC4_ADD_SAT(quadColor[2], source[2], blend_dest[2]); /* B */<br>
> + VEC4_ADD(quadColor[0], source[0], blend_dest[0]); /* R */<br>
> + VEC4_ADD(quadColor[1], source[1], blend_dest[1]); /* G */<br>
> + VEC4_ADD(quadColor[2], source[2], blend_dest[2]); /* B */<br>
> break;<br>
> case PIPE_BLEND_SUBTRACT:<br>
> - VEC4_SUB_SAT(quadColor[0], source[0], blend_dest[0]); /* R */<br>
> - VEC4_SUB_SAT(quadColor[1], source[1], blend_dest[1]); /* G */<br>
> - VEC4_SUB_SAT(quadColor[2], source[2], blend_dest[2]); /* B */<br>
> + VEC4_SUB(quadColor[0], source[0], blend_dest[0]); /* R */<br>
> + VEC4_SUB(quadColor[1], source[1], blend_dest[1]); /* G */<br>
> + VEC4_SUB(quadColor[2], source[2], blend_dest[2]); /* B */<br>
> break;<br>
> case PIPE_BLEND_REVERSE_SUBTRACT:<br>
> - VEC4_SUB_SAT(quadColor[0], blend_dest[0], source[0]); /* R */<br>
> - VEC4_SUB_SAT(quadColor[1], blend_dest[1], source[1]); /* G */<br>
> - VEC4_SUB_SAT(quadColor[2], blend_dest[2], source[2]); /* B */<br>
> + VEC4_SUB(quadColor[0], blend_dest[0], source[0]); /* R */<br>
> + VEC4_SUB(quadColor[1], blend_dest[1], source[1]); /* G */<br>
> + VEC4_SUB(quadColor[2], blend_dest[2], source[2]); /* B */<br>
> break;<br>
> case PIPE_BLEND_MIN:<br>
> VEC4_MIN(quadColor[0], source[0], blend_dest[0]); /* R */<br>
> @@ -735,13 +735,13 @@ blend_quad(struct quad_stage *qs,<br>
> */<br>
> switch (softpipe->blend->rt[blend_index].alpha_func) {<br>
> case PIPE_BLEND_ADD:<br>
> - VEC4_ADD_SAT(quadColor[3], source[3], blend_dest[3]); /* A */<br>
> + VEC4_ADD(quadColor[3], source[3], blend_dest[3]); /* A */<br>
> break;<br>
> case PIPE_BLEND_SUBTRACT:<br>
> - VEC4_SUB_SAT(quadColor[3], source[3], blend_dest[3]); /* A */<br>
> + VEC4_SUB(quadColor[3], source[3], blend_dest[3]); /* A */<br>
> break;<br>
> case PIPE_BLEND_REVERSE_SUBTRACT:<br>
> - VEC4_SUB_SAT(quadColor[3], blend_dest[3], source[3]); /* A */<br>
> + VEC4_SUB(quadColor[3], blend_dest[3], source[3]); /* A */<br>
> break;<br>
> case PIPE_BLEND_MIN:<br>
> VEC4_MIN(quadColor[3], source[3], blend_dest[3]); /* A */<br>
> @@ -856,6 +856,10 @@ blend_fallback(struct quad_stage *qs,<br>
><br>
> for (cbuf = 0; cbuf < softpipe->framebuffer.nr_cbufs; cbuf++)<br>
> {<br>
> + const enum pipe_format format =<br>
> + softpipe->framebuffer.cbufs[cbuf]->format;<br>
> + const struct util_format_description *desc =<br>
> + util_format_description(format);<br>
> /* which blend/mask state index to use: */<br>
> const uint blend_buf = blend->independent_blend_enable ? cbuf : 0;<br>
> float dest[4][QUAD_SIZE];<br>
> @@ -909,10 +913,19 @@ blend_fallback(struct quad_stage *qs,<br>
><br>
><br>
> if (blend->logicop_enable) {<br>
> - logicop_quad( qs, quadColor, dest );<br>
> + if (desc->channel[0].type != UTIL_FORMAT_TYPE_FLOAT) {<br>
> + logicop_quad( qs, quadColor, dest );<br>
> + }<br>
> }<br>
> else if (blend->rt[blend_buf].blend_enable) {<br>
> blend_quad(qs, quadColor, dest, blend_color, blend_buf);<br>
> +<br>
> + /* If fixed-point dest color buffer, need to clamp the outgoing<br>
> + * fragment colors now.<br>
> + */<br>
> + if (clamp) {<br>
> + clamp_colors(quadColor);<br>
> + }<br>
> }<br>
><br>
> rebase_colors(bqs->base_format[cbuf], quadColor);<br>
> @@ -969,6 +982,13 @@ blend_single_add_src_alpha_inv_src_alpha(struct quad_stage *qs,<br>
> }<br>
> }<br>
><br>
> + /* If fixed-point dest color buffer, need to clamp the incoming<br>
> + * fragment colors now.<br>
> + */<br>
> + if (bqs->clamp[0]) {<br>
> + clamp_colors(quadColor);<br>
> + }<br>
> +<br>
> VEC4_MUL(source[0], quadColor[0], alpha); /* R */<br>
> VEC4_MUL(source[1], quadColor[1], alpha); /* G */<br>
> VEC4_MUL(source[2], quadColor[2], alpha); /* B */<br>
> @@ -978,12 +998,19 @@ blend_single_add_src_alpha_inv_src_alpha(struct quad_stage *qs,<br>
> VEC4_MUL(dest[0], dest[0], one_minus_alpha); /* R */<br>
> VEC4_MUL(dest[1], dest[1], one_minus_alpha); /* G */<br>
> VEC4_MUL(dest[2], dest[2], one_minus_alpha); /* B */<br>
> - VEC4_MUL(dest[3], dest[3], one_minus_alpha); /* B */<br>
> + VEC4_MUL(dest[3], dest[3], one_minus_alpha); /* A */<br>
><br>
> - VEC4_ADD_SAT(quadColor[0], source[0], dest[0]); /* R */<br>
> - VEC4_ADD_SAT(quadColor[1], source[1], dest[1]); /* G */<br>
> - VEC4_ADD_SAT(quadColor[2], source[2], dest[2]); /* B */<br>
> - VEC4_ADD_SAT(quadColor[3], source[3], dest[3]); /* A */<br>
> + VEC4_ADD(quadColor[0], source[0], dest[0]); /* R */<br>
> + VEC4_ADD(quadColor[1], source[1], dest[1]); /* G */<br>
> + VEC4_ADD(quadColor[2], source[2], dest[2]); /* B */<br>
> + VEC4_ADD(quadColor[3], source[3], dest[3]); /* A */<br>
> +<br>
> + /* If fixed-point dest color buffer, need to clamp the outgoing<br>
> + * fragment colors now.<br>
> + */<br>
> + if (bqs->clamp[0]) {<br>
> + clamp_colors(quadColor);<br>
> + }<br>
><br>
> rebase_colors(bqs->base_format[0], quadColor);<br>
><br>
> @@ -1035,10 +1062,17 @@ blend_single_add_one_one(struct quad_stage *qs,<br>
> clamp_colors(quadColor);<br>
> }<br>
><br>
> - VEC4_ADD_SAT(quadColor[0], quadColor[0], dest[0]); /* R */<br>
> - VEC4_ADD_SAT(quadColor[1], quadColor[1], dest[1]); /* G */<br>
> - VEC4_ADD_SAT(quadColor[2], quadColor[2], dest[2]); /* B */<br>
> - VEC4_ADD_SAT(quadColor[3], quadColor[3], dest[3]); /* A */<br>
> + VEC4_ADD(quadColor[0], quadColor[0], dest[0]); /* R */<br>
> + VEC4_ADD(quadColor[1], quadColor[1], dest[1]); /* G */<br>
> + VEC4_ADD(quadColor[2], quadColor[2], dest[2]); /* B */<br>
> + VEC4_ADD(quadColor[3], quadColor[3], dest[3]); /* A */<br>
> +<br>
> + /* If fixed-point dest color buffer, need to clamp the outgoing<br>
> + * fragment colors now.<br>
> + */<br>
> + if (bqs->clamp[0]) {<br>
> + clamp_colors(quadColor);<br>
> + }<br>
><br>
> rebase_colors(bqs->base_format[0], quadColor);<br>
><br>
> --<br>
> 1.7.7.1.msysgit.0<br>
><br>
> _______________________________________________<br>
> mesa-dev mailing list<br>
> <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a> <mailto:<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a>><br>
> <a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
><br>
<br>
</blockquote></div>