1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ** Copyright 2008, The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project **
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ** Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ** you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ** You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project **
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project **     http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project **
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ** Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ** distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ** See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ** limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stddef.h>
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Atomic.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/RefBase.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/KeyedVector.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "BufferObjectManager.h"
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace gl;
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBufferObjectManager::EGLBufferObjectManager()
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project: TokenManager(), mCount(0)
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBufferObjectManager::~EGLBufferObjectManager()
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // destroy all the buffer objects and their storage
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLsizei n = mBuffers.size();
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (GLsizei i=0 ; i<n ; i++) {
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        buffer_t* bo = mBuffers.valueAt(i);
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        free(bo->data);
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete bo;
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbuffer_t const* EGLBufferObjectManager::bind(GLuint buffer)
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Mutex::Autolock _l(mLock);
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t i = mBuffers.indexOfKey(buffer);
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (i >= 0) {
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return mBuffers.valueAt(i);
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer_t* bo = new buffer_t;
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bo->data = 0;
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bo->usage = GL_STATIC_DRAW;
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bo->size = 0;
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bo->name = buffer;
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mBuffers.add(buffer, bo);
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return bo;
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint EGLBufferObjectManager::allocateStore(buffer_t* bo,
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLsizeiptr size, GLenum usage)
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Mutex::Autolock _l(mLock);
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (size != bo->size) {
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       uint8_t* data = (uint8_t*)malloc(size);
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (data == 0)
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return -1;
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        free(bo->data);
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        bo->data = data;
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        bo->size = size;
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bo->usage = usage;
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid EGLBufferObjectManager::deleteBuffers(GLsizei n, const GLuint* buffers)
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Mutex::Autolock _l(mLock);
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while (n--) {
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLuint t = *buffers++;
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (t) {
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t index = mBuffers.indexOfKey(t);
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (index >= 0) {
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                buffer_t* bo = mBuffers.valueAt(index);
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                free(bo->data);
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                mBuffers.removeItemsAt(index);
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                delete bo;
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
104