Skip to content

Commit

Permalink
RemoteDisplayListRecorder should lazily allocate a SharedVideoFrameRe…
Browse files Browse the repository at this point in the history
…ader

https://bugs.webkit.org/show_bug.cgi?id=262380
rdar://116586176

Reviewed by Youenn Fablet and Eric Carlson.

Only a small subset of RemoteDisplayListRecorder instances need a SharedVideoFrameReader,
and making one has some overhead because of the semaphore, so allocate lazily.

* Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp:
(WebKit::RemoteDisplayListRecorder::RemoteDisplayListRecorder):
(WebKit::RemoteDisplayListRecorder::sharedVideoFrameReader):
(WebKit::RemoteDisplayListRecorder::paintVideoFrame):
(WebKit::RemoteDisplayListRecorder::setSharedVideoFrameSemaphore):
(WebKit::RemoteDisplayListRecorder::setSharedVideoFrameMemory):
(): Deleted.
* Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.h:

Canonical link: https://commits.webkit.org/270404@main
  • Loading branch information
smfr committed Nov 8, 2023
1 parent 6f7cadf commit 34b59cb
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 8 deletions.
19 changes: 13 additions & 6 deletions Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#include "ImageBufferShareableAllocator.h"
#include "RemoteDisplayListRecorderMessages.h"
#include "RemoteImageBuffer.h"
#include "SharedVideoFrame.h"
#include <WebCore/BitmapImage.h>
#include <WebCore/FEImage.h>
#include <WebCore/FilterResults.h>
Expand All @@ -53,9 +54,6 @@ RemoteDisplayListRecorder::RemoteDisplayListRecorder(ImageBuffer& imageBuffer, R
: m_imageBuffer(imageBuffer)
, m_imageBufferIdentifier(imageBufferIdentifier)
, m_renderingBackend(&renderingBackend)
#if PLATFORM(COCOA) && ENABLE(VIDEO)
, m_sharedVideoFrameReader(Ref { renderingBackend.gpuConnectionToWebProcess().videoFrameObjectHeap() }, renderingBackend.gpuConnectionToWebProcess().webProcessIdentity())
#endif
{
}

Expand Down Expand Up @@ -505,20 +503,29 @@ void RemoteDisplayListRecorder::paintFrameForMedia(MediaPlayerIdentifier identif
#endif

#if PLATFORM(COCOA) && ENABLE(VIDEO)
SharedVideoFrameReader& RemoteDisplayListRecorder::sharedVideoFrameReader()
{
if (!m_sharedVideoFrameReader)
m_sharedVideoFrameReader = makeUnique<SharedVideoFrameReader>(Ref { m_renderingBackend->gpuConnectionToWebProcess().videoFrameObjectHeap() }, m_renderingBackend->gpuConnectionToWebProcess().webProcessIdentity());

return *m_sharedVideoFrameReader;
}

void RemoteDisplayListRecorder::paintVideoFrame(SharedVideoFrame&& frame, const WebCore::FloatRect& destination, bool shouldDiscardAlpha)
{
if (auto videoFrame = m_sharedVideoFrameReader.read(WTFMove(frame)))
if (auto videoFrame = sharedVideoFrameReader().read(WTFMove(frame)))
drawingContext().paintVideoFrame(*videoFrame, destination, shouldDiscardAlpha);
}


void RemoteDisplayListRecorder::setSharedVideoFrameSemaphore(IPC::Semaphore&& semaphore)
{
m_sharedVideoFrameReader.setSemaphore(WTFMove(semaphore));
sharedVideoFrameReader().setSemaphore(WTFMove(semaphore));
}

void RemoteDisplayListRecorder::setSharedVideoFrameMemory(SharedMemory::Handle&& handle)
{
m_sharedVideoFrameReader.setSharedMemory(WTFMove(handle));
sharedVideoFrameReader().setSharedMemory(WTFMove(handle));
}
#endif // PLATFORM(COCOA) && ENABLE(VIDEO)

Expand Down
6 changes: 4 additions & 2 deletions Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@

#include "Decoder.h"
#include "RemoteRenderingBackend.h"
#include "SharedVideoFrame.h"
#include "StreamMessageReceiver.h"
#include "StreamServerConnection.h"
#include <WebCore/ControlFactory.h>
Expand All @@ -43,6 +42,7 @@ namespace WebKit {

class RemoteRenderingBackend;
class RemoteResourceCache;
class SharedVideoFrameReader;

class RemoteDisplayListRecorder : public IPC::StreamMessageReceiver, public CanMakeWeakPtr<RemoteDisplayListRecorder> {
public:
Expand Down Expand Up @@ -155,6 +155,8 @@ class RemoteDisplayListRecorder : public IPC::StreamMessageReceiver, public CanM
void didReceiveStreamMessage(IPC::StreamServerConnection&, IPC::Decoder&) final;

#if PLATFORM(COCOA) && ENABLE(VIDEO)
SharedVideoFrameReader& sharedVideoFrameReader();

void paintVideoFrame(SharedVideoFrame&&, const WebCore::FloatRect&, bool shouldDiscardAlpha);
void setSharedVideoFrameSemaphore(IPC::Semaphore&&);
void setSharedVideoFrameMemory(SharedMemory::Handle&&);
Expand All @@ -165,7 +167,7 @@ class RemoteDisplayListRecorder : public IPC::StreamMessageReceiver, public CanM
RefPtr<RemoteRenderingBackend> m_renderingBackend;
std::unique_ptr<WebCore::ControlFactory> m_controlFactory;
#if PLATFORM(COCOA) && ENABLE(VIDEO)
SharedVideoFrameReader m_sharedVideoFrameReader;
std::unique_ptr<SharedVideoFrameReader> m_sharedVideoFrameReader;
#endif
};

Expand Down

0 comments on commit 34b59cb

Please sign in to comment.