19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project **
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** Copyright 2006, The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project **
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** Licensed under the Apache License, Version 2.0 (the "License");
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** you may not use this file except in compliance with the License.
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project **
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project **     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project **
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** Unless required by applicable law or agreed to in writing, software
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** distributed under the License is distributed on an "AS IS" BASIS,
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_OPENGLES_BUFFER_OBJECT_MANAGER_H
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_OPENGLES_BUFFER_OBJECT_MANAGER_H
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stddef.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Atomic.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/RefBase.h>
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/KeyedVector.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Errors.h>
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <GLES/gl.h>
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "Tokenizer.h"
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "TokenManager.h"
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace gl {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct buffer_t {
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLsizeiptr      size;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLenum          usage;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t*        data;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t        name;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass EGLBufferObjectManager : public TokenManager
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLBufferObjectManager();
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ~EGLBufferObjectManager();
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // protocol for sp<>
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    inline  void    incStrong(const void* id) const;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    inline  void    decStrong(const void* id) const;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    typedef void    weakref_type;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gl::buffer_t const* bind(GLuint buffer);
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int                 allocateStore(gl::buffer_t* bo, GLsizeiptr size, GLenum usage);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void                deleteBuffers(GLsizei n, const GLuint* buffers);
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mutable volatile int32_t            mCount;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mutable Mutex                       mLock;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    KeyedVector<GLuint, gl::buffer_t*>  mBuffers;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid EGLBufferObjectManager::incStrong(const void* id) const {
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    android_atomic_inc(&mCount);
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid EGLBufferObjectManager::decStrong(const void* id) const {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (android_atomic_dec(&mCount) == 1) {
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete this;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ANDROID_OPENGLES_BUFFER_OBJECT_MANAGER_H
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
86