@@ -99,7 +99,8 @@ void CommandEncoder::Cleanup() {
9999
100100RefPtr<WebGPUChild> CommandEncoder::GetBridge () { return mBridge ; }
101101
102- void CommandEncoder::TrackPresentationContext (CanvasContext* aTargetContext) {
102+ void CommandEncoder::TrackPresentationContext (
103+ WeakPtr<CanvasContext> aTargetContext) {
103104 if (aTargetContext) {
104105 mPresentationContexts .AppendElement (aTargetContext);
105106 }
@@ -256,7 +257,8 @@ void CommandEncoder::ResolveQuerySet(QuerySet& aQuerySet, uint32_t aFirstQuery,
256257 aQueryCount, aDestination.mId , aDestinationOffset);
257258}
258259
259- void CommandEncoder::EndComputePass (ffi::WGPURecordedComputePass& aPass) {
260+ void CommandEncoder::EndComputePass (ffi::WGPURecordedComputePass& aPass,
261+ CanvasContextArray& aCanvasContexts) {
260262 // Because this can be called during child Cleanup, we need to check
261263 // that the bridge is still alive.
262264 if (!mBridge ) {
@@ -271,11 +273,16 @@ void CommandEncoder::EndComputePass(ffi::WGPURecordedComputePass& aPass) {
271273 }
272274 mState = CommandEncoderState::Open;
273275
276+ for (const auto & context : aCanvasContexts) {
277+ TrackPresentationContext (context);
278+ }
279+
274280 ffi::wgpu_compute_pass_finish (mBridge ->GetClient (), mParent ->mId , mId ,
275281 &aPass);
276282}
277283
278- void CommandEncoder::EndRenderPass (ffi::WGPURecordedRenderPass& aPass) {
284+ void CommandEncoder::EndRenderPass (ffi::WGPURecordedRenderPass& aPass,
285+ CanvasContextArray& aCanvasContexts) {
279286 // Because this can be called during child Cleanup, we need to check
280287 // that the bridge is still alive.
281288 if (!mBridge ) {
@@ -290,6 +297,10 @@ void CommandEncoder::EndRenderPass(ffi::WGPURecordedRenderPass& aPass) {
290297 }
291298 mState = CommandEncoderState::Open;
292299
300+ for (const auto & context : aCanvasContexts) {
301+ TrackPresentationContext (context);
302+ }
303+
293304 ffi::wgpu_render_pass_finish (mBridge ->GetClient (), mParent ->mId , mId , &aPass);
294305}
295306
0 commit comments