nv30: adapt to vertex element cso
authorRoland Scheidegger <sroland@vmware.com>
Mon, 1 Mar 2010 19:11:36 +0000 (20:11 +0100)
committerRoland Scheidegger <sroland@vmware.com>
Mon, 1 Mar 2010 19:11:36 +0000 (20:11 +0100)
src/gallium/drivers/nv30/nv30_context.h
src/gallium/drivers/nv30/nv30_state.c
src/gallium/drivers/nv30/nv30_vbo.c

index ca3d6ac..e48f531 100644 (file)
@@ -108,6 +108,11 @@ struct nv30_state {
        struct nouveau_stateobj *hw[NV30_STATE_MAX];
 };
 
+struct nv30_vtxelt_state {
+       struct pipe_vertex_element pipe[16];
+       unsigned num_elements;
+};
+
 struct nv30_context {
        struct pipe_context pipe;
 
@@ -143,8 +148,7 @@ struct nv30_context {
        unsigned dirty_samplers;
        struct pipe_vertex_buffer vtxbuf[PIPE_MAX_ATTRIBS];
        unsigned vtxbuf_nr;
-       struct pipe_vertex_element vtxelt[PIPE_MAX_ATTRIBS];
-       unsigned vtxelt_nr;
+       struct nv30_vtxelt_state *vtxelt;
 };
 
 static INLINE struct nv30_context *
index d911c80..24b15a6 100644 (file)
@@ -669,15 +669,34 @@ nv30_set_vertex_buffers(struct pipe_context *pipe, unsigned count,
        /*nv30->draw_dirty |= NV30_NEW_ARRAYS;*/
 }
 
+static void *
+nv30_vtxelts_state_create(struct pipe_context *pipe,
+                         unsigned num_elements,
+                         const struct pipe_vertex_element *elements)
+{
+       struct nv30_vtxelt_state *cso = CALLOC_STRUCT(nv30_vtxelt_state);
+
+       assert(num_elements < 16); /* not doing fallbacks yet */
+       cso->num_elements = num_elements;
+       memcpy(cso->pipe, elements, num_elements * sizeof(*elements));
+
+/*     nv30_vtxelt_construct(cso);*/
+
+       return (void *)cso;
+}
+
 static void
-nv30_set_vertex_elements(struct pipe_context *pipe, unsigned count,
-                        const struct pipe_vertex_element *ve)
+nv30_vtxelts_state_delete(struct pipe_context *pipe, void *hwcso)
 {
-       struct nv30_context *nv30 = nv30_context(pipe);
+       FREE(hwcso);
+}
 
-       memcpy(nv30->vtxelt, ve, sizeof(*ve) * count);
-       nv30->vtxelt_nr = count;
+static void
+nv30_vtxelts_state_bind(struct pipe_context *pipe, void *hwcso)
+{
+       struct nv30_context *nv30 = nv30_context(pipe);
 
+       nv30->vtxelt = hwcso;
        nv30->dirty |= NV30_NEW_ARRAYS;
        /*nv30->draw_dirty |= NV30_NEW_ARRAYS;*/
 }
@@ -722,7 +741,10 @@ nv30_init_state_functions(struct nv30_context *nv30)
        nv30->pipe.set_scissor_state = nv30_set_scissor_state;
        nv30->pipe.set_viewport_state = nv30_set_viewport_state;
 
+       nv30->pipe.create_vertex_elements_state = nv30_vtxelts_state_create;
+       nv30->pipe.delete_vertex_elements_state = nv30_vtxelts_state_delete;
+       nv30->pipe.bind_vertex_elements_state = nv30_vtxelts_state_bind;
+
        nv30->pipe.set_vertex_buffers = nv30_set_vertex_buffers;
-       nv30->pipe.set_vertex_elements = nv30_set_vertex_elements;
 }
 
index e48823a..f3856bb 100644 (file)
@@ -492,16 +492,16 @@ nv30_vbo_validate(struct nv30_context *nv30)
        int hw;
 
        vtxbuf = so_new(3, 17, 18);
-       so_method(vtxbuf, rankine, NV34TCL_VTXBUF_ADDRESS(0), nv30->vtxelt_nr);
+       so_method(vtxbuf, rankine, NV34TCL_VTXBUF_ADDRESS(0), nv30->vtxelt->num_elements);
        vtxfmt = so_new(1, 16, 0);
-       so_method(vtxfmt, rankine, NV34TCL_VTXFMT(0), nv30->vtxelt_nr);
+       so_method(vtxfmt, rankine, NV34TCL_VTXFMT(0), nv30->vtxelt->num_elements);
 
-       for (hw = 0; hw < nv30->vtxelt_nr; hw++) {
+       for (hw = 0; hw < nv30->vtxelt->num_elements; hw++) {
                struct pipe_vertex_element *ve;
                struct pipe_vertex_buffer *vb;
                unsigned type, ncomp;
 
-               ve = &nv30->vtxelt[hw];
+               ve = &nv30->vtxelt->pipe[hw];
                vb = &nv30->vtxbuf[ve->vertex_buffer_index];
 
                if (!vb->stride) {