1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project **
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ** Copyright 2006, The Android Open Source Project
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project **
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ** Licensed under the Apache License, Version 2.0 (the "License");
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ** you may not use this file except in compliance with the License.
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ** You may obtain a copy of the License at
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project **
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project **     http://www.apache.org/licenses/LICENSE-2.0
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project **
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ** Unless required by applicable law or agreed to in writing, software
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ** distributed under the License is distributed on an "AS IS" BASIS,
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ** See the License for the specific language governing permissions and
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ** limitations under the License.
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef ANDROID_OPENGLES_BUFFER_OBJECT_MANAGER_H
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ANDROID_OPENGLES_BUFFER_OBJECT_MANAGER_H
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stddef.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Atomic.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/RefBase.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/KeyedVector.h>
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h>
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Tokenizer.h"
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "TokenManager.h"
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl {
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct buffer_t {
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLsizeiptr      size;
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLenum          usage;
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint8_t*        data;
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t        name;
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass EGLBufferObjectManager : public TokenManager
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBufferObjectManager();
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ~EGLBufferObjectManager();
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // protocol for sp<>
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline  void    incStrong(const void* id) const;
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline  void    decStrong(const void* id) const;
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    typedef void    weakref_type;
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl::buffer_t const* bind(GLuint buffer);
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int                 allocateStore(gl::buffer_t* bo, GLsizeiptr size, GLenum usage);
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void                deleteBuffers(GLsizei n, const GLuint* buffers);
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mutable volatile int32_t            mCount;
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mutable Mutex                       mLock;
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    KeyedVector<GLuint, gl::buffer_t*>  mBuffers;
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid EGLBufferObjectManager::incStrong(const void* id) const {
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    android_atomic_inc(&mCount);
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid EGLBufferObjectManager::decStrong(const void* id) const {
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_dec(&mCount) == 1) {
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete this;
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_OPENGLES_BUFFER_OBJECT_MANAGER_H
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
86