Pekka Paalanen | 0344b0e | 2008-11-08 17:04:45 +0200 | [diff] [blame] | 1 | #include "draw/draw_context.h" |
| 2 | #include "pipe/p_context.h" |
| 3 | #include "pipe/p_state.h" |
Ben Skeggs | 6b3ca67 | 2009-06-05 11:21:08 +1000 | [diff] [blame] | 4 | #include "pipe/p_inlines.h" |
Pekka Paalanen | 0344b0e | 2008-11-08 17:04:45 +0200 | [diff] [blame] | 5 | |
Pekka Paalanen | b5a3c42 | 2008-11-08 18:04:33 +0200 | [diff] [blame] | 6 | #include "nv20_context.h" |
| 7 | #include "nv20_state.h" |
Pekka Paalanen | 0344b0e | 2008-11-08 17:04:45 +0200 | [diff] [blame] | 8 | |
| 9 | #include "nouveau/nouveau_channel.h" |
| 10 | #include "nouveau/nouveau_pushbuf.h" |
| 11 | |
Pekka Paalanen | b5a3c42 | 2008-11-08 18:04:33 +0200 | [diff] [blame] | 12 | boolean nv20_draw_elements( struct pipe_context *pipe, |
Pekka Paalanen | 0344b0e | 2008-11-08 17:04:45 +0200 | [diff] [blame] | 13 | struct pipe_buffer *indexBuffer, |
| 14 | unsigned indexSize, |
| 15 | unsigned prim, unsigned start, unsigned count) |
| 16 | { |
Ben Skeggs | 6b3ca67 | 2009-06-05 11:21:08 +1000 | [diff] [blame] | 17 | struct pipe_screen *pscreen = pipe->screen; |
Pekka Paalanen | b5a3c42 | 2008-11-08 18:04:33 +0200 | [diff] [blame] | 18 | struct nv20_context *nv20 = nv20_context( pipe ); |
| 19 | struct draw_context *draw = nv20->draw; |
Pekka Paalanen | 0344b0e | 2008-11-08 17:04:45 +0200 | [diff] [blame] | 20 | unsigned i; |
| 21 | |
Pekka Paalanen | b5a3c42 | 2008-11-08 18:04:33 +0200 | [diff] [blame] | 22 | nv20_emit_hw_state(nv20); |
Pekka Paalanen | 0344b0e | 2008-11-08 17:04:45 +0200 | [diff] [blame] | 23 | |
| 24 | /* |
| 25 | * Map vertex buffers |
| 26 | */ |
| 27 | for (i = 0; i < PIPE_MAX_ATTRIBS; i++) { |
Pekka Paalanen | b5a3c42 | 2008-11-08 18:04:33 +0200 | [diff] [blame] | 28 | if (nv20->vtxbuf[i].buffer) { |
Pekka Paalanen | 0344b0e | 2008-11-08 17:04:45 +0200 | [diff] [blame] | 29 | void *buf |
Ben Skeggs | 6b3ca67 | 2009-06-05 11:21:08 +1000 | [diff] [blame] | 30 | = pipe_buffer_map(pscreen, |
| 31 | nv20->vtxbuf[i].buffer, |
| 32 | PIPE_BUFFER_USAGE_CPU_READ); |
Pekka Paalanen | 0344b0e | 2008-11-08 17:04:45 +0200 | [diff] [blame] | 33 | draw_set_mapped_vertex_buffer(draw, i, buf); |
| 34 | } |
| 35 | } |
| 36 | /* Map index buffer, if present */ |
| 37 | if (indexBuffer) { |
| 38 | void *mapped_indexes |
Ben Skeggs | 6b3ca67 | 2009-06-05 11:21:08 +1000 | [diff] [blame] | 39 | = pipe_buffer_map(pscreen, indexBuffer, |
| 40 | PIPE_BUFFER_USAGE_CPU_READ); |
Pekka Paalanen | 0344b0e | 2008-11-08 17:04:45 +0200 | [diff] [blame] | 41 | 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 Paalanen | b5a3c42 | 2008-11-08 18:04:33 +0200 | [diff] [blame] | 49 | nv20->constbuf[PIPE_SHADER_VERTEX], |
| 50 | nv20->constbuf_nr[PIPE_SHADER_VERTEX]); |
Pekka Paalanen | 0344b0e | 2008-11-08 17:04:45 +0200 | [diff] [blame] | 51 | |
| 52 | /* draw! */ |
Pekka Paalanen | b5a3c42 | 2008-11-08 18:04:33 +0200 | [diff] [blame] | 53 | draw_arrays(nv20->draw, prim, start, count); |
Pekka Paalanen | 0344b0e | 2008-11-08 17:04:45 +0200 | [diff] [blame] | 54 | |
| 55 | /* |
| 56 | * unmap vertex/index buffers |
| 57 | */ |
| 58 | for (i = 0; i < PIPE_MAX_ATTRIBS; i++) { |
Pekka Paalanen | b5a3c42 | 2008-11-08 18:04:33 +0200 | [diff] [blame] | 59 | if (nv20->vtxbuf[i].buffer) { |
Ben Skeggs | 6b3ca67 | 2009-06-05 11:21:08 +1000 | [diff] [blame] | 60 | pipe_buffer_unmap(pscreen, nv20->vtxbuf[i].buffer); |
Pekka Paalanen | 0344b0e | 2008-11-08 17:04:45 +0200 | [diff] [blame] | 61 | draw_set_mapped_vertex_buffer(draw, i, NULL); |
| 62 | } |
| 63 | } |
| 64 | if (indexBuffer) { |
Ben Skeggs | 6b3ca67 | 2009-06-05 11:21:08 +1000 | [diff] [blame] | 65 | pipe_buffer_unmap(pscreen, indexBuffer); |
Pekka Paalanen | 0344b0e | 2008-11-08 17:04:45 +0200 | [diff] [blame] | 66 | draw_set_mapped_element_buffer(draw, 0, NULL); |
| 67 | } |
| 68 | |
Pekka Paalanen | b5e2ab6 | 2009-01-31 14:36:20 +0200 | [diff] [blame] | 69 | draw_flush(nv20->draw); |
Pekka Paalanen | 0344b0e | 2008-11-08 17:04:45 +0200 | [diff] [blame] | 70 | return TRUE; |
| 71 | } |
| 72 | |
Pekka Paalanen | b5a3c42 | 2008-11-08 18:04:33 +0200 | [diff] [blame] | 73 | boolean nv20_draw_arrays( struct pipe_context *pipe, |
Pekka Paalanen | 0344b0e | 2008-11-08 17:04:45 +0200 | [diff] [blame] | 74 | unsigned prim, unsigned start, unsigned count) |
| 75 | { |
Pekka Paalanen | b5a3c42 | 2008-11-08 18:04:33 +0200 | [diff] [blame] | 76 | return nv20_draw_elements(pipe, NULL, 0, prim, start, count); |
Pekka Paalanen | 0344b0e | 2008-11-08 17:04:45 +0200 | [diff] [blame] | 77 | } |
| 78 | |
| 79 | |
| 80 | |