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
213aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall#include <atomic>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stddef.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
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:
673aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall    mutable std::atomic_size_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
7292dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzynvoid EGLBufferObjectManager::incStrong(const void* /*id*/) const {
733aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall    mCount.fetch_add(1, std::memory_order_relaxed);
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
7592dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzynvoid EGLBufferObjectManager::decStrong(const void* /*id*/) const {
763aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall    if (mCount.fetch_sub(1, std::memory_order_release) == 0) {
773aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall        std::atomic_thread_fence(std::memory_order_acquire);
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete this;
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_OPENGLES_BUFFER_OBJECT_MANAGER_H
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
87