Skip to content

Commit f0aca09

Browse files
committed
Merge remote-tracking branch 'origin/upstream/feat/accelerated-paint' into feat/accelerated-paint
# Conflicts: # java/org/cef/CefClient.java # java/org/cef/browser/CefBrowserOsr.java
2 parents 52e7dab + 8219703 commit f0aca09

14 files changed

Lines changed: 366 additions & 173 deletions

java/org/cef/CefBrowserSettings.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,29 @@ public class CefBrowserSettings {
2020
*/
2121
public int windowless_frame_rate = 0;
2222

23+
/**
24+
* Set to true to enable shared texture rendering. When enabled, the browser
25+
* will render to a shared texture that can be accessed by the host application
26+
* for hardware-accelerated compositing. This is supported on Windows via D3D11,
27+
* macOS via Metal/OpenGL, and Linux via native buffers.
28+
*/
29+
public boolean shared_texture_enabled = false;
30+
31+
/**
32+
* Set to true to enable external begin frame scheduling. When enabled, the
33+
* client must call CefBrowserHost::SendExternalBeginFrame to trigger frame
34+
* rendering at the specified frame rate.
35+
*/
36+
public boolean external_begin_frame_enabled = false;
37+
2338
public CefBrowserSettings() {}
2439

2540
@Override
2641
public CefBrowserSettings clone() {
2742
CefBrowserSettings tmp = new CefBrowserSettings();
2843
tmp.windowless_frame_rate = windowless_frame_rate;
44+
tmp.shared_texture_enabled = shared_texture_enabled;
45+
tmp.external_begin_frame_enabled = external_begin_frame_enabled;
2946
return tmp;
3047
}
3148
}

java/org/cef/CefClient.java

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public CefBrowser createBrowser(String url, boolean isTransparent,
8787
}
8888

8989
public CefBrowser createBrowser(String url, boolean isTransparent,
90-
CefRequestContext context, CefBrowserSettings settings) {
90+
CefRequestContext context, CefBrowserSettings settings) {
9191
if (isDisposed_)
9292
throw new IllegalStateException("Can't create browser. CefClient is disposed");
9393
return CefBrowserFactory.create(
@@ -122,7 +122,7 @@ protected CefDialogHandler getDialogHandler() {
122122
protected CefDisplayHandler getDisplayHandler() {
123123
return this;
124124
}
125-
125+
126126
@Override
127127
protected CefAudioHandler getAudioHandler() {
128128
return this;
@@ -230,7 +230,7 @@ public void removeDialogHandler() {
230230
@Override
231231
public boolean onFileDialog(CefBrowser browser, FileDialogMode mode, String title,
232232
String defaultFilePath, Vector<String> acceptFilters, Vector<String> acceptExtensions,
233-
Vector<String> acceptDescriptions, CefFileDialogCallback callback) {
233+
Vector<String> acceptDescriptions, CefFileDialogCallback callback) {
234234
if (dialogHandler_ != null && browser != null) {
235235
return dialogHandler_.onFileDialog(browser, mode, title, defaultFilePath, acceptFilters,
236236
acceptExtensions, acceptDescriptions, callback);
@@ -322,7 +322,7 @@ public void removeDownloadHandler() {
322322

323323
@Override
324324
public boolean onBeforeDownload(CefBrowser browser, CefDownloadItem downloadItem,
325-
String suggestedName, CefBeforeDownloadCallback callback) {
325+
String suggestedName, CefBeforeDownloadCallback callback) {
326326
if (downloadHandler_ != null && browser != null)
327327
return downloadHandler_.onBeforeDownload(
328328
browser, downloadItem, suggestedName, callback);
@@ -693,6 +693,15 @@ public void onPaint(CefBrowser browser, boolean popup, Rectangle[] dirtyRects,
693693
realHandler.onPaint(browser, popup, dirtyRects, buffer, width, height);
694694
}
695695

696+
@Override
697+
public void onAcceleratedPaint(CefBrowser browser, boolean popup, Rectangle[] dirtyRects, CefAcceleratedPaintInfo info) {
698+
if (browser == null) return;
699+
700+
CefRenderHandler realHandler = browser.getRenderHandler();
701+
if (realHandler != null)
702+
realHandler.onAcceleratedPaint(browser, popup, dirtyRects, info);
703+
}
704+
696705
@Override
697706
public void addOnPaintListener(Consumer<CefPaintEvent> listener) {}
698707

@@ -808,39 +817,39 @@ public void onMouseEvent(
808817
public boolean getScreenInfo(CefBrowser arg0, CefScreenInfo arg1) {
809818
return false;
810819
}
811-
820+
812821
// CefAudioHandler
813-
822+
814823
public CefClient addAudioHandler(CefAudioHandler handler) {
815824
if (audioHandler_ == null) audioHandler_ = handler;
816825
return this;
817826
}
818-
827+
819828
public void removeAudioHandler() {
820829
audioHandler_ = null;
821830
}
822-
831+
823832
@Override
824833
public boolean getAudioParameters(CefBrowser browser, CefAudioParameters params) {
825834
if (audioHandler_ != null) return audioHandler_.getAudioParameters(browser, params);
826835
return false;
827836
}
828-
837+
829838
@Override
830839
public void onAudioStreamStarted(CefBrowser browser, CefAudioParameters params, int channels) {
831840
if (audioHandler_ != null) audioHandler_.onAudioStreamStarted(browser, params, channels);
832841
}
833-
842+
834843
@Override
835844
public void onAudioStreamPacket(CefBrowser browser, DataPointer data, int frames, long pts) {
836845
if (audioHandler_ != null) audioHandler_.onAudioStreamPacket(browser, data, frames, pts);
837846
}
838-
847+
839848
@Override
840849
public void onAudioStreamStopped(CefBrowser browser) {
841850
if (audioHandler_ != null) audioHandler_.onAudioStreamStopped(browser);
842851
}
843-
852+
844853
@Override
845854
public void onAudioStreamError(CefBrowser browser, String text) {
846855
if (audioHandler_ != null) audioHandler_.onAudioStreamError(browser, text);

java/org/cef/browser/CefBrowser.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,15 @@ public void runFileDialog(FileDialogMode mode, String title, String defaultFileP
398398
*/
399399
public void setWindowlessFrameRate(int frameRate);
400400

401+
/**
402+
* Send an external begin frame to trigger frame rendering when external begin frame
403+
* scheduling is enabled. This method should be called at the desired frame rate when
404+
* CefBrowserSettings.external_begin_frame_enabled is set to true.
405+
*
406+
* @throws UnsupportedOperationException if not supported
407+
*/
408+
public void sendExternalBeginFrame();
409+
401410
/**
402411
* Returns the maximum rate in frames per second (fps) that {@code CefRenderHandler::onPaint}
403412
* will be called for a windowless browser. The actual fps may be lower if the browser cannot

0 commit comments

Comments
 (0)