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; }
/** * 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; }