/*
* Copyright (C) 2011 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.
*/
#ifndef _LIBRENDER_RENDER_CONTEXT_H
#define _LIBRENDER_RENDER_CONTEXT_H

#include "base/files/Stream.h"
#include "GLDecoderContextData.h"

#include <EGL/egl.h>

#include <memory>

// Type of handles, a.k.a. "object names" in the GL specification.
// These are integers used to uniquely identify a resource of a given type.
typedef uint32_t HandleType;

// Tracks all the possible OpenGL ES API versions.
enum GLESApi {
    GLESApi_CM = 1,
    GLESApi_2 = 2,
    GLESApi_3_0 = 3,
    GLESApi_3_1 = 4,
    GLESApi_3_2 = 5,
};

// A class used to model a guest EGLContext. This simply wraps a host
// EGLContext, associated with an GLDecoderContextData instance that is
// used to store copies of guest-side arrays.
class RenderContext {
public:
    // Create a new RenderContext instance.
    // |display| is the host EGLDisplay handle.
    // |config| is the host EGLConfig to use.
    // |sharedContext| is either EGL_NO_CONTEXT of a host EGLContext handle.
    // |version| specifies the GLES version as a GLESApi.
    static RenderContext *create(EGLDisplay display,
                                 EGLConfig config,
                                 EGLContext sharedContext,
                                 HandleType hndl,
                                 GLESApi = GLESApi_CM);

    // Destructor.
    ~RenderContext();

    // Retrieve host EGLContext value.
    EGLContext getEGLContext() const { return mContext; }

    // Return the GLES version it is trying to emulate in this context.
    // This can be different from the underlying version when using
    // GLES12Translator.
    GLESApi clientVersion() const;

    // Retrieve GLDecoderContextData instance reference for this
    // RenderContext instance.
    GLDecoderContextData& decoderContextData() { return mContextData; }

    HandleType getHndl() const { return mHndl; }

    void onSave(android::base::Stream* stream);
    static RenderContext *onLoad(android::base::Stream* stream,
            EGLDisplay display);
private:
    RenderContext(EGLDisplay display,
                  EGLContext context,
                  HandleType hndl,
                  GLESApi version,
                  void* emulatedGLES1Context);

    // Implementation of create
    // |stream| is the stream to load from when restoring a snapshot,
    // set |stream| to nullptr if it is not loading from a snapshot
    static RenderContext *createImpl(EGLDisplay display,
                                 EGLConfig config,
                                 EGLContext sharedContext,
                                 HandleType hndl,
                                 GLESApi version,
                                 android::base::Stream *stream);
private:
    EGLDisplay mDisplay;
    EGLContext mContext;
    HandleType mHndl;
    GLESApi mVersion;
    GLDecoderContextData mContextData;
};

typedef std::shared_ptr<RenderContext> RenderContextPtr;

#endif  // _LIBRENDER_RENDER_CONTEXT_H
