static void
finalize_vertex_elements(struct ilo_context *ilo)
{
   struct ilo_state_vector *vec = &ilo->state_vector;

   if (!(vec->dirty & (ILO_DIRTY_VE | ILO_DIRTY_VS)))
      return;

   vec->dirty |= ILO_DIRTY_VE;

   vec->ve->last_cso_edgeflag = false;
   if (vec->ve->count && vec->vs &&
         ilo_shader_get_kernel_param(vec->vs, ILO_KERNEL_VS_INPUT_EDGEFLAG)) {
      vec->ve->edgeflag_cso = vec->ve->cso[vec->ve->count - 1];
      ilo_gpe_set_ve_edgeflag(ilo->dev, &vec->ve->edgeflag_cso);
      vec->ve->last_cso_edgeflag = true;
   }

   vec->ve->prepend_nosrc_cso = false;
   if (vec->vs &&
       (ilo_shader_get_kernel_param(vec->vs,
                                    ILO_KERNEL_VS_INPUT_INSTANCEID) ||
        ilo_shader_get_kernel_param(vec->vs,
                                    ILO_KERNEL_VS_INPUT_VERTEXID))) {
      ilo_gpe_init_ve_nosrc(ilo->dev,
            GEN6_VFCOMP_STORE_VID,
            GEN6_VFCOMP_STORE_IID,
            GEN6_VFCOMP_NOSTORE,
            GEN6_VFCOMP_NOSTORE,
            &vec->ve->nosrc_cso);
      vec->ve->prepend_nosrc_cso = true;
   } else if (!vec->vs) {
      /* generate VUE header */
      ilo_gpe_init_ve_nosrc(ilo->dev,
            GEN6_VFCOMP_STORE_0, /* Reserved */
            GEN6_VFCOMP_STORE_0, /* Render Target Array Index */
            GEN6_VFCOMP_STORE_0, /* Viewport Index */
            GEN6_VFCOMP_STORE_0, /* Point Width */
            &vec->ve->nosrc_cso);
      vec->ve->prepend_nosrc_cso = true;
   } else if (!vec->ve->count) {
      /*
       * From the Sandy Bridge PRM, volume 2 part 1, page 92:
       *
       *    "SW must ensure that at least one vertex element is defined prior
       *     to issuing a 3DPRIMTIVE command, or operation is UNDEFINED."
       */
      ilo_gpe_init_ve_nosrc(ilo->dev,
            GEN6_VFCOMP_STORE_0,
            GEN6_VFCOMP_STORE_0,
            GEN6_VFCOMP_STORE_0,
            GEN6_VFCOMP_STORE_1_FP,
            &vec->ve->nosrc_cso);
      vec->ve->prepend_nosrc_cso = true;
   }
}
/**
 * Set the states that are invariant between all ops.
 */
static bool
ilo_blitter_set_invariants(struct ilo_blitter *blitter)
{
    struct pipe_vertex_element velem;
    struct pipe_viewport_state vp;

    if (blitter->initialized)
        return true;

    /* only vertex X and Y */
    memset(&velem, 0, sizeof(velem));
    velem.src_format = PIPE_FORMAT_R32G32_FLOAT;
    ilo_gpe_init_ve(blitter->ilo->dev, 1, &velem, &blitter->ve);

    /* generate VUE header */
    ilo_gpe_init_ve_nosrc(blitter->ilo->dev,
                          GEN6_VFCOMP_STORE_0, /* Reserved */
                          GEN6_VFCOMP_STORE_0, /* Render Target Array Index */
                          GEN6_VFCOMP_STORE_0, /* Viewport Index */
                          GEN6_VFCOMP_STORE_0, /* Point Width */
                          &blitter->ve.nosrc_cso);
    blitter->ve.prepend_nosrc_cso = true;

    /* a rectangle has 3 vertices in a RECTLIST */
    util_draw_init_info(&blitter->draw);
    blitter->draw.mode = ILO_PRIM_RECTANGLES;
    blitter->draw.count = 3;

    /**
     * From the Haswell PRM, volume 7, page 615:
     *
     *     "The clear value must be between the min and max depth values
     *     (inclusive) defined in the CC_VIEWPORT."
     *
     * Even though clipping and viewport transformation will be disabled, we
     * still need to set up the viewport states.
     */
    memset(&vp, 0, sizeof(vp));
    vp.scale[0] = 1.0f;
    vp.scale[1] = 1.0f;
    vp.scale[2] = 1.0f;
    ilo_gpe_set_viewport_cso(blitter->ilo->dev, &vp, &blitter->viewport);

    blitter->initialized = true;

    return true;
}