1 <!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
4 <meta http-equiv=
"content-type" content=
"text/html; charset=utf-8">
5 <title>Development Notes
</title>
6 <link rel=
"stylesheet" type=
"text/css" href=
"mesa.css">
11 <h1>The Mesa
3D Graphics Library
</h1>
14 <iframe src=
"contents.html"></iframe>
17 <h1>Development Notes
</h1>
21 <li><a href=
"#style">Coding Style
</a>
22 <li><a href=
"#submitting">Submitting Patches
</a>
23 <li><a href=
"#release">Making a New Mesa Release
</a>
24 <li><a href=
"#extensions">Adding Extensions
</a>
28 <h2 id=
"style">Coding Style
</h2>
31 Mesa is over
20 years old and the coding style has evolved over time.
32 Some old parts use a style that's a bit out of date.
34 Different sections of mesa can use different coding style as set in the local
35 EditorConfig (.editorconfig) and/or Emacs (.dir-locals.el) file.
37 Alternatively the following is applicable.
39 If the guidelines below don't cover something, try following the format of
40 existing, neighboring code.
44 Basic formatting guidelines
48 <li>3-space indentation, no tabs.
49 <li>Limit lines to
78 or fewer characters. The idea is to prevent line
50 wrapping in
80-column editors and terminals. There are exceptions, such
51 as if you're defining a large, static table of information.
52 <li>Opening braces go on the same line as the if/for/while statement.
62 <li>Put a space before/after operators. For example,
<tt>a = b + c;
</tt>
63 and not
<tt>a=b+c;
</tt>
65 <li>This GNU indent command generally does the right thing for formatting:
67 indent -br -i3 -npcs --no-tabs infile.c -o outfile.c
70 <li>Use comments wherever you think it would be helpful for other developers.
71 Several specific cases and style examples follow. Note that we roughly
72 follow
<a href=
"http://www.stack.nl/~dimitri/doxygen/">Doxygen
</a> conventions.
77 /* null-out pointer to prevent dangling reference below */
82 bufferObj = NULL; /* prevent dangling reference below */
86 /* If this is a new buffer object id, or one which was generated but
87 * never used before, allocate a buffer object now.
90 We try to quote the OpenGL specification where prudent:
92 /* Page
38 of the PDF of the OpenGL ES
3.0 spec says:
94 *
"An INVALID_OPERATION error is generated for any of the following
97 * * <length> is zero."
99 * Additionally, page
94 of the PDF of the OpenGL
4.5 core spec
100 * (
30.10.2014) also says this, so it's no longer allowed for desktop GL,
104 Function comment example:
107 * Create and initialize a new buffer object. Called via the
108 * ctx-
>Driver.CreateObject() driver callback function.
109 * \param name integer name of the object
110 * \param type one of GL_FOO, GL_BAR, etc.
111 * \return pointer to new object or NULL if error
114 _mesa_create_object(GLuint name, GLenum type)
120 <li>Put the function return type and qualifiers on one line and the function
121 name and parameters on the next, as seen above. This makes it easy to use
122 <code>grep ^function_name dir/*
</code> to find function definitions. Also,
123 the opening brace goes on the next line by itself (see above.)
125 <li>Function names follow various conventions depending on the type of function:
127 glFooBar() - a public GL entry point (in glapi_dispatch.c)
128 _mesa_FooBar() - the internal immediate mode function
129 save_FooBar() - retained mode (display list) function in dlist.c
130 foo_bar() - a static (private) function
131 _mesa_foo_bar() - an internal non-static Mesa function
134 <li>Constants, macros and enumerant names are ALL_UPPERCASE, with _ between
136 <li>Mesa usually uses camel case for local variables (Ex:
"localVarname")
137 while gallium typically uses underscores (Ex:
"local_var_name").
138 <li>Global variables are almost never used because Mesa should be thread-safe.
140 <li>Booleans. Places that are not directly visible to the GL API
141 should prefer the use of
<tt>bool
</tt>,
<tt>true
</tt>, and
142 <tt>false
</tt> over
<tt>GLboolean
</tt>,
<tt>GL_TRUE
</tt>, and
143 <tt>GL_FALSE
</tt>. In C code, this may mean that
144 <tt>#include
<stdbool.h
></tt> needs to be added. The
145 <tt>try_emit_
</tt>* methods in src/mesa/program/ir_to_mesa.cpp and
146 src/mesa/state_tracker/st_glsl_to_tgsi.cpp can serve as examples.
151 <h2 id=
"submitting">Submitting patches
</h2>
154 The basic guidelines for submitting patches are:
158 <li>Patches should be sufficiently tested before submitting.
159 <li>Code patches should follow Mesa coding conventions.
160 <li>Whenever possible, patches should only effect individual Mesa/Gallium
162 <li>Patches should never introduce build breaks and should be bisectable (see
163 <code>git bisect
</code>.)
164 <li>Patches should be properly formatted (see below).
165 <li>Patches should be submitted to mesa-dev for review using
166 <code>git send-email
</code>.
167 <li>Patches should not mix code changes with code formatting changes (except,
168 perhaps, in very trivial cases.)
171 <h3>Patch formatting
</h3>
174 The basic rules for patch formatting are:
178 <li>Lines should be limited to
75 characters or less so that git logs
179 displayed in
80-column terminals avoid line wrapping. Note that git
180 log uses
4 spaces of indentation (
4 +
75 < 80).
181 <li>The first line should be a short, concise summary of the change prefixed
182 with a module name. Examples:
184 mesa: Add support for querying GL_VERTEX_ATTRIB_ARRAY_LONG
186 gallium: add PIPE_CAP_DEVICE_RESET_STATUS_QUERY
188 i965: Fix missing type in local variable declaration.
190 <li>Subsequent patch comments should describe the change in more detail,
191 if needed. For example:
193 i965: Remove end-of-thread SEND alignment code.
195 This was present in Eric's initial implementation of the compaction code
196 for Sandybridge (commit
077d01b6). There is no documentation saying this
197 is necessary, and removing it causes no regressions in piglit on any
200 <li>A
"Signed-off-by:" line is not required, but not discouraged either.
201 <li>If a patch address a bugzilla issue, that should be noted in the
202 patch comment. For example:
204 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=
89689
206 <li>If there have been several revisions to a patch during the review
207 process, they should be noted such as in this example:
209 st/mesa: add ARB_texture_stencil8 support (v4)
211 if we support stencil texturing, enable texture_stencil8
212 there is no requirement to support native S8 for this,
213 the texture can be converted to x24s8 fine.
215 v2: fold fixes from Marek in:
216 a) put S8 last in the list
217 b) fix renderable to always test for d/s renderable
218 fixup the texture case to use a stencil only format
219 for picking the format for the texture view.
220 v3: hit fallback for getteximage
221 v4: put s8 back in front, it shouldn't get picked now (Ilia)
223 <li>If someone tested your patch, document it with a line like this:
225 Tested-by: Joe Hacker
<jhacker@foo.com
>
227 <li>If the patch was reviewed (usually the case) or acked by someone,
228 that should be documented with:
230 Reviewed-by: Joe Hacker
<jhacker@foo.com
>
231 Acked-by: Joe Hacker
<jhacker@foo.com
>
237 <h3>Testing Patches
</h3>
240 It should go without saying that patches must be tested. In general,
241 do whatever testing is prudent.
245 You should always run the Mesa test suite before submitting patches.
246 The test suite can be run using the 'make check' command. All tests
247 must pass before patches will be accepted, this may mean you have
248 to update the tests themselves.
252 Whenever possible and applicable, test the patch with
253 <a href=
"http://piglit.freedesktop.org">Piglit
</a> and/or
254 <a href=
"https://android.googlesource.com/platform/external/deqp/">dEQP
</a>
255 to check for regressions.
259 <h3>Mailing Patches
</h3>
262 Patches should be sent to the mesa-dev mailing list for review:
263 <a href=
"https://lists.freedesktop.org/mailman/listinfo/mesa-dev">
264 mesa-dev@lists.freedesktop.org
<a/>.
265 When submitting a patch make sure to use
266 <a href=
"https://git-scm.com/docs/git-send-email">git send-email
</a>
267 rather than attaching patches to emails. Sending patches as
268 attachments prevents people from being able to provide in-line review
273 When submitting follow-up patches you can use --in-reply-to to make v2, v3,
274 etc patches show up as replies to the originals. This usually works well
275 when you're sending out updates to individual patches (as opposed to
276 re-sending the whole series). Using --in-reply-to makes
277 it harder for reviewers to accidentally review old patches.
281 When submitting follow-up patches you should also login to
282 <a href=
"https://patchwork.freedesktop.org">patchwork
</a> and change the
283 state of your old patches to Superseded.
286 <h3>Reviewing Patches
</h3>
289 When you've reviewed a patch on the mailing list, please be unambiguous
290 about your review. That is, state either
292 Reviewed-by: Joe Hacker
<jhacker@foo.com
>
296 Acked-by: Joe Hacker
<jhacker@foo.com
>
298 Rather than saying just
"LGTM" or
"Seems OK".
302 If small changes are suggested, it's OK to say something like:
304 With the above fixes, Reviewed-by: Joe Hacker
<jhacker@foo.com
>
306 which tells the patch author that the patch can be committed, as long
307 as the issues are resolved first.
311 <h3>Marking a commit as a candidate for a stable branch
</h3>
314 If you want a commit to be applied to a stable branch,
315 you should add an appropriate note to the commit message.
319 Here are some examples of such a note:
322 <li>CC:
<mesa-stable@lists.freedesktop.org
></li>
323 <li>CC:
"9.2 10.0" <mesa-stable@lists.freedesktop.org
></li>
324 <li>CC:
"10.0" <mesa-stable@lists.freedesktop.org
></li>
327 Simply adding the CC to the mesa-stable list address is adequate to nominate
328 the commit for the most-recently-created stable branch. It is only necessary
329 to specify a specific branch name, (such as
"9.2 10.0" or
"10.0" in the
330 examples above), if you want to nominate the commit for an older stable
331 branch. And, as in these examples, you can nominate the commit for the older
332 branch in addition to the more recent branch, or nominate the commit
333 exclusively for the older branch.
335 This
"CC" syntax for patch nomination will cause patches to automatically be
336 copied to the mesa-stable@ mailing list when you use
"git send-email" to send
337 patches to the mesa-dev@ mailing list. Also, if you realize that a commit
338 should be nominated for the stable branch after it has already been committed,
339 you can send a note directly to the mesa-stable@lists.freedesktop.org where
340 the Mesa stable-branch maintainers will receive it. Be sure to mention the
341 commit ID of the commit of interest (as it appears in the mesa master branch).
343 The latest set of patches that have been nominated, accepted, or rejected for
344 the upcoming stable release can always be seen on the
345 <a href=
"http://cworth.org/~cworth/mesa-stable-queue/">Mesa Stable Queue
</a>
348 <h3>Criteria for accepting patches to the stable branch
</h3>
350 Mesa has a designated release manager for each stable branch, and the release
351 manager is the only developer that should be pushing changes to these
352 branches. Everyone else should simply nominate patches using the mechanism
355 The stable-release manager will work with the list of nominated patches, and
356 for each patch that meets the crtieria below will cherry-pick the patch with:
357 <code>git cherry-pick -x
<commit
></code>. The
<code>-x
</code> option is
358 important so that the picked patch references the comit ID of the original
361 The stable-release manager may at times need to force-push changes to the
362 stable branches, for example, to drop a previously-picked patch that was later
363 identified as causing a regression). These force-pushes may cause changes to
364 be lost from the stable branch if developers push things directly. Consider
367 The stable-release manager is also given broad discretion in rejecting patches
368 that have been nominated for the stable branch. The most basic rule is that
369 the stable branch is for bug fixes only, (no new features, no
370 regressions). Here is a non-exhaustive list of some reasons that a patch may
374 <li>Patch introduces a regression. Any reported build breakage or other
375 regression caused by a particular patch, (game no longer work, piglit test
376 changes from PASS to FAIL), is justification for rejecting a patch.
</li>
378 <li>Patch is too large, (say, larger than
100 lines)
</li>
380 <li>Patch is not a fix. For example, a commit that moves code around with no
381 functional change should be rejected.
</li>
383 <li>Patch fix is not clearly described. For example, a commit message
384 of only a single line, no description of the bug, no mention of bugzilla,
387 <li>Patch has not obviously been reviewed, For example, the commit message
388 has no Reviewed-by, Signed-off-by, nor Tested-by tags from anyone but the
391 <li>Patch has not already been merged to the master branch. As a rule, bug
392 fixes should never be applied first to a stable branch. Patches should land
393 first on the master branch and then be cherry-picked to a stable
394 branch. (This is to avoid future releases causing regressions if the patch
395 is not also applied to master.) The only things that might look like
396 exceptions would be backports of patches from master that happen to look
397 significantly different.
</li>
399 <li>Patch depends on too many other patches. Ideally, all stable-branch
400 patches should be self-contained. It sometimes occurs that a single, logical
401 bug-fix occurs as two separate patches on master, (such as an original
402 patch, then a subsequent fix-up to that patch). In such a case, these two
403 patches should be squashed into a single, self-contained patch for the
404 stable branch. (Of course, if the squashing makes the patch too large, then
405 that could be a reason to reject the patch.)
</li>
407 <li>Patch includes new feature development, not bug fixes. New OpenGL
408 features, extensions, etc. should be applied to Mesa master and included in
409 the next major release. Stable releases are intended only for bug fixes.
411 Note: As an exception to this rule, the stable-release manager may accept
412 hardware-enabling
"features". For example, backports of new code to support
413 a newly-developed hardware product can be accepted if they can be reasonably
414 determined to not have effects on other hardware.
</li>
416 <li>Patch is a performance optimization. As a rule, performance patches are
417 not candidates for the stable branch. The only exception might be a case
418 where an application's performance was recently severely impacted so as to
419 become unusable. The fix for this performance regression could then be
420 considered for a stable branch. The optimization must also be
421 non-controversial and the patches still need to meet the other criteria of
422 being simple and self-contained
</li>
424 <li>Patch introduces a new failure mode (such as an assert). While the new
425 assert might technically be correct, for example to make Mesa more
426 conformant, this is not the kind of
"bug fix" we want in a stable
427 release. The potential problem here is that an OpenGL program that was
428 previously working, (even if technically non-compliant with the
429 specification), could stop working after this patch. So that would be a
430 regression that is unaacceptable for the stable branch.
</li>
434 <h2 id=
"release">Making a New Mesa Release
</h2>
437 These are the instructions for making a new Mesa release.
440 <h3>Get latest source files
</h3>
442 Use git to get the latest Mesa files from the git repository, from whatever
443 branch is relevant. This document uses the convention X.Y.Z for the release
444 being created, which should be created from a branch named X.Y.
447 <h3>Perform basic testing
</h3>
449 The release manager should, at the very least, test the code by compiling it,
450 installing it, and running the latest piglit to ensure that no piglit tests
451 have regressed since the previous release.
455 The release manager should do this testing with at least one hardware driver,
456 (say, whatever is contained in the local development machine), as well as on
457 both Gallium and non-Gallium software drivers. The software testing can be
458 performed by running piglit with the following environment-variable set:
462 LIBGL_ALWAYS_SOFTWARE=
1
465 And Gallium vs. non-Gallium software drivers can be obtained by using the
466 following configure flags on separate builds:
469 --with-dri-drivers=swrast
470 --with-gallium-drivers=swrast
474 Note: If both options are given in one build, both swrast_dri.so drivers will
475 be compiled, but only one will be installed. The following command can be used
476 to ensure the correct driver is being tested:
480 LIBGL_ALWAYS_SOFTWARE=
1 glxinfo | grep
"renderer string"
483 If any regressions are found in this testing with piglit, stop here, and do
484 not perform a release until regressions are fixed.
486 <h3>Update version in file VERSION
</h3>
489 Increment the version contained in the file VERSION at Mesa's top-level, then
493 <h3>Create release notes for the new release
</h3>
496 Create a new file docs/relnotes/X.Y.Z.html, (follow the style of the previous
497 release notes). Note that the sha256sums section of the release notes should
498 be empty at this point.
502 Two scripts are available to help generate portions of the release notes:
505 ./bin/bugzilla_mesa.sh
506 ./bin/shortlog_mesa.sh
510 The first script identifies commits that reference bugzilla bugs and obtains
511 the descriptions of those bugs from bugzilla. The second script generates a
512 log of all commits. In both cases, HTML-formatted lists are printed to stdout
513 to be included in the release notes.
520 <h3>Make the release archives, signatures, and the release tag
</h3>
522 From inside the Mesa directory:
529 After the tarballs are created, the sha256 checksums for the files will
530 be computed and printed. These will be used in a step below.
534 It's important at this point to also verify that the constructed tar file
539 tar xjf MesaLib-X.Y.Z.tar.bz2
541 ./configure --enable-gallium-llvm
547 Some touch testing should also be performed at this point, (run glxgears or
548 more involved OpenGL programs against the installed Mesa).
552 Create detached GPG signatures for each of the archive files created above:
556 gpg --sign --detach MesaLib-X.Y.Z.tar.gz
557 gpg --sign --detach MesaLib-X.Y.Z.tar.bz2
558 gpg --sign --detach MesaLib-X.Y.Z.zip
562 Tag the commit used for the build:
566 git tag -s mesa-X.Y.X -m
"Mesa X.Y.Z release"
570 Note: It would be nice to investigate and fix the issue that causes the
571 tarballs target to fail with multiple build process, such as with
"-j4". It
572 would also be nice to incorporate all of the above commands into a single
573 makefile target. And instead of a custom
"tarballs" target, we should
574 incorporate things into the standard
"make dist" and
"make distcheck" targets.
577 <h3>Add the sha256sums to the release notes
</h3>
580 Edit docs/relnotes/X.Y.Z.html to add the sha256sums printed as part of
"make
581 tarballs" in the previous step. Commit this change.
584 <h3>Push all commits and the tag created above
</h3>
587 This is the first step that cannot easily be undone. The release is going
588 forward from this point:
592 git push origin X.Y --tags
595 <h3>Install the release files and signatures on the distribution server
</h3>
598 The following commands can be used to copy the release archive files and
599 signatures to the freedesktop.org server:
603 scp MesaLib-X.Y.Z* people.freedesktop.org:
604 ssh people.freedesktop.org
605 cd /srv/ftp.freedesktop.org/pub/mesa
608 mv ~/MesaLib-X.Y.Z* .
611 <h3>Back on mesa master, add the new release notes into the tree
</h3>
614 Something like the following steps will do the trick:
618 cp docs/relnotes/X.Y.Z.html /tmp
620 cp /tmp/X.Y.Z.html docs/relnotes
621 git add docs/relnotes/X.Y.Z.html
625 Also, edit docs/relnotes.html to add a link to the new release notes, and edit
626 docs/index.html to add a news entry. Then commit and push:
630 git commit -a -m
"docs: Import X.Y.Z release notes, add news item."
634 <h3>Update the mesa3d.org website
</h3>
637 NOTE: The recent release managers have not been performing this step
638 themselves, but leaving this to Brian Paul, (who has access to the
639 sourceforge.net hosting for mesa3d.org). Brian is more than willing to grant
640 the permission necessary to future release managers to do this step on their
645 Update the web site by copying the docs/ directory's files to
646 /home/users/b/br/brianp/mesa-www/htdocs/ with:
649 sftp USERNAME,mesa3d@web.sourceforge.net
654 <h3>Announce the release
</h3>
656 Make an announcement on the mailing lists:
658 <em>mesa-dev@lists.freedesktop.org
</em>,
660 <em>mesa-announce@lists.freedesktop.org
</em>
662 Follow the template of previously-sent release announcements. The following
663 command can be used to generate the log of changes to be included in the
664 release announcement:
667 git shortlog mesa-X.Y.Z-
1..mesa-X.Y.Z
672 <h2 id=
"extensions">Adding Extensions
</h2>
675 To add a new GL extension to Mesa you have to do at least the following.
679 If glext.h doesn't define the extension, edit include/GL/gl.h and add
682 #ifndef GL_EXT_the_extension_name
683 #define GL_EXT_the_extension_name
1
684 /* declare the new enum tokens */
685 /* prototype the new functions */
686 /* TYPEDEFS for the new functions */
691 In the src/mapi/glapi/gen/ directory, add the new extension functions and
692 enums to the gl_API.xml file.
693 Then, a bunch of source files must be regenerated by executing the
694 corresponding Python scripts.
697 Add a new entry to the
<code>gl_extensions
</code> struct in mtypes.h
698 if the extension requires driver capabilities not already exposed by
702 Add a new entry to the src/mesa/main/extensions_table.h file.
705 From this point, the best way to proceed is to find another extension,
706 similar to the new one, that's already implemented in Mesa and use it
710 If the new extension adds new GL state, the functions in get.c, enable.c
711 and attrib.c will most likely require new code.
714 To determine if the new extension is active in the current context,
715 use the auto-generated _mesa_has_##name_str() function defined in
716 src/mesa/main/extensions.h.
719 The dispatch tests check_table.cpp and dispatch_sanity.cpp
720 should be updated with details about the new extensions functions. These
721 tests are run using 'make check'