gallium: Implement draw_vbo and set_index_buffer for all drivers.
[mesa.git] / src / gallium / drivers / cell / ppu / cell_draw_arrays.c
1 /**************************************************************************
2 *
3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28 /* Author:
29 * Brian Paul
30 * Keith Whitwell
31 */
32
33
34 #include "pipe/p_defines.h"
35 #include "pipe/p_context.h"
36 #include "util/u_inlines.h"
37 #include "util/u_draw_quad.h"
38
39 #include "cell_context.h"
40 #include "cell_draw_arrays.h"
41 #include "cell_state.h"
42 #include "cell_flush.h"
43 #include "cell_texture.h"
44
45 #include "draw/draw_context.h"
46
47
48
49
50
51
52 /**
53 * Draw vertex arrays, with optional indexing.
54 * Basically, map the vertex buffers (and drawing surfaces), then hand off
55 * the drawing to the 'draw' module.
56 *
57 * XXX should the element buffer be specified/bound with a separate function?
58 */
59 static void
60 cell_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
61 {
62 struct cell_context *cell = cell_context(pipe);
63 struct draw_context *draw = cell->draw;
64 void *mapped_indices = NULL;
65 unsigned i;
66
67 if (cell->dirty)
68 cell_update_derived( cell );
69
70 #if 0
71 cell_map_surfaces(cell);
72 #endif
73
74 /*
75 * Map vertex buffers
76 */
77 for (i = 0; i < cell->num_vertex_buffers; i++) {
78 void *buf = cell_resource(cell->vertex_buffer[i].buffer)->data;
79 draw_set_mapped_vertex_buffer(draw, i, buf);
80 }
81 /* Map index buffer, if present */
82 if (info->indexed && cell->index_buffer.buffer) {
83 mapped_indices = cell_resource(cell->index_buffer.buffer)->data;
84 mapped_indices += cell->index_buffer.offset;
85 }
86
87 draw_set_mapped_element_buffer_range(draw, (mapped_indices) ?
88 lp->index_buffer.index_size : 0,
89 info->index_bias,
90 info->min_index,
91 info->max_index,
92 mapped_indices);
93
94 /* draw! */
95 draw_arrays(draw, info->mode, info->start, info->count);
96
97 /*
98 * unmap vertex/index buffers - will cause draw module to flush
99 */
100 for (i = 0; i < cell->num_vertex_buffers; i++) {
101 draw_set_mapped_vertex_buffer(draw, i, NULL);
102 }
103 if (mapped_indices) {
104 draw_set_mapped_element_buffer(draw, 0, 0, NULL);
105 }
106
107 /*
108 * TODO: Flush only when a user vertex/index buffer is present
109 * (or even better, modify draw module to do this
110 * internally when this condition is seen?)
111 */
112 draw_flush(draw);
113 }
114
115
116 static void
117 cell_draw_range_elements(struct pipe_context *pipe,
118 struct pipe_resource *indexBuffer,
119 unsigned indexSize,
120 int indexBias,
121 unsigned min_index,
122 unsigned max_index,
123 unsigned mode, unsigned start, unsigned count)
124 {
125 struct cell_context *cell = cell_context(pipe);
126 struct pipe_draw_info info;
127 struct pipe_index_buffer saved_ib, ib;
128
129 util_draw_init_info(&info);
130 info.mode = mode;
131 info.start = start;
132 info.count = count;
133 info.index_bias = indexBias;
134 info.min_index = min_index;
135 info.max_index = max_index;
136
137 if (indexBuffer) {
138 info.indexed = TRUE;
139 saved_ib = cell->index_buffer;
140
141 ib.buffer = indexBuffer;
142 ib.offset = 0;
143 ib.index_size = indexSize;
144 pipe->set_index_buffer(pipe, &ib);
145 }
146
147 cell_draw_vbo(pipe, &info);
148
149 if (indexBuffer)
150 pipe->set_index_buffer(pipe, &saved_ib);
151 }
152
153
154 static void
155 cell_draw_elements(struct pipe_context *pipe,
156 struct pipe_resource *indexBuffer,
157 unsigned indexSize, int indexBias,
158 unsigned mode, unsigned start, unsigned count)
159 {
160 cell_draw_range_elements( pipe, indexBuffer,
161 indexSize, indexBias,
162 0, 0xffffffff,
163 mode, start, count );
164 }
165
166
167 static void
168 cell_draw_arrays(struct pipe_context *pipe, unsigned mode,
169 unsigned start, unsigned count)
170 {
171 cell_draw_elements(pipe, NULL, 0, 0, mode, start, count);
172 }
173
174
175 void
176 cell_init_draw_functions(struct cell_context *cell)
177 {
178 cell->pipe.draw_arrays = cell_draw_arrays;
179 cell->pipe.draw_elements = cell_draw_elements;
180 cell->pipe.draw_range_elements = cell_draw_range_elements;
181 cell->pipe.draw_vbo = cell_draw_vbo;
182 }
183