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 RennVertexFrame::VertexFrame(int size)
2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  : vbo_(0),
3065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    size_(size) {
3165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennVertexFrame::~VertexFrame() {
3465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  glDeleteBuffers(1, &vbo_);
3565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
3665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennbool VertexFrame::CreateBuffer() {
3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  glGenBuffers(1, &vbo_);
3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return !GLEnv::CheckGLError("Generating VBO");
4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennbool VertexFrame::WriteData(const uint8_t* data, int size) {
4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Create buffer if not created already
4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  const bool first_upload = !HasVBO();
4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (first_upload && !CreateBuffer()) {
4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    ALOGE("VertexFrame: Could not create vertex buffer!");
4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return false;
4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Upload the data
5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  glBindBuffer(GL_ARRAY_BUFFER, vbo_);
5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (GLEnv::CheckGLError("VBO Bind Buffer"))
5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return false;
5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (first_upload && size == size_)
5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);
5765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  else if (!first_upload && size <= size_)
5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    glBufferSubData(GL_ARRAY_BUFFER, 0, size, data);
5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  else {
6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    ALOGE("VertexFrame: Attempting to upload more data (%d bytes) than fits "
6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn         "inside the vertex frame (%d bytes)!", size, size_);
6265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return false;
6365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
6465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Make sure it worked
6665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (GLEnv::CheckGLError("VBO Data Upload"))
6765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return false;
6865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Subsequent uploads are now bound to the size given here
7065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  size_ = size;
7165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return true;
7365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
7465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint VertexFrame::Size() const {
7665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return size_;
7765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
7865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} // namespace filterfw
8065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} // namespace android
81