# 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 jmadill 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
   `shannonwoods 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-review.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-review.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.  After about 6 months of regular contributions, you may
request committer status from a core ANGLE team member via email or code review.  Chromium
committers and Googlers may ask at any time.

### 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
