mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-25 05:41:12 +00:00
e34eeaaa86
MozReview-Commit-ID: FAWTC1Llu31 --HG-- extra : rebase_source : 05bda872389db5cc61e805c3eb48e70eb5d95cbe |
||
---|---|---|
.. | ||
AdvancedLayers.md | ||
AsyncPanZoom-HighLevel.png | ||
AsyncPanZoom.md | ||
GraphicsOverview.md | ||
LayersHistory.md | ||
MainPage.md | ||
MozSurface.md | ||
README.webrender | ||
SharedMozSurface.md | ||
Silk.md | ||
silkArchitecture.png |
To build and run WebRender in Gecko: 1. Install Rust if you don't have it already If you are doing gecko builds already, you should already have Rust as it is a build requirement. If not, you can install it using |mach bootstrap| (recommended) or from https://www.rust-lang.org/ Note: If installing manually, use the stable 64-bit release - on Windows make sure to use the MSVC ABI installer. Ensure that rustc and cargo are in your $PATH (adding $HOME/.cargo/bin/ should be sufficient) 2. Build using |mach build|. You don't need anything special in your mozconfig for local builds; webrender will be built by default. If you are building a non-nightly version (e.g. beta) you may need to add |ac_add_options --enable-webrender=build| to your mozconfig. 3. Run with |MOZ_WEBRENDER=1| in your environment. e.g. |MOZ_WEBRENDER=1 ./mach run|. Alternatively, you can set the gfx.webrender.enabled pref to true (browser restart required). Note that on Linux, acceleration is disabled by default and it needs to be enabled for WebRender to work. On Linux you can enable acceleration by putting |MOZ_ACCELERATED=1| in your environment, or setting layers.acceleration.force-enabled to true in about:config. 4. Verify WebRender is enabled. You can do this by going to about:support and checking the "Compositing" line in the Graphics section. It should say "WebRender". There should also be a WebRender section under "Decision Log" in about:support, which will provide some more detail on what caused it to be enabled/disabled. When making changes: - Make the changes you want. - Run |mach build| or |mach build binaries| as desired. For a debug webrender build: Use a debug mozconfig (ac_add_options --enable-debug) You can also use an opt build but make webrender less optimized by putting opt-level=0 in the [profile.release] section of your toolkit/library/rust/Cargo.toml file See also https://groups.google.com/forum/#!topic/mozilla.dev.servo/MbeMcqqO1fs -------------------------------------------------------------------------------- What if you have to pull in an update to webrender itself? You have two options, listed below. Both options will give you a set of patches and the ability to do try pushes to verify the update. After that, continue with the steps below to actually land the update into the tree. Option A: Use a script to do the update for you. This will usually work, if you satisfy all the assumptions the script is making. The script can be found at https://github.com/staktrace/moz-scripts/blob/master/try-latest-webrender.sh and contains documentation on how to use it. Read the documentation carefully before trying to use it. Option B: Do the update manually. This is a little more cumbersome but may be required if the script doesn't work or the repos are in a state that violates hidden assumptions in the script (e.g. if the webrender_bindings/Cargo.toml file is no longer in the format expected by the script). The steps to do this are, roughly: - Update your mozilla-central checkout to the latest code on mozilla-central. - Check out and update the webrender repo to the version you want - Copy over the webrender, webrender_api, and part of the wrench folders into gfx/. The best way to do this is to simply delete the gfx/webrender, gfx/webrender_api, and gfx/wrench folders and use |cp -R| to copy them in again from the webrender repo, and then delete the gfx/wrench/reftests, gfx/wrench/benchmarks, and gfx/wrench/script folders. Update the revision in gfx/webrender_bindings/revision.txt file with the git changeset hash. - If you need to modify webrender_bindings/Cargo.toml file, do so now. Changes at this step usually consist of: (a) Updating version numbers. Go through the version numbers of ALL the dependencies in the Cargo.toml file (webrender, euclid, etc.) and make sure the version numbers listed match what's in the new gfx/webrender/Cargo.toml and gfx/webrender_api/Cargo.toml files. (b) Turning on or off any new features that were added in upstream WR. This used to happen a lot but is pretty rare now. - Go to toolkit/library/rust and run |cargo update -p webrender -p webrender_api|. If it complains about version numbers of other crates not lining up, add those as well, e.g. |cargo update -p webrender -p webrender_api -p gleam -p euclid|. You may need to do this a few times until you get all the crates to make it happy. - Run the same cargo update command from the previous step in the toolkit/library/gtest/rust folder. - Commit your changes locally. You'll need to do this before the next step or it will complain. - At the top of the tree, run |mach vendor rust| to update the rust dependencies in third_party/rust. - Commit your changes locally. - Build and test. You may need to make changes in bindings.rs or on the C++ side depending on what changed in webrender. This can potentially be quite tricky if you don't fully understand the API changes on the webrender side. Get help if you need it. For simplicity in bisecting, try to not use your new features yet, just get the build working with the minimal changes. - Commit any changes from the previous step, and do a try push to make sure everything is good. Generally we do two try pushes, one for builds and linux tests. This should be totally green. The other forces WR enabled on Windows and runs reftests, which currently fails. However if it fails with more than just regular reftest failures (e.g. it crashes or has an assertion failure) then that's potentially going to be a problem for Windows users running WebRender and will need investigation. - You now have an updated webrender, so you can land it or write gecko code against the new features. Once you have followed either Option A or Option B and have a good update, you might want to land it in the tree. To do this: - Find the current wr-future-update bug, by going to https://bugzil.la/wr-future-update - Clone this bug (there is a little dropdown in the bottom right corner of the page which gives you an option to "Create a new bug ... as a clone of this bug"). - This will take you to a bug entry page with some stuff prepopulated. Do NOT submit it yet, but make the following changes: (a) Modify the "Description" to remove the SECOND instance of the text "+++ This bug was initially created as a clone of ... +++". Keep the first instance as it points to the bug you just cloned, and keep the rest of the text unless you feel it needs changing. (b) Add wr-future-update into the "Alias" field (c) Clear the bugs in the "Depends on" field (d) For each bug in the "Blocks" field, except for 1311790 and 1386670, go to the bug and check the "See Also" link for the corresponding WR issue/PR, if any. If there is a WR issue that is not yet resolved in the update you are landing, leave the bug in the "Blocks" field of your clone. In a later step you will remove the dependency from the update you are landing. At end of this step the "Blocks" field should contain 1311790, 1386670, and any bugs tracking upstream WR issues that are not fixed in the update. (e) You still cannot submit the clone as a new bug, because you can't have two bugs in the system with the same alias. So hold on a sec. - Go back to the tab with the current wr-future-update bug, and click on the edit button. Make the following changes: (a) Assign the bug to yourself. (b) Clear the "Alias" field. (c) Remove bugs from the "Blocks" field that you kept in step (d), other than 1311790 and 1386670. In other words, update the "Blocks" field so that it contains 1311790, 1386670, and any bugs that are actually fixed by the update. (d) Submit your changes to this bug. - Now you can submit your changes to the clone bug which will create a new wr-future-update bug. - Update your patch queue so that the patches are properly formatted with bug number, reviewer, etc. and push to MozReview. This is kind of important, because you want these patches to land on autoland rather than inbound. If it lands on inbound there's a high chance of it conflicting with the servo-vcs-sync bot that is regularly pushing to autoland, and then you'll only find out about it when the sheriff tries to do a merge and backs you out. If you push to autoland you're likely to find out about the problem at push time, when the patches won't rebase. Troubleshooting tips: 1. Note that when webrender is built as part of gecko, it may end up using slightly different versions of its dependencies than when it is built standalone from the webrender repo. The reason is that the Cargo.lock files in m-c and in the WR repo may reference different versions of the dependencies. Both builds will be compatible in terms of semantic versioning, but may produce different results - for example the standalone webrender might use euclid 0.10.4 while the one in gecko uses euclid 0.10.3. Although both choices are "valid" per the semantic versioning rules in webrender's Cargo.toml, the 0.2.3 may provide a bugfix that is needed for correct behaviour in webrender. If this is the case, the technically "correct" fix is to change the upstream webrender Cargo.toml file to require the correct version. Alternnatively, you can update the Cargo.lock files in m-c to pull in the new version. The way to do this is as follows: - Go to toolkit/library/rust and run |cargo update -p <package> --precise <version>|. Repeat this for as many libraries as you need to update. Run the same commands in toolkit/library/gtest/rust and js/src (ignore any errors about unmatched packages). Commit all the changes locally. - Run |mach vendor rust|, which will update the corresponding libraries in third_party/rust to the versions you specified. The reason we don't do this by default is to work around bug 1336528. Specifically, there is another crate in m-c called mozjs_sys which is built separately but uses the same folder to store its rust dependencies. If one of the libraries that is required by both mozjs_sys and webrender is updated without updating the other project's Cargo.lock file, that results in build bustage. This means that any time you do this sort of manual update of packages, you need to make sure that mozjs_sys also has its Cargo.lock file updated if needed, hence the need to run the cargo update command in js/src as well. Hopefully this will be resolved soon. 2. Sometimes autoland tip has changed enough from mozilla-central (because of the servo vcs-sync-bot, which will sync servo into m-c and often re-vendor third- party rust dependencies) that trying to land an update based on mozilla-central will not work well. As in, you'll get conflicts in Cargo.lock files or in the third_party/rust directory. This is best handled by running your update steps on top of autoland tip rather than central. (The script-based update in option A has an env var you can set to do this). In theory you can get the same result by resolving the conflict manually but Cargo.lock files are usually not trivial to merge by hand. If it's just the third_party/rust dir that has conflicts you can delete it and run |mach vendor rust| again to repopulate it. ------------------------------------------------------------------------------- The current WebRender revision can be found in gfx/webrender_bindings/revision.txt file.