예제 #1
0
static void
ilo_set_viewport_states(struct pipe_context *pipe,
                        unsigned start_slot,
                        unsigned num_viewports,
                        const struct pipe_viewport_state *viewports)
{
   const struct ilo_dev_info *dev = ilo_context(pipe)->dev;
   struct ilo_state_vector *vec = &ilo_context(pipe)->state_vector;

   if (viewports) {
      unsigned i;

      for (i = 0; i < num_viewports; i++) {
         ilo_gpe_set_viewport_cso(dev, &viewports[i],
               &vec->viewport.cso[start_slot + i]);
      }

      if (vec->viewport.count < start_slot + num_viewports)
         vec->viewport.count = start_slot + num_viewports;

      /* need to save viewport 0 for util_blitter */
      if (!start_slot && num_viewports)
         vec->viewport.viewport0 = viewports[0];
   }
   else {
      if (vec->viewport.count <= start_slot + num_viewports &&
          vec->viewport.count > start_slot)
         vec->viewport.count = start_slot;
   }

   vec->dirty |= ILO_DIRTY_VIEWPORT;
}
예제 #2
0
/**
 * 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;
}