/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once

#include <assert.h>
#include <GLES/gl.h>
#include <memory>

enum class NamedObjectType {
    VERTEXBUFFER,
    TEXTURE,
    RENDERBUFFER,
    FRAMEBUFFER,
    SHADER_OR_PROGRAM,
    NUM_OBJECT_TYPES  // Must be last
};

enum class ShaderProgramType {
    PROGRAM,
    VERTEX_SHADER,
    FRAGMENT_SHADER
};

//
// Class GenNameInfo - this class contains the type of an GL object to be
//                     generated. It also contains shader type when generating
//                     shader object.
//                     It is used by GlobalNameSpace::genName.
//                     When generating an object that is not shader or program,
//                     a NamedObjectType parameter should be passed to the
//                     constructor. When generating shader / program object, the
//                     ShaderProgramType should be passed to the constructor.
// Example:
//          GlobalNameSpace globalNameSpace;
//          GenNameInfo genTexture(NamedObjectType::TEXTURE);
//          unsigned int texID = globalNameSpace.genName(genTexture);
//          GenNameInfo genShader(ShaderProgramType::FRAGMENT_SHADER);
//          unsigned int shaderID = globalNameSpace.genName(genShader);

struct GenNameInfo {
    NamedObjectType m_type = (NamedObjectType)0;
    // only used for NamedObjectType::SHADER_OR_PROGRAM
    ShaderProgramType m_shaderProgramType = (ShaderProgramType)0;
    GenNameInfo() = delete;
    // constructor for generating non-shader object
    explicit GenNameInfo(NamedObjectType type) : m_type(type) {
        assert(type != NamedObjectType::SHADER_OR_PROGRAM);
    }
    // constructor for generating shader object
    explicit GenNameInfo(ShaderProgramType shaderProgramType) :
        m_type(NamedObjectType::SHADER_OR_PROGRAM),
        m_shaderProgramType(shaderProgramType) {}
};


typedef unsigned long long ObjectLocalName;

class GlobalNameSpace;

// NamedObject is used to manage GPU names.
// It generates / releases GPU names.
// NamedObject is expected to be encapsulated in a shared pointer when used (see
// NamedObjectPtr). The main purpose to use smart pointers is to have reference
// counters for texture objects, which are frequently shared across contexts and
// share groups when used in EGLImages. The specification of EGLImage says:
//
//    Once an EGLImage is created from an EGLImage source, the memory associated
//    with the EGLImage source will remain allocated (and all EGLImage siblings
//    in all client API contexts will be useable) as long as either of the
//    following conditions is true:
//      A)  Any EGLImage siblings exist in any client API context
//      B)  The EGLImage object exists inside EGL
// Reference: 2.5.2  Lifetime and Usage of EGLImages in
// https://www.khronos.org/registry/egl/extensions/KHR/EGL_KHR_image_base.txt
//
// In our situation, "the memory associated with the EGLImage source" means the
// textures. Thus a shared pointer is needed.

class NamedObject {
public:
    NamedObject(GenNameInfo genNameInfo,
                GlobalNameSpace *globalNameSpace);
    ~NamedObject();
    unsigned int getGlobalName() const {return m_globalName;}
private:
    // m_globalName is the name generated by GPU
    unsigned int m_globalName = 0;
    NamedObjectType m_type;
    GlobalNameSpace *m_globalNameSpace;
};

typedef std::shared_ptr<NamedObject> NamedObjectPtr;
