static void *brw_create_blend_state( struct pipe_context *pipe,
				     const struct pipe_blend_state *templ )
{
   struct brw_blend_state *blend = CALLOC_STRUCT(brw_blend_state);
   if (blend == NULL)
      return NULL;

   if (templ->logicop_enable) {
      blend->cc2.logicop_enable = 1;
      blend->cc5.logicop_func = translate_logicop(templ->logicop_func);
   } 
   else if (templ->rt[0].blend_enable) {
      blend->cc6.dest_blend_factor = translate_blend_factor(templ->rt[0].rgb_dst_factor);
      blend->cc6.src_blend_factor = translate_blend_factor(templ->rt[0].rgb_src_factor);
      blend->cc6.blend_function = translate_blend_equation(templ->rt[0].rgb_func);

      blend->cc5.ia_dest_blend_factor = translate_blend_factor(templ->rt[0].alpha_dst_factor);
      blend->cc5.ia_src_blend_factor = translate_blend_factor(templ->rt[0].alpha_src_factor);
      blend->cc5.ia_blend_function = translate_blend_equation(templ->rt[0].alpha_func);

      blend->cc3.blend_enable = 1;
      blend->cc3.ia_blend_enable = 
	 (blend->cc6.dest_blend_factor != blend->cc5.ia_dest_blend_factor ||
	  blend->cc6.src_blend_factor != blend->cc5.ia_src_blend_factor ||
	  blend->cc6.blend_function != blend->cc5.ia_blend_function);

      /* Per-surface blend enables, currently just follow global
       * state:
       */
      blend->ss0.color_blend = 1;
   }

   blend->cc5.dither_enable = templ->dither;

   if (BRW_DEBUG & DEBUG_STATS)
      blend->cc5.statistics_enable = 1;

   /* Per-surface color mask -- just follow global state:
    */
   blend->ss0.writedisable_red   = (templ->rt[0].colormask & PIPE_MASK_R) ? 0 : 1;
   blend->ss0.writedisable_green = (templ->rt[0].colormask & PIPE_MASK_G) ? 0 : 1;
   blend->ss0.writedisable_blue  = (templ->rt[0].colormask & PIPE_MASK_B) ? 0 : 1;
   blend->ss0.writedisable_alpha = (templ->rt[0].colormask & PIPE_MASK_A) ? 0 : 1;

   return (void *)blend;
}
示例#2
0
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++) {
示例#3
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++) {