mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-10 11:55:49 +00:00
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:
parent
6701c71e0c
commit
0afcd4879b
@ -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) \
|
||||
|
@ -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();
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
},
|
||||
|
@ -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.
|
||||
|
@ -2,4 +2,4 @@ root:
|
||||
items:
|
||||
- type: rect
|
||||
bounds: 0 0 500 500
|
||||
color: green
|
||||
color: red
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user