1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #ifndef mozilla_layers_RecordedCanvasEventImpl_h
8 #define mozilla_layers_RecordedCanvasEventImpl_h
10 #include "mozilla/gfx/RecordedEvent.h"
11 #include "mozilla/gfx/RecordingTypes.h"
12 #include "mozilla/layers/CanvasTranslator.h"
13 #include "mozilla/layers/CompositorTypes.h"
14 #include "mozilla/layers/TextureClient.h"
19 using gfx::DrawTarget
;
21 using gfx::RecordedEvent
;
22 using gfx::RecordedEventDerived
;
23 using EventType
= gfx::RecordedEvent::EventType
;
24 using gfx::ReadElement
;
25 using gfx::ReferencePtr
;
26 using gfx::SurfaceFormat
;
27 using gfx::WriteElement
;
28 using ipc::SharedMemoryBasic
;
30 const EventType CANVAS_BEGIN_TRANSACTION
= EventType::LAST
;
31 const EventType CANVAS_END_TRANSACTION
= EventType(EventType::LAST
+ 1);
32 const EventType CANVAS_FLUSH
= EventType(EventType::LAST
+ 2);
33 const EventType TEXTURE_LOCK
= EventType(EventType::LAST
+ 3);
34 const EventType TEXTURE_UNLOCK
= EventType(EventType::LAST
+ 4);
35 const EventType CACHE_DATA_SURFACE
= EventType(EventType::LAST
+ 5);
36 const EventType PREPARE_DATA_FOR_SURFACE
= EventType(EventType::LAST
+ 6);
37 const EventType GET_DATA_FOR_SURFACE
= EventType(EventType::LAST
+ 7);
38 const EventType ADD_SURFACE_ALIAS
= EventType(EventType::LAST
+ 8);
39 const EventType REMOVE_SURFACE_ALIAS
= EventType(EventType::LAST
+ 9);
40 const EventType DEVICE_CHANGE_ACKNOWLEDGED
= EventType(EventType::LAST
+ 10);
41 const EventType NEXT_TEXTURE_ID
= EventType(EventType::LAST
+ 11);
42 const EventType TEXTURE_DESTRUCTION
= EventType(EventType::LAST
+ 12);
44 class RecordedCanvasBeginTransaction final
45 : public RecordedEventDerived
<RecordedCanvasBeginTransaction
> {
47 RecordedCanvasBeginTransaction()
48 : RecordedEventDerived(CANVAS_BEGIN_TRANSACTION
) {}
51 MOZ_IMPLICIT
RecordedCanvasBeginTransaction(S
& aStream
);
53 bool PlayCanvasEvent(CanvasTranslator
* aTranslator
) const;
56 void Record(S
& aStream
) const;
58 std::string
GetName() const final
{ return "RecordedCanvasBeginTransaction"; }
61 inline bool RecordedCanvasBeginTransaction::PlayCanvasEvent(
62 CanvasTranslator
* aTranslator
) const {
63 aTranslator
->BeginTransaction();
68 void RecordedCanvasBeginTransaction::Record(S
& aStream
) const {}
71 RecordedCanvasBeginTransaction::RecordedCanvasBeginTransaction(S
& aStream
)
72 : RecordedEventDerived(CANVAS_BEGIN_TRANSACTION
) {}
74 class RecordedCanvasEndTransaction final
75 : public RecordedEventDerived
<RecordedCanvasEndTransaction
> {
77 RecordedCanvasEndTransaction()
78 : RecordedEventDerived(CANVAS_END_TRANSACTION
) {}
81 MOZ_IMPLICIT
RecordedCanvasEndTransaction(S
& aStream
);
83 bool PlayCanvasEvent(CanvasTranslator
* aTranslator
) const;
86 void Record(S
& aStream
) const;
88 std::string
GetName() const final
{ return "RecordedCanvasEndTransaction"; }
91 inline bool RecordedCanvasEndTransaction::PlayCanvasEvent(
92 CanvasTranslator
* aTranslator
) const {
93 aTranslator
->EndTransaction();
98 void RecordedCanvasEndTransaction::Record(S
& aStream
) const {}
101 RecordedCanvasEndTransaction::RecordedCanvasEndTransaction(S
& aStream
)
102 : RecordedEventDerived(CANVAS_END_TRANSACTION
) {}
104 class RecordedCanvasFlush final
105 : public RecordedEventDerived
<RecordedCanvasFlush
> {
107 RecordedCanvasFlush() : RecordedEventDerived(CANVAS_FLUSH
) {}
110 MOZ_IMPLICIT
RecordedCanvasFlush(S
& aStream
);
112 bool PlayCanvasEvent(CanvasTranslator
* aTranslator
) const;
115 void Record(S
& aStream
) const;
117 std::string
GetName() const final
{ return "RecordedCanvasFlush"; }
120 inline bool RecordedCanvasFlush::PlayCanvasEvent(
121 CanvasTranslator
* aTranslator
) const {
122 aTranslator
->Flush();
127 void RecordedCanvasFlush::Record(S
& aStream
) const {}
130 RecordedCanvasFlush::RecordedCanvasFlush(S
& aStream
)
131 : RecordedEventDerived(CANVAS_FLUSH
) {}
133 class RecordedTextureLock final
134 : public RecordedEventDerived
<RecordedTextureLock
> {
136 RecordedTextureLock(int64_t aTextureId
, const OpenMode aMode
)
137 : RecordedEventDerived(TEXTURE_LOCK
),
138 mTextureId(aTextureId
),
142 MOZ_IMPLICIT
RecordedTextureLock(S
& aStream
);
144 bool PlayCanvasEvent(CanvasTranslator
* aTranslator
) const;
147 void Record(S
& aStream
) const;
149 std::string
GetName() const final
{ return "TextureLock"; }
156 inline bool RecordedTextureLock::PlayCanvasEvent(
157 CanvasTranslator
* aTranslator
) const {
158 TextureData
* textureData
= aTranslator
->LookupTextureData(mTextureId
);
163 textureData
->Lock(mMode
);
168 void RecordedTextureLock::Record(S
& aStream
) const {
169 WriteElement(aStream
, mTextureId
);
170 WriteElement(aStream
, mMode
);
174 RecordedTextureLock::RecordedTextureLock(S
& aStream
)
175 : RecordedEventDerived(TEXTURE_LOCK
) {
176 ReadElement(aStream
, mTextureId
);
177 ReadElementConstrained(aStream
, mMode
, OpenMode::OPEN_NONE
,
178 OpenMode::OPEN_READ_WRITE_ASYNC
);
181 class RecordedTextureUnlock final
182 : public RecordedEventDerived
<RecordedTextureUnlock
> {
184 explicit RecordedTextureUnlock(int64_t aTextureId
)
185 : RecordedEventDerived(TEXTURE_UNLOCK
), mTextureId(aTextureId
) {}
188 MOZ_IMPLICIT
RecordedTextureUnlock(S
& aStream
);
190 bool PlayCanvasEvent(CanvasTranslator
* aTranslator
) const;
193 void Record(S
& aStream
) const;
195 std::string
GetName() const final
{ return "TextureUnlock"; }
201 inline bool RecordedTextureUnlock::PlayCanvasEvent(
202 CanvasTranslator
* aTranslator
) const {
203 TextureData
* textureData
= aTranslator
->LookupTextureData(mTextureId
);
208 textureData
->Unlock();
213 void RecordedTextureUnlock::Record(S
& aStream
) const {
214 WriteElement(aStream
, mTextureId
);
218 RecordedTextureUnlock::RecordedTextureUnlock(S
& aStream
)
219 : RecordedEventDerived(TEXTURE_UNLOCK
) {
220 ReadElement(aStream
, mTextureId
);
223 class RecordedCacheDataSurface final
224 : public RecordedEventDerived
<RecordedCacheDataSurface
> {
226 explicit RecordedCacheDataSurface(gfx::SourceSurface
* aSurface
)
227 : RecordedEventDerived(CACHE_DATA_SURFACE
), mSurface(aSurface
) {}
230 MOZ_IMPLICIT
RecordedCacheDataSurface(S
& aStream
);
232 bool PlayCanvasEvent(CanvasTranslator
* aTranslator
) const;
235 void Record(S
& aStream
) const;
237 std::string
GetName() const final
{ return "RecordedCacheDataSurface"; }
240 ReferencePtr mSurface
;
243 inline bool RecordedCacheDataSurface::PlayCanvasEvent(
244 CanvasTranslator
* aTranslator
) const {
245 gfx::SourceSurface
* surface
= aTranslator
->LookupSourceSurface(mSurface
);
250 RefPtr
<gfx::DataSourceSurface
> dataSurface
= surface
->GetDataSurface();
252 aTranslator
->AddDataSurface(mSurface
, std::move(dataSurface
));
257 void RecordedCacheDataSurface::Record(S
& aStream
) const {
258 WriteElement(aStream
, mSurface
);
262 RecordedCacheDataSurface::RecordedCacheDataSurface(S
& aStream
)
263 : RecordedEventDerived(CACHE_DATA_SURFACE
) {
264 ReadElement(aStream
, mSurface
);
267 class RecordedPrepareDataForSurface final
268 : public RecordedEventDerived
<RecordedPrepareDataForSurface
> {
270 explicit RecordedPrepareDataForSurface(const gfx::SourceSurface
* aSurface
)
271 : RecordedEventDerived(PREPARE_DATA_FOR_SURFACE
), mSurface(aSurface
) {}
274 MOZ_IMPLICIT
RecordedPrepareDataForSurface(S
& aStream
);
276 bool PlayCanvasEvent(CanvasTranslator
* aTranslator
) const;
279 void Record(S
& aStream
) const;
281 std::string
GetName() const final
{ return "RecordedPrepareDataForSurface"; }
284 ReferencePtr mSurface
;
287 inline bool RecordedPrepareDataForSurface::PlayCanvasEvent(
288 CanvasTranslator
* aTranslator
) const {
289 RefPtr
<gfx::DataSourceSurface
> dataSurface
=
290 aTranslator
->LookupDataSurface(mSurface
);
292 gfx::SourceSurface
* surface
= aTranslator
->LookupSourceSurface(mSurface
);
297 dataSurface
= surface
->GetDataSurface();
303 auto preparedMap
= MakeUnique
<gfx::DataSourceSurface::ScopedMap
>(
304 dataSurface
, gfx::DataSourceSurface::READ
);
305 if (!preparedMap
->IsMapped()) {
309 aTranslator
->SetPreparedMap(mSurface
, std::move(preparedMap
));
315 void RecordedPrepareDataForSurface::Record(S
& aStream
) const {
316 WriteElement(aStream
, mSurface
);
320 RecordedPrepareDataForSurface::RecordedPrepareDataForSurface(S
& aStream
)
321 : RecordedEventDerived(PREPARE_DATA_FOR_SURFACE
) {
322 ReadElement(aStream
, mSurface
);
325 class RecordedGetDataForSurface final
326 : public RecordedEventDerived
<RecordedGetDataForSurface
> {
328 explicit RecordedGetDataForSurface(const gfx::SourceSurface
* aSurface
)
329 : RecordedEventDerived(GET_DATA_FOR_SURFACE
), mSurface(aSurface
) {}
332 MOZ_IMPLICIT
RecordedGetDataForSurface(S
& aStream
);
334 bool PlayCanvasEvent(CanvasTranslator
* aTranslator
) const;
337 void Record(S
& aStream
) const;
339 std::string
GetName() const final
{ return "RecordedGetDataForSurface"; }
342 ReferencePtr mSurface
;
345 inline bool RecordedGetDataForSurface::PlayCanvasEvent(
346 CanvasTranslator
* aTranslator
) const {
347 gfx::SourceSurface
* surface
= aTranslator
->LookupSourceSurface(mSurface
);
352 UniquePtr
<gfx::DataSourceSurface::ScopedMap
> map
=
353 aTranslator
->GetPreparedMap(mSurface
);
358 int32_t dataFormatWidth
=
359 surface
->GetSize().width
* BytesPerPixel(surface
->GetFormat());
360 int32_t srcStride
= map
->GetStride();
361 if (dataFormatWidth
> srcStride
) {
365 char* src
= reinterpret_cast<char*>(map
->GetData());
366 char* endSrc
= src
+ (map
->GetSurface()->GetSize().height
* srcStride
);
367 while (src
< endSrc
) {
368 aTranslator
->ReturnWrite(src
, dataFormatWidth
);
376 void RecordedGetDataForSurface::Record(S
& aStream
) const {
377 WriteElement(aStream
, mSurface
);
381 RecordedGetDataForSurface::RecordedGetDataForSurface(S
& aStream
)
382 : RecordedEventDerived(GET_DATA_FOR_SURFACE
) {
383 ReadElement(aStream
, mSurface
);
386 class RecordedAddSurfaceAlias final
387 : public RecordedEventDerived
<RecordedAddSurfaceAlias
> {
389 RecordedAddSurfaceAlias(ReferencePtr aSurfaceAlias
,
390 const RefPtr
<gfx::SourceSurface
>& aActualSurface
)
391 : RecordedEventDerived(ADD_SURFACE_ALIAS
),
392 mSurfaceAlias(aSurfaceAlias
),
393 mActualSurface(aActualSurface
) {}
396 MOZ_IMPLICIT
RecordedAddSurfaceAlias(S
& aStream
);
398 bool PlayCanvasEvent(CanvasTranslator
* aTranslator
) const;
401 void Record(S
& aStream
) const;
403 std::string
GetName() const final
{ return "RecordedAddSurfaceAlias"; }
406 ReferencePtr mSurfaceAlias
;
407 ReferencePtr mActualSurface
;
410 inline bool RecordedAddSurfaceAlias::PlayCanvasEvent(
411 CanvasTranslator
* aTranslator
) const {
412 RefPtr
<gfx::SourceSurface
> surface
=
413 aTranslator
->LookupSourceSurface(mActualSurface
);
418 aTranslator
->AddSourceSurface(mSurfaceAlias
, surface
);
423 void RecordedAddSurfaceAlias::Record(S
& aStream
) const {
424 WriteElement(aStream
, mSurfaceAlias
);
425 WriteElement(aStream
, mActualSurface
);
429 RecordedAddSurfaceAlias::RecordedAddSurfaceAlias(S
& aStream
)
430 : RecordedEventDerived(ADD_SURFACE_ALIAS
) {
431 ReadElement(aStream
, mSurfaceAlias
);
432 ReadElement(aStream
, mActualSurface
);
435 class RecordedRemoveSurfaceAlias final
436 : public RecordedEventDerived
<RecordedRemoveSurfaceAlias
> {
438 explicit RecordedRemoveSurfaceAlias(ReferencePtr aSurfaceAlias
)
439 : RecordedEventDerived(REMOVE_SURFACE_ALIAS
),
440 mSurfaceAlias(aSurfaceAlias
) {}
443 MOZ_IMPLICIT
RecordedRemoveSurfaceAlias(S
& aStream
);
445 bool PlayCanvasEvent(CanvasTranslator
* aTranslator
) const;
448 void Record(S
& aStream
) const;
450 std::string
GetName() const final
{ return "RecordedRemoveSurfaceAlias"; }
453 ReferencePtr mSurfaceAlias
;
456 inline bool RecordedRemoveSurfaceAlias::PlayCanvasEvent(
457 CanvasTranslator
* aTranslator
) const {
458 aTranslator
->RemoveSourceSurface(mSurfaceAlias
);
463 void RecordedRemoveSurfaceAlias::Record(S
& aStream
) const {
464 WriteElement(aStream
, mSurfaceAlias
);
468 RecordedRemoveSurfaceAlias::RecordedRemoveSurfaceAlias(S
& aStream
)
469 : RecordedEventDerived(REMOVE_SURFACE_ALIAS
) {
470 ReadElement(aStream
, mSurfaceAlias
);
473 class RecordedDeviceChangeAcknowledged final
474 : public RecordedEventDerived
<RecordedDeviceChangeAcknowledged
> {
476 RecordedDeviceChangeAcknowledged()
477 : RecordedEventDerived(DEVICE_CHANGE_ACKNOWLEDGED
) {}
480 MOZ_IMPLICIT
RecordedDeviceChangeAcknowledged(S
& aStream
);
482 bool PlayCanvasEvent(CanvasTranslator
* aTranslator
) const;
485 void Record(S
& aStream
) const;
487 std::string
GetName() const final
{
488 return "RecordedDeviceChangeAcknowledged";
492 inline bool RecordedDeviceChangeAcknowledged::PlayCanvasEvent(
493 CanvasTranslator
* aTranslator
) const {
494 aTranslator
->DeviceChangeAcknowledged();
499 void RecordedDeviceChangeAcknowledged::Record(S
& aStream
) const {}
502 RecordedDeviceChangeAcknowledged::RecordedDeviceChangeAcknowledged(S
& aStream
)
503 : RecordedEventDerived(DEVICE_CHANGE_ACKNOWLEDGED
) {}
505 class RecordedNextTextureId final
506 : public RecordedEventDerived
<RecordedNextTextureId
> {
508 explicit RecordedNextTextureId(int64_t aNextTextureId
)
509 : RecordedEventDerived(NEXT_TEXTURE_ID
), mNextTextureId(aNextTextureId
) {}
512 MOZ_IMPLICIT
RecordedNextTextureId(S
& aStream
);
514 bool PlayCanvasEvent(CanvasTranslator
* aTranslator
) const;
517 void Record(S
& aStream
) const;
519 std::string
GetName() const final
{ return "RecordedNextTextureId"; }
522 int64_t mNextTextureId
;
525 inline bool RecordedNextTextureId::PlayCanvasEvent(
526 CanvasTranslator
* aTranslator
) const {
527 aTranslator
->SetNextTextureId(mNextTextureId
);
532 void RecordedNextTextureId::Record(S
& aStream
) const {
533 WriteElement(aStream
, mNextTextureId
);
537 RecordedNextTextureId::RecordedNextTextureId(S
& aStream
)
538 : RecordedEventDerived(NEXT_TEXTURE_ID
) {
539 ReadElement(aStream
, mNextTextureId
);
542 class RecordedTextureDestruction final
543 : public RecordedEventDerived
<RecordedTextureDestruction
> {
545 explicit RecordedTextureDestruction(int64_t aTextureId
)
546 : RecordedEventDerived(TEXTURE_DESTRUCTION
), mTextureId(aTextureId
) {}
549 MOZ_IMPLICIT
RecordedTextureDestruction(S
& aStream
);
551 bool PlayCanvasEvent(CanvasTranslator
* aTranslator
) const;
554 void Record(S
& aStream
) const;
556 std::string
GetName() const final
{ return "RecordedTextureDestruction"; }
562 inline bool RecordedTextureDestruction::PlayCanvasEvent(
563 CanvasTranslator
* aTranslator
) const {
564 aTranslator
->RemoveTexture(mTextureId
);
569 void RecordedTextureDestruction::Record(S
& aStream
) const {
570 WriteElement(aStream
, mTextureId
);
574 RecordedTextureDestruction::RecordedTextureDestruction(S
& aStream
)
575 : RecordedEventDerived(TEXTURE_DESTRUCTION
) {
576 ReadElement(aStream
, mTextureId
);
579 #define FOR_EACH_CANVAS_EVENT(f) \
580 f(CANVAS_BEGIN_TRANSACTION, RecordedCanvasBeginTransaction); \
581 f(CANVAS_END_TRANSACTION, RecordedCanvasEndTransaction); \
582 f(CANVAS_FLUSH, RecordedCanvasFlush); \
583 f(TEXTURE_LOCK, RecordedTextureLock); \
584 f(TEXTURE_UNLOCK, RecordedTextureUnlock); \
585 f(CACHE_DATA_SURFACE, RecordedCacheDataSurface); \
586 f(PREPARE_DATA_FOR_SURFACE, RecordedPrepareDataForSurface); \
587 f(GET_DATA_FOR_SURFACE, RecordedGetDataForSurface); \
588 f(ADD_SURFACE_ALIAS, RecordedAddSurfaceAlias); \
589 f(REMOVE_SURFACE_ALIAS, RecordedRemoveSurfaceAlias); \
590 f(DEVICE_CHANGE_ACKNOWLEDGED, RecordedDeviceChangeAcknowledged); \
591 f(NEXT_TEXTURE_ID, RecordedNextTextureId); \
592 f(TEXTURE_DESTRUCTION, RecordedTextureDestruction);
594 } // namespace layers
595 } // namespace mozilla
597 #endif // mozilla_layers_RecordedCanvasEventImpl_h