diff --git a/gfx/layers/wr/AsyncImagePipelineManager.cpp b/gfx/layers/wr/AsyncImagePipelineManager.cpp index e608229dd344..14fa1ea4363f 100644 --- a/gfx/layers/wr/AsyncImagePipelineManager.cpp +++ b/gfx/layers/wr/AsyncImagePipelineManager.cpp @@ -353,7 +353,7 @@ AsyncImagePipelineManager::ApplyAsyncImages() builder.Finalize(builderContentSize, dl); mApi->SetDisplayList(gfx::Color(0.f, 0.f, 0.f, 0.f), epoch, LayerSize(pipeline->mScBounds.Width(), pipeline->mScBounds.Height()), pipelineId, builderContentSize, - dl.dl_desc, dl.dl.inner.data, dl.dl.inner.length, + dl.dl_desc, dl.dl, resourceUpdates); } } diff --git a/gfx/layers/wr/WebRenderBridgeParent.cpp b/gfx/layers/wr/WebRenderBridgeParent.cpp index 7e577b4a65a2..ddfc1b9cbd7d 100644 --- a/gfx/layers/wr/WebRenderBridgeParent.cpp +++ b/gfx/layers/wr/WebRenderBridgeParent.cpp @@ -114,6 +114,7 @@ gecko_profiler_unregister_thread() } namespace mozilla { + namespace layers { using namespace mozilla::gfx; @@ -598,6 +599,9 @@ WebRenderBridgeParent::RecvSetDisplayList(const gfx::IntSize& aSize, return IPC_FAIL(this, "Failed to deserialize resource updates"); } + + wr::Vec_u8 dlData(Move(dl)); + // If id namespaces do not match, it means the command is obsolete, probably // because the tab just moved to a new window. // In that case do not send the commands to webrender. @@ -609,7 +613,7 @@ WebRenderBridgeParent::RecvSetDisplayList(const gfx::IntSize& aSize, gfx::Color clearColor(0.f, 0.f, 0.f, 0.f); mApi->SetDisplayList(clearColor, wr::NewEpoch(wrEpoch), LayerSize(aSize.width, aSize.height), mPipelineId, aContentSize, - dlDesc, dl.mData, dl.mLen, + dlDesc, dlData, resources); ScheduleGenerateFrame(); diff --git a/gfx/webrender_bindings/WebRenderAPI.cpp b/gfx/webrender_bindings/WebRenderAPI.cpp index dd8d458ec65c..3a2668a655fd 100644 --- a/gfx/webrender_bindings/WebRenderAPI.cpp +++ b/gfx/webrender_bindings/WebRenderAPI.cpp @@ -265,8 +265,7 @@ WebRenderAPI::SetDisplayList(gfx::Color aBgColor, wr::WrPipelineId pipeline_id, const LayoutSize& content_size, wr::BuiltDisplayListDescriptor dl_descriptor, - uint8_t *dl_data, - size_t dl_size, + wr::Vec_u8& dl_data, ResourceUpdateQueue& aResources) { wr_api_set_display_list(mDocHandle, @@ -276,8 +275,7 @@ WebRenderAPI::SetDisplayList(gfx::Color aBgColor, pipeline_id, content_size, dl_descriptor, - dl_data, - dl_size, + &dl_data.inner, aResources.Raw()); } diff --git a/gfx/webrender_bindings/WebRenderAPI.h b/gfx/webrender_bindings/WebRenderAPI.h index f759a4baf7ed..77171da7363c 100644 --- a/gfx/webrender_bindings/WebRenderAPI.h +++ b/gfx/webrender_bindings/WebRenderAPI.h @@ -161,8 +161,7 @@ public: wr::WrPipelineId pipeline_id, const wr::LayoutSize& content_size, wr::BuiltDisplayListDescriptor dl_descriptor, - uint8_t *dl_data, - size_t dl_size, + wr::Vec_u8& dl_data, ResourceUpdateQueue& aResources); void ClearDisplayList(Epoch aEpoch, wr::WrPipelineId pipeline_id); diff --git a/gfx/webrender_bindings/WebRenderTypes.cpp b/gfx/webrender_bindings/WebRenderTypes.cpp new file mode 100644 index 000000000000..26774872f210 --- /dev/null +++ b/gfx/webrender_bindings/WebRenderTypes.cpp @@ -0,0 +1,24 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "WebRenderTypes.h" + +#include "mozilla/ipc/ByteBuf.h" + +namespace mozilla { +namespace wr { + +Vec_u8::Vec_u8(mozilla::ipc::ByteBuf&& aSrc) { + inner.data = aSrc.mData; + inner.length = aSrc.mLen; + inner.capacity = aSrc.mCapacity; + aSrc.mData = nullptr; + aSrc.mLen = 0; + aSrc.mCapacity = 0; +} + +} // namespace wr +} // namespace mozilla diff --git a/gfx/webrender_bindings/WebRenderTypes.h b/gfx/webrender_bindings/WebRenderTypes.h index 87df533dfdaf..4959e6086ced 100644 --- a/gfx/webrender_bindings/WebRenderTypes.h +++ b/gfx/webrender_bindings/WebRenderTypes.h @@ -21,6 +21,11 @@ #include "nsStyleConsts.h" namespace mozilla { + +namespace ipc { +class ByteBuf; +} // namespace ipc + namespace wr { typedef wr::WrWindowId WindowId; @@ -576,6 +581,8 @@ struct Vec_u8 { src.SetEmpty(); } + explicit Vec_u8(mozilla::ipc::ByteBuf&& aSrc); + Vec_u8& operator=(Vec_u8&& src) { inner = src.inner; diff --git a/gfx/webrender_bindings/moz.build b/gfx/webrender_bindings/moz.build index c522f9583e36..1ea249335b69 100644 --- a/gfx/webrender_bindings/moz.build +++ b/gfx/webrender_bindings/moz.build @@ -29,6 +29,7 @@ UNIFIED_SOURCES += [ 'RenderTextureHostOGL.cpp', 'RenderThread.cpp', 'WebRenderAPI.cpp', + 'WebRenderTypes.cpp', ] if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa': diff --git a/gfx/webrender_bindings/src/bindings.rs b/gfx/webrender_bindings/src/bindings.rs index b167e77d1bdc..8a3be78877e9 100644 --- a/gfx/webrender_bindings/src/bindings.rs +++ b/gfx/webrender_bindings/src/bindings.rs @@ -958,8 +958,7 @@ pub unsafe extern "C" fn wr_api_set_display_list( pipeline_id: WrPipelineId, content_size: LayoutSize, dl_descriptor: BuiltDisplayListDescriptor, - dl_data: *mut u8, - dl_size: usize, + dl_data: &mut WrVecU8, resources: &mut ResourceUpdates, ) { let resource_updates = mem::replace(resources, ResourceUpdates::new()); @@ -971,10 +970,7 @@ pub unsafe extern "C" fn wr_api_set_display_list( // but I suppose it is a good default. let preserve_frame_state = true; - let dl_slice = make_slice(dl_data, dl_size); - let mut dl_vec = Vec::new(); - // XXX: see if we can get rid of the copy here - dl_vec.extend_from_slice(dl_slice); + let dl_vec = dl_data.flush_into_vec(); let dl = BuiltDisplayList::from_data(dl_vec, dl_descriptor); dh.api.set_display_list( diff --git a/gfx/webrender_bindings/webrender_ffi_generated.h b/gfx/webrender_bindings/webrender_ffi_generated.h index 3bfb189e3b40..238985351b88 100644 --- a/gfx/webrender_bindings/webrender_ffi_generated.h +++ b/gfx/webrender_bindings/webrender_ffi_generated.h @@ -1068,8 +1068,7 @@ void wr_api_set_display_list(DocumentHandle *aDh, WrPipelineId aPipelineId, LayoutSize aContentSize, BuiltDisplayListDescriptor aDlDescriptor, - uint8_t *aDlData, - size_t aDlSize, + WrVecU8 *aDlData, ResourceUpdates *aResources) WR_FUNC;