165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/*
265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Copyright (C) 2011 The Android Open Source Project
365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Licensed under the Apache License, Version 2.0 (the "License");
565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * you may not use this file except in compliance with the License.
665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * You may obtain a copy of the License at
765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *      http://www.apache.org/licenses/LICENSE-2.0
965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
1065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Unless required by applicable law or agreed to in writing, software
1165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * distributed under the License is distributed on an "AS IS" BASIS,
1265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * See the License for the specific language governing permissions and
1465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * limitations under the License.
1565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */
1665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
1765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "base/logging.h"
1865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
1965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "core/gl_env.h"
2065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "core/vertex_frame.h"
2165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <GLES2/gl2ext.h>
2365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <EGL/egl.h>
2465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennnamespace android {
2665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennnamespace filterfw {
2765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// GL Extensions that are dynamically looked up at runtime
2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennstatic PFNGLMAPBUFFEROESPROC    GLMapBufferOES    = NULL;
3065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennstatic PFNGLUNMAPBUFFEROESPROC  GLUnmapBufferOES  = NULL;
3165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennVertexFrame::VertexFrame(int size)
3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  : vbo_(0),
3465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    size_(size) {
3565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
3665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennVertexFrame::~VertexFrame() {
3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  glDeleteBuffers(1, &vbo_);
3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennbool VertexFrame::CreateBuffer() {
4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  glGenBuffers(1, &vbo_);
4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return !GLEnv::CheckGLError("Generating VBO");
4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennbool VertexFrame::WriteData(const uint8_t* data, int size) {
4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Create buffer if not created already
4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  const bool first_upload = !HasVBO();
4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (first_upload && !CreateBuffer()) {
5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    ALOGE("VertexFrame: Could not create vertex buffer!");
5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return false;
5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Upload the data
5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  glBindBuffer(GL_ARRAY_BUFFER, vbo_);
5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (GLEnv::CheckGLError("VBO Bind Buffer"))
5765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return false;
5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (first_upload && size == size_)
6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);
6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  else if (!first_upload && size <= size_)
6265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    glBufferSubData(GL_ARRAY_BUFFER, 0, size, data);
6365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  else {
6465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    ALOGE("VertexFrame: Attempting to upload more data (%d bytes) than fits "
6565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn         "inside the vertex frame (%d bytes)!", size, size_);
6665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return false;
6765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
6865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Make sure it worked
7065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (GLEnv::CheckGLError("VBO Data Upload"))
7165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return false;
7265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Subsequent uploads are now bound to the size given here
7465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  size_ = size;
7565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return true;
7765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
7865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint VertexFrame::Size() const {
8065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return size_;
8165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
8265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
8365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} // namespace filterfw
8465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} // namespace android
85