summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/libEGL/Display.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/angle/src/libEGL/Display.cpp')
-rw-r--r--src/3rdparty/angle/src/libEGL/Display.cpp648
1 files changed, 0 insertions, 648 deletions
diff --git a/src/3rdparty/angle/src/libEGL/Display.cpp b/src/3rdparty/angle/src/libEGL/Display.cpp
deleted file mode 100644
index eea93b1d87..0000000000
--- a/src/3rdparty/angle/src/libEGL/Display.cpp
+++ /dev/null
@@ -1,648 +0,0 @@
-//
-// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Display.cpp: Implements the egl::Display class, representing the abstract
-// display on which graphics are drawn. Implements EGLDisplay.
-// [EGL 1.4] section 2.1.2 page 3.
-
-#include "libEGL/Display.h"
-
-#include <algorithm>
-#include <map>
-#include <vector>
-#include <sstream>
-#include <iterator>
-
-#include "common/debug.h"
-#include "common/mathutil.h"
-#include "libGLESv2/main.h"
-#include "libGLESv2/Context.h"
-#include "libGLESv2/renderer/SwapChain.h"
-
-#include "libEGL/main.h"
-#include "libEGL/Surface.h"
-
-namespace egl
-{
-
-typedef std::map<EGLNativeDisplayType, Display*> DisplayMap;
-static DisplayMap *GetDisplayMap()
-{
- static DisplayMap displays;
- return &displays;
-}
-
-egl::Display *Display::getDisplay(EGLNativeDisplayType displayId, const AttributeMap &attribMap)
-{
- Display *display = NULL;
-
- DisplayMap *displays = GetDisplayMap();
- DisplayMap::const_iterator iter = displays->find(displayId);
- if (iter != displays->end())
- {
- display = iter->second;
- }
- else
- {
- display = new egl::Display(displayId);
- displays->insert(std::make_pair(displayId, display));
- }
-
- // Apply new attributes if the display is not initialized yet.
- if (!display->isInitialized())
- {
- display->setAttributes(attribMap);
- }
-
- return display;
-}
-
-Display::Display(EGLNativeDisplayType displayId)
- : mDisplayId(displayId),
- mAttributeMap(),
- mRenderer(NULL)
-{
-}
-
-Display::~Display()
-{
- terminate();
-
- DisplayMap *displays = GetDisplayMap();
- DisplayMap::iterator iter = displays->find(mDisplayId);
- if (iter != displays->end())
- {
- displays->erase(iter);
- }
-}
-
-void Display::setAttributes(const AttributeMap &attribMap)
-{
- mAttributeMap = attribMap;
-}
-
-Error Display::initialize()
-{
- if (isInitialized())
- {
- return Error(EGL_SUCCESS);
- }
-
- mRenderer = glCreateRenderer(this, mDisplayId, mAttributeMap);
-
- if (!mRenderer)
- {
- terminate();
- return Error(EGL_NOT_INITIALIZED);
- }
-
- //TODO(jmadill): should be part of caps?
- EGLint minSwapInterval = mRenderer->getMinSwapInterval();
- EGLint maxSwapInterval = mRenderer->getMaxSwapInterval();
- EGLint maxTextureSize = mRenderer->getRendererCaps().max2DTextureSize;
-
- rx::ConfigDesc *descList;
- int numConfigs = mRenderer->generateConfigs(&descList);
- ConfigSet configSet;
-
- for (int i = 0; i < numConfigs; ++i)
- {
- configSet.add(descList[i], minSwapInterval, maxSwapInterval, maxTextureSize, maxTextureSize);
- }
-
- // Give the sorted configs a unique ID and store them internally
- EGLint index = 1;
- for (ConfigSet::Iterator config = configSet.mSet.begin(); config != configSet.mSet.end(); config++)
- {
- Config configuration = *config;
- configuration.mConfigID = index;
- index++;
-
- mConfigSet.mSet.insert(configuration);
- }
-
- mRenderer->deleteConfigs(descList);
- descList = NULL;
-
- if (!isInitialized())
- {
- terminate();
- return Error(EGL_NOT_INITIALIZED);
- }
-
- initDisplayExtensionString();
- initVendorString();
-
- return Error(EGL_SUCCESS);
-}
-
-void Display::terminate()
-{
- while (!mSurfaceSet.empty())
- {
- destroySurface(*mSurfaceSet.begin());
- }
-
- while (!mContextSet.empty())
- {
- destroyContext(*mContextSet.begin());
- }
-
- glDestroyRenderer(mRenderer);
- mRenderer = NULL;
-
- mConfigSet.mSet.clear();
-}
-
-bool Display::getConfigs(EGLConfig *configs, const EGLint *attribList, EGLint configSize, EGLint *numConfig)
-{
- return mConfigSet.getConfigs(configs, attribList, configSize, numConfig);
-}
-
-bool Display::getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value)
-{
- const egl::Config *configuration = mConfigSet.get(config);
-
- switch (attribute)
- {
- case EGL_BUFFER_SIZE: *value = configuration->mBufferSize; break;
- case EGL_ALPHA_SIZE: *value = configuration->mAlphaSize; break;
- case EGL_BLUE_SIZE: *value = configuration->mBlueSize; break;
- case EGL_GREEN_SIZE: *value = configuration->mGreenSize; break;
- case EGL_RED_SIZE: *value = configuration->mRedSize; break;
- case EGL_DEPTH_SIZE: *value = configuration->mDepthSize; break;
- case EGL_STENCIL_SIZE: *value = configuration->mStencilSize; break;
- case EGL_CONFIG_CAVEAT: *value = configuration->mConfigCaveat; break;
- case EGL_CONFIG_ID: *value = configuration->mConfigID; break;
- case EGL_LEVEL: *value = configuration->mLevel; break;
- case EGL_NATIVE_RENDERABLE: *value = configuration->mNativeRenderable; break;
- case EGL_NATIVE_VISUAL_TYPE: *value = configuration->mNativeVisualType; break;
- case EGL_SAMPLES: *value = configuration->mSamples; break;
- case EGL_SAMPLE_BUFFERS: *value = configuration->mSampleBuffers; break;
- case EGL_SURFACE_TYPE: *value = configuration->mSurfaceType; break;
- case EGL_TRANSPARENT_TYPE: *value = configuration->mTransparentType; break;
- case EGL_TRANSPARENT_BLUE_VALUE: *value = configuration->mTransparentBlueValue; break;
- case EGL_TRANSPARENT_GREEN_VALUE: *value = configuration->mTransparentGreenValue; break;
- case EGL_TRANSPARENT_RED_VALUE: *value = configuration->mTransparentRedValue; break;
- case EGL_BIND_TO_TEXTURE_RGB: *value = configuration->mBindToTextureRGB; break;
- case EGL_BIND_TO_TEXTURE_RGBA: *value = configuration->mBindToTextureRGBA; break;
- case EGL_MIN_SWAP_INTERVAL: *value = configuration->mMinSwapInterval; break;
- case EGL_MAX_SWAP_INTERVAL: *value = configuration->mMaxSwapInterval; break;
- case EGL_LUMINANCE_SIZE: *value = configuration->mLuminanceSize; break;
- case EGL_ALPHA_MASK_SIZE: *value = configuration->mAlphaMaskSize; break;
- case EGL_COLOR_BUFFER_TYPE: *value = configuration->mColorBufferType; break;
- case EGL_RENDERABLE_TYPE: *value = configuration->mRenderableType; break;
- case EGL_MATCH_NATIVE_PIXMAP: *value = false; UNIMPLEMENTED(); break;
- case EGL_CONFORMANT: *value = configuration->mConformant; break;
- case EGL_MAX_PBUFFER_WIDTH: *value = configuration->mMaxPBufferWidth; break;
- case EGL_MAX_PBUFFER_HEIGHT: *value = configuration->mMaxPBufferHeight; break;
- case EGL_MAX_PBUFFER_PIXELS: *value = configuration->mMaxPBufferPixels; break;
- default:
- return false;
- }
-
- return true;
-}
-
-
-
-Error Display::createWindowSurface(EGLNativeWindowType window, EGLConfig config, const EGLint *attribList, EGLSurface *outSurface)
-{
- const Config *configuration = mConfigSet.get(config);
- EGLint postSubBufferSupported = EGL_FALSE;
-
- EGLint width = 0;
- EGLint height = 0;
- EGLint fixedSize = EGL_FALSE;
-
- if (attribList)
- {
- while (*attribList != EGL_NONE)
- {
- switch (attribList[0])
- {
- case EGL_RENDER_BUFFER:
- switch (attribList[1])
- {
- case EGL_BACK_BUFFER:
- break;
- case EGL_SINGLE_BUFFER:
- return Error(EGL_BAD_MATCH); // Rendering directly to front buffer not supported
- default:
- return Error(EGL_BAD_ATTRIBUTE);
- }
- break;
- case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
- postSubBufferSupported = attribList[1];
- break;
- case EGL_WIDTH:
- width = attribList[1];
- break;
- case EGL_HEIGHT:
- height = attribList[1];
- break;
- case EGL_FIXED_SIZE_ANGLE:
- fixedSize = attribList[1];
- break;
- case EGL_VG_COLORSPACE:
- return Error(EGL_BAD_MATCH);
- case EGL_VG_ALPHA_FORMAT:
- return Error(EGL_BAD_MATCH);
- default:
- return Error(EGL_BAD_ATTRIBUTE);
- }
-
- attribList += 2;
- }
- }
-
- if (width < 0 || height < 0)
- {
- return Error(EGL_BAD_PARAMETER);
- }
-
- if (!fixedSize)
- {
- width = -1;
- height = -1;
- }
-
- if (hasExistingWindowSurface(window))
- {
- return Error(EGL_BAD_ALLOC);
- }
-
- if (mRenderer->testDeviceLost(false))
- {
- Error error = restoreLostDevice();
- if (error.isError())
- {
- return error;
- }
- }
-
- Surface *surface = new Surface(this, configuration, window, fixedSize, width, height, postSubBufferSupported);
- Error error = surface->initialize();
- if (error.isError())
- {
- SafeDelete(surface);
- return error;
- }
-
- mSurfaceSet.insert(surface);
-
- *outSurface = surface;
- return Error(EGL_SUCCESS);
-}
-
-Error Display::createOffscreenSurface(EGLConfig config, HANDLE shareHandle, const EGLint *attribList, EGLSurface *outSurface)
-{
- EGLint width = 0, height = 0;
- EGLenum textureFormat = EGL_NO_TEXTURE;
- EGLenum textureTarget = EGL_NO_TEXTURE;
- const Config *configuration = mConfigSet.get(config);
-
- if (attribList)
- {
- while (*attribList != EGL_NONE)
- {
- switch (attribList[0])
- {
- case EGL_WIDTH:
- width = attribList[1];
- break;
- case EGL_HEIGHT:
- height = attribList[1];
- break;
- case EGL_LARGEST_PBUFFER:
- if (attribList[1] != EGL_FALSE)
- UNIMPLEMENTED(); // FIXME
- break;
- case EGL_TEXTURE_FORMAT:
- switch (attribList[1])
- {
- case EGL_NO_TEXTURE:
- case EGL_TEXTURE_RGB:
- case EGL_TEXTURE_RGBA:
- textureFormat = attribList[1];
- break;
- default:
- return Error(EGL_BAD_ATTRIBUTE);
- }
- break;
- case EGL_TEXTURE_TARGET:
- switch (attribList[1])
- {
- case EGL_NO_TEXTURE:
- case EGL_TEXTURE_2D:
- textureTarget = attribList[1];
- break;
- default:
- return Error(EGL_BAD_ATTRIBUTE);
- }
- break;
- case EGL_MIPMAP_TEXTURE:
- if (attribList[1] != EGL_FALSE)
- return Error(EGL_BAD_ATTRIBUTE);
- break;
- case EGL_VG_COLORSPACE:
- return Error(EGL_BAD_MATCH);
- case EGL_VG_ALPHA_FORMAT:
- return Error(EGL_BAD_MATCH);
- default:
- return Error(EGL_BAD_ATTRIBUTE);
- }
-
- attribList += 2;
- }
- }
-
- if (width < 0 || height < 0)
- {
- return Error(EGL_BAD_PARAMETER);
- }
-
- if (width == 0 || height == 0)
- {
- return Error(EGL_BAD_ATTRIBUTE);
- }
-
- if (textureFormat != EGL_NO_TEXTURE && !mRenderer->getRendererExtensions().textureNPOT && (!gl::isPow2(width) || !gl::isPow2(height)))
- {
- return Error(EGL_BAD_MATCH);
- }
-
- if ((textureFormat != EGL_NO_TEXTURE && textureTarget == EGL_NO_TEXTURE) ||
- (textureFormat == EGL_NO_TEXTURE && textureTarget != EGL_NO_TEXTURE))
- {
- return Error(EGL_BAD_MATCH);
- }
-
- if (!(configuration->mSurfaceType & EGL_PBUFFER_BIT))
- {
- return Error(EGL_BAD_MATCH);
- }
-
- if ((textureFormat == EGL_TEXTURE_RGB && configuration->mBindToTextureRGB != EGL_TRUE) ||
- (textureFormat == EGL_TEXTURE_RGBA && configuration->mBindToTextureRGBA != EGL_TRUE))
- {
- return Error(EGL_BAD_ATTRIBUTE);
- }
-
- if (mRenderer->testDeviceLost(false))
- {
- Error error = restoreLostDevice();
- if (error.isError())
- {
- return error;
- }
- }
-
- Surface *surface = new Surface(this, configuration, shareHandle, width, height, textureFormat, textureTarget);
- Error error = surface->initialize();
- if (error.isError())
- {
- SafeDelete(surface);
- return error;
- }
-
- mSurfaceSet.insert(surface);
-
- *outSurface = surface;
- return Error(EGL_SUCCESS);
-}
-
-Error Display::createContext(EGLConfig configHandle, EGLint clientVersion, const gl::Context *shareContext, bool notifyResets,
- bool robustAccess, EGLContext *outContext)
-{
- if (!mRenderer)
- {
- *outContext = EGL_NO_CONTEXT;
- return Error(EGL_SUCCESS);
- }
- else if (mRenderer->testDeviceLost(false)) // Lost device
- {
- Error error = restoreLostDevice();
- if (error.isError())
- {
- return error;
- }
- }
-
- //TODO(jmadill): shader model is not cross-platform
- if (clientVersion > 2 && mRenderer->getMajorShaderModel() < 4)
- {
- return Error(EGL_BAD_CONFIG);
- }
-
- gl::Context *context = glCreateContext(clientVersion, shareContext, mRenderer, notifyResets, robustAccess);
- mContextSet.insert(context);
-
- *outContext = context;
- return Error(EGL_SUCCESS);
-}
-
-Error Display::restoreLostDevice()
-{
- for (ContextSet::iterator ctx = mContextSet.begin(); ctx != mContextSet.end(); ctx++)
- {
- if ((*ctx)->isResetNotificationEnabled())
- {
- // If reset notifications have been requested, application must delete all contexts first
- return Error(EGL_CONTEXT_LOST);
- }
- }
-
- // Release surface resources to make the Reset() succeed
- for (SurfaceSet::iterator surface = mSurfaceSet.begin(); surface != mSurfaceSet.end(); surface++)
- {
- (*surface)->release();
- }
-
- if (!mRenderer->resetDevice())
- {
- return Error(EGL_BAD_ALLOC);
- }
-
- // Restore any surfaces that may have been lost
- for (SurfaceSet::iterator surface = mSurfaceSet.begin(); surface != mSurfaceSet.end(); surface++)
- {
- Error error = (*surface)->resetSwapChain();
- if (error.isError())
- {
- return error;
- }
- }
-
- return Error(EGL_SUCCESS);
-}
-
-
-void Display::destroySurface(egl::Surface *surface)
-{
- delete surface;
- mSurfaceSet.erase(surface);
-}
-
-void Display::destroyContext(gl::Context *context)
-{
- glDestroyContext(context);
- mContextSet.erase(context);
-}
-
-void Display::notifyDeviceLost()
-{
- for (ContextSet::iterator context = mContextSet.begin(); context != mContextSet.end(); context++)
- {
- (*context)->markContextLost();
- }
-}
-
-void Display::recreateSwapChains()
-{
- for (SurfaceSet::iterator surface = mSurfaceSet.begin(); surface != mSurfaceSet.end(); surface++)
- {
- (*surface)->getSwapChain()->recreate();
- }
-}
-
-bool Display::isInitialized() const
-{
- return mRenderer != NULL && mConfigSet.size() > 0;
-}
-
-bool Display::isValidConfig(EGLConfig config)
-{
- return mConfigSet.get(config) != NULL;
-}
-
-bool Display::isValidContext(gl::Context *context)
-{
- return mContextSet.find(context) != mContextSet.end();
-}
-
-bool Display::isValidSurface(egl::Surface *surface)
-{
- return mSurfaceSet.find(surface) != mSurfaceSet.end();
-}
-
-bool Display::hasExistingWindowSurface(EGLNativeWindowType window)
-{
- for (SurfaceSet::iterator surface = mSurfaceSet.begin(); surface != mSurfaceSet.end(); surface++)
- {
- if ((*surface)->getWindowHandle() == window)
- {
- return true;
- }
- }
-
- return false;
-}
-
-std::string Display::generateClientExtensionString()
-{
- std::vector<std::string> extensions;
-
- extensions.push_back("EGL_EXT_client_extensions");
-
- extensions.push_back("ANGLE_platform_angle");
-
- if (supportsPlatformD3D())
- {
- extensions.push_back("ANGLE_platform_angle_d3d");
- }
-
- if (supportsPlatformOpenGL())
- {
- extensions.push_back("ANGLE_platform_angle_opengl");
- }
-
- std::ostringstream stream;
- std::copy(extensions.begin(), extensions.end(), std::ostream_iterator<std::string>(stream, " "));
- return stream.str();
-}
-
-void Display::initDisplayExtensionString()
-{
- std::vector<std::string> extensions;
-
- // Multi-vendor (EXT) extensions
- extensions.push_back("EGL_EXT_create_context_robustness");
-
- // ANGLE-specific extensions
- if (mRenderer->getShareHandleSupport())
- {
- extensions.push_back("EGL_ANGLE_d3d_share_handle_client_buffer");
- extensions.push_back("EGL_ANGLE_surface_d3d_texture_2d_share_handle");
- }
-
- extensions.push_back("EGL_ANGLE_query_surface_pointer");
- extensions.push_back("EGL_ANGLE_window_fixed_size");
-
- if (mRenderer->getPostSubBufferSupport())
- {
- extensions.push_back("EGL_NV_post_sub_buffer");
- }
-
-#if defined (ANGLE_TEST_CONFIG)
- // TODO: complete support for the EGL_KHR_create_context extension
- extensions.push_back("EGL_KHR_create_context");
-#endif
-
- std::ostringstream stream;
- std::copy(extensions.begin(), extensions.end(), std::ostream_iterator<std::string>(stream, " "));
- mDisplayExtensionString = stream.str();
-}
-
-const char *Display::getExtensionString(egl::Display *display)
-{
- if (display != EGL_NO_DISPLAY)
- {
- return display->mDisplayExtensionString.c_str();
- }
- else
- {
- static std::string clientExtensions = generateClientExtensionString();
- return clientExtensions.c_str();
- }
-}
-
-bool Display::supportsPlatformD3D()
-{
-#if defined(ANGLE_ENABLE_D3D9) || defined(ANGLE_ENABLE_D3D11)
- return true;
-#else
- return false;
-#endif
-}
-
-bool Display::supportsPlatformOpenGL()
-{
- return false;
-}
-
-void Display::initVendorString()
-{
- mVendorString = "Google Inc.";
-
- LUID adapterLuid = {0};
-
- //TODO(jmadill): LUID is not cross-platform
- if (mRenderer && mRenderer->getLUID(&adapterLuid))
- {
- char adapterLuidString[64];
- sprintf_s(adapterLuidString, sizeof(adapterLuidString), " (adapter LUID: %08x%08x)", adapterLuid.HighPart, adapterLuid.LowPart);
-
- mVendorString += adapterLuidString;
- }
-}
-
-const char *Display::getVendorString() const
-{
- return mVendorString.c_str();
-}
-
-}