blob: a62a289d9081419b7560e83e220d5cba833ccbc4 [file] [log] [blame]
// 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