nv30_draw.c revision cd0dec0d9dfab642c51774c3f5788cbdf00b8c9b
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 55a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic 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 interp; 212a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned vp30; 213a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned vp40; 214a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned ow40; 215a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} vroute [] = { 216a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs [TGSI_SEMANTIC_POSITION] = { EMIT_4F, INTERP_PERSPECTIVE, 0, 0, 0x00000000 }, 217a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs [TGSI_SEMANTIC_COLOR ] = { EMIT_4F, INTERP_LINEAR , 3, 1, 0x00000001 }, 218a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs [TGSI_SEMANTIC_BCOLOR ] = { EMIT_4F, INTERP_LINEAR , 1, 3, 0x00000004 }, 219a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs [TGSI_SEMANTIC_FOG ] = { EMIT_4F, INTERP_PERSPECTIVE, 5, 5, 0x00000010 }, 220a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs [TGSI_SEMANTIC_PSIZE ] = { EMIT_1F_PSIZE, INTERP_POS , 6, 6, 0x00000020 }, 22125be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin [TGSI_SEMANTIC_TEXCOORD] = { EMIT_4F, INTERP_PERSPECTIVE, 8, 7, 0x00004000 }, 222a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs}; 223a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 224cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoisetstatic bool 225a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsvroute_add(struct nv30_render *r, uint attrib, uint sem, uint *idx) 226a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 22725be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin struct nv30_screen *screen = r->nv30->screen; 228a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_fragprog *fp = r->nv30->fragprog.program; 229a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct vertex_info *vinfo = &r->vertex_info; 230a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs enum pipe_format format; 231a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs uint emit = EMIT_OMIT; 232a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs uint result = *idx; 233a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 23425be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin if (sem == TGSI_SEMANTIC_GENERIC) { 23525be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin uint num_texcoords = (screen->eng3d->oclass < NV40_3D_CLASS) ? 8 : 10; 23625be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin for (result = 0; result < num_texcoords; result++) { 23725be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin if (fp->texcoord[result] == *idx + 8) { 23825be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin sem = TGSI_SEMANTIC_TEXCOORD; 239a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs emit = vroute[sem].emit; 240a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs break; 241a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 242a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 243a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } else { 244a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs emit = vroute[sem].emit; 245a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 246a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 247a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (emit == EMIT_OMIT) 248cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset return false; 249a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 250a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_emit_vertex_attr(vinfo, emit, vroute[sem].interp, attrib); 251a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs format = draw_translate_vinfo_format(emit); 252a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 25325be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin r->vtxfmt[attrib] = nv30_vtxfmt(&screen->base.base, format)->hw; 254fdad7dfbdae07b9273fc8f57e63258dbe542c9b5Ilia Mirkin r->vtxptr[attrib] = vinfo->size; 255a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs vinfo->size += draw_translate_vinfo_size(emit); 256a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 25725be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin if (screen->eng3d->oclass < NV40_3D_CLASS) { 258a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxprog[attrib][0] = 0x001f38d8; 259a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxprog[attrib][1] = 0x0080001b | (attrib << 9); 260a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxprog[attrib][2] = 0x0836106c; 261a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxprog[attrib][3] = 0x2000f800 | (result + vroute[sem].vp30) << 2; 262a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } else { 263a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxprog[attrib][0] = 0x401f9c6c; 264a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxprog[attrib][1] = 0x0040000d | (attrib << 8); 265a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxprog[attrib][2] = 0x8106c083; 266a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxprog[attrib][3] = 0x6041ff80 | (result + vroute[sem].vp40) << 2; 267a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 268a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 26925be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin if (result < 8) 27025be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin *idx = vroute[sem].ow40 << result; 27125be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin else { 27225be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin assert(sem == TGSI_SEMANTIC_TEXCOORD); 27325be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin *idx = 0x00001000 << (result - 8); 27425be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin } 275cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset return true; 276a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 277a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 278cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoisetstatic bool 279a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_render_validate(struct nv30_context *nv30) 280a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 281a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_render *r = nv30_render(nv30->draw->render); 282a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_rasterizer_stateobj *rast = nv30->rast; 283a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct pipe_screen *pscreen = &nv30->screen->base.base; 284a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nouveau_pushbuf *push = nv30->screen->base.pushbuf; 285a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nouveau_object *eng3d = nv30->screen->eng3d; 286a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_vertprog *vp = nv30->vertprog.program; 287a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct vertex_info *vinfo = &r->vertex_info; 288a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned vp_attribs = 0; 289a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned vp_results = 0; 290a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned attrib = 0; 291a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned pntc; 292a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs int i; 293a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 294a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (!r->vertprog) { 295a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nouveau_heap *heap = nv30_screen(pscreen)->vp_exec_heap; 296a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nouveau_heap_alloc(heap, 16, &r->vertprog, &r->vertprog)) { 297a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs while (heap->next && heap->size < 16) { 298a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nouveau_heap **evict = heap->next->priv; 299a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nouveau_heap_free(evict); 300a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 301a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 302a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nouveau_heap_alloc(heap, 16, &r->vertprog, &r->vertprog)) 303cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset return false; 304a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 305a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 306a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 307a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs vinfo->num_attribs = 0; 308a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs vinfo->size = 0; 309a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 310a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs /* setup routing for all necessary vp outputs */ 311a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs for (i = 0; i < vp->info.num_outputs && attrib < 16; i++) { 312a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs uint semantic = vp->info.output_semantic_name[i]; 313a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs uint index = vp->info.output_semantic_index[i]; 314a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (vroute_add(r, attrib, semantic, &index)) { 315a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs vp_attribs |= (1 << attrib++); 316a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs vp_results |= index; 317a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 318a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 319a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 320a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs /* setup routing for replaced point coords not written by vp */ 321a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (rast && rast->pipe.point_quad_rasterization) 322a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs pntc = rast->pipe.sprite_coord_enable & 0x000002ff; 323a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs else 324a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs pntc = 0; 325a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 326a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs while (pntc && attrib < 16) { 327a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs uint index = ffs(pntc) - 1; pntc &= ~(1 << index); 32825be70462dbb7ee994e69ffccc3de94e4114e667Ilia Mirkin if (vroute_add(r, attrib, TGSI_SEMANTIC_TEXCOORD, &index)) { 329a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs vp_attribs |= (1 << attrib++); 330a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs vp_results |= index; 331a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 332a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 333a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 334a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs /* modify vertex format for correct stride, and stub out unused ones */ 335a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV30_3D(VP_UPLOAD_FROM_ID), 1); 336a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATA (push, r->vertprog->start); 337a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxprog[attrib - 1][3] |= 1; 338a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs for (i = 0; i < attrib; i++) { 339a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4); 340a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATAp(push, r->vtxprog[i], 4); 341a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxfmt[i] |= vinfo->size << 8; 342a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 343a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs for (; i < 16; i++) 344a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->vtxfmt[i] = NV30_3D_VTXFMT_TYPE_V32_FLOAT; 345a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 346a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV30_3D(VIEWPORT_TRANSLATE_X), 8); 347a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATAf(push, 0.0); 348a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATAf(push, 0.0); 349a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATAf(push, 0.0); 350a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATAf(push, 0.0); 351a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATAf(push, 1.0); 352a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATAf(push, 1.0); 353a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATAf(push, 1.0); 354a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATAf(push, 1.0); 355a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV30_3D(DEPTH_RANGE_NEAR), 2); 356a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATAf(push, 0.0); 357a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATAf(push, 1.0); 358a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 359a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV30_3D(VTXFMT(0)), 16); 360a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATAp(push, r->vtxfmt, 16); 361a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 362a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV30_3D(VP_START_FROM_ID), 1); 363a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATA (push, r->vertprog->start); 364a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV30_3D(ENGINE), 1); 365a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATA (push, 0x00000103); 366a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (eng3d->oclass >= NV40_3D_CLASS) { 367a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV40_3D(VP_ATTRIB_EN), 2); 368a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATA (push, vp_attribs); 369a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATA (push, vp_results); 370a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 371a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 372a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs vinfo->size /= 4; 373cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset return true; 374a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 375a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 376a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsvoid 377a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) 378a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 379a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_context *nv30 = nv30_context(pipe); 380a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct draw_context *draw = nv30->draw; 3814552fd50d959ab99546cfa994f8ba5bdf5d66bc7Marek Olšák struct pipe_transfer *transfer[PIPE_MAX_ATTRIBS] = {NULL}; 382a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct pipe_transfer *transferi = NULL; 383a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs int i; 384a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 385a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30_render_validate(nv30); 386a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 387a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nv30->draw_dirty & NV30_NEW_VIEWPORT) 388eaabb4ead07ae043ecc789024028e225ebd0f318Zack Rusin draw_set_viewport_states(draw, 0, 1, &nv30->viewport); 389a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nv30->draw_dirty & NV30_NEW_RASTERIZER) 390a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_set_rasterizer_state(draw, &nv30->rast->pipe, NULL); 391a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nv30->draw_dirty & NV30_NEW_CLIP) 392a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_set_clip_state(draw, &nv30->clip); 393a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nv30->draw_dirty & NV30_NEW_ARRAYS) { 394e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák draw_set_vertex_buffers(draw, 0, nv30->num_vtxbufs, nv30->vtxbuf); 395a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_set_vertex_elements(draw, nv30->vertex->num_elements, nv30->vertex->pipe); 396a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 397a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nv30->draw_dirty & NV30_NEW_FRAGPROG) { 398a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_fragprog *fp = nv30->fragprog.program; 399a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (!fp->draw) 400a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs fp->draw = draw_create_fragment_shader(draw, &fp->pipe); 401a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_bind_fragment_shader(draw, fp->draw); 402a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 403a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nv30->draw_dirty & NV30_NEW_VERTPROG) { 404a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_vertprog *vp = nv30->vertprog.program; 405a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (!vp->draw) 406a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs vp->draw = draw_create_vertex_shader(draw, &vp->pipe); 407a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_bind_vertex_shader(draw, vp->draw); 408a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 409a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nv30->draw_dirty & NV30_NEW_VERTCONST) { 410a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nv30->vertprog.constbuf) { 411a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs void *map = nv04_resource(nv30->vertprog.constbuf)->data; 412a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_set_mapped_constant_buffer(draw, PIPE_SHADER_VERTEX, 0, 413147816375d22a653176ab28ed650fa811ceea83fIlia Mirkin map, nv30->vertprog.constbuf_nr * 16); 41489585edf3c01c94b62d163adf0209568efa68568Ilia Mirkin } else { 41589585edf3c01c94b62d163adf0209568efa68568Ilia Mirkin draw_set_mapped_constant_buffer(draw, PIPE_SHADER_VERTEX, 0, NULL, 0); 416a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 417a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 418a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 419a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs for (i = 0; i < nv30->num_vtxbufs; i++) { 4204552fd50d959ab99546cfa994f8ba5bdf5d66bc7Marek Olšák const void *map = nv30->vtxbuf[i].user_buffer; 421e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák if (!map) { 42289585edf3c01c94b62d163adf0209568efa68568Ilia Mirkin if (nv30->vtxbuf[i].buffer) 42389585edf3c01c94b62d163adf0209568efa68568Ilia Mirkin map = pipe_buffer_map(pipe, nv30->vtxbuf[i].buffer, 424a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PIPE_TRANSFER_UNSYNCHRONIZED | 425a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PIPE_TRANSFER_READ, &transfer[i]); 426e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák } 42729853ab7b8656cee9b92a53bec43f6e9f1e49691Zack Rusin draw_set_mapped_vertex_buffer(draw, i, map, ~0); 428a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 429a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 430a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (info->indexed) { 431bf469f4edc60bd1c5fd770cb231b8d5ab801427fMarek Olšák const void *map = nv30->idxbuf.user_buffer; 432bf469f4edc60bd1c5fd770cb231b8d5ab801427fMarek Olšák if (!map) 4333600439897c79d37c3c654546867ddfa0c420743Ilia Mirkin map = pipe_buffer_map(pipe, nv30->idxbuf.buffer, 4343600439897c79d37c3c654546867ddfa0c420743Ilia Mirkin PIPE_TRANSFER_UNSYNCHRONIZED | 4353600439897c79d37c3c654546867ddfa0c420743Ilia Mirkin PIPE_TRANSFER_READ, &transferi); 436185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul draw_set_indexes(draw, 437185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul (ubyte *) map + nv30->idxbuf.offset, 4385104ed3dbf18d47736fc67a8e3e317ea18360fa8Zack Rusin nv30->idxbuf.index_size, ~0); 439a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } else { 4405104ed3dbf18d47736fc67a8e3e317ea18360fa8Zack Rusin draw_set_indexes(draw, NULL, 0, 0); 441a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 442a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 443a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_vbo(draw, info); 444a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_flush(draw); 445a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 446bf469f4edc60bd1c5fd770cb231b8d5ab801427fMarek Olšák if (info->indexed && transferi) 447a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs pipe_buffer_unmap(pipe, transferi); 448a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs for (i = 0; i < nv30->num_vtxbufs; i++) 4494552fd50d959ab99546cfa994f8ba5bdf5d66bc7Marek Olšák if (transfer[i]) 4504552fd50d959ab99546cfa994f8ba5bdf5d66bc7Marek Olšák pipe_buffer_unmap(pipe, transfer[i]); 451a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 452a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->draw_dirty = 0; 453a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30_state_release(nv30); 454a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 455a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 456a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic void 457a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_render_destroy(struct vbuf_render *render) 458a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 4599870ed05dd333a20662479b9b1e3a8db542924c4Ilia Mirkin struct nv30_render *r = nv30_render(render); 4609870ed05dd333a20662479b9b1e3a8db542924c4Ilia Mirkin 4619870ed05dd333a20662479b9b1e3a8db542924c4Ilia Mirkin if (r->transfer) 4629870ed05dd333a20662479b9b1e3a8db542924c4Ilia Mirkin pipe_buffer_unmap(&r->nv30->base.pipe, r->transfer); 4639870ed05dd333a20662479b9b1e3a8db542924c4Ilia Mirkin pipe_resource_reference(&r->buffer, NULL); 4649870ed05dd333a20662479b9b1e3a8db542924c4Ilia Mirkin nouveau_heap_free(&r->vertprog); 465a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs FREE(render); 466a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 467a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 468a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic struct vbuf_render * 469a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_render_create(struct nv30_context *nv30) 470a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 471a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_render *r = CALLOC_STRUCT(nv30_render); 472a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (!r) 473a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs return NULL; 474a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 475a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->nv30 = nv30; 476a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->offset = 1 * 1024 * 1024; 477a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 478a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.max_indices = 16 * 1024; 479a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.max_vertex_buffer_bytes = r->offset; 480a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 481a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.get_vertex_info = nv30_render_get_vertex_info; 482a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.allocate_vertices = nv30_render_allocate_vertices; 483a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.map_vertices = nv30_render_map_vertices; 484a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.unmap_vertices = nv30_render_unmap_vertices; 485a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.set_primitive = nv30_render_set_primitive; 486a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.draw_elements = nv30_render_draw_elements; 487a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.draw_arrays = nv30_render_draw_arrays; 488a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.release_vertices = nv30_render_release_vertices; 489a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs r->base.destroy = nv30_render_destroy; 490a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs return &r->base; 491a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 492a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 493a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsvoid 494a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_draw_init(struct pipe_context *pipe) 495a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 496a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_context *nv30 = nv30_context(pipe); 497a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct vbuf_render *render; 498a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct draw_context *draw; 499a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct draw_stage *stage; 500a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 501a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw = draw_create(pipe); 502a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (!draw) 503a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs return; 504a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 505a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs render = nv30_render_create(nv30); 506a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (!render) { 507a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_destroy(draw); 508a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs return; 509a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 510a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 511a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs stage = draw_vbuf_stage(draw, render); 512a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (!stage) { 513a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs render->destroy(render); 514a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_destroy(draw); 515a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs return; 516a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 517a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 518a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_set_render(draw, render); 519a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_set_rasterize_stage(draw, stage); 520a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_wide_line_threshold(draw, 10000000.f); 521a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_wide_point_threshold(draw, 10000000.f); 522cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset draw_wide_point_sprites(draw, true); 523a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->draw = draw; 524a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 525