xref: /aosp_15_r20/external/mesa3d/docs/codingstyle.rst (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard WorkerCoding Style
2*61046927SAndroid Build Coastguard Worker============
3*61046927SAndroid Build Coastguard Worker
4*61046927SAndroid Build Coastguard WorkerMesa is over 20 years old and the coding style has evolved over time.
5*61046927SAndroid Build Coastguard WorkerSome old parts use a style that's a bit out of date. Different sections
6*61046927SAndroid Build Coastguard Workerof mesa can use different coding style as set in the local EditorConfig
7*61046927SAndroid Build Coastguard Worker(.editorconfig) and/or Emacs (.dir-locals.el) file. Alternatively the
8*61046927SAndroid Build Coastguard Workerfollowing is applicable. If the guidelines below don't cover something,
9*61046927SAndroid Build Coastguard Workertry following the format of existing, neighboring code.
10*61046927SAndroid Build Coastguard Worker
11*61046927SAndroid Build Coastguard Worker``clang-format``
12*61046927SAndroid Build Coastguard Worker----------------
13*61046927SAndroid Build Coastguard Worker
14*61046927SAndroid Build Coastguard WorkerA growing number of drivers and components are adopting ``clang-format``
15*61046927SAndroid Build Coastguard Workerto standardize the formatting and make it easy for everyone to apply it.
16*61046927SAndroid Build Coastguard Worker
17*61046927SAndroid Build Coastguard WorkerYou can re-format the code for the components that have opted-in to the
18*61046927SAndroid Build Coastguard Workerformatting enforcement (listed in ``.clang-format-include``) by simply
19*61046927SAndroid Build Coastguard Workerrunning ``ninja -C build/ clang-format``.
20*61046927SAndroid Build Coastguard Worker
21*61046927SAndroid Build Coastguard WorkerSince mass-reformatting commits can be an annoying extra jump to go
22*61046927SAndroid Build Coastguard Workerthrough when looking at ``git blame``, you can configure it to ignore
23*61046927SAndroid Build Coastguard Workerthem by running::
24*61046927SAndroid Build Coastguard Worker
25*61046927SAndroid Build Coastguard Worker  git config blame.ignoreRevsFile .git-blame-ignore-revs
26*61046927SAndroid Build Coastguard Worker
27*61046927SAndroid Build Coastguard WorkerMost code editors also support automatically formatting code as you
28*61046927SAndroid Build Coastguard Workerwrite it; check your editor or its plug-ins to see how to enable this.
29*61046927SAndroid Build Coastguard Worker
30*61046927SAndroid Build Coastguard WorkerVim
31*61046927SAndroid Build Coastguard Worker***
32*61046927SAndroid Build Coastguard Worker
33*61046927SAndroid Build Coastguard WorkerAdd this to your ``.vimrc`` to automatically format any C & C++ file
34*61046927SAndroid Build Coastguard Worker(that has a .clang-format config) when you save it:
35*61046927SAndroid Build Coastguard Worker
36*61046927SAndroid Build Coastguard Worker.. code:: vim
37*61046927SAndroid Build Coastguard Worker
38*61046927SAndroid Build Coastguard Worker   augroup ClangFormatOnSave
39*61046927SAndroid Build Coastguard Worker     au!
40*61046927SAndroid Build Coastguard Worker
41*61046927SAndroid Build Coastguard Worker     function! ClangFormatOnSave()
42*61046927SAndroid Build Coastguard Worker       " Only format files that have a .clang-format in a parent folder
43*61046927SAndroid Build Coastguard Worker       if !empty(findfile('.clang-format', '.;'))
44*61046927SAndroid Build Coastguard Worker         let l:formatdiff = 1 " Only format lines that have changed
45*61046927SAndroid Build Coastguard Worker         py3f /usr/share/clang/clang-format.py
46*61046927SAndroid Build Coastguard Worker       endif
47*61046927SAndroid Build Coastguard Worker     endfunction
48*61046927SAndroid Build Coastguard Worker
49*61046927SAndroid Build Coastguard Worker     autocmd BufWritePre *.h,*.c,*.cc,*.cpp call ClangFormatOnSave()
50*61046927SAndroid Build Coastguard Worker   augroup END
51*61046927SAndroid Build Coastguard Worker
52*61046927SAndroid Build Coastguard WorkerIf ``/usr/share/clang/clang-format.py`` doesn't exist, try
53*61046927SAndroid Build Coastguard Worker``/usr/share/clang/clang-format-$CLANG_VERSION/clang-format.py``
54*61046927SAndroid Build Coastguard Worker(replacing ``$CLANG_VERSION`` with your clang version). If your distro
55*61046927SAndroid Build Coastguard Workerhas put the file somewhere else, look through the files in the package
56*61046927SAndroid Build Coastguard Workerproviding ``clang-format``.
57*61046927SAndroid Build Coastguard Worker
58*61046927SAndroid Build Coastguard WorkerEmacs
59*61046927SAndroid Build Coastguard Worker*****
60*61046927SAndroid Build Coastguard Worker
61*61046927SAndroid Build Coastguard WorkerAdd this to your ``.emacs`` to automatically format any C & C++ file
62*61046927SAndroid Build Coastguard Worker(that has a .clang-format config) when you save it:
63*61046927SAndroid Build Coastguard Worker
64*61046927SAndroid Build Coastguard Worker.. code:: emacs
65*61046927SAndroid Build Coastguard Worker
66*61046927SAndroid Build Coastguard Worker   (load "/usr/share/clang/clang-format.el")
67*61046927SAndroid Build Coastguard Worker
68*61046927SAndroid Build Coastguard Worker   (defun clang-format-save-hook-for-this-buffer ()
69*61046927SAndroid Build Coastguard Worker     "Create a buffer local save hook."
70*61046927SAndroid Build Coastguard Worker     (add-hook 'before-save-hook
71*61046927SAndroid Build Coastguard Worker               (lambda ()
72*61046927SAndroid Build Coastguard Worker                 (when (locate-dominating-file "." ".clang-format")
73*61046927SAndroid Build Coastguard Worker                   (clang-format-buffer))
74*61046927SAndroid Build Coastguard Worker                 ;; Continue to save.
75*61046927SAndroid Build Coastguard Worker                 nil)
76*61046927SAndroid Build Coastguard Worker               nil
77*61046927SAndroid Build Coastguard Worker               ;; Buffer local hook.
78*61046927SAndroid Build Coastguard Worker               t))
79*61046927SAndroid Build Coastguard Worker
80*61046927SAndroid Build Coastguard Worker   ;; Run this for each mode you want to use the hook.
81*61046927SAndroid Build Coastguard Worker   (add-hook 'c-mode-hook (lambda () (clang-format-save-hook-for-this-buffer)))
82*61046927SAndroid Build Coastguard Worker   (add-hook 'c++-mode-hook (lambda () (clang-format-save-hook-for-this-buffer)))
83*61046927SAndroid Build Coastguard Worker
84*61046927SAndroid Build Coastguard WorkerIf ``/usr/share/clang/clang-format.el`` doesn't exist, look through the
85*61046927SAndroid Build Coastguard Workerfiles in the package providing ``clang-format`` in your distro. If you
86*61046927SAndroid Build Coastguard Workercan't find anything (e.g. on Debian/Ubuntu), refer to `this StackOverflow
87*61046927SAndroid Build Coastguard Workeranswer <https://stackoverflow.com/questions/59690583/how-do-you-use-clang-format-on-emacs-ubuntu/59850773#59850773>`__
88*61046927SAndroid Build Coastguard Workerto install clang-format through Emacs instead.
89*61046927SAndroid Build Coastguard Worker
90*61046927SAndroid Build Coastguard Workergit ``pre-commit`` hook
91*61046927SAndroid Build Coastguard Worker***********************
92*61046927SAndroid Build Coastguard Worker
93*61046927SAndroid Build Coastguard WorkerIf your editor doesn't support this, or if you don't want to enable it, you
94*61046927SAndroid Build Coastguard Workercan always just run ``ninja clang-format`` to format everything, or add
95*61046927SAndroid Build Coastguard Workera ``pre-commit`` hook that runs this automatically whenever you ``git
96*61046927SAndroid Build Coastguard Workercommit`` by adding the following in your ``.git/hooks/pre-commit``:
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard Worker.. code:: sh
99*61046927SAndroid Build Coastguard Worker
100*61046927SAndroid Build Coastguard Worker   shopt -s globstar
101*61046927SAndroid Build Coastguard Worker   git clang-format $upstream -- $(grep -E '^[^#]' .clang-format-include)
102*61046927SAndroid Build Coastguard Worker   # replace $upstream with the name of the remote tracking upstream mesa
103*61046927SAndroid Build Coastguard Worker   # if you don't know, it's probably `origin`
104*61046927SAndroid Build Coastguard Worker
105*61046927SAndroid Build Coastguard Worker
106*61046927SAndroid Build Coastguard WorkerBasic formatting guidelines
107*61046927SAndroid Build Coastguard Worker---------------------------
108*61046927SAndroid Build Coastguard Worker
109*61046927SAndroid Build Coastguard Worker-  3-space indentation, no tabs.
110*61046927SAndroid Build Coastguard Worker-  Limit lines to 78 or fewer characters. The idea is to prevent line
111*61046927SAndroid Build Coastguard Worker   wrapping in 80-column editors and terminals. There are exceptions,
112*61046927SAndroid Build Coastguard Worker   such as if you're defining a large, static table of information.
113*61046927SAndroid Build Coastguard Worker-  Opening braces go on the same line as the if/for/while statement. For
114*61046927SAndroid Build Coastguard Worker   example:
115*61046927SAndroid Build Coastguard Worker
116*61046927SAndroid Build Coastguard Worker   .. code-block:: c
117*61046927SAndroid Build Coastguard Worker
118*61046927SAndroid Build Coastguard Worker      if (condition) {
119*61046927SAndroid Build Coastguard Worker         foo;
120*61046927SAndroid Build Coastguard Worker      } else {
121*61046927SAndroid Build Coastguard Worker         bar;
122*61046927SAndroid Build Coastguard Worker      }
123*61046927SAndroid Build Coastguard Worker
124*61046927SAndroid Build Coastguard Worker-  Put a space before/after operators. For example, ``a = b + c;`` and
125*61046927SAndroid Build Coastguard Worker   not ``a=b+c;``
126*61046927SAndroid Build Coastguard Worker-  This GNU indent command generally does the right thing for
127*61046927SAndroid Build Coastguard Worker   formatting:
128*61046927SAndroid Build Coastguard Worker
129*61046927SAndroid Build Coastguard Worker   .. code-block:: sh
130*61046927SAndroid Build Coastguard Worker
131*61046927SAndroid Build Coastguard Worker      indent -br -i3 -npcs --no-tabs infile.c -o outfile.c
132*61046927SAndroid Build Coastguard Worker
133*61046927SAndroid Build Coastguard Worker-  Use comments wherever you think it would be helpful for other
134*61046927SAndroid Build Coastguard Worker   developers. Several specific cases and style examples follow. Note
135*61046927SAndroid Build Coastguard Worker   that we roughly follow `Doxygen <https://www.doxygen.nl>`__
136*61046927SAndroid Build Coastguard Worker   conventions.
137*61046927SAndroid Build Coastguard Worker
138*61046927SAndroid Build Coastguard Worker   Single-line comments:
139*61046927SAndroid Build Coastguard Worker
140*61046927SAndroid Build Coastguard Worker   .. code-block:: c
141*61046927SAndroid Build Coastguard Worker
142*61046927SAndroid Build Coastguard Worker      /* null-out pointer to prevent dangling reference below */
143*61046927SAndroid Build Coastguard Worker      bufferObj = NULL;
144*61046927SAndroid Build Coastguard Worker
145*61046927SAndroid Build Coastguard Worker   Or,
146*61046927SAndroid Build Coastguard Worker
147*61046927SAndroid Build Coastguard Worker   .. code-block:: c
148*61046927SAndroid Build Coastguard Worker
149*61046927SAndroid Build Coastguard Worker      bufferObj = NULL;  /* prevent dangling reference below */
150*61046927SAndroid Build Coastguard Worker
151*61046927SAndroid Build Coastguard Worker   Multi-line comment:
152*61046927SAndroid Build Coastguard Worker
153*61046927SAndroid Build Coastguard Worker   .. code-block:: c
154*61046927SAndroid Build Coastguard Worker
155*61046927SAndroid Build Coastguard Worker      /* If this is a new buffer object id, or one which was generated but
156*61046927SAndroid Build Coastguard Worker       * never used before, allocate a buffer object now.
157*61046927SAndroid Build Coastguard Worker       */
158*61046927SAndroid Build Coastguard Worker
159*61046927SAndroid Build Coastguard Worker   We try to quote the OpenGL specification where prudent:
160*61046927SAndroid Build Coastguard Worker
161*61046927SAndroid Build Coastguard Worker   .. code-block:: c
162*61046927SAndroid Build Coastguard Worker
163*61046927SAndroid Build Coastguard Worker      /* Page 38 of the PDF of the OpenGL ES 3.0 spec says:
164*61046927SAndroid Build Coastguard Worker       *
165*61046927SAndroid Build Coastguard Worker       *     "An INVALID_OPERATION error is generated for any of the following
166*61046927SAndroid Build Coastguard Worker       *     conditions:
167*61046927SAndroid Build Coastguard Worker       *
168*61046927SAndroid Build Coastguard Worker       *     * <length> is zero."
169*61046927SAndroid Build Coastguard Worker       *
170*61046927SAndroid Build Coastguard Worker       * Additionally, page 94 of the PDF of the OpenGL 4.5 core spec
171*61046927SAndroid Build Coastguard Worker       * (30.10.2014) also says this, so it's no longer allowed for desktop GL,
172*61046927SAndroid Build Coastguard Worker       * either.
173*61046927SAndroid Build Coastguard Worker       */
174*61046927SAndroid Build Coastguard Worker
175*61046927SAndroid Build Coastguard Worker   Function comment example:
176*61046927SAndroid Build Coastguard Worker
177*61046927SAndroid Build Coastguard Worker   .. code-block:: c
178*61046927SAndroid Build Coastguard Worker
179*61046927SAndroid Build Coastguard Worker      /**
180*61046927SAndroid Build Coastguard Worker       * Create and initialize a new buffer object.  Called via the
181*61046927SAndroid Build Coastguard Worker       * ctx->Driver.CreateObject() driver callback function.
182*61046927SAndroid Build Coastguard Worker       * \param  name  integer name of the object
183*61046927SAndroid Build Coastguard Worker       * \param  type  one of GL_FOO, GL_BAR, etc.
184*61046927SAndroid Build Coastguard Worker       * \return  pointer to new object or NULL if error
185*61046927SAndroid Build Coastguard Worker       */
186*61046927SAndroid Build Coastguard Worker      struct gl_object *
187*61046927SAndroid Build Coastguard Worker      _mesa_create_object(GLuint name, GLenum type)
188*61046927SAndroid Build Coastguard Worker      {
189*61046927SAndroid Build Coastguard Worker         /* function body */
190*61046927SAndroid Build Coastguard Worker      }
191*61046927SAndroid Build Coastguard Worker
192*61046927SAndroid Build Coastguard Worker-  Put the function return type and qualifiers on one line and the
193*61046927SAndroid Build Coastguard Worker   function name and parameters on the next, as seen above. This makes
194*61046927SAndroid Build Coastguard Worker   it easy to use ``grep ^function_name dir/*`` to find function
195*61046927SAndroid Build Coastguard Worker   definitions. Also, the opening brace goes on the next line by itself
196*61046927SAndroid Build Coastguard Worker   (see above.)
197*61046927SAndroid Build Coastguard Worker-  Function names follow various conventions depending on the type of
198*61046927SAndroid Build Coastguard Worker   function:
199*61046927SAndroid Build Coastguard Worker
200*61046927SAndroid Build Coastguard Worker   +---------------------+------------------------------------------+
201*61046927SAndroid Build Coastguard Worker   | Convention          | Explanation                              |
202*61046927SAndroid Build Coastguard Worker   +=====================+==========================================+
203*61046927SAndroid Build Coastguard Worker   | ``glFooBar()``      | a public GL entry point (in              |
204*61046927SAndroid Build Coastguard Worker   |                     | :file:`glapi_dispatch.c`)                |
205*61046927SAndroid Build Coastguard Worker   +---------------------+------------------------------------------+
206*61046927SAndroid Build Coastguard Worker   | ``_mesa_FooBar()``  | the internal immediate mode function     |
207*61046927SAndroid Build Coastguard Worker   +---------------------+------------------------------------------+
208*61046927SAndroid Build Coastguard Worker   | ``save_FooBar()``   | retained mode (display list) function in |
209*61046927SAndroid Build Coastguard Worker   |                     | :file:`dlist.c`                          |
210*61046927SAndroid Build Coastguard Worker   +---------------------+------------------------------------------+
211*61046927SAndroid Build Coastguard Worker   | ``foo_bar()``       | a static (private) function              |
212*61046927SAndroid Build Coastguard Worker   +---------------------+------------------------------------------+
213*61046927SAndroid Build Coastguard Worker   | ``_mesa_foo_bar()`` | an internal non-static Mesa function     |
214*61046927SAndroid Build Coastguard Worker   +---------------------+------------------------------------------+
215*61046927SAndroid Build Coastguard Worker
216*61046927SAndroid Build Coastguard Worker-  Constants, macros and enum names are ``ALL_UPPERCASE``, with \_
217*61046927SAndroid Build Coastguard Worker   between words.
218*61046927SAndroid Build Coastguard Worker-  Mesa usually uses camel case for local variables (Ex:
219*61046927SAndroid Build Coastguard Worker   ``localVarname``) while Gallium typically uses underscores (Ex:
220*61046927SAndroid Build Coastguard Worker   ``local_var_name``).
221*61046927SAndroid Build Coastguard Worker-  Global variables are almost never used because Mesa should be
222*61046927SAndroid Build Coastguard Worker   thread-safe.
223*61046927SAndroid Build Coastguard Worker-  Booleans. Places that are not directly visible to the GL API should
224*61046927SAndroid Build Coastguard Worker   prefer the use of ``bool``, ``true``, and ``false`` over
225*61046927SAndroid Build Coastguard Worker   ``GLboolean``, ``GL_TRUE``, and ``GL_FALSE``. In C code, this may
226*61046927SAndroid Build Coastguard Worker   mean that ``#include <stdbool.h>`` needs to be added. The
227*61046927SAndroid Build Coastguard Worker   ``try_emit_*`` method ``src/mesa/state_tracker/st_glsl_to_tgsi.cpp``
228*61046927SAndroid Build Coastguard Worker   can serve as an example.
229