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