Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5563 | serge | 1 | /** \mainpage |
2 | |||
3 | \section about About |
||
4 | |||
5 | Gallium3D is Tungsten Graphics' |
||
6 | new architecture for building 3D graphics drivers. Initially |
||
7 | supporting Mesa and Linux graphics drivers, Gallium3D is designed to allow |
||
8 | portability to all major operating systems and graphics interfaces. |
||
9 | |||
10 | Compared to existing Linux graphics drivers, Gallium3D will: |
||
11 | |||
12 | - Make drivers smaller and simpler. |
||
13 | Current DRI drivers are rather complicated. They're large, contain |
||
14 | duplicated code and are burdened with implementing many concepts tightly |
||
15 | tied to the OpenGL 1.x/2.x API. |
||
16 | |||
17 | - Model modern graphics hardware. |
||
18 | The new driver architecture is an abstraction of modern graphics hardware, |
||
19 | rather than an OpenGL->hardware translator. The new driver interface will |
||
20 | assume the presence of programmable vertex/fragment shaders and flexible |
||
21 | memory objects. |
||
22 | |||
23 | - Support multiple graphics APIs. |
||
24 | The OpenGL 3.0 API will be very different from OpenGL 1.x/2.x. We'd like a |
||
25 | driver model that is API-neutral so that it's not tied to a specific |
||
26 | graphics API. |
||
27 | |||
28 | \section contents Contents |
||
29 | |||
30 | - \ref overview |
||
31 | |||
32 | - \ref statetracker |
||
33 | |||
34 | - Pipe drivers: |
||
35 | - \ref softpipe |
||
36 | - \ref i915g |
||
37 | |||
38 | - Winsys drivers: |
||
39 | - X11 winsys driver (xm_winsys.c) |
||
40 | - Intel DRI winsys driver (intel_context.h, intel_winsys_pipe.c) |
||
41 | |||
42 | - Ancillary Modules: |
||
43 | - \ref draw |
||
44 | - \ref tgsi |
||
45 | - LLVM TGSI backend (gallivm.h) |
||
46 | |||
47 | - \ref callgraph |
||
48 | |||
49 | \section external External documentation |
||
50 | |||
51 | - Gallium3D's Architectural Overview |
||
52 | - Technical Overview |
||
53 | - Gallium3D talk from XDS 2007 |
||
54 | |||
55 | */ |
||
56 | |||
57 | /** \page overview Overview |
||
58 | |||
59 | The public interface of a Gallium3D driver is described by the p_context.h |
||
60 | header file. The pipe_context structure is an abstract base class with |
||
61 | methods for: |
||
62 | |||
63 | - Setting rendering state (texture sampler state, vertex array info, drawing surfaces, etc.) |
||
64 | |||
65 | - Setting shader state, using the TGSI binary shader representation. |
||
66 | |||
67 | - Vertex array and indexed vertex array drawing. |
||
68 | |||
69 | - Region (memory) management for textures, renderbuffers, vertex buffers, etc. |
||
70 | |||
71 | - Hardware queries (number of texture units, max texture size, etc). |
||
72 | |||
73 | The p_state.h header defines all the state objects (such as polygon |
||
74 | rasterization options, blend modes, etc) and resources (drawing surfaces, |
||
75 | textures, memory buffers). The pipe interface uses "constant state" objects. |
||
76 | That is, state objects are created once and are immutable. State objects are |
||
77 | put into effect by binding them. This allows Gallium3D drivers to create |
||
78 | corresponding hardware state objects which can be quickly handled. |
||
79 | |||
80 | The p_defines.h header defines numerous constants and tokens (blend modes, |
||
81 | texture wrap modes, surface formats, etc. |
||
82 | |||
83 | The p_winsys.h header defines the window system and OS facilities which |
||
84 | Gallium3D drivers rely upon. For example, memory allocation is typically a |
||
85 | service the OS provides while window size/position information is provided by |
||
86 | the window system. Pipe drivers use the winsys interface to handle these |
||
87 | things. |
||
88 | |||
89 | By abstracting OS and window system services, pipe drivers are portable to |
||
90 | other platforms (e.g. embedded devices). |
||
91 | */ |
||
92 | |||
93 | /** \page statetracker The State Tracker |
||
94 | |||
95 | The state tracker is the piece which interfaces core Mesa to the Gallium3D |
||
96 | interface. It's responsible for translating Mesa state (blend modes, texture |
||
97 | state, etc) and drawing commands (like glDrawArrays and glDrawPixels) into |
||
98 | pipe objects and operations. |
||
99 | |||
100 | Traditional fixed-function OpenGL components (such as lighting and texture |
||
101 | combining) are implemented with shaders. OpenGL commands such as glDrawPixels |
||
102 | are translated into textured quadrilateral rendering. Basically, any |
||
103 | rendering operation that isn't directly supported by modern graphics hardware |
||
104 | is translated into a hardware-friendly form. |
||
105 | |||
106 | Future state trackers will be created for OpenGL 3.0 and OpenGL-ES 2.x. |
||
107 | */ |
||
108 | |||
109 | /** \page softpipe Softpipe Driver |
||
110 | |||
111 | The softpipe driver is a software implementation of the Gallium3D interface. |
||
112 | It will be used as a reference implementation and as a fallback driver when a |
||
113 | hardware driver isn't available. The softpipe driver will make extensive use |
||
114 | of run-time code generation to efficiently execute vertex, fragment and |
||
115 | rasterization operations. |
||
116 | |||
117 | \sa sp_winsys.h |
||
118 | */ |
||
119 | |||
120 | /** \page i915g i915 Driver |
||
121 | |||
122 | The i915 Gallium3D Driver is an initial hardware driver implementation within |
||
123 | the Gallium3D driver architecture. We expect that once complete this driver |
||
124 | will have equivalent functionality and performance to the current Mesa |
||
125 | i915tex driver, but from a much smaller codebase. |
||
126 | |||
127 | \sa i915_context.h |
||
128 | \sa i915_winsys.h |
||
129 | */ |
||
130 | |||
131 | /** \page draw Draw Module |
||
132 | The Draw module provides point/line/polygon rendering services such as |
||
133 | vertex transformation, polygon culling and clipping. It will be used by |
||
134 | drivers for hardware which lacks vertex transformation (such as the |
||
135 | i915/i945). It may also be instantiated and used directly by the state |
||
136 | tracker to implement some API functionality that doesn't map well to hardware |
||
137 | capabilities. |
||
138 | |||
139 | The interface of this module corresponds closely to the subset of the Gallium |
||
140 | Driver Interface which is relevent to these steps in the pipeline. Specifically |
||
141 | there are calls for: |
||
142 | |||
143 | - Vertex shader constant state objects |
||
144 | - Vertex buffer binding |
||
145 | - Vertex element layout (vertex fetch) constant state objects |
||
146 | - DrawArrays and DrawElements |
||
147 | - Rasterizer constant state objects. |
||
148 | |||
149 | The Draw module is effectively the part of \ref softpipe which is concerned with |
||
150 | vertex processing, split off into a separate module so that it can be reused |
||
151 | by drivers for rasterization-only hardware. As such it is also instantiated |
||
152 | by the \ref i915g driver. |
||
153 | |||
154 | Additionally, there are cases in the Mesa OpenGL state_tracker where it is |
||
155 | required to obtain transformed vertices and yet it is anticipated that using |
||
156 | hardware transformation even if available would reduce performance, usually |
||
157 | because the setup costs or latency are prohibitive. For this reason the Mesa |
||
158 | state_tracker also instantiates a copy of this module. |
||
159 | |||
160 | \sa draw_context.h |
||
161 | */ |
||
162 | |||
163 | /** \page tgsi TGSI |
||
164 | |||
165 | The TGSI module provides a universal representation of shaders and |
||
166 | CPU-based execution of shaders. All Mesa vertex/fragment programs and shaders |
||
167 | are translated into the TGSI representation before being passed to the |
||
168 | driver. In turn, the driver will convert the TGSI instructions into |
||
169 | GPU-specific instructions. For hardware that lacks vertex or fragment shader |
||
170 | support, the TGSI's executor can be used. The TGSI executor includes support |
||
171 | for SSE code generation. Support for other processors (such as Cell) will be |
||
172 | added in the future. |
||
173 | |||
174 | \sa tgsi_parse.h |
||
175 | \sa TGSI specification |
||
176 | */ |
||
177 | |||
178 | /** \page callgraph Glxgears callgraph example |
||
179 | |||
180 | Below is a call graph of the glxgears application together with the Gallium3D's softpipe reference driver. |
||
181 | |||
182 | \htmlonly |
||
183 | The functions in the graph below are clickable. |
||
184 | \endhtmlonly |
||
185 | |||
186 | \dot |
||
187 | digraph { |
||
188 | graph [fontname=Arial, fontsize=10]; |
||
189 | node [fontcolor=white, fontname=Arial, style=filled, fontsize=10, shape=box]; |
||
190 | edge [fontname=Arial, fontsize=10]; |
||
191 | 1 [color="#ff0000", URL="\ref main", label="main\n100.00% (0.68%)\n0"]; |
||
192 | 1 -> 2 [color="#fe0400", fontcolor="#fe0400", label="99.32%\n1433"]; |
||
193 | 2 [color="#fe0400", URL="\ref do_draw", label="do_draw\n99.32% (0.00%)\n1433"]; |
||
194 | 2 -> 4 [color="#fa1201", fontcolor="#fa1201", label="96.67%\n4298"]; |
||
195 | 2 -> 39 [color="#0d4f76", fontcolor="#0d4f76", label="2.45%\n1433"]; |
||
196 | 3 [color="#fa1201", URL="\ref execute_list", label="execute_list\n96.67% (0.00%)\n4299"]; |
||
197 | 3 -> 5 [color="#f91301", fontcolor="#f91301", label="96.38%\n17196"]; |
||
198 | 4 [color="#fa1201", URL="\ref _mesa_CallList", label="_mesa_CallList\n96.67% (0.00%)\n4299"]; |
||
199 | 4 -> 3 [color="#fa1201", fontcolor="#fa1201", label="96.67%\n4299"]; |
||
200 | 5 [color="#f91301", URL="\ref vbo_save_playback_vertex_list", label="vbo_save_playback_vertex_list\n96.38% (0.10%)\n17196"]; |
||
201 | 5 -> 6 [color="#f91501", fontcolor="#f91501", label="96.09%\n17196"]; |
||
202 | 6 [color="#f91501", URL="\ref st_draw_vbo", label="st_draw_vbo\n96.09% (0.00%)\n17196"]; |
||
203 | 6 -> 10 [color="#ec3f03", fontcolor="#ec3f03", label="87.48%\n30093"]; |
||
204 | 6 -> 33 [color="#0d5f78", fontcolor="#0d5f78", label="3.72%\n34392"]; |
||
205 | 6 -> 34 [color="#0d5f78", fontcolor="#0d5f78", label="3.72%\n34392"]; |
||
206 | 6 -> 47 [color="#0d3a74", fontcolor="#0d3a74", label="1.17%\n17196"]; |
||
207 | 7 [color="#f71d01", URL="\ref draw_do_flush", label="draw_do_flush\n94.52% (0.20%)\n101744"]; |
||
208 | 7 -> 13 [color="#e74e04", fontcolor="#e74e04", label="84.25%\n1146400"]; |
||
209 | 7 -> 8 [color="#0d7d6c", fontcolor="#0d7d6c", label="8.32%\n114640"]; |
||
210 | 7 -> 46 [color="#0d4175", fontcolor="#0d4175", label="1.57%\n97444"]; |
||
211 | 8 [color="#f32702", URL="\ref clip_tri", label="clip_tri\n92.37% (0.49%)\n1261040"]; |
||
212 | 8 -> 9 [color="#f32a02", fontcolor="#f32a02", label="91.88%\n1261040"]; |
||
213 | 9 [color="#f32a02", URL="\ref cull_tri", label="cull_tri\n91.88% (0.20%)\n1261040"]; |
||
214 | 9 -> 15 [color="#e35d04", fontcolor="#e35d04", label="81.12%\n560810"]; |
||
215 | 9 -> 12 [color="#0d805e", fontcolor="#0d805e", label="10.57%\n560810"]; |
||
216 | 10 [color="#ec3f03", URL="\ref softpipe_draw_arrays", label="softpipe_draw_arrays\n87.48% (0.00%)\n30093"]; |
||
217 | 10 -> 11 [color="#ec3f03", fontcolor="#ec3f03", label="87.48%\n30093"]; |
||
218 | 11 [color="#ec3f03", URL="\ref softpipe_draw_elements", label="softpipe_draw_elements\n87.48% (0.10%)\n30093"]; |
||
219 | 11 -> 17 [color="#cf9507", fontcolor="#cf9507", label="67.61%\n30093"]; |
||
220 | 11 -> 27 [color="#0d844f", fontcolor="#0d844f", label="13.01%\n120372"]; |
||
221 | 11 -> 36 [color="#0d5a77", fontcolor="#0d5a77", label="3.33%\n30093"]; |
||
222 | 11 -> 23 [color="#0d5977", fontcolor="#0d5977", label="3.23%\n30093"]; |
||
223 | 12 [color="#ea4703", URL="\ref flush_spans", label="flush_spans\n85.91% (4.60%)\n4586176"]; |
||
224 | 12 -> 14 [color="#e35c04", fontcolor="#e35c04", label="81.31%\n15910811"]; |
||
225 | 13 [color="#e74e04", URL="\ref flatshade_tri", label="flatshade_tri\n84.25% (0.29%)\n1146400"]; |
||
226 | 13 -> 8 [color="#e75004", fontcolor="#e75004", label="83.95%\n1146400"]; |
||
227 | 14 [color="#e35c04", URL="\ref shade_quad", label="shade_quad\n81.31% (7.73%)\n15910811"]; |
||
228 | 14 -> 21 [color="#c0bb09", fontcolor="#c0bb09", label="57.24%\n13903725"]; |
||
229 | 14 -> 26 [color="#0c883c", fontcolor="#0c883c", label="16.24%\n15910811"]; |
||
230 | 15 [color="#e35d04", URL="\ref setup_tri", label="setup_tri\n81.12% (1.47%)\n560810"]; |
||
231 | 15 -> 16 [color="#e06505", fontcolor="#e06505", label="79.26%\n1121620"]; |
||
232 | 16 [color="#e06505", URL="\ref subtriangle", label="subtriangle\n79.26% (3.91%)\n1121620"]; |
||
233 | 16 -> 12 [color="#da7606", fontcolor="#da7606", label="75.34%\n4025366"]; |
||
234 | 17 [color="#cf9507", URL="\ref draw_arrays", label="draw_arrays\n67.61% (0.00%)\n30093"]; |
||
235 | 17 -> 19 [color="#cf9607", fontcolor="#cf9607", label="67.42%\n630520"]; |
||
236 | 18 [color="#cf9607", URL="\ref do_ef_triangle", label="do_ef_triangle\n67.42% (0.49%)\n1261040"]; |
||
237 | 18 -> 20 [color="#ce9807", fontcolor="#ce9807", label="66.83%\n1261040"]; |
||
238 | 19 [color="#cf9607", URL="\ref do_quad", label="do_quad\n67.42% (0.00%)\n630520"]; |
||
239 | 19 -> 18 [color="#cf9607", fontcolor="#cf9607", label="67.42%\n1261040"]; |
||
240 | 20 [color="#ce9807", URL="\ref get_queued_prim", label="get_queued_prim\n66.83% (0.10%)\n1261040"]; |
||
241 | 20 -> 7 [color="#cd9907", fontcolor="#cd9907", label="66.54%\n71650"]; |
||
242 | 21 [color="#c0bb09", URL="\ref depth_test_quad", label="depth_test_quad\n57.24% (1.08%)\n13903725"]; |
||
243 | 21 -> 22 [color="#40a00b", fontcolor="#40a00b", label="34.54%\n13074127"]; |
||
244 | 21 -> 24 [color="#0c8f1e", fontcolor="#0c8f1e", label="21.62%\n13903725"]; |
||
245 | 22 [color="#40a00b", URL="\ref output_quad", label="output_quad\n34.54% (3.91%)\n13074127"]; |
||
246 | 22 -> 25 [color="#0c8c2b", fontcolor="#0c8c2b", label="19.28%\n13074127"]; |
||
247 | 22 -> 28 [color="#0d8159", fontcolor="#0d8159", label="11.35%\n7223435"]; |
||
248 | 23 [color="#1c970c", URL="\ref draw_flush", label="draw_flush\n27.98% (0.00%)\n257944"]; |
||
249 | 23 -> 7 [color="#1c970c", fontcolor="#1c970c", label="27.98%\n30093"]; |
||
250 | 24 [color="#0c8f1e", URL="\ref sp_depth_test_quad", label="sp_depth_test_quad\n21.62% (16.14%)\n13903725"]; |
||
251 | 24 -> 37 [color="#0d5977", fontcolor="#0d5977", label="3.23%\n13903725"]; |
||
252 | 24 -> 44 [color="#0d4c76", fontcolor="#0d4c76", label="2.25%\n13903725"]; |
||
253 | 25 [color="#0c8c2b", URL="\ref write_quad_f_swz", label="write_quad_f_swz\n19.28% (16.14%)\n13074127"]; |
||
254 | 25 -> 38 [color="#0d5877", fontcolor="#0d5877", label="3.13%\n26148254"]; |
||
255 | 26 [color="#0c883a", URL="\ref tgsi_exec_machine_init", label="tgsi_exec_machine_init\n16.73% (10.27%)\n16326381"]; |
||
256 | 26 -> 30 [color="#0d6178", fontcolor="#0d6178", label="3.91%\n16326381"]; |
||
257 | 26 -> 45 [color="#0d4475", fontcolor="#0d4475", label="1.76%\n16326381"]; |
||
258 | 26 -> 52 [color="#0d3174", fontcolor="#0d3174", label="0.78%\n16326381"]; |
||
259 | 27 [color="#0d844f", URL="\ref draw_set_mapped_vertex_buffer", label="draw_set_mapped_vertex_buffer\n13.01% (0.00%)\n120372"]; |
||
260 | 27 -> 23 [color="#0d844f", fontcolor="#0d844f", label="13.01%\n120372"]; |
||
261 | 28 [color="#0d8159", URL="\ref read_quad_f_swz", label="read_quad_f_swz\n11.35% (5.87%)\n7223435"]; |
||
262 | 28 -> 29 [color="#0d737a", fontcolor="#0d737a", label="5.48%\n14446870"]; |
||
263 | 29 [color="#0d737a", URL="\ref get_row_rgba", label="get_row_rgba\n5.48% (5.48%)\n14446870"]; |
||
264 | 30 [color="#0d6178", URL="\ref tgsi_parse_init", label="tgsi_parse_init\n3.91% (3.52%)\n16326383"]; |
||
265 | 31 [color="#0d5f78", URL="\ref draw_set_vertex_buffer", label="draw_set_vertex_buffer\n3.72% (0.00%)\n34392"]; |
||
266 | 31 -> 23 [color="#0d5f78", fontcolor="#0d5f78", label="3.72%\n34392"]; |
||
267 | 32 [color="#0d5f78", URL="\ref draw_set_vertex_element", label="draw_set_vertex_element\n3.72% (0.00%)\n34392"]; |
||
268 | 32 -> 23 [color="#0d5f78", fontcolor="#0d5f78", label="3.72%\n34392"]; |
||
269 | 33 [color="#0d5f78", URL="\ref softpipe_set_vertex_buffer", label="softpipe_set_vertex_buffer\n3.72% (0.00%)\n34392"]; |
||
270 | 33 -> 31 [color="#0d5f78", fontcolor="#0d5f78", label="3.72%\n34392"]; |
||
271 | 34 [color="#0d5f78", URL="\ref softpipe_set_vertex_element", label="softpipe_set_vertex_element\n3.72% (0.00%)\n34392"]; |
||
272 | 34 -> 32 [color="#0d5f78", fontcolor="#0d5f78", label="3.72%\n34392"]; |
||
273 | 35 [color="#0d5d77", URL="\ref __i686.get_pc_thunk.bx", label="__i686.get_pc_thunk.bx\n3.52% (3.52%)\n0"]; |
||
274 | 36 [color="#0d5a77", URL="\ref draw_set_mapped_constant_buffer", label="draw_set_mapped_constant_buffer\n3.33% (0.10%)\n30093"]; |
||
275 | 36 -> 23 [color="#0d5977", fontcolor="#0d5977", label="3.23%\n30093"]; |
||
276 | 37 [color="#0d5977", URL="\ref s8z24_read_quad_z", label="s8z24_read_quad_z\n3.23% (3.23%)\n13903725"]; |
||
277 | 38 [color="#0d5877", URL="\ref put_row_8R8G8B_ximage", label="put_row_8R8G8B_ximage\n3.13% (3.13%)\n26148254"]; |
||
278 | 39 [color="#0d4f76", URL="\ref _mesa_Clear", label="_mesa_Clear\n2.45% (0.00%)\n1433"]; |
||
279 | 39 -> 40 [color="#0d4f76", fontcolor="#0d4f76", label="2.45%\n1433"]; |
||
280 | 40 [color="#0d4f76", URL="\ref st_clear", label="st_clear\n2.45% (0.00%)\n1433"]; |
||
281 | 40 -> 41 [color="#0d4d76", fontcolor="#0d4d76", label="2.35%\n2866"]; |
||
282 | 41 [color="#0d4d76", URL="\ref xmesa_clear", label="xmesa_clear\n2.35% (0.00%)\n2866"]; |
||
283 | 41 -> 42 [color="#0d4c76", fontcolor="#0d4c76", label="2.25%\n1433"]; |
||
284 | 42 [color="#0d4c76", URL="\ref softpipe_clear", label="softpipe_clear\n2.25% (0.00%)\n1433"]; |
||
285 | 42 -> 43 [color="#0d4c76", fontcolor="#0d4c76", label="2.25%\n1433"]; |
||
286 | 43 [color="#0d4c76", URL="\ref sp_region_fill", label="sp_region_fill\n2.25% (2.25%)\n1433"]; |
||
287 | 44 [color="#0d4c76", URL="\ref s8z24_write_quad_z", label="s8z24_write_quad_z\n2.25% (2.25%)\n13903725"]; |
||
288 | 45 [color="#0d4475", URL="\ref tgsi_parse_free", label="tgsi_parse_free\n1.76% (0.78%)\n16326383"]; |
||
289 | 45 -> 49 [color="#0d3674", fontcolor="#0d3674", label="0.98%\n16326383"]; |
||
290 | 46 [color="#0d4175", URL="\ref draw_vertex_shader_queue_flush", label="draw_vertex_shader_queue_flush\n1.57% (0.49%)\n97444"]; |
||
291 | 46 -> 53 [color="#0d2f74", fontcolor="#0d2f74", label="0.68%\n415570"]; |
||
292 | 46 -> 26 [color="#0d2973", fontcolor="#0d2973", label="0.49%\n415570"]; |
||
293 | 47 [color="#0d3b74", URL="\ref st_validate_state", label="st_validate_state\n1.27% (0.00%)\n18629"]; |
||
294 | 47 -> 48 [color="#0d3874", fontcolor="#0d3874", label="1.08%\n8599"]; |
||
295 | 48 [color="#0d3874", URL="\ref update_raster_state", label="update_raster_state\n1.08% (0.10%)\n8599"]; |
||
296 | 48 -> 51 [color="#0d3674", fontcolor="#0d3674", label="0.98%\n8599"]; |
||
297 | 49 [color="#0d3674", URL="\ref tgsi_full_token_free", label="tgsi_full_token_free\n0.98% (0.98%)\n16326412"]; |
||
298 | 50 [color="#0d3674", URL="\ref draw_set_rasterizer_state", label="draw_set_rasterizer_state\n0.98% (0.00%)\n8599"]; |
||
299 | 50 -> 23 [color="#0d3674", fontcolor="#0d3674", label="0.98%\n8599"]; |
||
300 | 51 [color="#0d3674", URL="\ref softpipe_bind_rasterizer_state", label="softpipe_bind_rasterizer_state\n0.98% (0.00%)\n8599"]; |
||
301 | 51 -> 50 [color="#0d3674", fontcolor="#0d3674", label="0.98%\n8599"]; |
||
302 | 52 [color="#0d3174", URL="\ref tgsi_align_128bit", label="tgsi_align_128bit\n0.78% (0.78%)\n16326381"]; |
||
303 | 53 [color="#0d2f74", URL="\ref draw_vertex_fetch", label="draw_vertex_fetch\n0.68% (0.68%)\n415570"]; |
||
304 | } |
||
305 | |||
306 | \enddot |
||
307 | |||
308 | The graph above was generated by the gprof2dot.py script. |
||
309 | */ |