Bug 1729441 - Add a pref to set the blob tile size. r=gfx-reviewers,bradwerth

The prefs name is gfx.webrender.blob-tile-size and can be changed at runtime.

It changes the behavior of a wrench reftest that was ensuring that we don't crash with unreasonable tile sizes. The new behavior (sanitizing the tile size) means we can render the image while we would previously skip it.

Differential Revision: https://phabricator.services.mozilla.com/D124789
This commit is contained in:
Nicolas Silva 2021-09-08 12:41:51 +00:00
parent 6701c71e0c
commit 0afcd4879b
12 changed files with 51 additions and 16 deletions

View File

@ -56,6 +56,7 @@ class gfxVarReceiver;
_(WebRenderMaxPartialPresentRects, int32_t, 0) \
_(WebRenderDebugFlags, int32_t, 0) \
_(WebRenderBatchingLookback, int32_t, 10) \
_(WebRenderBlobTileSize, int32_t, 256) \
_(UseSoftwareWebRender, bool, false) \
_(AllowSoftwareWebRenderD3D11, bool, false) \
_(ScreenDepth, int32_t, 0) \

View File

@ -1334,8 +1334,9 @@ void CompositorBridgeParent::InitializeStatics() {
gfxVars::SetWebRenderDebugFlagsListener(&UpdateDebugFlags);
gfxVars::SetUseWebRenderMultithreadingListener(
&UpdateWebRenderMultithreading);
gfxVars::SetWebRenderBatchingLookbackListener(
&UpdateWebRenderBatchingParameters);
gfxVars::SetWebRenderBatchingLookbackListener(&UpdateWebRenderParameters);
gfxVars::SetWebRenderBlobTileSizeListener(&UpdateWebRenderParameters);
gfxVars::SetWebRenderProfilerUIListener(&UpdateWebRenderProfilerUI);
}
@ -1398,12 +1399,12 @@ void CompositorBridgeParent::UpdateWebRenderMultithreading() {
}
/*static*/
void CompositorBridgeParent::UpdateWebRenderBatchingParameters() {
void CompositorBridgeParent::UpdateWebRenderParameters() {
if (!CompositorThreadHolder::IsInCompositorThread()) {
if (CompositorThread()) {
CompositorThread()->Dispatch(NewRunnableFunction(
"CompositorBridgeParent::UpdateWebRenderBatchingParameters",
&CompositorBridgeParent::UpdateWebRenderBatchingParameters));
"CompositorBridgeParent::UpdateWebRenderParameters",
&CompositorBridgeParent::UpdateWebRenderParameters));
}
return;
@ -1411,7 +1412,7 @@ void CompositorBridgeParent::UpdateWebRenderBatchingParameters() {
MonitorAutoLock lock(*sIndirectLayerTreesLock);
ForEachWebRenderBridgeParent([&](WebRenderBridgeParent* wrBridge) -> void {
wrBridge->UpdateBatchingParameters();
wrBridge->UpdateParameters();
});
}

View File

@ -619,9 +619,9 @@ class CompositorBridgeParent final : public CompositorBridgeParentBase,
static void UpdateWebRenderMultithreading();
/**
* Notify the compositor webrender batching parameters have been updated.
* Notify the compositor some webrender parameters have been updated.
*/
static void UpdateWebRenderBatchingParameters();
static void UpdateWebRenderParameters();
/**
* Notify the compositor webrender profiler UI string has been updated.

View File

@ -336,6 +336,7 @@ WebRenderBridgeParent::WebRenderBridgeParent(
#if defined(MOZ_WIDGET_ANDROID)
mScreenPixelsTarget(nullptr),
#endif
mBlobTileSize(256),
mDestroyed(false),
mReceivedDisplayList(false),
mIsFirstPaint(true),
@ -555,7 +556,8 @@ bool WebRenderBridgeParent::UpdateResources(
gfxCriticalNote << "TOpAddBlobImage failed";
return false;
}
aUpdates.AddBlobImage(op.key(), op.descriptor(), bytes,
aUpdates.AddBlobImage(op.key(), op.descriptor(), mBlobTileSize, bytes,
wr::ToDeviceIntRect(op.visibleRect()));
break;
}
@ -1653,9 +1655,11 @@ void WebRenderBridgeParent::UpdateMultithreading() {
mApi->EnableMultithreading(gfxVars::UseWebRenderMultithreading());
}
void WebRenderBridgeParent::UpdateBatchingParameters() {
void WebRenderBridgeParent::UpdateParameters() {
uint32_t count = gfxVars::WebRenderBatchingLookback();
mApi->SetBatchingLookback(count);
mBlobTileSize = gfxVars::WebRenderBlobTileSize();
}
#if defined(MOZ_WIDGET_ANDROID)

View File

@ -93,7 +93,7 @@ class WebRenderBridgeParent final : public PWebRenderBridgeParent,
void UpdateQualitySettings();
void UpdateDebugFlags();
void UpdateMultithreading();
void UpdateBatchingParameters();
void UpdateParameters();
void UpdateProfilerUI();
mozilla::ipc::IPCResult RecvEnsureConnected(
@ -502,6 +502,7 @@ class WebRenderBridgeParent final : public PWebRenderBridgeParent,
#if defined(MOZ_WIDGET_ANDROID)
UiCompositorControllerParent* mScreenPixelsTarget;
#endif
uint16_t mBlobTileSize;
bool mDestroyed;
bool mReceivedDisplayList;
bool mIsFirstPaint;

View File

@ -556,6 +556,13 @@ static void WebRenderBatchingPrefChangeCallback(const char* aPrefName, void*) {
gfx::gfxVars::SetWebRenderBatchingLookback(count);
}
static void WebRenderBlobTileSizePrefChangeCallback(const char* aPrefName,
void*) {
uint32_t tileSize = Preferences::GetUint(
StaticPrefs::GetPrefName_gfx_webrender_blob_tile_size(), 256);
gfx::gfxVars::SetWebRenderBlobTileSize(tileSize);
}
static uint32_t GetSkiaGlyphCacheSize() {
// Only increase font cache size on non-android to save memory.
#if !defined(MOZ_WIDGET_ANDROID)
@ -1272,6 +1279,10 @@ void gfxPlatform::ShutdownLayersIPC() {
WR_DEBUG_PREF);
Preferences::UnregisterCallback(WebRendeProfilerUIPrefChangeCallback,
"gfx.webrender.debug.profiler-ui");
Preferences::UnregisterCallback(
WebRenderBlobTileSizePrefChangeCallback,
nsDependentCString(
StaticPrefs::GetPrefName_gfx_webrender_blob_tile_size()));
}
} else {
@ -2611,6 +2622,11 @@ void gfxPlatform::InitWebRenderConfig() {
nsDependentCString(
StaticPrefs::GetPrefName_gfx_webrender_batching_lookback()));
Preferences::RegisterCallbackAndCall(
WebRenderBlobTileSizePrefChangeCallback,
nsDependentCString(
StaticPrefs::GetPrefName_gfx_webrender_blob_tile_size()));
if (WebRenderResourcePathOverride()) {
CrashReporter::AnnotateCrashReport(
CrashReporter::Annotation::IsWebRenderResourcePathOverridden, true);

View File

@ -817,10 +817,11 @@ void TransactionBuilder::AddImage(ImageKey key,
void TransactionBuilder::AddBlobImage(BlobImageKey key,
const ImageDescriptor& aDescriptor,
uint16_t aTileSize,
wr::Vec<uint8_t>& aBytes,
const wr::DeviceIntRect& aVisibleRect) {
wr_resource_updates_add_blob_image(mTxn, key, &aDescriptor, &aBytes.inner,
aVisibleRect);
wr_resource_updates_add_blob_image(mTxn, key, &aDescriptor, aTileSize,
&aBytes.inner, aVisibleRect);
}
void TransactionBuilder::AddExternalImage(ImageKey key,

View File

@ -140,7 +140,7 @@ class TransactionBuilder final {
wr::Vec<uint8_t>& aBytes);
void AddBlobImage(wr::BlobImageKey aKey, const ImageDescriptor& aDescriptor,
wr::Vec<uint8_t>& aBytes,
uint16_t aTileSize, wr::Vec<uint8_t>& aBytes,
const wr::DeviceIntRect& aVisibleRect);
void AddExternalImageBuffer(ImageKey key, const ImageDescriptor& aDescriptor,

View File

@ -2003,6 +2003,7 @@ pub extern "C" fn wr_resource_updates_add_blob_image(
txn: &mut Transaction,
image_key: BlobImageKey,
descriptor: &WrImageDescriptor,
tile_size: u16,
bytes: &mut WrVecU8,
visible_rect: DeviceIntRect,
) {
@ -2012,7 +2013,7 @@ pub extern "C" fn wr_resource_updates_add_blob_image(
Arc::new(bytes.flush_into_vec()),
visible_rect,
if descriptor.format == ImageFormat::BGRA8 {
Some(256)
Some(tile_size)
} else {
None
},

View File

@ -780,6 +780,11 @@ impl ResourceCache {
visible_rect: &DeviceIntRect,
mut tiling: Option<TileSize>,
) {
if let Some(ref mut tile_size) = tiling {
// Sanitize the value since it can be set by a pref.
*tile_size = (*tile_size).max(16).min(2048);
}
if tiling.is_none() && Self::should_tile(self.tiling_threshold(), &descriptor, &data) {
// We aren't going to be able to upload a texture this big, so tile it, even
// if tiling was not requested.

View File

@ -2,4 +2,4 @@ root:
items:
- type: rect
bounds: 0 0 500 500
color: green
color: red

View File

@ -5188,6 +5188,11 @@
value: 10
mirror: always
- name: gfx.webrender.blob-tile-size
type: uint32_t
value: 256
mirror: always
- name: gfx.webrender.compositor
type: bool
#if defined(XP_WIN) || defined(XP_MACOSX)