Exemplo n.º 1
0
static void *
create_shader(struct pipe_context *pipe,
              int id,
              struct pipe_shader_state *shader)
{
   int idx = 0;
   const struct shader_asm_info * shaders[SHADER_STAGES];

   /* the shader has to have a fill */
   debug_assert(id & ALL_FILLS);

   /* first stage */
   if (id & VEGA_SOLID_FILL_SHADER) {
      debug_assert(idx == 0);
      shaders[idx] = &shaders_asm[0];
      debug_assert(shaders_asm[0].id == VEGA_SOLID_FILL_SHADER);
      ++idx;
   }
   if ((id & VEGA_LINEAR_GRADIENT_SHADER)) {
      debug_assert(idx == 0);
      shaders[idx] = &shaders_asm[1];
      debug_assert(shaders_asm[1].id == VEGA_LINEAR_GRADIENT_SHADER);
      ++idx;
   }
   if ((id & VEGA_RADIAL_GRADIENT_SHADER)) {
      debug_assert(idx == 0);
      shaders[idx] = &shaders_asm[2];
      debug_assert(shaders_asm[2].id == VEGA_RADIAL_GRADIENT_SHADER);
      ++idx;
   }
   if ((id & VEGA_PATTERN_SHADER)) {
      debug_assert(idx == 0);
      debug_assert(shaders_asm[3].id == VEGA_PATTERN_SHADER);
      shaders[idx] = &shaders_asm[3];
      ++idx;
   }
   if ((id & VEGA_IMAGE_NORMAL_SHADER)) {
      debug_assert(idx == 0);
      debug_assert(shaders_asm[4].id == VEGA_IMAGE_NORMAL_SHADER);
      shaders[idx] = &shaders_asm[4];
      ++idx;
   }

   /* second stage */
   if ((id & VEGA_IMAGE_MULTIPLY_SHADER)) {
      debug_assert(shaders_asm[5].id == VEGA_IMAGE_MULTIPLY_SHADER);
      shaders[idx] = &shaders_asm[5];
      ++idx;
   } else if ((id & VEGA_IMAGE_STENCIL_SHADER)) {
      debug_assert(shaders_asm[6].id == VEGA_IMAGE_STENCIL_SHADER);
      shaders[idx] = &shaders_asm[6];
      ++idx;
   }

   /* third stage */
   if ((id & VEGA_MASK_SHADER)) {
      debug_assert(idx == 1);
      debug_assert(shaders_asm[7].id == VEGA_MASK_SHADER);
      shaders[idx] = &shaders_asm[7];
      ++idx;
   }

   /* fourth stage */
   if ((id & VEGA_BLEND_MULTIPLY_SHADER)) {
      debug_assert(shaders_asm[8].id == VEGA_BLEND_MULTIPLY_SHADER);
      shaders[idx] = &shaders_asm[8];
      ++idx;
   } else if ((id & VEGA_BLEND_SCREEN_SHADER)) {
      debug_assert(shaders_asm[9].id == VEGA_BLEND_SCREEN_SHADER);
      shaders[idx] = &shaders_asm[9];
      ++idx;
   } else if ((id & VEGA_BLEND_DARKEN_SHADER)) {
      debug_assert(shaders_asm[10].id == VEGA_BLEND_DARKEN_SHADER);
      shaders[idx] = &shaders_asm[10];
      ++idx;
   } else if ((id & VEGA_BLEND_LIGHTEN_SHADER)) {
      debug_assert(shaders_asm[11].id == VEGA_BLEND_LIGHTEN_SHADER);
      shaders[idx] = &shaders_asm[11];
      ++idx;
   }

   /* fifth stage */
   if ((id & VEGA_PREMULTIPLY_SHADER)) {
      debug_assert(shaders_asm[12].id == VEGA_PREMULTIPLY_SHADER);
      shaders[idx] = &shaders_asm[12];
      ++idx;
   } else if ((id & VEGA_UNPREMULTIPLY_SHADER)) {
      debug_assert(shaders_asm[13].id == VEGA_UNPREMULTIPLY_SHADER);
      shaders[idx] = &shaders_asm[13];
      ++idx;
   }

   /* sixth stage */
   if ((id & VEGA_BW_SHADER)) {
      debug_assert(shaders_asm[14].id == VEGA_BW_SHADER);
      shaders[idx] = &shaders_asm[14];
      ++idx;
   }

   return combine_shaders(shaders, idx, pipe, shader);
}
Exemplo n.º 2
0
static void *
create_shader(struct pipe_context *pipe,
              int id,
              struct pipe_shader_state *shader)
{
   int idx = 0, sh;
   const struct shader_asm_info * shaders[SHADER_STAGES];

   /* first stage */
   sh = SHADERS_GET_PAINT_SHADER(id);
   switch (sh << SHADERS_PAINT_SHIFT) {
   case VEGA_SOLID_FILL_SHADER:
   case VEGA_LINEAR_GRADIENT_SHADER:
   case VEGA_RADIAL_GRADIENT_SHADER:
   case VEGA_PATTERN_SHADER:
   case VEGA_PAINT_DEGENERATE_SHADER:
      shaders[idx] = &shaders_paint_asm[(sh >> SHADERS_PAINT_SHIFT) - 1];
      assert(shaders[idx]->id == sh);
      idx++;
      break;
   default:
      break;
   }

   /* second stage */
   sh = SHADERS_GET_IMAGE_SHADER(id);
   switch (sh) {
   case VEGA_IMAGE_NORMAL_SHADER:
   case VEGA_IMAGE_MULTIPLY_SHADER:
   case VEGA_IMAGE_STENCIL_SHADER:
      shaders[idx] = &shaders_image_asm[(sh >> SHADERS_IMAGE_SHIFT) - 1];
      assert(shaders[idx]->id == sh);
      idx++;
      break;
   default:
      break;
   }

   /* sanity check */
   assert(idx == ((!sh || sh == VEGA_IMAGE_NORMAL_SHADER) ? 1 : 2));

   /* third stage */
   sh = SHADERS_GET_COLOR_TRANSFORM_SHADER(id);
   switch (sh) {
   case VEGA_COLOR_TRANSFORM_SHADER:
      shaders[idx] = &shaders_color_transform_asm[
         (sh >> SHADERS_COLOR_TRANSFORM_SHIFT) - 1];
      assert(shaders[idx]->id == sh);
      idx++;
      break;
   default:
      break;
   }

   /* fourth stage */
   sh = SHADERS_GET_ALPHA_SHADER(id);
   switch (sh) {
   case VEGA_ALPHA_NORMAL_SHADER:
   case VEGA_ALPHA_PER_CHANNEL_SHADER:
      shaders[idx] = &shaders_alpha_asm[
         (sh >> SHADERS_ALPHA_SHIFT) - 1];
      assert(shaders[idx]->id == sh);
      idx++;
      break;
   default:
      break;
   }

   /* fifth stage */
   sh = SHADERS_GET_BLEND_SHADER(id);
   switch (sh) {
   case VEGA_BLEND_SRC_SHADER:
   case VEGA_BLEND_SRC_OVER_SHADER:
   case VEGA_BLEND_DST_OVER_SHADER:
   case VEGA_BLEND_SRC_IN_SHADER:
   case VEGA_BLEND_DST_IN_SHADER:
   case VEGA_BLEND_MULTIPLY_SHADER:
   case VEGA_BLEND_SCREEN_SHADER:
   case VEGA_BLEND_DARKEN_SHADER:
   case VEGA_BLEND_LIGHTEN_SHADER:
   case VEGA_BLEND_ADDITIVE_SHADER:
      shaders[idx] = &shaders_blend_asm[(sh >> SHADERS_BLEND_SHIFT) - 1];
      assert(shaders[idx]->id == sh);
      idx++;
      break;
   default:
      break;
   }

   /* sixth stage */
   sh = SHADERS_GET_MASK_SHADER(id);
   switch (sh) {
   case VEGA_MASK_SHADER:
      shaders[idx] = &shaders_mask_asm[(sh >> SHADERS_MASK_SHIFT) - 1];
      assert(shaders[idx]->id == sh);
      idx++;
      break;
   default:
      break;
   }

   /* seventh stage */
   sh = SHADERS_GET_PREMULTIPLY_SHADER(id);
   switch (sh) {
   case VEGA_PREMULTIPLY_SHADER:
   case VEGA_UNPREMULTIPLY_SHADER:
      shaders[idx] = &shaders_premultiply_asm[
         (sh >> SHADERS_PREMULTIPLY_SHIFT) - 1];
      assert(shaders[idx]->id == sh);
      idx++;
      break;
   default:
      break;
   }

   /* eighth stage */
   sh = SHADERS_GET_BW_SHADER(id);
   switch (sh) {
   case VEGA_BW_SHADER:
      shaders[idx] = &shaders_bw_asm[(sh >> SHADERS_BW_SHIFT) - 1];
      assert(shaders[idx]->id == sh);
      idx++;
      break;
   default:
      break;
   }

   return combine_shaders(shaders, idx, pipe, shader);
}