static void nv20_render_set_format(struct gl_context *ctx) { struct nouveau_render_state *render = to_render_state(ctx); struct nouveau_channel *chan = context_chan(ctx); struct nouveau_grobj *kelvin = context_eng3d(ctx); int i, attr, hw_format; FOR_EACH_ATTR(render, i, attr) { if (attr >= 0) { struct nouveau_array *a = &render->attrs[attr]; hw_format = a->stride << 8 | a->fields << 4 | get_hw_format(a->type); } else { /* Unused attribute. */ hw_format = NV20_3D_VTXBUF_FMT_TYPE_FLOAT; } BEGIN_RING(chan, kelvin, NV20_3D_VTXBUF_FMT(i), 1); OUT_RING(chan, hw_format); } }
static void nv10_render_set_format(struct gl_context *ctx) { struct nouveau_render_state *render = to_render_state(ctx); struct nouveau_pushbuf *push = context_push(ctx); int i, attr, hw_format; FOR_EACH_ATTR(render, i, attr) { if (attr >= 0) { struct nouveau_array *a = &render->attrs[attr]; hw_format = a->stride << 8 | a->fields << 4 | get_hw_format(a->type); if (attr == VERT_ATTRIB_POS && a->fields == 4) hw_format |= NV10_3D_VTXBUF_FMT_HOMOGENEOUS; } else { /* Unused attribute. */ hw_format = NV10_3D_VTXBUF_FMT_TYPE_V32_FLOAT; } BEGIN_NV04(push, NV10_3D(VTXBUF_FMT(i)), 1); PUSH_DATA (push, hw_format); } }