blob: 84d7db6c5e27c3274eea2f40340e06311db8a04e [file] [log] [blame]
Pekka Paalanen0344b0e2008-11-08 17:04:45 +02001#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"
Pekka Paalanen0344b0e2008-11-08 17:04:45 +02005
Pekka Paalanenb5a3c422008-11-08 18:04:33 +02006#include "nv20_context.h"
7#include "nv20_state.h"
Pekka Paalanen0344b0e2008-11-08 17:04:45 +02008
9#include "nouveau/nouveau_channel.h"
10#include "nouveau/nouveau_pushbuf.h"
11
Pekka Paalanenb5a3c422008-11-08 18:04:33 +020012boolean nv20_draw_elements( struct pipe_context *pipe,
Pekka Paalanen0344b0e2008-11-08 17:04:45 +020013 struct pipe_buffer *indexBuffer,
14 unsigned indexSize,
15 unsigned prim, unsigned start, unsigned count)
16{
Ben Skeggs6b3ca672009-06-05 11:21:08 +100017 struct pipe_screen *pscreen = pipe->screen;
Pekka Paalanenb5a3c422008-11-08 18:04:33 +020018 struct nv20_context *nv20 = nv20_context( pipe );
19 struct draw_context *draw = nv20->draw;
Pekka Paalanen0344b0e2008-11-08 17:04:45 +020020 unsigned i;
21
Pekka Paalanenb5a3c422008-11-08 18:04:33 +020022 nv20_emit_hw_state(nv20);
Pekka Paalanen0344b0e2008-11-08 17:04:45 +020023
24 /*
25 * Map vertex buffers
26 */
27 for (i = 0; i < PIPE_MAX_ATTRIBS; i++) {
Pekka Paalanenb5a3c422008-11-08 18:04:33 +020028 if (nv20->vtxbuf[i].buffer) {
Pekka Paalanen0344b0e2008-11-08 17:04:45 +020029 void *buf
Ben Skeggs6b3ca672009-06-05 11:21:08 +100030 = pipe_buffer_map(pscreen,
31 nv20->vtxbuf[i].buffer,
32 PIPE_BUFFER_USAGE_CPU_READ);
Pekka Paalanen0344b0e2008-11-08 17:04:45 +020033 draw_set_mapped_vertex_buffer(draw, i, buf);
34 }
35 }
36 /* Map index buffer, if present */
37 if (indexBuffer) {
38 void *mapped_indexes
Ben Skeggs6b3ca672009-06-05 11:21:08 +100039 = pipe_buffer_map(pscreen, indexBuffer,
40 PIPE_BUFFER_USAGE_CPU_READ);
Pekka Paalanen0344b0e2008-11-08 17:04:45 +020041 draw_set_mapped_element_buffer(draw, indexSize, mapped_indexes);
42 }
43 else {
44 /* no index/element buffer */
45 draw_set_mapped_element_buffer(draw, 0, NULL);
46 }
47
48 draw_set_mapped_constant_buffer(draw,
Pekka Paalanenb5a3c422008-11-08 18:04:33 +020049 nv20->constbuf[PIPE_SHADER_VERTEX],
50 nv20->constbuf_nr[PIPE_SHADER_VERTEX]);
Pekka Paalanen0344b0e2008-11-08 17:04:45 +020051
52 /* draw! */
Pekka Paalanenb5a3c422008-11-08 18:04:33 +020053 draw_arrays(nv20->draw, prim, start, count);
Pekka Paalanen0344b0e2008-11-08 17:04:45 +020054
55 /*
56 * unmap vertex/index buffers
57 */
58 for (i = 0; i < PIPE_MAX_ATTRIBS; i++) {
Pekka Paalanenb5a3c422008-11-08 18:04:33 +020059 if (nv20->vtxbuf[i].buffer) {
Ben Skeggs6b3ca672009-06-05 11:21:08 +100060 pipe_buffer_unmap(pscreen, nv20->vtxbuf[i].buffer);
Pekka Paalanen0344b0e2008-11-08 17:04:45 +020061 draw_set_mapped_vertex_buffer(draw, i, NULL);
62 }
63 }
64 if (indexBuffer) {
Ben Skeggs6b3ca672009-06-05 11:21:08 +100065 pipe_buffer_unmap(pscreen, indexBuffer);
Pekka Paalanen0344b0e2008-11-08 17:04:45 +020066 draw_set_mapped_element_buffer(draw, 0, NULL);
67 }
68
Pekka Paalanenb5e2ab62009-01-31 14:36:20 +020069 draw_flush(nv20->draw);
Pekka Paalanen0344b0e2008-11-08 17:04:45 +020070 return TRUE;
71}
72
Pekka Paalanenb5a3c422008-11-08 18:04:33 +020073boolean nv20_draw_arrays( struct pipe_context *pipe,
Pekka Paalanen0344b0e2008-11-08 17:04:45 +020074 unsigned prim, unsigned start, unsigned count)
75{
Pekka Paalanenb5a3c422008-11-08 18:04:33 +020076 return nv20_draw_elements(pipe, NULL, 0, prim, start, count);
Pekka Paalanen0344b0e2008-11-08 17:04:45 +020077}
78
79
80