| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "services/gfx/compositor/render/render_image.h" |
| |
| #include "base/bind.h" |
| #include "base/location.h" |
| #include "base/logging.h" |
| #include "mojo/skia/ganesh_image_factory.h" |
| #include "third_party/skia/include/core/SkImage.h" |
| |
| namespace compositor { |
| |
| // Invokes the release callback when both the Generator and the RenderImage |
| // have been freed. Note that the Generator may outlive the RenderImage. |
| class RenderImage::Releaser |
| : public base::RefCountedThreadSafe<RenderImage::Releaser> { |
| public: |
| Releaser(const scoped_refptr<base::TaskRunner>& task_runner, |
| const base::Closure& release_task) |
| : task_runner_(task_runner), release_task_(release_task) { |
| DCHECK(task_runner_); |
| } |
| |
| private: |
| friend class base::RefCountedThreadSafe<RenderImage::Releaser>; |
| |
| ~Releaser() { task_runner_->PostTask(FROM_HERE, release_task_); } |
| |
| scoped_refptr<base::TaskRunner> const task_runner_; |
| base::Closure const release_task_; |
| }; |
| |
| class RenderImage::Generator : public mojo::skia::MailboxTextureImageGenerator { |
| public: |
| Generator(const scoped_refptr<Releaser>& releaser, |
| const GLbyte mailbox_name[GL_MAILBOX_SIZE_CHROMIUM], |
| GLuint sync_point, |
| uint32_t width, |
| uint32_t height, |
| GrSurfaceOrigin origin) |
| : MailboxTextureImageGenerator(mailbox_name, |
| sync_point, |
| width, |
| height, |
| origin), |
| releaser_(releaser) { |
| DCHECK(releaser_); |
| } |
| |
| ~Generator() override {} |
| |
| private: |
| scoped_refptr<Releaser> releaser_; |
| }; |
| |
| RenderImage::RenderImage(const skia::RefPtr<SkImage>& image, |
| const scoped_refptr<Releaser>& releaser) |
| : image_(image), releaser_(releaser) { |
| DCHECK(image_); |
| DCHECK(releaser_); |
| } |
| |
| RenderImage::~RenderImage() {} |
| |
| scoped_refptr<RenderImage> RenderImage::CreateFromMailboxTexture( |
| const GLbyte mailbox_name[GL_MAILBOX_SIZE_CHROMIUM], |
| GLuint sync_point, |
| uint32_t width, |
| uint32_t height, |
| mojo::gfx::composition::MailboxTextureResource::Origin origin, |
| const scoped_refptr<base::TaskRunner>& task_runner, |
| const base::Closure& release_task) { |
| scoped_refptr<Releaser> releaser = new Releaser(task_runner, release_task); |
| skia::RefPtr<SkImage> image = skia::AdoptRef(SkImage::NewFromGenerator( |
| new Generator(releaser, mailbox_name, sync_point, width, height, |
| origin == mojo::gfx::composition::MailboxTextureResource:: |
| Origin::BOTTOM_LEFT |
| ? kBottomLeft_GrSurfaceOrigin |
| : kTopLeft_GrSurfaceOrigin))); |
| if (!image) |
| return nullptr; |
| |
| return new RenderImage(image, releaser); |
| } |
| |
| } // namespace compositor |