blob: c23b5480c1ef7a4ce621ef42b4f9ed3a2aaea36f [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.
*/
#pragma once
#include <memory>
#include <unordered_map>
#include <unordered_set>
#include <EGL/egl.h>
#include "GLDecoderContextData.h"
#include "Handle.h"
#include "aemu/base/files/Stream.h"
namespace gfxstream {
namespace gl {
// 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 EmulatedEglContext {
public:
// Create a new EmulatedEglContext 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 std::unique_ptr<EmulatedEglContext> create(EGLDisplay display,
EGLConfig config,
EGLContext sharedContext,
HandleType hndl,
GLESApi = GLESApi_CM);
// Destructor.
~EmulatedEglContext();
// 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
// EmulatedEglContext instance.
GLDecoderContextData& decoderContextData() { return mContextData; }
HandleType getHndl() const { return mHndl; }
void onSave(android::base::Stream* stream);
static std::unique_ptr<EmulatedEglContext> onLoad(android::base::Stream* stream,
EGLDisplay display);
private:
EmulatedEglContext(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 std::unique_ptr<EmulatedEglContext> createImpl(EGLDisplay display,
EGLConfig config,
EGLContext sharedContext,
HandleType hndl,
GLESApi version,
android::base::Stream *stream);
EGLDisplay mDisplay;
EGLContext mContext;
HandleType mHndl;
GLESApi mVersion;
GLDecoderContextData mContextData;
};
typedef std::shared_ptr<EmulatedEglContext> EmulatedEglContextPtr;
typedef std::unordered_map<HandleType, EmulatedEglContextPtr> EmulatedEglContextMap;
typedef std::unordered_set<HandleType> EmulatedEglContextSet;
} // namespace gl
} // namespace gfxstream