1a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs/*
2a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * Copyright 2012 Red Hat Inc.
3a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs *
4a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * Permission is hereby granted, free of charge, to any person obtaining a
5a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * copy of this software and associated documentation files (the "Software"),
6a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * to deal in the Software without restriction, including without limitation
7a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * and/or sell copies of the Software, and to permit persons to whom the
9a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * Software is furnished to do so, subject to the following conditions:
10a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs *
11a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * The above copyright notice and this permission notice shall be included in
12a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * all copies or substantial portions of the Software.
13a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs *
14a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * SOFTWARE.
21a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs *
22a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * Authors: Ben Skeggs
23a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs *
24a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs */
25a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
26a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs#include "util/u_dynarray.h"
27a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs#include "tgsi/tgsi_parse.h"
28a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
29a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs#include "nouveau/nv_object.xml.h"
30a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs#include "nv30-40_3d.xml.h"
31a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs#include "nv30_context.h"
32a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs#include "nv30_state.h"
33a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
34a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic void
35a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_vertprog_destroy(struct nv30_vertprog *vp)
36a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{
37a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   util_dynarray_fini(&vp->branch_relocs);
38a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   nouveau_heap_free(&vp->exec);
39a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   FREE(vp->insns);
40a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   vp->insns = NULL;
41a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   vp->nr_insns = 0;
42a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
43a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   util_dynarray_fini(&vp->const_relocs);
44a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   nouveau_heap_free(&vp->data);
45a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   FREE(vp->consts);
46a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   vp->consts = NULL;
47a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   vp->nr_consts = 0;
48a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
49a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   vp->translated = FALSE;
50a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs}
51a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
52a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsvoid
53a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_vertprog_validate(struct nv30_context *nv30)
54a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{
55a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   struct nouveau_pushbuf *push = nv30->base.pushbuf;
56a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   struct nouveau_object *eng3d = nv30->screen->eng3d;
57a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   struct nv30_vertprog *vp = nv30->vertprog.program;
58a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   struct nv30_fragprog *fp = nv30->fragprog.program;
59a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   boolean upload_code = FALSE;
60a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   boolean upload_data = FALSE;
61a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   unsigned i;
62a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
63a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   if (nv30->dirty & NV30_NEW_FRAGPROG) {
64a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      if (memcmp(vp->texcoord, fp->texcoord, sizeof(vp->texcoord))) {
65a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         if (vp->translated)
66a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            nv30_vertprog_destroy(vp);
67a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         memcpy(vp->texcoord, fp->texcoord, sizeof(vp->texcoord));
68a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      }
69a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   }
70a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
71a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   if (nv30->rast && nv30->rast->pipe.clip_plane_enable != vp->enabled_ucps) {
72a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      vp->enabled_ucps = nv30->rast->pipe.clip_plane_enable;
73a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      if (vp->translated)
74a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         nv30_vertprog_destroy(vp);
75a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   }
76a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
77a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   if (!vp->translated) {
78a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      vp->translated = _nvfx_vertprog_translate(nv30, vp);
79a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      if (!vp->translated) {
80a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         nv30->draw_flags |= NV30_NEW_VERTPROG;
81a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         return;
82a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      }
83a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      nv30->dirty |= NV30_NEW_VERTPROG;
84a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   }
85a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
86a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   if (!vp->exec) {
87a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      struct nouveau_heap *heap = nv30->screen->vp_exec_heap;
88a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      struct nv30_shader_reloc *reloc = vp->branch_relocs.data;
89a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      unsigned nr_reloc = vp->branch_relocs.size / sizeof(*reloc);
90a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      uint32_t *inst, target;
91a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
92a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      if (nouveau_heap_alloc(heap, vp->nr_insns, &vp->exec, &vp->exec)) {
93a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         while (heap->next && heap->size < vp->nr_insns) {
94a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            struct nouveau_heap **evict = heap->next->priv;
95a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            nouveau_heap_free(evict);
96a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         }
97a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
98a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         if (nouveau_heap_alloc(heap, vp->nr_insns, &vp->exec, &vp->exec)) {
99a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            nv30->draw_flags |= NV30_NEW_VERTPROG;
100a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            return;
101a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         }
102a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      }
103a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
104a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      if (eng3d->oclass < NV40_3D_CLASS) {
105a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         while (nr_reloc--) {
106a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            inst     = vp->insns[reloc->location].data;
107a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            target   = vp->exec->start + reloc->target;
108a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
109a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            inst[2] &= ~0x000007fc;
110a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            inst[2] |= target << 2;
111a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            reloc++;
112a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         }
113a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      } else {
114a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         while (nr_reloc--) {
115a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            inst     = vp->insns[reloc->location].data;
116a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            target   = vp->exec->start + reloc->target;
117a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
118a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            inst[2] &= ~0x0000003f;
119a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            inst[2] |= target >> 3;
120a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            inst[3] &= ~0xe0000000;
121a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            inst[3] |= target << 29;
122a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            reloc++;
123a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         }
124a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      }
125a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
126a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      upload_code = TRUE;
127a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   }
128a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
129a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   if (vp->nr_consts && !vp->data) {
130a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      struct nouveau_heap *heap = nv30->screen->vp_data_heap;
131a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      struct nv30_shader_reloc *reloc = vp->const_relocs.data;
132a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      unsigned nr_reloc = vp->const_relocs.size / sizeof(*reloc);
133a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      uint32_t *inst, target;
134a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
135a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      if (nouveau_heap_alloc(heap, vp->nr_consts, vp, &vp->data)) {
136a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         while (heap->next && heap->size < vp->nr_consts) {
137a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            struct nv30_vertprog *evp = heap->next->priv;
138a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            nouveau_heap_free(&evp->data);
139a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         }
140a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
141a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         if (nouveau_heap_alloc(heap, vp->nr_consts, vp, &vp->data)) {
142a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            nv30->draw_flags |= NV30_NEW_VERTPROG;
143a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            return;
144a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         }
145a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      }
146a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
147a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      if (eng3d->oclass < NV40_3D_CLASS) {
148a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         while (nr_reloc--) {
149a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            inst     = vp->insns[reloc->location].data;
150a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            target   = vp->data->start + reloc->target;
151a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
152542bd6941f5a56f7a3aa84b44d92591488b146bfRoy Spliet            inst[1] &= ~0x0007fc000;
153542bd6941f5a56f7a3aa84b44d92591488b146bfRoy Spliet            inst[1] |= (target & 0x1ff) << 14;
154a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            reloc++;
155a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         }
156a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      } else {
157a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         while (nr_reloc--) {
158a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            inst     = vp->insns[reloc->location].data;
159a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            target   = vp->data->start + reloc->target;
160a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
161a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            inst[1] &= ~0x0001ff000;
162542bd6941f5a56f7a3aa84b44d92591488b146bfRoy Spliet            inst[1] |= (target & 0x1ff) << 12;
163a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            reloc++;
164a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         }
165a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      }
166a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
167a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      upload_code = TRUE;
168a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      upload_data = TRUE;
169a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   }
170a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
171a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   if (vp->nr_consts) {
172a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      struct nv04_resource *res = nv04_resource(nv30->vertprog.constbuf);
173a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
174a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      for (i = 0; i < vp->nr_consts; i++) {
175a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         struct nv30_vertprog_data *data = &vp->consts[i];
176a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
177a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         if (data->index < 0) {
178a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            if (!upload_data)
179a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs               continue;
180a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         } else {
181a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            float *constbuf = (float *)res->data;
182a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            if (!upload_data &&
183a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs                !memcmp(data->value, &constbuf[data->index * 4], 16))
184a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs               continue;
185a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs            memcpy(data->value, &constbuf[data->index * 4], 16);
186a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         }
187a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
188a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         BEGIN_NV04(push, NV30_3D(VP_UPLOAD_CONST_ID), 5);
189a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         PUSH_DATA (push, vp->data->start + i);
190a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         PUSH_DATAp(push, data->value, 4);
191a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      }
192a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   }
193a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
194a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   if (upload_code) {
195a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      BEGIN_NV04(push, NV30_3D(VP_UPLOAD_FROM_ID), 1);
196a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      PUSH_DATA (push, vp->exec->start);
197a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      for (i = 0; i < vp->nr_insns; i++) {
198a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4);
199a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         PUSH_DATAp(push, vp->insns[i].data, 4);
200a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      }
201a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   }
202a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
203a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   if (nv30->dirty & (NV30_NEW_VERTPROG | NV30_NEW_FRAGPROG)) {
204a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      BEGIN_NV04(push, NV30_3D(VP_START_FROM_ID), 1);
205a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      PUSH_DATA (push, vp->exec->start);
206a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      if (eng3d->oclass < NV40_3D_CLASS) {
207a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         BEGIN_NV04(push, NV30_3D(ENGINE), 1);
208a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         PUSH_DATA (push, 0x00000013); /* vp instead of ff, somehow */
209a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      } else {
210a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         BEGIN_NV04(push, NV40_3D(VP_ATTRIB_EN), 2);
211a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         PUSH_DATA (push, vp->ir);
212a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         PUSH_DATA (push, vp->or | fp->vp_or);
213a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         BEGIN_NV04(push, NV30_3D(ENGINE), 1);
214a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs         PUSH_DATA (push, 0x00000011);
215a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      }
216a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   }
217a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs}
218a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
219a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic void *
220a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_vp_state_create(struct pipe_context *pipe,
221a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs                     const struct pipe_shader_state *cso)
222a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{
223a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   struct nv30_vertprog *vp = CALLOC_STRUCT(nv30_vertprog);
224a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   if (!vp)
225a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      return NULL;
226a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
227a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   vp->pipe.tokens = tgsi_dup_tokens(cso->tokens);
228a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   tgsi_scan_shader(vp->pipe.tokens, &vp->info);
229a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   return vp;
230a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs}
231a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
232a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic void
233a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_vp_state_delete(struct pipe_context *pipe, void *hwcso)
234a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{
235a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   struct nv30_vertprog *vp = hwcso;
236a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
237a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   if (vp->translated)
238a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs      nv30_vertprog_destroy(vp);
239a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   FREE((void *)vp->pipe.tokens);
240a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   FREE(vp);
241a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs}
242a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
243a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic void
244a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_vp_state_bind(struct pipe_context *pipe, void *hwcso)
245a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{
246a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   struct nv30_context *nv30 = nv30_context(pipe);
247a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
248a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   nv30->vertprog.program = hwcso;
249a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   nv30->dirty |= NV30_NEW_VERTPROG;
250a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs}
251a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs
252a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsvoid
253a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_vertprog_init(struct pipe_context *pipe)
254a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{
255a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   pipe->create_vs_state = nv30_vp_state_create;
256a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   pipe->bind_vs_state = nv30_vp_state_bind;
257a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs   pipe->delete_vs_state = nv30_vp_state_delete;
258a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs}
259