blob: 47300e7e21897be5a3c621daa792faf2f892c4b5 [file] [log] [blame]
/*
* 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