Can st/mesa instead be fixed to maintain the original API? Other drivers look in rt[0] in the non-independent_blend_enable case. For example, freedreno and nouveau.
On Wed, Feb 28, 2018 at 10:29 AM, Brian Paul <bri...@vmware.com> wrote: > The earlier Mesa commit 3d06c8afb5 ("st/mesa: don't translate blend > state when it's disabled for a colorbuffer") subtly changed the > details of gallium's per-RT blend state. > > In particular, when pipe_rt_blend_state[i].blend_enabled is true, > we have to get the src/dst blend terms from pipe_rt_blend_state[i], > not [0] as before. > > We now have to scan the blend targets to find the first one that's > enabled (if any). We have to use the index of that target for getting > the src/dst blend terms. And note that we have to set identical blend > terms for all targets. > > This fixes the Piglit fbo-drawbuffers2-blend test. VMware bug 2063493. > --- > src/gallium/drivers/svga/svga_pipe_blend.c | 35 > ++++++++++++++++++++---------- > 1 file changed, 24 insertions(+), 11 deletions(-) > > diff --git a/src/gallium/drivers/svga/svga_pipe_blend.c > b/src/gallium/drivers/svga/svga_pipe_blend.c > index 04855fa..6bb9d94 100644 > --- a/src/gallium/drivers/svga/svga_pipe_blend.c > +++ b/src/gallium/drivers/svga/svga_pipe_blend.c > @@ -148,6 +148,17 @@ svga_create_blend_state(struct pipe_context *pipe, > if (!blend) > return NULL; > > + /* Find index of first target with blending enabled. -1 means blending > + * is not enabled at all. > + */ > + int first_enabled = -1; > + for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { > + if (templ->rt[i].blend_enable) { > + first_enabled = i; > + break; > + } > + } > + > /* Fill in the per-rendertarget blend state. We currently only > * support independent blend enable and colormask per render target. > */ > @@ -260,24 +271,26 @@ svga_create_blend_state(struct pipe_context *pipe, > } > } > else { > - /* Note: the vgpu10 device does not yet support independent > - * blend terms per render target. Target[0] always specifies the > - * blending terms. > + /* Note: the vgpu10 device does not yet support independent blend > + * terms per render target. When blending is enabled, the blend > + * terms must match for all targets. > */ > - if (templ->independent_blend_enable || templ->rt[0].blend_enable) { > - /* always use the 0th target's blending terms for now */ > + if (first_enabled >= 0) { > + /* use first enabled target's blending terms */ > + const struct pipe_rt_blend_state *rt = &templ->rt[first_enabled]; > + > blend->rt[i].srcblend = > - svga_translate_blend_factor(svga, > templ->rt[0].rgb_src_factor); > + svga_translate_blend_factor(svga, rt->rgb_src_factor); > blend->rt[i].dstblend = > - svga_translate_blend_factor(svga, > templ->rt[0].rgb_dst_factor); > + svga_translate_blend_factor(svga, rt->rgb_dst_factor); > blend->rt[i].blendeq = > - svga_translate_blend_func(templ->rt[0].rgb_func); > + svga_translate_blend_func(rt->rgb_func); > blend->rt[i].srcblend_alpha = > - svga_translate_blend_factor(svga, > templ->rt[0].alpha_src_factor); > + svga_translate_blend_factor(svga, rt->alpha_src_factor); > blend->rt[i].dstblend_alpha = > - svga_translate_blend_factor(svga, > templ->rt[0].alpha_dst_factor); > + svga_translate_blend_factor(svga, rt->alpha_dst_factor); > blend->rt[i].blendeq_alpha = > - svga_translate_blend_func(templ->rt[0].alpha_func); > + svga_translate_blend_func(rt->alpha_func); > > if (blend->rt[i].srcblend_alpha != blend->rt[i].srcblend || > blend->rt[i].dstblend_alpha != blend->rt[i].dstblend || > -- > 2.7.4 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev