OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/resources/video_resource_updater.h" | 5 #include "cc/resources/video_resource_updater.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
11 #include "cc/base/util.h" | 11 #include "cc/base/util.h" |
12 #include "cc/output/gl_renderer.h" | 12 #include "cc/output/gl_renderer.h" |
13 #include "cc/resources/resource_provider.h" | 13 #include "cc/resources/resource_provider.h" |
14 #include "gpu/GLES2/gl2extchromium.h" | 14 #include "gpu/GLES2/gl2extchromium.h" |
15 #include "gpu/command_buffer/client/gles2_interface.h" | 15 #include "gpu/command_buffer/client/gles2_interface.h" |
16 #include "media/base/video_frame.h" | 16 #include "media/base/video_frame.h" |
17 #include "media/blink/skcanvas_video_renderer.h" | 17 #include "media/blink/skcanvas_video_renderer.h" |
18 #include "third_party/khronos/GLES2/gl2.h" | 18 #include "third_party/khronos/GLES2/gl2.h" |
19 #include "third_party/khronos/GLES2/gl2ext.h" | 19 #include "third_party/khronos/GLES2/gl2ext.h" |
20 #include "ui/gfx/geometry/size_conversions.h" | 20 #include "ui/gfx/geometry/size_conversions.h" |
21 | 21 |
22 namespace cc { | 22 namespace cc { |
23 | 23 |
24 namespace { | 24 namespace { |
25 | 25 |
26 const ResourceFormat kRGBResourceFormat = RGBA_8888; | 26 const ResourceFormat kRGBResourceFormat = RGBA_8888; |
27 | 27 |
28 class SyncPointClientImpl : public media::VideoFrame::SyncPointClient { | 28 class SyncPointClientImpl : public media::VideoFrame::SyncPointClient { |
29 public: | 29 public: |
30 explicit SyncPointClientImpl(gpu::gles2::GLES2Interface* gl) : gl_(gl) {} | 30 explicit SyncPointClientImpl(gpu::gles2::GLES2Interface* gl, |
| 31 uint32 sync_point) |
| 32 : gl_(gl), sync_point_(sync_point) {} |
31 ~SyncPointClientImpl() override {} | 33 ~SyncPointClientImpl() override {} |
32 uint32 InsertSyncPoint() override { return gl_->InsertSyncPointCHROMIUM(); } | 34 uint32 InsertSyncPoint() override { |
| 35 if (sync_point_) |
| 36 return sync_point_; |
| 37 return gl_->InsertSyncPointCHROMIUM(); |
| 38 } |
33 void WaitSyncPoint(uint32 sync_point) override { | 39 void WaitSyncPoint(uint32 sync_point) override { |
| 40 if (!sync_point) |
| 41 return; |
34 gl_->WaitSyncPointCHROMIUM(sync_point); | 42 gl_->WaitSyncPointCHROMIUM(sync_point); |
| 43 if (sync_point_) { |
| 44 gl_->WaitSyncPointCHROMIUM(sync_point_); |
| 45 sync_point_ = 0; |
| 46 } |
35 } | 47 } |
36 | 48 |
37 private: | 49 private: |
38 gpu::gles2::GLES2Interface* gl_; | 50 gpu::gles2::GLES2Interface* gl_; |
| 51 uint32 sync_point_; |
39 }; | 52 }; |
40 | 53 |
41 } // namespace | 54 } // namespace |
42 | 55 |
43 VideoResourceUpdater::PlaneResource::PlaneResource( | 56 VideoResourceUpdater::PlaneResource::PlaneResource( |
44 unsigned int resource_id, | 57 unsigned int resource_id, |
45 const gfx::Size& resource_size, | 58 const gfx::Size& resource_size, |
46 ResourceFormat resource_format, | 59 ResourceFormat resource_format, |
47 gpu::Mailbox mailbox) | 60 gpu::Mailbox mailbox) |
48 : resource_id(resource_id), | 61 : resource_id(resource_id), |
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 void VideoResourceUpdater::ReturnTexture( | 381 void VideoResourceUpdater::ReturnTexture( |
369 base::WeakPtr<VideoResourceUpdater> updater, | 382 base::WeakPtr<VideoResourceUpdater> updater, |
370 const scoped_refptr<media::VideoFrame>& video_frame, | 383 const scoped_refptr<media::VideoFrame>& video_frame, |
371 uint32 sync_point, | 384 uint32 sync_point, |
372 bool lost_resource, | 385 bool lost_resource, |
373 BlockingTaskRunner* main_thread_task_runner) { | 386 BlockingTaskRunner* main_thread_task_runner) { |
374 // TODO(dshwang) this case should be forwarded to the decoder as lost | 387 // TODO(dshwang) this case should be forwarded to the decoder as lost |
375 // resource. | 388 // resource. |
376 if (lost_resource || !updater.get()) | 389 if (lost_resource || !updater.get()) |
377 return; | 390 return; |
378 // VideoFrame::UpdateReleaseSyncPoint() creates new sync point using the same | 391 // Update the release sync point in |video_frame| with |sync_point| |
379 // GL context which created the given |sync_point|, so discard the | 392 // returned by the compositor and emit a WaitSyncPointCHROMIUM on |
380 // |sync_point|. | 393 // |video_frame|'s previous sync point using the current GL context. |
381 SyncPointClientImpl client(updater->context_provider_->ContextGL()); | 394 SyncPointClientImpl client(updater->context_provider_->ContextGL(), |
| 395 sync_point); |
382 video_frame->UpdateReleaseSyncPoint(&client); | 396 video_frame->UpdateReleaseSyncPoint(&client); |
383 } | 397 } |
384 | 398 |
385 VideoFrameExternalResources VideoResourceUpdater::CreateForHardwarePlanes( | 399 VideoFrameExternalResources VideoResourceUpdater::CreateForHardwarePlanes( |
386 const scoped_refptr<media::VideoFrame>& video_frame) { | 400 const scoped_refptr<media::VideoFrame>& video_frame) { |
387 TRACE_EVENT0("cc", "VideoResourceUpdater::CreateForHardwarePlanes"); | 401 TRACE_EVENT0("cc", "VideoResourceUpdater::CreateForHardwarePlanes"); |
388 media::VideoFrame::Format frame_format = video_frame->format(); | 402 media::VideoFrame::Format frame_format = video_frame->format(); |
389 | 403 |
390 DCHECK_EQ(frame_format, media::VideoFrame::NATIVE_TEXTURE); | 404 DCHECK_EQ(frame_format, media::VideoFrame::NATIVE_TEXTURE); |
391 if (frame_format != media::VideoFrame::NATIVE_TEXTURE) | 405 if (frame_format != media::VideoFrame::NATIVE_TEXTURE) |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 resource_it->ref_count = 0; | 466 resource_it->ref_count = 0; |
453 updater->DeleteResource(resource_it); | 467 updater->DeleteResource(resource_it); |
454 return; | 468 return; |
455 } | 469 } |
456 | 470 |
457 --resource_it->ref_count; | 471 --resource_it->ref_count; |
458 DCHECK_GE(resource_it->ref_count, 0); | 472 DCHECK_GE(resource_it->ref_count, 0); |
459 } | 473 } |
460 | 474 |
461 } // namespace cc | 475 } // namespace cc |
OLD | NEW |