# Contributing Code

## Communicate

* Whether you're writing a new feature or fixing an existing bug, it pays to get a second opinion
  before you get too far. If it's a new feature idea, post to the discussion group
  ([angleproject][ANGLE-website]).
* Not all bugs in our [bug system][anglebug.com] are assigned, but if the one you're interested in
  fixing is, send a note to the person it's assigned to and ask if they would like a patch.
* Behavior changes and anything nontrivial (i.e. anything other than simple cleanups and style
  fixes) should generally be tracked in the bug system. Please [file a bug][anglebug-new] and
  describe what you're doing if there isn't one already.
* If you would like bug-editing rights, simply ask a team member via email or the discussion group.

[ANGLE-website]: https://groups.google.com/forum/?fromgroups#!forum/angleproject
[anglebug.com]: http://anglebug.com
[anglebug-new]: http://anglebug.com/new

## Get your code ready

### Code

1. Must conform to the [ANGLE style][ANGLE-style] guidelines.
2. Must be tested. (see the [Testing][Testing] section below)
3. Should be a reasonable size to review.  Giant patches are unlikely to get reviewed quickly.

[ANGLE-style]: CodingStandard.md
[Testing]: #Testing

### Build maintenance

1. If you added or removed source files:
   * You _must_ update the build files with your changes. See [`src/libGLESv2.gni`][libGLESv2.gni]
     and [`src/compiler.gni`][compiler.gni].
2. ANGLE's BUILD.gn script is used by [Chromium's gn build][gn-build-config]. If you change build
   files other than to add or remove source files be aware you could break the Chromium build.
   ANGLE's commit queue (CQ) will detect such breakage. Ask a project member for help with Chromium
   issues if you don't have a Chromium checkout.
3. Some generated code is baked into the repository. If you modify the source of these files, such
   as the translator's [`glslang.l`][glslang.l], or one of the internal shaders in the Vulkan
   backend, you will need to run [`scripts/run_code_generation.py`][run_code_generation.py] and
   include the autogenerated files in your change.
   `git cl upload` should warn you if you are missing this step.

[gn-build-config]: https://www.chromium.org/developers/gn-build-configuration
[compiler.gni]: https://chromium.googlesource.com/angle/angle/+/refs/heads/main/src/compiler.gni
[libGLESv2.gni]: https://chromium.googlesource.com/angle/angle/+/refs/heads/main/src/libGLESv2.gni
[glslang.l]: https://chromium.googlesource.com/angle/angle/+/refs/heads/main/src/compiler/translator/glslang.l
[run_code_generation.py]: https://chromium.googlesource.com/angle/angle/+/refs/heads/main/scripts/run_code_generation.py

### Testing

* ANGLE uses trybots to test on a variety of platforms. Please run your changes against our bots
  and check the results before landing changes or requesting reviews.
   * Upload your change (see [Making changes](#making-changes)).
   * To kick off a try job, use the 'CQ Dry Run' button, or set the Commit-Queue +1 label to trigger
     a dry run of the CQ (will not land the change).
   * If you are not part of the `angle-committers` group, you will need to either ask to be added or
     ask a member of the group to submit the tryjob for you. Add syoussefi or geofflang as a reviewer
     for assistance.
   * Wait for the bots to report the result on the code review page. The bot results should be
     visible in Gerrit as yellow (in-progress), green (passed), or red (failed). This can take up to
     two hours for some of the debug bots. Click on the colored rectangle to open the bot log to
     triage failed tests.
   * If a failure is unexpected, or seems likely unrelated to your change, ask an ANGLE project
     member for advice.
   * We do not currently have the capability to run individual bots or tests in a run.
* Tests can also be run locally, ANGLE's main testing methods are:
   * `angle_unittests`, `angle_end2end_tests` and `angle_white_box_tests` targets.
   * The OpenGL CTS also known as [drawElements Quality Program (dEQP)](dEQP.md).
     If you're working on a new feature, there may be some extensive tests for it already written.
   * The [Top-of-Tree WebGL Conformance tests][WebGL-CTS].
     * If you are a Chromium developer, see
       [Building ANGLE for Chromium Development][build-ANGLE-for-chromium] for instructions on
       building ANGLE within Chromium.
     * If you aren't a browser developer, you should be able to drop your compiled DLLs into a
       Chrome installation, in place of those distributed with Chrome, to check WebGL conformance.
       [Chrome Canary][Chrome-Canary] is well-suited for this.
   * If your code isn't covered by an existing test, you are *strongly encouraged* to add new test
     coverage. This both ensures that your code is correct and that new contributors won't break it
     in the future.
   * Add new tests to `angle_end2end_tests` for OpenGL-based API tests, `angle_unittests` for
     cross-platform internal tests, and `angle_white_box_tests` for rendering tests which also need
     visibility into internal ANGLE classes.
  * If you are submitting a performance fix, test your code with `angle_perftests` and add a new
    performance test if it is not covered by the existing benchmarks. For more documentation on
    `angle_perftests` see the [README][README].
  * The [Chromium GPU FYI bot waterfall][Chromium-waterfall] provides continuous integration for
    ANGLE patches that have been committed.  There may be hardware configurations that are not
    tested by the ANGLE trybots, if you notice breakage on this waterfall after landing a patch,
    please notify a project member.

[WebGL-CTS]: https://www.khronos.org/registry/webgl/sdk/tests/webgl-conformance-tests.html
[build-ANGLE-for-Chromium]: BuildingAngleForChromiumDevelopment.md
[Chrome-Canary]: https://www.google.com/chrome/browser/canary.html
[README]: ../src/tests/perf_tests/README.md
[Chromium-waterfall]: https://ci.chromium.org/p/chromium/g/chromium.gpu.fyi/console

### Legal

1. You must complete the [Individual Contributor License Agreement][Individual-CLA]. You can do this
   online, and it only takes a minute. If you are contributing on behalf of a corporation, you must
   fill out the [Corporate Contributor License Agreement][Corporate-CLA] and send it to Google as
   described on that page.
2. Once you've submitted the CLA, please email the following information (as entered on the CLA) to
   `geofflang at chromium dot org` for record keeping purposes:
   * Full Name:
   * Email:
   * Company (If applicable):
3. If you've never submitted code before, you must add your (or your organization's) name and
   contact info to the [AUTHORS](../AUTHORS) file.
4. *NOTE TO REVIEWERS*: Follow the [External Contributor Checklist][Contributor-checklist].

[Individual-CLA]: https://cla.developers.google.com/about/google-individual
[Corporate-CLA]: https://cla.developers.google.com/about/google-corporate
[Contributor-checklist]: http://www.chromium.org/developers/contributing-code/external-contributor-checklist

## Life of a Change List

### <a name="getting-started-with-gerrit"></a>Getting started with Gerrit for ANGLE

1. Go to [https://chromium.googlesource.com/new-password][CR-passwd]
2. Log in with the email you use for your git commits.
3. Follow the directions on the new-password page to set up authentication with your Google account.
4. Make sure to set your real name.
   * Visit [https://chromium-review.googlesource.com/#/settings][CR-settings] and check the "Full
     Name" field.
5. Check out the repository (see [DevSetup](DevSetup.md)).
6. Install the Gerrit `commit_msg` hook
   * Gerrit requires a hook to append a change ID tag to each commit, so that it can associate your
     CL with a particular review, and track dependencies between commits.
   * Download the hook from
     [https://chromium-review.googlesource.com/tools/hooks/commit-msg][commit-msg-hook] and copy
     this file to `.git/hooks/commit-msg` within your local repository. On non-Windows platforms,
     ensure that permissions are set to allow execution.
   * *BE AWARE:* Some patch management tools, such as StGit, currently bypass git hooks. They should
     not currently be used with changes intended for review.

[CR-passwd]: https://chromium.googlesource.com/new-password
[CR-settings]: https://chromium-review.googlesource.com/#/settings
[commit-msg-hook]: https://chromium-review.googlesource.com/tools/hooks/commit-msg

### Making changes

1. Commit your changes locally:
   * `git add src/../FileName.cpp`
   * `git commit`
   * A text editor will open. Add a description at the top of the file.
   * Associate the CL with an issue in the issue tracker (e.g. a fix for a reported bug)
     by adding the following line to the commit message: `Bug: angleproject:<issue number>`.
     * If necessary please file a new bug at http://anglebug.com/new
   * Save.
   * Close the text editor.
   * Use `git commit --amend` to update your CL with new changes.
   * Use `git cl format` to amend the style of your CL. This saves both your time and the reviewers'!
2. Ensure your code is landed on top of latest changes
   * `git pull --rebase`
   * Resolve conflicts if necessary
3. Upload the change list
   * `git cl upload`
   * The change list and modified files will be uploaded to [ANGLE Gerrit][ANGLE-Gerrit].
   * Follow the generated URL to the new issue.
   * Take a moment to perform a self-review of your code. Gerrit's viewer makes it easy to see
     whitespace errors, erroneous tabs, and other simple style problems.
   * [Select reviewers](#selecting-reviewers).  If you don't do this, reviewers may not realize
     you're requesting a review!
   * Make changes, upload and repeat as necessary.
   * Project members and others will review your code as described in the
     [CodeReviewProcess](CodeReviewProcess.md).
5. If your change list needs revision:
   * If you have correctly installed the commit hook from the section above, Gerrit will be able to
     track your changes by Change-Id.
   * You should need only to update your commit with `git commit --amend` and re-upload with
     `git cl upload`.
6. Landing change after it receives +2 Code Review:
   * If you are a committer, you may submit the change yourself via the Gerrit web interface.
   * If you are not a committer, ask your reviewer to submit the change list.
7. Pull and integrate reviewed CL:
   * `git pull --rebase`

[ANGLE-Gerrit]: https://chromium-review.googlesource.com/q/project:angle/angle

### Selecting reviewers

When your CL is ready to review, you can use the "Find Owners" button in
Gerrit to select appropriate code reviewers. They will be able to route your
CL to additional reviewers as neccessary and answer any questions you may have
about the process.

### Rules for submission

 * At least one **Owner** must give approval.
 * The owner must be from the **most specific** directory.
 * At least two **Committers** must give approval for non-trival CLs.
   For trivial CLs, a single Owner approval is sufficient.
 * Only **Committers** may submit CLs. If you aren't a committer please ask for help submitting.
 * Committers may submit high-priority small CLs immediately using **TBR**.
   See [the Chromium docs][TBR] for more info.
 * There are exceptions to these rules. Use your best judgement.

[TBR]: https://chromium.googlesource.com/chromium/src/+/main/docs/code_reviews.md#tbr-to-be-reviewed

### Reverting a CL

Sometimes a change will cause an unforseen problem, e.g. on a platform that's not tested with
pre-submit testing.  In those cases, a CL may be reverted; often by a "[Wrangler][wrangler]", who is
an engineer who keeps the testing infrastructure healthy/green.

[wrangler]: ../infra/ANGLEWrangling.md

The best and easiest way to create a revert change is with Gerrit's **REVERT** button, in the
upper-right corner of the original change.  Pressing this will pop up a dialog with a template
commit message, and an optional checkbox for automatically sending the revert CL to CQ.  Please edit
the commit message with the reason for the revert.  When satisfied, press the dialog's **REVERT**
button.  It is wise to add the author and reviewers of the original CL as reviewers of the revert
CL.  If it's been less than 24 hours since the original CL landed, the revert Cl will land
immediately and bypass the try bots.

If you cannot use Gerrit's **REVERT** button, you can create a revert CL with the "git revert"
command.  When doing so, the commit message should include a short description for why the original
commit needs to be reverted, and potentially a bug; similar to this example [revert CL][RevertCL].

[RevertCL]: https://chromium-review.googlesource.com/c/chromium/src/+/2453504


### Relanding a reverted CL

When you re-land a reverted CL, follow this process:

 * Prefix the CL title with "Reland: ".
 * Keep the commit message of the original CL and add a description of what changed in the re-land.
 * Ensure the re-land CL has a unique Change-Id.
 * First upload the reverted CL as Patchset 1 with no changes applied.
 * Then, apply your fixes, and upload your CL as a new Patchset.  The reviewers will be able to see
   the diff between Patchset 1 and the fixed/final Patchset.

Here is an example [reland CL][RelandCL].  This [link][RelandCLDiff] shows the difference between Patchset 1
and the fixed/final Patchset.  Notice how a reviewer can easily see the fix to the original CL.

[RelandCL]: https://chromium-review.googlesource.com/c/angle/angle/+/2197735
[RelandCLDiff]: https://chromium-review.googlesource.com/c/angle/angle/+/2197735/1..3

If you do not need to make any changes to your CL to re-land, you can instead use Gerrit's **CREATE
RELAND** button.

### Committer status

Similar to [Chromium's committer status][Committer-status], long-term contributors to the ANGLE
project may request to join the `angle-committers` group.  This allows you to give `+2` on code
reviews and land patches without assistance.  See [Becoming a Committer](BecomingCommitter.md).

### OWNERS files and becoming an Owner

See these Chromium docs for some good guidelines: [link][Owners].

### More info

See also:

* [ANGLE Gerrit][ANGLE-Gerrit]
* [Chromium Projects: Contributing Code][Contributing-code]
* [depot_tools tutorial][depot-tools-tutorial]
* [angle_perftests README][Perftest-README]
* [ANGLE Testing and Processes](TestingAndProcesses.md)

[Committer-status]: https://dev.chromium.org/getting-involved/become-a-committer
[Contributing-code]: http://www.chromium.org/developers/contributing-code/
[depot-tools-tutorial]: http://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html
[Perftest-README]: ../src/tests/perf_tests/README.md
[Owners]: https://chromium.googlesource.com/chromium/src/+/main/docs/code_reviews.md#expectations-of-owners
