Skip to content
This repository has been archived by the owner on Aug 4, 2022. It is now read-only.

Commit

Permalink
Bug 1368846 - Display the window buttons when webrender is used. r=ka…
Browse files Browse the repository at this point in the history
…ts,mattwoodrow

MozReview-Commit-ID: Ki4ONGxtzyO
  • Loading branch information
mstange committed Jun 21, 2017
1 parent 6678f71 commit 7b20e4b
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 3 deletions.
5 changes: 5 additions & 0 deletions gfx/layers/wr/WebRenderBridgeChild.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,11 @@ class WebRenderBridgeChild final : public PWebRenderBridgeChild
mIdNamespace = aIdNamespace;
}

WrImageKey GetNextImageKey()
{
return WrImageKey{ GetNamespace(), GetNextResourceId() };
}

void PushGlyphs(wr::DisplayListBuilder& aBuilder, const nsTArray<GlyphArray>& aGlyphs,
gfx::ScaledFont* aFont, const StackingContextHelper& aSc,
const LayerRect& aBounds, const LayerRect& aClip);
Expand Down
3 changes: 3 additions & 0 deletions gfx/layers/wr/WebRenderLayerManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ WebRenderLayerManager::Destroy()
return;
}

mWidget->CleanupWebRenderWindowOverlay(WrBridge());

LayerManager::Destroy();
DiscardImages();
DiscardCompositorAnimations();
Expand Down Expand Up @@ -203,6 +205,7 @@ WebRenderLayerManager::EndTransactionInternal(DrawPaintedLayerCallback aCallback
WrSize contentSize { (float)size.width, (float)size.height };
wr::DisplayListBuilder builder(WrBridge()->GetPipeline(), contentSize);
WebRenderLayer::ToWebRenderLayer(mRoot)->RenderLayer(builder, sc);
mWidget->AddWindowOverlayWebRenderCommands(WrBridge(), builder);
WrBridge()->ClearReadLocks();

// We can't finish this transaction so return. This usually
Expand Down
3 changes: 0 additions & 3 deletions gfx/webrender_bindings/RendererOGL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,14 +121,11 @@ RendererOGL::Render()
return false;
}
// XXX set clear color if MOZ_WIDGET_ANDROID is defined.
// XXX pass the actual render bounds instead of an empty rect.
mWidget->DrawWindowUnderlay(&widgetContext, LayoutDeviceIntRect());

auto size = mWidget->GetClientSize();
wr_renderer_render(mWrRenderer, size.width, size.height);

mGL->SwapBuffers();
mWidget->DrawWindowOverlay(&widgetContext, LayoutDeviceIntRect());
mWidget->PostRender(&widgetContext);

// TODO: Flush pending actions such as texture deletions/unlocks and
Expand Down
10 changes: 10 additions & 0 deletions widget/cocoa/nsChildView.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "nsRegion.h"
#include "mozilla/MouseEvents.h"
#include "mozilla/UniquePtr.h"
#include "mozilla/webrender/WebRenderTypes.h"

#include "nsString.h"
#include "nsIDragService.h"
Expand Down Expand Up @@ -451,6 +452,12 @@ class nsChildView : public nsBaseWidget
virtual void CreateCompositor() override;
virtual void PrepareWindowEffects() override;
virtual void CleanupWindowEffects() override;

virtual void AddWindowOverlayWebRenderCommands(mozilla::layers::WebRenderBridgeChild* aWrBridge,
mozilla::wr::DisplayListBuilder& aBuilder) override;

virtual void CleanupWebRenderWindowOverlay(mozilla::layers::WebRenderBridgeChild* aWrBridge) override;

virtual bool PreRender(mozilla::widget::WidgetRenderingContext* aContext) override;
virtual void PostRender(mozilla::widget::WidgetRenderingContext* aContext) override;
virtual void DrawWindowOverlay(mozilla::widget::WidgetRenderingContext* aManager,
Expand Down Expand Up @@ -626,6 +633,9 @@ class nsChildView : public nsBaseWidget
mozilla::UniquePtr<mozilla::widget::RectTextureImage> mTitlebarImage;
mozilla::UniquePtr<mozilla::widget::RectTextureImage> mBasicCompositorImage;

// Main thread + webrender only
mozilla::Maybe<mozilla::wr::ImageKey> mTitlebarImageKey;

// The area of mTitlebarCGContext that has changed and needs to be
// uploaded to to mTitlebarImage. Main thread only.
nsIntRegion mDirtyTitlebarRegion;
Expand Down
48 changes: 48 additions & 0 deletions widget/cocoa/nsChildView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@
#include "mozilla/layers/CompositorBridgeParent.h"
#include "mozilla/layers/BasicCompositor.h"
#include "mozilla/layers/InputAPZContext.h"
#include "mozilla/layers/WebRenderBridgeChild.h"
#include "mozilla/webrender/WebRenderAPI.h"
#include "mozilla/widget/CompositorWidget.h"
#include "gfxUtils.h"
#include "gfxPrefs.h"
Expand Down Expand Up @@ -2074,6 +2076,52 @@ inline uint16_t COLOR8TOCOLOR16(uint8_t color8)
mTitlebarImage = nullptr;
}

void
nsChildView::AddWindowOverlayWebRenderCommands(layers::WebRenderBridgeChild* aWrBridge,
wr::DisplayListBuilder& aBuilder)
{
PrepareWindowEffects();

LayoutDeviceIntRegion updatedTitlebarRegion;
updatedTitlebarRegion.And(mUpdatedTitlebarRegion, mTitlebarRect);
mUpdatedTitlebarRegion.SetEmpty();

if (mTitlebarCGContext) {
gfx::IntSize size(CGBitmapContextGetWidth(mTitlebarCGContext),
CGBitmapContextGetHeight(mTitlebarCGContext));
size_t stride = CGBitmapContextGetBytesPerRow(mTitlebarCGContext);
size_t titlebarCGContextDataLength = stride * size.height;
gfx::SurfaceFormat format = gfx::SurfaceFormat::B8G8R8A8;
wr::ByteBuffer buffer(
titlebarCGContextDataLength,
static_cast<uint8_t *>(CGBitmapContextGetData(mTitlebarCGContext)));

if (!mTitlebarImageKey) {
mTitlebarImageKey = Some(aWrBridge->GetNextImageKey());
aWrBridge->SendAddImage(*mTitlebarImageKey, size, stride, format, buffer);
updatedTitlebarRegion.SetEmpty();
}

if (!updatedTitlebarRegion.IsEmpty()) {
aWrBridge->SendUpdateImage(*mTitlebarImageKey, size, format, buffer);
}

WrRect rect = wr::ToWrRect(mTitlebarRect);
WrClipRegionToken clip = aBuilder.PushClipRegion(rect, nullptr);
aBuilder.PushImage(WrRect{ 0, 0, float(size.width), float(size.height) },
clip, wr::ImageRendering::Auto, *mTitlebarImageKey);
}
}

void
nsChildView::CleanupWebRenderWindowOverlay(layers::WebRenderBridgeChild* aWrBridge)
{
if (mTitlebarImageKey) {
aWrBridge->SendDeleteImage(*mTitlebarImageKey);
mTitlebarImageKey = Nothing();
}
}

bool
nsChildView::PreRender(WidgetRenderingContext* aContext)
{
Expand Down
16 changes: 16 additions & 0 deletions widget/nsIWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ class CompositorBridgeChild;
class LayerManager;
class LayerManagerComposite;
class PLayerTransactionChild;
class WebRenderBridgeChild;
struct ScrollableLayerGuid;
} // namespace layers
namespace gfx {
Expand All @@ -73,6 +74,9 @@ class TextEventDispatcherListener;
class CompositorWidget;
class CompositorWidgetInitData;
} // namespace widget
namespace wr {
class DisplayListBuilder;
} // namespace wr
} // namespace mozilla

/**
Expand Down Expand Up @@ -1279,6 +1283,18 @@ class nsIWidget : public nsISupports
*/
virtual void PrepareWindowEffects() = 0;

/**
* Called on the main thread at the end of WebRender display list building.
*/
virtual void AddWindowOverlayWebRenderCommands(mozilla::layers::WebRenderBridgeChild* aWrBridge,
mozilla::wr::DisplayListBuilder& aBuilder) {}

/**
* Called on the main thread when WebRender resources used for
* AddWindowOverlayWebRenderCommands need to be destroyed.
*/
virtual void CleanupWebRenderWindowOverlay(mozilla::layers::WebRenderBridgeChild* aWrBridge) {}

/**
* Called when Gecko knows which themed widgets exist in this window.
* The passed array contains an entry for every themed widget of the right
Expand Down

0 comments on commit 7b20e4b

Please sign in to comment.