Index: services/gfx/compositor/render/render_image.cc |
diff --git a/services/gfx/compositor/render/render_image.cc b/services/gfx/compositor/render/render_image.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a62a289d9081419b7560e83e220d5cba833ccbc4 |
--- /dev/null |
+++ b/services/gfx/compositor/render/render_image.cc |
@@ -0,0 +1,74 @@ |
+// 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 { |
+ |
+class 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_); |
+ } |
+ |
+ ~Releaser() { task_runner_->PostTask(FROM_HERE, release_task_); } |
+ |
+ private: |
+ scoped_refptr<base::TaskRunner> const task_runner_; |
+ base::Closure const release_task_; |
+}; |
+ |
+class RenderImage::Generator : public mojo::skia::MailboxTextureImageGenerator { |
+ public: |
+ Generator(const std::shared_ptr<Releaser>& releaser, |
+ const GLbyte mailbox_name[GL_MAILBOX_SIZE_CHROMIUM], |
+ GLuint sync_point, |
+ uint32_t width, |
+ uint32_t height) |
+ : MailboxTextureImageGenerator(mailbox_name, sync_point, width, height), |
+ releaser_(releaser) { |
+ DCHECK(releaser_); |
+ } |
+ |
+ ~Generator() override {} |
+ |
+ private: |
+ std::shared_ptr<Releaser> releaser_; |
+}; |
+ |
+RenderImage::RenderImage(const skia::RefPtr<SkImage>& image, |
+ const std::shared_ptr<Releaser>& releaser) |
+ : image_(image), releaser_(releaser) { |
+ DCHECK(image_); |
+ DCHECK(releaser_); |
+} |
+ |
+RenderImage::~RenderImage() {} |
+ |
+std::shared_ptr<RenderImage> RenderImage::CreateFromMailboxTexture( |
+ const GLbyte mailbox_name[GL_MAILBOX_SIZE_CHROMIUM], |
+ GLuint sync_point, |
+ uint32_t width, |
+ uint32_t height, |
+ const scoped_refptr<base::TaskRunner>& task_runner, |
+ const base::Closure& release_task) { |
+ std::shared_ptr<Releaser> releaser = |
+ std::make_shared<Releaser>(task_runner, release_task); |
+ skia::RefPtr<SkImage> image = skia::AdoptRef(SkImage::NewFromGenerator( |
+ new Generator(releaser, mailbox_name, sync_point, width, height))); |
+ if (!image) |
+ return nullptr; |
+ |
+ return std::make_shared<RenderImage>(image, releaser); |
+} |
+ |
+} // namespace compositor |