blob: 441a4f75f3f84ddfde01116b4ed01d44e1b16b0a [file] [log] [blame]
Stephane Marchesind4932032008-03-15 05:37:57 +01001#include "draw/draw_context.h"
2#include "pipe/p_context.h"
3#include "pipe/p_state.h"
Ben Skeggs6b3ca672009-06-05 11:21:08 +10004#include "pipe/p_inlines.h"
Stephane Marchesind4932032008-03-15 05:37:57 +01005
6#include "nv10_context.h"
7#include "nv10_state.h"
8
9#include "nouveau/nouveau_channel.h"
10#include "nouveau/nouveau_pushbuf.h"
11
12boolean 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;
Ben Skeggs6b3ca672009-06-05 11:21:08 +100019 struct pipe_screen *pscreen = pipe->screen;
Stephane Marchesind4932032008-03-15 05:37:57 +010020 unsigned i;
21
Stephane Marchesinfb19b332008-04-02 18:26:49 +020022 nv10_emit_hw_state(nv10);
23
Stephane Marchesind4932032008-03-15 05:37:57 +010024 /*
25 * Map vertex buffers
26 */
Ben Skeggs7d2085b2008-04-15 13:25:28 +100027 for (i = 0; i < PIPE_MAX_ATTRIBS; i++) {
Stephane Marchesind4932032008-03-15 05:37:57 +010028 if (nv10->vtxbuf[i].buffer) {
Ben Skeggs6b3ca672009-06-05 11:21:08 +100029 void *buf =
30 pipe_buffer_map(pscreen, nv10->vtxbuf[i].buffer,
Stephane Marchesind4932032008-03-15 05:37:57 +010031 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
Ben Skeggs6b3ca672009-06-05 11:21:08 +100038 = pipe_buffer_map(pscreen, indexBuffer,
39 PIPE_BUFFER_USAGE_CPU_READ);
Stephane Marchesind4932032008-03-15 05:37:57 +010040 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
Ben Skeggs5a010602008-06-23 00:14:21 +100047 draw_set_mapped_constant_buffer(draw,
48 nv10->constbuf[PIPE_SHADER_VERTEX],
49 nv10->constbuf_nr[PIPE_SHADER_VERTEX]);
Stephane Marchesin7f21b632008-04-03 04:07:16 +020050
Stephane Marchesind4932032008-03-15 05:37:57 +010051 /* draw! */
52 draw_arrays(nv10->draw, prim, start, count);
53
54 /*
55 * unmap vertex/index buffers
56 */
Ben Skeggs7d2085b2008-04-15 13:25:28 +100057 for (i = 0; i < PIPE_MAX_ATTRIBS; i++) {
Stephane Marchesind4932032008-03-15 05:37:57 +010058 if (nv10->vtxbuf[i].buffer) {
Ben Skeggs6b3ca672009-06-05 11:21:08 +100059 pipe_buffer_unmap(pscreen, nv10->vtxbuf[i].buffer);
Stephane Marchesind4932032008-03-15 05:37:57 +010060 draw_set_mapped_vertex_buffer(draw, i, NULL);
61 }
62 }
63 if (indexBuffer) {
Ben Skeggs6b3ca672009-06-05 11:21:08 +100064 pipe_buffer_unmap(pscreen, indexBuffer);
Stephane Marchesind4932032008-03-15 05:37:57 +010065 draw_set_mapped_element_buffer(draw, 0, NULL);
66 }
67
68 return TRUE;
69}
70
71boolean 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