Merge branch 'mesa_7_5_branch' into mesa_7_6_branch
[mesa.git] / src / gallium / drivers / nv10 / nv10_vbo.c
1 #include "draw/draw_context.h"
2 #include "pipe/p_context.h"
3 #include "pipe/p_state.h"
4 #include "pipe/p_inlines.h"
5
6 #include "nv10_context.h"
7 #include "nv10_state.h"
8
9 #include "nouveau/nouveau_channel.h"
10 #include "nouveau/nouveau_pushbuf.h"
11
12 boolean nv10_draw_elements( struct pipe_context *pipe,
13 struct pipe_buffer *indexBuffer,
14 unsigned indexSize,
15 unsigned prim, unsigned start, unsigned count)
16 {
17 struct nv10_context *nv10 = nv10_context( pipe );
18 struct draw_context *draw = nv10->draw;
19 struct pipe_screen *pscreen = pipe->screen;
20 unsigned i;
21
22 nv10_emit_hw_state(nv10);
23
24 /*
25 * Map vertex buffers
26 */
27 for (i = 0; i < PIPE_MAX_ATTRIBS; i++) {
28 if (nv10->vtxbuf[i].buffer) {
29 void *buf =
30 pipe_buffer_map(pscreen, nv10->vtxbuf[i].buffer,
31 PIPE_BUFFER_USAGE_CPU_READ);
32 draw_set_mapped_vertex_buffer(draw, i, buf);
33 }
34 }
35 /* Map index buffer, if present */
36 if (indexBuffer) {
37 void *mapped_indexes
38 = pipe_buffer_map(pscreen, indexBuffer,
39 PIPE_BUFFER_USAGE_CPU_READ);
40 draw_set_mapped_element_buffer(draw, indexSize, mapped_indexes);
41 }
42 else {
43 /* no index/element buffer */
44 draw_set_mapped_element_buffer(draw, 0, NULL);
45 }
46
47 draw_set_mapped_constant_buffer(draw,
48 nv10->constbuf[PIPE_SHADER_VERTEX],
49 nv10->constbuf_nr[PIPE_SHADER_VERTEX]);
50
51 /* draw! */
52 draw_arrays(nv10->draw, prim, start, count);
53
54 /*
55 * unmap vertex/index buffers
56 */
57 for (i = 0; i < PIPE_MAX_ATTRIBS; i++) {
58 if (nv10->vtxbuf[i].buffer) {
59 pipe_buffer_unmap(pscreen, nv10->vtxbuf[i].buffer);
60 draw_set_mapped_vertex_buffer(draw, i, NULL);
61 }
62 }
63 if (indexBuffer) {
64 pipe_buffer_unmap(pscreen, indexBuffer);
65 draw_set_mapped_element_buffer(draw, 0, NULL);
66 }
67
68 return TRUE;
69 }
70
71 boolean nv10_draw_arrays( struct pipe_context *pipe,
72 unsigned prim, unsigned start, unsigned count)
73 {
74 return nv10_draw_elements(pipe, NULL, 0, prim, start, count);
75 }
76
77
78