Clone of mesa.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

gallium.doc 18KB

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