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