Michifumi's Blog

This blog is entirely produced by silicon-based slaves. I only issue commands and wield the whip.

· Updated on

How I Forced Brave to Use AMD GPU on an Intel Mac

Brave Browser (Chromium) kept sticking to Intel iGPU for WebGL/WebGPU. Here’s the exact fix I used and a one-click Automator launcher to make it permanent.

#macOS#Brave Browser

Go to solution directly

This issue has been bothering me for over half a year: ever since I got hooked on using the Brave browser, I’ve noticed that on my old 2018 MacBook Pro, it only utilizes the Intel integrated graphics and fails to leverage the discrete AMD GPU for rendering intensive tasks. This forces me to occasionally switch to Safari (WebKit sucks!) when encountering heavy rendering demands to achieve a smoother browsing experience. Today, I stumbled upon news that WebGPU has officially launched in major browsers. On a whim, I decided to tackle this issue.

First, I confirmed all settings are correct:

  • Brave Settings → System → Use graphics acceleration when available: ON.

  • macOS Battery → Automatic graphics switching: OFF (forces the system to use the discrete GPU).

  • Terminal (system‑wide GPU preference):

    sudo pmset -a gpuswitch 1

    This forces macOS to use the discrete GPU system‑wide. While this locks the display output to the AMD chip, Chromium’s internal GPU process still defaulted to creating its context on the integrated adapter.

    Reset to default:

    sudo pmset -a gpuswitch 2

    (2 restores automatic switching. The change takes effect immediately, though a reboot can ensure all background processes reload.)

Despite all that, Brave still stubbornly used Intel.


The Symptom

To reproduce the problem, I used a classic GPU-stressing WebGL demo from Three.js:

  • In Safari, opening the Three.js animation example immediately flipped the machine to the discrete AMD GPU with stable 60 FPS.
  • In Brave, the same page stayed on the Intel iGPU and, even under heavy rendering load, barely reached 30 FPS.

I checked the report from brave://gpu, which showed that Brave was clearly hardware-accelerating, just on the wrong adapter.


What brave://gpu Revealed

I opened brave://gpu and found something like this:

  • Both GPUs were detected:
    • AMD Radeon Pro Vega 20
    • Intel UHD Graphics 630
  • But Brave marked the Intel chip as ACTIVE, and WebGL reported:
    • GL_RENDERER: ANGLE Metal Renderer: Intel UHD Graphics 630

So it wasn’t a software fallback. Chromium was simply choosing the low‑power GPU and sticking to it.


The Real Fix: Force High‑Performance GPU at Launch

Since the Chromium flag to force high‑performance GPU is not available on Intel dual‑GPU macOS builds, there’s no UI toggle that persists this choice.

Chromium, however, still honors a startup argument that overrides the early GPU selection.

[!IMPORTANT] Make sure to quit Brave completely (Cmd + Q) first. On macOS, open -a will simply bring an already-running instance to the foreground and silently ignore any new --args.

Run this in Terminal:

open -a "Brave Browser" --args --force_high_performance_gpu

After launching Brave this way, brave://gpu finally showed the AMD GPU as ACTIVE, and the Three.js demo ran just as smoothly as it did in Safari.

Why this works

Chromium decides which GPU to bind very early during startup for its GPU process. On dual‑GPU Macs it defaults to the integrated Intel chip for battery life, and once that choice is made, most WebGL/WebGPU contexts follow it for the rest of the session. It seems this issue persists to this day (see Chromium issue #393263507).

The --force_high_performance_gpu argument injects a “prefer discrete GPU” directive before that decision locks in, so the GPU process starts on AMD, and all rendering follows.

Functionally this is the same behavior the missing force-high-performance-gpu flag would provide if it were supported on this platform, it’s just applied through a launch argument instead of Brave’s flags UI.


Make It Permanent: One‑Click Automator Launcher

Typing the launch command every time is annoying, so I made a tiny Automator app that starts Brave in AMD mode.

  1. Open AutomatorNew Document → choose Application.
  2. Add Run Shell Script.
  3. Set shell to /bin/zsh and paste:
    open -a "Brave Browser" --args --force_high_performance_gpu
  4. Save as something like Brave AMD.app.
  5. Drag Brave AMD.app into the Dock and remove the original Brave icon.

[!NOTE] Remember to quit Brave (Cmd + Q) before clicking the launcher if you are switching modes; macOS won’t apply launch arguments to an existing running process.

Here’s what the Automator setup looks like:

Automator launcher setup

Now every time I click the Dock icon, Brave launches using the AMD GPU.


Bonus: Make the Launcher Look Like Brave

Because the launcher is a separate app, it has a generic Automator icon by default. I changed it to the Brave icon:

  1. Finder → Applications → right‑click Brave Browser.appGet Info.
  2. Click the small Brave icon top‑left to highlight it.
  3. Press Cmd‑C.
  4. Right‑click Brave AMD.appGet Info.
  5. Click its small icon top‑left and press Cmd‑V.

If the Dock doesn’t update immediately, remove/re‑add the launcher.


Tradeoffs

Forcing the discrete GPU means:

  • More battery drain.
  • More heat/fan usage.

For me that’s a fair trade whenever I’m doing heavy WebGL/WebGPU stuff (3D demos, map visualizations, creative coding, etc.). Daily browsing on battery? I can still quit and open the normal Brave app if I want Intel. Not to mention, the battery on my MacBook Pro hasn’t been able to last through a single hour of normal use for ages, I couldn’t care less about battery life.