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 173d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 183d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 193d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 203d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * OTHER DEALINGS IN THE SOFTWARE. 21a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * 22a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * Authors: Ben Skeggs 23a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * 24a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs */ 25a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 26a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs#include "draw/draw_context.h" 27a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs#include "draw/draw_vertex.h" 28a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs#include "draw/draw_pipe.h" 29a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs#include "draw/draw_vbuf.h" 30a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs#include "draw/draw_private.h" 31a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 325eb7ff1175a644ffe3b0f1a75cb235400355f9fbJohannes Obermayr#include "nv_object.xml.h" 335eb7ff1175a644ffe3b0f1a75cb235400355f9fbJohannes Obermayr#include "nv30/nv30-40_3d.xml.h" 345eb7ff1175a644ffe3b0f1a75cb235400355f9fbJohannes Obermayr#include "nv30/nv30_context.h" 355eb7ff1175a644ffe3b0f1a75cb235400355f9fbJohannes Obermayr#include "nv30/nv30_format.h" 36a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 37a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstruct nv30_render { 38a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct vbuf_render base; 39a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_context *nv30; 40a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 41a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct pipe_transfer *transfer; 42a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct pipe_resource *buffer; 43a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned offset; 44a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned length; 45a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 46a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct vertex_info vertex_info; 47a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 48a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nouveau_heap *vertprog; 49a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs uint32_t vtxprog[16][4]; 50a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs uint32_t vtxfmt[16]; 51a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs uint32_t vtxptr[16]; 52a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs uint32_t prim; 53a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs}; 54a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 55a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct nv30_render * 56a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_render(struct vbuf_render *render) 57a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 58a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs return (struct nv30_render *)render; 59a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 60a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 61a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic const struct vertex_info * 62a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_render_get_vertex_info(struct vbuf_render *render) 63a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 64a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs return &nv30_render(render)->vertex_info; 65a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 66a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 67a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic boolean 68a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_render_allocate_vertices(struct vbuf_render *render, 69a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs ushort vertex_size, ushort nr_vertices) 70a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 71a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_render *r = nv30_render(render); 72a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_context *nv30 = r->nv30; 73a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 74c3d36a2e1a87a4aded662db7a5d320ee7ac3a8b5Ilia Mirkin r->length = (uint32_t)vertex_size * (uint32_t)nr_vertices; 75a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 76a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (r->offset + r->length >= render->max_vertex_buffer_bytes) { 77a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs pipe_resource_reference(&r->buffer, NULL); 78a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->buffer = pipe_buffer_create(&nv30->screen->base.base, 79c3d36a2e1a87a4aded662db7a5d320ee7ac3a8b5Ilia Mirkin PIPE_BIND_VERTEX_BUFFER, PIPE_USAGE_STREAM, 80a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs render->max_vertex_buffer_bytes); 81a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (!r->buffer) 82cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset return false; 83a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 84a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->offset = 0; 85a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 86a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 87cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset return true; 88a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 89a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 90a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic void * 91a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_render_map_vertices(struct vbuf_render *render) 92a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 93a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_render *r = nv30_render(render); 94c3d36a2e1a87a4aded662db7a5d320ee7ac3a8b5Ilia Mirkin char *map = pipe_buffer_map_range( 95c3d36a2e1a87a4aded662db7a5d320ee7ac3a8b5Ilia Mirkin &r->nv30->base.pipe, r->buffer, 96c3d36a2e1a87a4aded662db7a5d320ee7ac3a8b5Ilia Mirkin r->offset, r->length, 97c3d36a2e1a87a4aded662db7a5d320ee7ac3a8b5Ilia Mirkin PIPE_TRANSFER_WRITE | 98c3d36a2e1a87a4aded662db7a5d320ee7ac3a8b5Ilia Mirkin PIPE_TRANSFER_DISCARD_RANGE, 99c3d36a2e1a87a4aded662db7a5d320ee7ac3a8b5Ilia Mirkin &r->transfer); 100c3d36a2e1a87a4aded662db7a5d320ee7ac3a8b5Ilia Mirkin assert(map); 101c3d36a2e1a87a4aded662db7a5d320ee7ac3a8b5Ilia Mirkin return map; 102a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 103a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 104a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic void 105a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_render_unmap_vertices(struct vbuf_render *render, 106a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs ushort min_index, ushort max_index) 107a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 108a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_render *r = nv30_render(render); 109a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs pipe_buffer_unmap(&r->nv30->base.pipe, r->transfer); 1109870ed05dd333a20662479b9b1e3a8db542924c4Ilia Mirkin r->transfer = NULL; 111a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 112a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 113a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic void 114a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_render_set_primitive(struct vbuf_render *render, unsigned prim) 115a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 116a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_render *r = nv30_render(render); 117a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 118a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->prim = nv30_prim_gl(prim); 119a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 120a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 121a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic void 122a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_render_draw_elements(struct vbuf_render *render, 123a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs const ushort *indices, uint count) 124a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 125a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_render *r = nv30_render(render); 126a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_context *nv30 = r->nv30; 127a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nouveau_pushbuf *push = nv30->screen->base.pushbuf; 128a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned i; 129a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 130a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV30_3D(VTXBUF(0)), r->vertex_info.num_attribs); 131a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs for (i = 0; i < r->vertex_info.num_attribs; i++) { 132a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_RESRC(push, NV30_3D(VTXBUF(i)), BUFCTX_VTXTMP, 133a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv04_resource(r->buffer), r->offset + r->vtxptr[i], 134fdad7dfbdae07b9273fc8f57e63258dbe542c9b5Ilia Mirkin NOUVEAU_BO_LOW | NOUVEAU_BO_RD, 0, NV30_3D_VTXBUF_DMA1); 135a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 136a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 137cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset if (!nv30_state_validate(nv30, ~0, false)) 138a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs return; 139a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 140a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV30_3D(VERTEX_BEGIN_END), 1); 141a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATA (push, r->prim); 142a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 143a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (count & 1) { 144a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV30_3D(VB_ELEMENT_U32), 1); 145a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATA (push, *indices++); 146a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 147a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 148a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs count >>= 1; 149a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs while (count) { 150a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned npush = MIN2(count, NV04_PFIFO_MAX_PACKET_LEN); 151a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs count -= npush; 152a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 153a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NI04(push, NV30_3D(VB_ELEMENT_U16), npush); 154a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs while (npush--) { 155a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATA(push, (indices[1] << 16) | indices[0]); 156a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs indices += 2; 157a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 158a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 159a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 160a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV30_3D(VERTEX_BEGIN_END), 1); 161a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATA (push, NV30_3D_VERTEX_BEGIN_END_STOP); 162a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_RESET(push, BUFCTX_VTXTMP); 163a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 164a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 165a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic void 166a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_render_draw_arrays(struct vbuf_render *render, unsigned start, uint nr) 167a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 168a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_render *r = nv30_render(render); 169a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_context *nv30 = r->nv30; 170a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nouveau_pushbuf *push = nv30->base.pushbuf; 171a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned fn = nr >> 8, pn = nr & 0xff; 172a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned ps = fn + (pn ? 1 : 0); 173a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned i; 174a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 175a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV30_3D(VTXBUF(0)), r->vertex_info.num_attribs); 176a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs for (i = 0; i < r->vertex_info.num_attribs; i++) { 177a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_RESRC(push, NV30_3D(VTXBUF(i)), BUFCTX_VTXTMP, 178a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv04_resource(r->buffer), r->offset + r->vtxptr[i], 179fdad7dfbdae07b9273fc8f57e63258dbe542c9b5Ilia Mirkin NOUVEAU_BO_LOW | NOUVEAU_BO_RD, 0, NV30_3D_VTXBUF_DMA1); 180a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 181a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 182cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset if (!nv30_state_validate(nv30, ~0, false)) 183a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs return; 184a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 185a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV30_3D(VERTEX_BEGIN_END), 1); 186a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATA (push, r->prim); 187a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 188a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NI04(push, NV30_3D(VB_VERTEX_BATCH), ps); 189a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs while (fn--) { 190a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATA (push, 0xff000000 | start); 191a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs start += 256; 192a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 193a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 194a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (pn) 195a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATA (push, ((pn - 1) << 24) | start); 196a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 197a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV30_3D(VERTEX_BEGIN_END), 1); 198a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATA (push, NV30_3D_VERTEX_BEGIN_END_STOP); 199a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_RESET(push, BUFCTX_VTXTMP); 200a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 201a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 202a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic void 203a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_render_release_vertices(struct vbuf_render *render) 204a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 205a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_render *r = nv30_render(render); 206a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->offset += r->length; 207a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 208a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 209a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic const struct { 210a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned emit; 211a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned vp30; 212a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned vp40; 213a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned ow40; 214a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} vroute [] = { 2152dbc20e45689e09766552517a74e2270e49817b5Roland Scheidegger [TGSI_SEMANTIC_POSITION] = { EMIT_4F, 0, 0, 0x00000000 }, 2162dbc20e45689e09766552517a74e2270e49817b5Roland Scheidegger [TGSI_SEMANTIC_COLOR ] = { EMIT_4F, 3, 1, 0x00000001 }, 2172dbc20e45689e09766552517a74e2270e49817b5Roland Scheidegger [TGSI_SEMANTIC_BCOLOR ] = { EMIT_4F, 1, 3, 0x00000004 }, 2182dbc20e45689e09766552517a74e2270e49817b5Roland Scheidegger [TGSI_SEMANTIC_FOG ] = { EMIT_4F, 5, 5, 0x00000010 }, 2192dbc20e45689e09766552517a74e2270e49817b5Roland Scheidegger [TGSI_SEMANTIC_PSIZE ] = { EMIT_1F_PSIZE, 6, 6, 0x00000020 }, 2202dbc20e45689e09766552517a74e2270e49817b5Roland Scheidegger [TGSI_SEMANTIC_TEXCOORD] = { EMIT_4F, 8, 7, 0x00004000 }, 221a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs}; 222a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 223cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoisetstatic bool 224a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsvroute_add(struct nv30_render *r, uint attrib, uint sem, uint *idx) 225a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 22625be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin struct nv30_screen *screen = r->nv30->screen; 227a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_fragprog *fp = r->nv30->fragprog.program; 228a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct vertex_info *vinfo = &r->vertex_info; 229a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs enum pipe_format format; 230a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs uint emit = EMIT_OMIT; 231a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs uint result = *idx; 232a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 23325be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin if (sem == TGSI_SEMANTIC_GENERIC) { 23425be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin uint num_texcoords = (screen->eng3d->oclass < NV40_3D_CLASS) ? 8 : 10; 23525be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin for (result = 0; result < num_texcoords; result++) { 23625be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin if (fp->texcoord[result] == *idx + 8) { 23725be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin sem = TGSI_SEMANTIC_TEXCOORD; 238a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs emit = vroute[sem].emit; 239a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs break; 240a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 241a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 242a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } else { 243a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs emit = vroute[sem].emit; 244a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 245a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 246a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (emit == EMIT_OMIT) 247cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset return false; 248a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 2492dbc20e45689e09766552517a74e2270e49817b5Roland Scheidegger draw_emit_vertex_attr(vinfo, emit, attrib); 250a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs format = draw_translate_vinfo_format(emit); 251a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 25225be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin r->vtxfmt[attrib] = nv30_vtxfmt(&screen->base.base, format)->hw; 253fdad7dfbdae07b9273fc8f57e63258dbe542c9b5Ilia Mirkin r->vtxptr[attrib] = vinfo->size; 254a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs vinfo->size += draw_translate_vinfo_size(emit); 255a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 25625be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin if (screen->eng3d->oclass < NV40_3D_CLASS) { 257a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxprog[attrib][0] = 0x001f38d8; 258a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxprog[attrib][1] = 0x0080001b | (attrib << 9); 259a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxprog[attrib][2] = 0x0836106c; 260a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxprog[attrib][3] = 0x2000f800 | (result + vroute[sem].vp30) << 2; 261a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } else { 262a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxprog[attrib][0] = 0x401f9c6c; 263a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxprog[attrib][1] = 0x0040000d | (attrib << 8); 264a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxprog[attrib][2] = 0x8106c083; 265a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxprog[attrib][3] = 0x6041ff80 | (result + vroute[sem].vp40) << 2; 266a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 267a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 26825be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin if (result < 8) 26925be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin *idx = vroute[sem].ow40 << result; 27025be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin else { 27125be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin assert(sem == TGSI_SEMANTIC_TEXCOORD); 27225be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin *idx = 0x00001000 << (result - 8); 27325be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin } 274cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset return true; 275a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 276a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 277cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoisetstatic bool 278a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_render_validate(struct nv30_context *nv30) 279a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 280a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_render *r = nv30_render(nv30->draw->render); 281a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_rasterizer_stateobj *rast = nv30->rast; 282a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct pipe_screen *pscreen = &nv30->screen->base.base; 283a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nouveau_pushbuf *push = nv30->screen->base.pushbuf; 284a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nouveau_object *eng3d = nv30->screen->eng3d; 285a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_vertprog *vp = nv30->vertprog.program; 286a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct vertex_info *vinfo = &r->vertex_info; 287a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned vp_attribs = 0; 288a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned vp_results = 0; 289a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned attrib = 0; 290a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned pntc; 291a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs int i; 292a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 293a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (!r->vertprog) { 294a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nouveau_heap *heap = nv30_screen(pscreen)->vp_exec_heap; 295a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nouveau_heap_alloc(heap, 16, &r->vertprog, &r->vertprog)) { 296a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs while (heap->next && heap->size < 16) { 297a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nouveau_heap **evict = heap->next->priv; 298a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nouveau_heap_free(evict); 299a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 300a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 301a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nouveau_heap_alloc(heap, 16, &r->vertprog, &r->vertprog)) 302cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset return false; 303a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 304a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 305a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 306a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs vinfo->num_attribs = 0; 307a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs vinfo->size = 0; 308a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 309a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs /* setup routing for all necessary vp outputs */ 310a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs for (i = 0; i < vp->info.num_outputs && attrib < 16; i++) { 311a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs uint semantic = vp->info.output_semantic_name[i]; 312a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs uint index = vp->info.output_semantic_index[i]; 313a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (vroute_add(r, attrib, semantic, &index)) { 314a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs vp_attribs |= (1 << attrib++); 315a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs vp_results |= index; 316a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 317a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 318a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 319a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs /* setup routing for replaced point coords not written by vp */ 320a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (rast && rast->pipe.point_quad_rasterization) 321a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs pntc = rast->pipe.sprite_coord_enable & 0x000002ff; 322a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs else 323a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs pntc = 0; 324a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 325a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs while (pntc && attrib < 16) { 326a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs uint index = ffs(pntc) - 1; pntc &= ~(1 << index); 32725be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin if (vroute_add(r, attrib, TGSI_SEMANTIC_TEXCOORD, &index)) { 328a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs vp_attribs |= (1 << attrib++); 329a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs vp_results |= index; 330a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 331a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 332a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 333a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs /* modify vertex format for correct stride, and stub out unused ones */ 334a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV30_3D(VP_UPLOAD_FROM_ID), 1); 335a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATA (push, r->vertprog->start); 336a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxprog[attrib - 1][3] |= 1; 337a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs for (i = 0; i < attrib; i++) { 338a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4); 339a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATAp(push, r->vtxprog[i], 4); 340a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxfmt[i] |= vinfo->size << 8; 341a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 342a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs for (; i < 16; i++) 343a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxfmt[i] = NV30_3D_VTXFMT_TYPE_V32_FLOAT; 344a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 34551ca57df0196837e5ac754fd8e54e64205a5b957Ilia Mirkin BEGIN_NV04(push, NV30_3D(VIEWPORT_TRANSLATE_X), 8); 34651ca57df0196837e5ac754fd8e54e64205a5b957Ilia Mirkin PUSH_DATAf(push, 0.0); 34751ca57df0196837e5ac754fd8e54e64205a5b957Ilia Mirkin PUSH_DATAf(push, 0.0); 34851ca57df0196837e5ac754fd8e54e64205a5b957Ilia Mirkin PUSH_DATAf(push, 0.0); 34951ca57df0196837e5ac754fd8e54e64205a5b957Ilia Mirkin PUSH_DATAf(push, 0.0); 35051ca57df0196837e5ac754fd8e54e64205a5b957Ilia Mirkin PUSH_DATAf(push, 1.0); 35151ca57df0196837e5ac754fd8e54e64205a5b957Ilia Mirkin PUSH_DATAf(push, 1.0); 35251ca57df0196837e5ac754fd8e54e64205a5b957Ilia Mirkin PUSH_DATAf(push, 1.0); 35351ca57df0196837e5ac754fd8e54e64205a5b957Ilia Mirkin PUSH_DATAf(push, 1.0); 35451ca57df0196837e5ac754fd8e54e64205a5b957Ilia Mirkin BEGIN_NV04(push, NV30_3D(DEPTH_RANGE_NEAR), 2); 35551ca57df0196837e5ac754fd8e54e64205a5b957Ilia Mirkin PUSH_DATAf(push, 0.0); 35651ca57df0196837e5ac754fd8e54e64205a5b957Ilia Mirkin PUSH_DATAf(push, 1.0); 35751ca57df0196837e5ac754fd8e54e64205a5b957Ilia Mirkin BEGIN_NV04(push, NV30_3D(VIEWPORT_HORIZ), 2); 35851ca57df0196837e5ac754fd8e54e64205a5b957Ilia Mirkin PUSH_DATA (push, nv30->framebuffer.width << 16); 35951ca57df0196837e5ac754fd8e54e64205a5b957Ilia Mirkin PUSH_DATA (push, nv30->framebuffer.height << 16); 36051ca57df0196837e5ac754fd8e54e64205a5b957Ilia Mirkin 361a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV30_3D(VTXFMT(0)), 16); 362a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATAp(push, r->vtxfmt, 16); 363a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 364a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV30_3D(VP_START_FROM_ID), 1); 365a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATA (push, r->vertprog->start); 366a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV30_3D(ENGINE), 1); 367a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATA (push, 0x00000103); 368a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (eng3d->oclass >= NV40_3D_CLASS) { 369a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV40_3D(VP_ATTRIB_EN), 2); 370a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATA (push, vp_attribs); 371a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATA (push, vp_results); 372a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 373a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 374a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs vinfo->size /= 4; 375cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset return true; 376a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 377a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 378a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsvoid 379a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) 380a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 381a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_context *nv30 = nv30_context(pipe); 382a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct draw_context *draw = nv30->draw; 3834552fd50d959ab99546cfa994f8ba5bdf5d66bc7Marek Olšák struct pipe_transfer *transfer[PIPE_MAX_ATTRIBS] = {NULL}; 384a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct pipe_transfer *transferi = NULL; 385a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs int i; 386a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 387a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30_render_validate(nv30); 388a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 389a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nv30->draw_dirty & NV30_NEW_VIEWPORT) 390eaabb4ead07ae043ecc789024028e225ebd0f318Zack Rusin draw_set_viewport_states(draw, 0, 1, &nv30->viewport); 391a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nv30->draw_dirty & NV30_NEW_RASTERIZER) 392a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_set_rasterizer_state(draw, &nv30->rast->pipe, NULL); 393a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nv30->draw_dirty & NV30_NEW_CLIP) 394a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_set_clip_state(draw, &nv30->clip); 395a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nv30->draw_dirty & NV30_NEW_ARRAYS) { 396e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák draw_set_vertex_buffers(draw, 0, nv30->num_vtxbufs, nv30->vtxbuf); 397a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_set_vertex_elements(draw, nv30->vertex->num_elements, nv30->vertex->pipe); 398a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 399a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nv30->draw_dirty & NV30_NEW_FRAGPROG) { 400a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_fragprog *fp = nv30->fragprog.program; 401a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (!fp->draw) 402a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs fp->draw = draw_create_fragment_shader(draw, &fp->pipe); 403a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_bind_fragment_shader(draw, fp->draw); 404a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 405a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nv30->draw_dirty & NV30_NEW_VERTPROG) { 406a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_vertprog *vp = nv30->vertprog.program; 407a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (!vp->draw) 408a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs vp->draw = draw_create_vertex_shader(draw, &vp->pipe); 409a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_bind_vertex_shader(draw, vp->draw); 410a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 411a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nv30->draw_dirty & NV30_NEW_VERTCONST) { 412a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nv30->vertprog.constbuf) { 413a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs void *map = nv04_resource(nv30->vertprog.constbuf)->data; 414a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_set_mapped_constant_buffer(draw, PIPE_SHADER_VERTEX, 0, 415147816375d22a653176ab28ed650fa811ceea83fIlia Mirkin map, nv30->vertprog.constbuf_nr * 16); 41689585edf3c01c94b62d163adf0209568efa68568Ilia Mirkin } else { 41789585edf3c01c94b62d163adf0209568efa68568Ilia Mirkin draw_set_mapped_constant_buffer(draw, PIPE_SHADER_VERTEX, 0, NULL, 0); 418a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 419a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 420a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 421a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs for (i = 0; i < nv30->num_vtxbufs; i++) { 4224552fd50d959ab99546cfa994f8ba5bdf5d66bc7Marek Olšák const void *map = nv30->vtxbuf[i].user_buffer; 423e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák if (!map) { 42489585edf3c01c94b62d163adf0209568efa68568Ilia Mirkin if (nv30->vtxbuf[i].buffer) 42589585edf3c01c94b62d163adf0209568efa68568Ilia Mirkin map = pipe_buffer_map(pipe, nv30->vtxbuf[i].buffer, 426a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PIPE_TRANSFER_UNSYNCHRONIZED | 427a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PIPE_TRANSFER_READ, &transfer[i]); 428e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák } 42929853ab7b8656cee9b92a53bec43f6e9f1e49691Zack Rusin draw_set_mapped_vertex_buffer(draw, i, map, ~0); 430a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 431a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 432a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (info->indexed) { 433bf469f4edc60bd1c5fd770cb231b8d5ab801427fMarek Olšák const void *map = nv30->idxbuf.user_buffer; 434bf469f4edc60bd1c5fd770cb231b8d5ab801427fMarek Olšák if (!map) 4353600439897c79d37c3c654546867ddfa0c420743Ilia Mirkin map = pipe_buffer_map(pipe, nv30->idxbuf.buffer, 4363600439897c79d37c3c654546867ddfa0c420743Ilia Mirkin PIPE_TRANSFER_UNSYNCHRONIZED | 4373600439897c79d37c3c654546867ddfa0c420743Ilia Mirkin PIPE_TRANSFER_READ, &transferi); 438185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul draw_set_indexes(draw, 439185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul (ubyte *) map + nv30->idxbuf.offset, 4405104ed3dbf18d47736fc67a8e3e317ea18360fa8Zack Rusin nv30->idxbuf.index_size, ~0); 441a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } else { 4425104ed3dbf18d47736fc67a8e3e317ea18360fa8Zack Rusin draw_set_indexes(draw, NULL, 0, 0); 443a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 444a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 445a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_vbo(draw, info); 446a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_flush(draw); 447a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 448bf469f4edc60bd1c5fd770cb231b8d5ab801427fMarek Olšák if (info->indexed && transferi) 449a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs pipe_buffer_unmap(pipe, transferi); 450a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs for (i = 0; i < nv30->num_vtxbufs; i++) 4514552fd50d959ab99546cfa994f8ba5bdf5d66bc7Marek Olšák if (transfer[i]) 4524552fd50d959ab99546cfa994f8ba5bdf5d66bc7Marek Olšák pipe_buffer_unmap(pipe, transfer[i]); 453a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 454a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->draw_dirty = 0; 455a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30_state_release(nv30); 456a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 457a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 458a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic void 459a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_render_destroy(struct vbuf_render *render) 460a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 4619870ed05dd333a20662479b9b1e3a8db542924c4Ilia Mirkin struct nv30_render *r = nv30_render(render); 4629870ed05dd333a20662479b9b1e3a8db542924c4Ilia Mirkin 4639870ed05dd333a20662479b9b1e3a8db542924c4Ilia Mirkin if (r->transfer) 4649870ed05dd333a20662479b9b1e3a8db542924c4Ilia Mirkin pipe_buffer_unmap(&r->nv30->base.pipe, r->transfer); 4659870ed05dd333a20662479b9b1e3a8db542924c4Ilia Mirkin pipe_resource_reference(&r->buffer, NULL); 4669870ed05dd333a20662479b9b1e3a8db542924c4Ilia Mirkin nouveau_heap_free(&r->vertprog); 467a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs FREE(render); 468a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 469a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 470a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic struct vbuf_render * 471a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_render_create(struct nv30_context *nv30) 472a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 473a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_render *r = CALLOC_STRUCT(nv30_render); 474a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (!r) 475a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs return NULL; 476a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 477a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->nv30 = nv30; 478a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->offset = 1 * 1024 * 1024; 479a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 480a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.max_indices = 16 * 1024; 481a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.max_vertex_buffer_bytes = r->offset; 482a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 483a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.get_vertex_info = nv30_render_get_vertex_info; 484a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.allocate_vertices = nv30_render_allocate_vertices; 485a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.map_vertices = nv30_render_map_vertices; 486a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.unmap_vertices = nv30_render_unmap_vertices; 487a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.set_primitive = nv30_render_set_primitive; 488a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.draw_elements = nv30_render_draw_elements; 489a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.draw_arrays = nv30_render_draw_arrays; 490a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.release_vertices = nv30_render_release_vertices; 491a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.destroy = nv30_render_destroy; 492a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs return &r->base; 493a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 494a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 495a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsvoid 496a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_draw_init(struct pipe_context *pipe) 497a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 498a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_context *nv30 = nv30_context(pipe); 499a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct vbuf_render *render; 500a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct draw_context *draw; 501a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct draw_stage *stage; 502a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 503a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw = draw_create(pipe); 504a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (!draw) 505a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs return; 506a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 507a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs render = nv30_render_create(nv30); 508a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (!render) { 509a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_destroy(draw); 510a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs return; 511a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 512a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 513a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs stage = draw_vbuf_stage(draw, render); 514a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (!stage) { 515a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs render->destroy(render); 516a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_destroy(draw); 517a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs return; 518a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 519a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 520a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_set_render(draw, render); 521a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_set_rasterize_stage(draw, stage); 522a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_wide_line_threshold(draw, 10000000.f); 523a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_wide_point_threshold(draw, 10000000.f); 524cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset draw_wide_point_sprites(draw, true); 525a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->draw = draw; 526a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 527