blob: 4545c5b086b64e7c52bae4a91df57964446cdb7b [file] [log] [blame]
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "media/gpu/gles2_decoder_helper.h"
#include <memory>
#include "base/check_op.h"
#include "base/memory/raw_ptr.h"
#include "base/threading/thread_checker.h"
#include "gpu/command_buffer/common/gles2_cmd_utils.h"
#include "gpu/command_buffer/common/mailbox.h"
#include "gpu/command_buffer/service/context_group.h"
#include "gpu/command_buffer/service/decoder_context.h"
#include "gpu/command_buffer/service/mailbox_manager.h"
#include "ui/gl/gl_context.h"
#include "ui/gl/scoped_binders.h"
using gpu::gles2::AbstractTexture;
namespace media {
class GLES2DecoderHelperImpl : public GLES2DecoderHelper {
public:
explicit GLES2DecoderHelperImpl(gpu::DecoderContext* decoder)
: decoder_(decoder) {
DCHECK(decoder_);
gpu::gles2::ContextGroup* group = decoder_->GetContextGroup();
mailbox_manager_ = group->mailbox_manager();
DCHECK(mailbox_manager_);
}
GLES2DecoderHelperImpl(const GLES2DecoderHelperImpl&) = delete;
GLES2DecoderHelperImpl& operator=(const GLES2DecoderHelperImpl&) = delete;
bool MakeContextCurrent() override {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
return decoder_->MakeCurrent();
}
std::unique_ptr<AbstractTexture> CreateTexture(GLenum target,
GLenum internal_format,
GLsizei width,
GLsizei height,
GLenum format,
GLenum type) override {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(decoder_->GetGLContext()->IsCurrent(nullptr));
std::unique_ptr<AbstractTexture> texture =
decoder_->CreateAbstractTexture(target, internal_format, width, height,
1, // depth
0, // border
format, type);
texture->SetParameteri(GL_TEXTURE_MAG_FILTER, GL_LINEAR);
texture->SetParameteri(GL_TEXTURE_MIN_FILTER, GL_LINEAR);
texture->SetParameteri(GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
texture->SetParameteri(GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// TODO(sandersd): Do we always want to allocate for GL_TEXTURE_2D?
if (target == GL_TEXTURE_2D) {
gl::ScopedTextureBinder scoped_binder(target, texture->service_id());
glTexImage2D(target, // target
0, // level
internal_format, // internal_format
width, // width
height, // height
0, // border
format, // format
type, // type
nullptr); // data
}
return texture;
}
gl::GLContext* GetGLContext() override {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
return decoder_->GetGLContext();
}
private:
gpu::Mailbox CreateLegacyMailbox(AbstractTexture* texture) override {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
gpu::Mailbox mailbox = gpu::Mailbox::GenerateLegacyMailbox();
mailbox_manager_->ProduceTexture(mailbox, texture->GetTextureBase());
return mailbox;
}
raw_ptr<gpu::DecoderContext> decoder_;
raw_ptr<gpu::MailboxManager> mailbox_manager_;
THREAD_CHECKER(thread_checker_);
};
// static
std::unique_ptr<GLES2DecoderHelper> GLES2DecoderHelper::Create(
gpu::DecoderContext* decoder) {
return std::make_unique<GLES2DecoderHelperImpl>(decoder);
}
} // namespace media