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