static void 
update_blend( struct st_context *st )
{
   struct pipe_blend_state *blend = &st->state.blend;
   unsigned num_state = 1;
   unsigned i;

   memset(blend, 0, sizeof(*blend));

   if (blend_per_rt(st->ctx) || colormask_per_rt(st->ctx)) {
      num_state = st->ctx->Const.MaxDrawBuffers;
      blend->independent_blend_enable = 1;
   }
   /* Note it is impossible to correctly deal with EXT_blend_logic_op and
      EXT_draw_buffers2/EXT_blend_equation_separate at the same time.
      These combinations would require support for per-rt logicop enables
      and separate alpha/rgb logicop/blend support respectively. Neither
      possible in gallium nor most hardware. Assume these combinations
      don't happen. */
   if (st->ctx->Color.ColorLogicOpEnabled ||
       (st->ctx->Color.BlendEnabled &&
        st->ctx->Color.BlendEquationRGB == GL_LOGIC_OP)) {
      /* logicop enabled */
      blend->logicop_enable = 1;
      blend->logicop_func = translate_logicop(st->ctx->Color.LogicOp);
   }
   else if (st->ctx->Color.BlendEnabled) {
      /* blending enabled */
      for (i = 0; i < num_state; i++) {

         blend->rt[i].blend_enable = (st->ctx->Color.BlendEnabled >> i) & 0x1;

         blend->rt[i].rgb_func = translate_blend(st->ctx->Color.BlendEquationRGB);
         if (st->ctx->Color.BlendEquationRGB == GL_MIN ||
             st->ctx->Color.BlendEquationRGB == GL_MAX) {
            /* Min/max are special */
            blend->rt[i].rgb_src_factor = PIPE_BLENDFACTOR_ONE;
            blend->rt[i].rgb_dst_factor = PIPE_BLENDFACTOR_ONE;
         }
         else {
            blend->rt[i].rgb_src_factor = translate_blend(st->ctx->Color.BlendSrcRGB);
            blend->rt[i].rgb_dst_factor = translate_blend(st->ctx->Color.BlendDstRGB);
         }

         blend->rt[i].alpha_func = translate_blend(st->ctx->Color.BlendEquationA);
         if (st->ctx->Color.BlendEquationA == GL_MIN ||
             st->ctx->Color.BlendEquationA == GL_MAX) {
            /* Min/max are special */
            blend->rt[i].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
            blend->rt[i].alpha_dst_factor = PIPE_BLENDFACTOR_ONE;
         }
         else {
            blend->rt[i].alpha_src_factor = translate_blend(st->ctx->Color.BlendSrcA);
            blend->rt[i].alpha_dst_factor = translate_blend(st->ctx->Color.BlendDstA);
         }
      }
   }
   else {
      /* no blending / logicop */
   }

   /* Colormask - maybe reverse these bits? */
   for (i = 0; i < num_state; i++) {
Exemple #2
0
static void 
update_blend( struct st_context *st )
{
   struct pipe_blend_state *blend = &st->state.blend;
   const struct gl_context *ctx = st->ctx;
   unsigned num_state = 1;
   unsigned i, j;

   memset(blend, 0, sizeof(*blend));

   if (blend_per_rt(ctx) || colormask_per_rt(ctx)) {
      num_state = ctx->Const.MaxDrawBuffers;
      blend->independent_blend_enable = 1;
   }
   if (ctx->Color.ColorLogicOpEnabled) {
      /* logicop enabled */
      blend->logicop_enable = 1;
      blend->logicop_func = translate_logicop(ctx->Color.LogicOp);
   }
   else if (ctx->Color.BlendEnabled) {
      /* blending enabled */
      for (i = 0, j = 0; i < num_state; i++) {

         blend->rt[i].blend_enable = (ctx->Color.BlendEnabled >> i) & 0x1;

         if (ctx->Extensions.ARB_draw_buffers_blend)
            j = i;

         blend->rt[i].rgb_func =
            translate_blend(ctx->Color.Blend[j].EquationRGB);

         if (ctx->Color.Blend[i].EquationRGB == GL_MIN ||
             ctx->Color.Blend[i].EquationRGB == GL_MAX) {
            /* Min/max are special */
            blend->rt[i].rgb_src_factor = PIPE_BLENDFACTOR_ONE;
            blend->rt[i].rgb_dst_factor = PIPE_BLENDFACTOR_ONE;
         }
         else {
            blend->rt[i].rgb_src_factor =
               translate_blend(ctx->Color.Blend[j].SrcRGB);
            blend->rt[i].rgb_dst_factor =
               translate_blend(ctx->Color.Blend[j].DstRGB);
         }

         blend->rt[i].alpha_func =
            translate_blend(ctx->Color.Blend[j].EquationA);

         if (ctx->Color.Blend[i].EquationA == GL_MIN ||
             ctx->Color.Blend[i].EquationA == GL_MAX) {
            /* Min/max are special */
            blend->rt[i].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
            blend->rt[i].alpha_dst_factor = PIPE_BLENDFACTOR_ONE;
         }
         else {
            blend->rt[i].alpha_src_factor =
               translate_blend(ctx->Color.Blend[j].SrcA);
            blend->rt[i].alpha_dst_factor =
               translate_blend(ctx->Color.Blend[j].DstA);
         }
      }
   }
   else {
      /* no blending / logicop */
   }

   /* Colormask - maybe reverse these bits? */
   for (i = 0; i < num_state; i++) {