blob: a564c1b5d74df8625d756dbcae834048bbb966b7 [file] [log] [blame]
/*
* Copyright 2015 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "cobalt/renderer/backend/egl/texture.h"
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include "cobalt/renderer/backend/egl/graphics_context.h"
#include "cobalt/renderer/backend/egl/resource_context.h"
#include "cobalt/renderer/backend/egl/texture_data.h"
#include "cobalt/renderer/backend/egl/texture_data_cpu.h"
#include "cobalt/renderer/backend/egl/utils.h"
namespace cobalt {
namespace renderer {
namespace backend {
TextureEGL::TextureEGL(GraphicsContextEGL* graphics_context,
scoped_ptr<TextureDataEGL> texture_source_data,
bool bgra_supported)
: graphics_context_(graphics_context),
size_(texture_source_data->GetSize()),
format_(texture_source_data->GetFormat()) {
gl_handle_ =
texture_source_data->ConvertToTexture(graphics_context_, bgra_supported);
}
TextureEGL::TextureEGL(GraphicsContextEGL* graphics_context,
const RawTextureMemoryEGL* data, intptr_t offset,
const math::Size& size, GLenum format,
int pitch_in_bytes, bool bgra_supported)
: graphics_context_(graphics_context), size_(size), format_(format) {
gl_handle_ = data->CreateTexture(graphics_context_, offset, size, format,
pitch_in_bytes, bgra_supported);
}
TextureEGL::TextureEGL(
GraphicsContextEGL* graphics_context,
const scoped_refptr<PBufferRenderTargetEGL>& render_target)
: graphics_context_(graphics_context),
size_(render_target->GetSize()),
format_(GL_RGBA) {
GraphicsContextEGL::ScopedMakeCurrent scoped_make_current(graphics_context_);
source_render_target_ = render_target;
// First we create the OpenGL texture object and maintain a handle to it.
GL_CALL(glGenTextures(1, &gl_handle_));
GL_CALL(glBindTexture(GL_TEXTURE_2D, gl_handle_));
SetupInitialTextureParameters();
// This call attaches the EGL PBuffer object to the currently bound OpenGL
// texture object, effectively allowing the PBO render target to be used
// as a texture by referencing gl_handle_ from now on.
EGL_CALL(eglBindTexImage(render_target->display(),
render_target->GetSurface(),
EGL_BACK_BUFFER));
GL_CALL(glBindTexture(GL_TEXTURE_2D, 0));
}
TextureEGL::~TextureEGL() {
GraphicsContextEGL::ScopedMakeCurrent scoped_make_current(graphics_context_);
if (source_render_target_) {
EGL_CALL(eglReleaseTexImage(source_render_target_->display(),
source_render_target_->GetSurface(),
EGL_BACK_BUFFER));
}
GL_CALL(glDeleteTextures(1, &gl_handle_));
}
const math::Size& TextureEGL::GetSize() const { return size_; }
GLenum TextureEGL::GetFormat() const { return format_; }
} // namespace backend
} // namespace renderer
} // namespace cobalt