14f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
24f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
34f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be
44f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// found in the LICENSE file.
54f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
64f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
74f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// libEGL.cpp: Implements the exported EGL functions.
84f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
9bbf56f755e0dd78c7650c52531ce412fcaaafa2bdaniel@transgaming.com#include <exception>
10bbf56f755e0dd78c7650c52531ce412fcaaafa2bdaniel@transgaming.com
11ea0e1af4c3db538081d776e4ec1a588ca82cb9d9alokp@chromium.org#include "common/debug.h"
12a0ce7e613ecbd04617cd49595d7da74856dd3bd1daniel@transgaming.com#include "common/version.h"
13bbf56f755e0dd78c7650c52531ce412fcaaafa2bdaniel@transgaming.com#include "libGLESv2/Context.h"
14ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org#include "libGLESv2/Texture.h"
15cfa8efdfe5cf382d1afd81abde03a145fdb5168bdaniel@transgaming.com#include "libGLESv2/main.h"
16d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.com#include "libGLESv2/renderer/SwapChain.h"
17bbf56f755e0dd78c7650c52531ce412fcaaafa2bdaniel@transgaming.com
18bbf56f755e0dd78c7650c52531ce412fcaaafa2bdaniel@transgaming.com#include "libEGL/main.h"
19bbf56f755e0dd78c7650c52531ce412fcaaafa2bdaniel@transgaming.com#include "libEGL/Display.h"
20486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com#include "libEGL/Surface.h"
214f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
22192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.orgbool validateDisplay(egl::Display *display)
234f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
244f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    if (display == EGL_NO_DISPLAY)
254f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
26779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_DISPLAY, false);
274f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
284f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    if (!display->isInitialized())
304f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
31779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_NOT_INITIALIZED, false);
324f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
334f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
344f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    return true;
354f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
364f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
37192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.orgbool validateConfig(egl::Display *display, EGLConfig config)
384f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
39192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org    if (!validateDisplay(display))
404f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
414f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        return false;
424f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
434f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
444f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    if (!display->isValidConfig(config))
454f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
46779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_CONFIG, false);
474f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
494f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    return true;
504f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
514f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
52192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.orgbool validateContext(egl::Display *display, gl::Context *context)
534f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
54192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org    if (!validateDisplay(display))
554f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
564f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        return false;
574f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
584f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
594f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    if (!display->isValidContext(context))
604f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
61779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_CONTEXT, false);
624f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
634f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
644f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    return true;
654f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
664f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
67192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.orgbool validateSurface(egl::Display *display, egl::Surface *surface)
684f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
69192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org    if (!validateDisplay(display))
704f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
714f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        return false;
724f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
734f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
744f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    if (!display->isValidSurface(surface))
754f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
76779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_SURFACE, false);
774f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
784f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
794f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    return true;
804f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
814f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
824f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comextern "C"
834f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
844f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLint __stdcall eglGetError(void)
854f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
860f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("()");
874f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
884f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    EGLint error = egl::getCurrentError();
894f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
904f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    if (error != EGL_SUCCESS)
914f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
924f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::setCurrentError(EGL_SUCCESS);
934f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
944f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
954f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    return error;
964f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
974f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
984f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLDisplay __stdcall eglGetDisplay(EGLNativeDisplayType display_id)
994f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
1000f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLNativeDisplayType display_id = 0x%0.8p)", display_id);
1014f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1024f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
1034f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
10484d7cbc3b1cf664ef9340ad28755f2851f5040dcjbauman@chromium.org        return egl::Display::getDisplay(display_id);
1054f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
1064f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
1074f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
108779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_NO_DISPLAY);
1094f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
1104f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
1114f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1124f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLBoolean __stdcall eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
1134f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
1140f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, EGLint *major = 0x%0.8p, EGLint *minor = 0x%0.8p)",
115b5b0616063ccb5c22a8f50339d47e134d6b9cd9adaniel@transgaming.com          dpy, major, minor);
1164f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1174f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
1184f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
1194f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        if (dpy == EGL_NO_DISPLAY)
1204f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
121779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_DISPLAY, EGL_FALSE);
1224f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
1234f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1244f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
1254f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1264f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        if (!display->initialize())
1274f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
128779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_NOT_INITIALIZED, EGL_FALSE);
1294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
1304f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1312c42c6c34a6169a83799b21df697f3c5f7377ee2daniel@transgaming.com        if (major) *major = 1;
1322c42c6c34a6169a83799b21df697f3c5f7377ee2daniel@transgaming.com        if (minor) *minor = 4;
1334f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
134779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(EGL_TRUE);
1354f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
1364f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
1374f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
138779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
1394f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
1404f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
1414f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1424f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLBoolean __stdcall eglTerminate(EGLDisplay dpy)
1434f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
1440f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p)", dpy);
1454f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1464f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
1474f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
1484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        if (dpy == EGL_NO_DISPLAY)
1494f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
150779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_DISPLAY, EGL_FALSE);
1514f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
1524f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1534f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
1544f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1554f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        display->terminate();
1564f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
157779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(EGL_TRUE);
1584f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
1594f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
1604f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
161779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
1624f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
1634f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
1644f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1654f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comconst char *__stdcall eglQueryString(EGLDisplay dpy, EGLint name)
1664f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
1670f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, EGLint name = %d)", dpy, name);
1684f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1694f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
1704f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
1714f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
1724f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
173192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (!validateDisplay(display))
1744f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
1754f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            return NULL;
1764f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
1774f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1784f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        switch (name)
1794f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
1804f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_CLIENT_APIS:
181779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::success("OpenGL_ES");
1824f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_EXTENSIONS:
183b0f1b486b2320657f6783dd1442c9cef5f601e4bshannonwoods@chromium.org            return egl::success(display->getExtensionString());
1844f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_VENDOR:
185b0f1b486b2320657f6783dd1442c9cef5f601e4bshannonwoods@chromium.org            return egl::success(display->getVendorString());
1864f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_VERSION:
187779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::success("1.4 (ANGLE " VERSION_STRING ")");
1884f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
1894f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
190779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_PARAMETER, (const char*)NULL);
1914f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
1924f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
1934f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
194779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, (const char*)NULL);
1954f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
1964f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
1974f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1984f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLBoolean __stdcall eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config)
1994f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
2000f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, EGLConfig *configs = 0x%0.8p, "
201b5b0616063ccb5c22a8f50339d47e134d6b9cd9adaniel@transgaming.com          "EGLint config_size = %d, EGLint *num_config = 0x%0.8p)",
202b5b0616063ccb5c22a8f50339d47e134d6b9cd9adaniel@transgaming.com          dpy, configs, config_size, num_config);
2034f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
2044f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
2054f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
2064f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
2074f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
208192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (!validateDisplay(display))
2094f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
2104f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            return EGL_FALSE;
2114f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
2124f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
2134f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        if (!num_config)
2144f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
215779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_PARAMETER, EGL_FALSE);
2164f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
2174f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
2184f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        const EGLint attribList[] =    {EGL_NONE};
2194f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
2204f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        if (!display->getConfigs(configs, attribList, config_size, num_config))
2214f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
222779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_ATTRIBUTE, EGL_FALSE);
2234f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
2244f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
225779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(EGL_TRUE);
2264f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
2274f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
2284f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
229779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
2304f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
2314f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
2324f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
2334f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLBoolean __stdcall eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config)
2344f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
2350f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, const EGLint *attrib_list = 0x%0.8p, "
236b5b0616063ccb5c22a8f50339d47e134d6b9cd9adaniel@transgaming.com          "EGLConfig *configs = 0x%0.8p, EGLint config_size = %d, EGLint *num_config = 0x%0.8p)",
237b5b0616063ccb5c22a8f50339d47e134d6b9cd9adaniel@transgaming.com          dpy, attrib_list, configs, config_size, num_config);
2384f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
2394f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
2404f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
2414f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
2424f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
243192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (!validateDisplay(display))
2444f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
2454f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            return EGL_FALSE;
2464f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
2474f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
2484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        if (!num_config)
2494f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
250779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_PARAMETER, EGL_FALSE);
2514f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
2524f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
2534f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        const EGLint attribList[] =    {EGL_NONE};
2544f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
2554f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        if (!attrib_list)
2564f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
2574f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            attrib_list = attribList;
2584f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
2594f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
2604f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        display->getConfigs(configs, attrib_list, config_size, num_config);
2614f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
262779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(EGL_TRUE);
2634f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
2644f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
2654f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
266779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
2674f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
2684f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
2694f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
2704f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLBoolean __stdcall eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value)
2714f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
2720f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, EGLConfig config = 0x%0.8p, EGLint attribute = %d, EGLint *value = 0x%0.8p)",
273b5b0616063ccb5c22a8f50339d47e134d6b9cd9adaniel@transgaming.com          dpy, config, attribute, value);
2744f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
2754f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
2764f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
2774f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
2784f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
279192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (!validateConfig(display, config))
2804f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
2814f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            return EGL_FALSE;
2824f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
2834f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
2844f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        if (!display->getConfigAttrib(config, attribute, value))
2854f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
286779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_ATTRIBUTE, EGL_FALSE);
2874f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
2884f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
289779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(EGL_TRUE);
2904f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
2914f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
2924f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
293779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
2944f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
2954f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
2964f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
2974f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLSurface __stdcall eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list)
2984f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
2990f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, EGLConfig config = 0x%0.8p, EGLNativeWindowType win = 0x%0.8p, "
300b5b0616063ccb5c22a8f50339d47e134d6b9cd9adaniel@transgaming.com          "const EGLint *attrib_list = 0x%0.8p)", dpy, config, win, attrib_list);
3014f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
3024f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
3034f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
3044f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
3054f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
306192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (!validateConfig(display, config))
3074f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
3084f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            return EGL_NO_SURFACE;
3094f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
3104f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
3114f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        HWND window = (HWND)win;
3124f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
3134f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        if (!IsWindow(window))
3144f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
315779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
3164f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
3174f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
31806d7a7559b3c284bf568ac1aa0881209a61e7582jbauman@chromium.org        return display->createWindowSurface(window, config, attrib_list);
3194f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
3204f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
3214f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
322779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_NO_SURFACE);
3234f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
3244f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
3254f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
3264f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLSurface __stdcall eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list)
3274f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
3280f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, EGLConfig config = 0x%0.8p, const EGLint *attrib_list = 0x%0.8p)",
329b5b0616063ccb5c22a8f50339d47e134d6b9cd9adaniel@transgaming.com          dpy, config, attrib_list);
3304f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
3314f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
3324f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
3334f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
3344f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
335192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (!validateConfig(display, config))
3364f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
3374f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            return EGL_NO_SURFACE;
3384f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
3394f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
3404e29770792184805ad0b9e50ec6355e940fd22c4jbauman@chromium.org        return display->createOffscreenSurface(config, NULL, attrib_list);
3414f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
3424f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
3434f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
344779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_NO_SURFACE);
3454f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
3464f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
3474f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
3484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLSurface __stdcall eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list)
3494f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
3500f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, EGLConfig config = 0x%0.8p, EGLNativePixmapType pixmap = 0x%0.8p, "
351b5b0616063ccb5c22a8f50339d47e134d6b9cd9adaniel@transgaming.com          "const EGLint *attrib_list = 0x%0.8p)", dpy, config, pixmap, attrib_list);
3524f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
3534f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
3544f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
3554f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
3564f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
357192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (!validateConfig(display, config))
3584f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
3594f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            return EGL_NO_SURFACE;
3604f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
3614f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
3624f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        UNIMPLEMENTED();   // FIXME
3634f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
364779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(EGL_NO_SURFACE);
3654f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
3664f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
3674f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
368779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_NO_SURFACE);
3694f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
3704f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
3714f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
3724f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLBoolean __stdcall eglDestroySurface(EGLDisplay dpy, EGLSurface surface)
3734f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
3740f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p)", dpy, surface);
3754f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
3764f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
3774f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
3784f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
379192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        egl::Surface *eglSurface = static_cast<egl::Surface*>(surface);
3804f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
381192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (!validateSurface(display, eglSurface))
3824f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
3834f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            return EGL_FALSE;
3844f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
3854f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
3864f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        if (surface == EGL_NO_SURFACE)
3874f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
388779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_SURFACE, EGL_FALSE);
3894f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
3904f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
3914f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        display->destroySurface((egl::Surface*)surface);
3924f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
393779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(EGL_TRUE);
3944f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
3954f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
3964f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
397779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
3984f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
3994f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
4004f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
4014f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLBoolean __stdcall eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value)
4024f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
4030f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint attribute = %d, EGLint *value = 0x%0.8p)",
404b5b0616063ccb5c22a8f50339d47e134d6b9cd9adaniel@transgaming.com          dpy, surface, attribute, value);
4054f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
4064f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
4074f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
4084f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
409192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        egl::Surface *eglSurface = (egl::Surface*)surface;
4104f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
411192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (!validateSurface(display, eglSurface))
4124f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
4134f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            return EGL_FALSE;
4144f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
4154f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
4164f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        if (surface == EGL_NO_SURFACE)
4174f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
418779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_SURFACE, EGL_FALSE);
4194f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
4204f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
4214f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        switch (attribute)
4224f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
4234f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_VG_ALPHA_FORMAT:
4244f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            UNIMPLEMENTED();   // FIXME
4254f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            break;
4264f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_VG_COLORSPACE:
4274f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            UNIMPLEMENTED();   // FIXME
4284f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            break;
4294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_CONFIG_ID:
4304f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            UNIMPLEMENTED();   // FIXME
4314f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            break;
4324f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_HEIGHT:
4334f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            *value = eglSurface->getHeight();
4344f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            break;
4354f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_HORIZONTAL_RESOLUTION:
4364f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            UNIMPLEMENTED();   // FIXME
4374f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            break;
4384f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_LARGEST_PBUFFER:
4394f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            UNIMPLEMENTED();   // FIXME
4404f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            break;
4414f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_MIPMAP_TEXTURE:
4424f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            UNIMPLEMENTED();   // FIXME
4434f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            break;
4444f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_MIPMAP_LEVEL:
4454f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            UNIMPLEMENTED();   // FIXME
4464f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            break;
4474f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_MULTISAMPLE_RESOLVE:
4484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            UNIMPLEMENTED();   // FIXME
4494f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            break;
4504f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_PIXEL_ASPECT_RATIO:
4514f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            UNIMPLEMENTED();   // FIXME
4524f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            break;
4534f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_RENDER_BUFFER:
4544f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            UNIMPLEMENTED();   // FIXME
4554f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            break;
4564f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_SWAP_BEHAVIOR:
4574f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            UNIMPLEMENTED();   // FIXME
4584f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            break;
4594f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_TEXTURE_FORMAT:
4604f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            UNIMPLEMENTED();   // FIXME
4614f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            break;
4624f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_TEXTURE_TARGET:
4634f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            UNIMPLEMENTED();   // FIXME
4644f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            break;
4654f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_VERTICAL_RESOLUTION:
4664f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            UNIMPLEMENTED();   // FIXME
4674f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            break;
4684f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_WIDTH:
4694f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            *value = eglSurface->getWidth();
4704f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            break;
471f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org          case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
472f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org            *value = eglSurface->isPostSubBufferSupported();
473f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org            break;
4744f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          default:
475779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_ATTRIBUTE, EGL_FALSE);
4764f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
4774f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
478779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(EGL_TRUE);
4794f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
4804f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
4814f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
482779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
4834f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
4844f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
4854f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
486721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.comEGLBoolean __stdcall eglQuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value)
487721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com{
488721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com    TRACE("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint attribute = %d, void **value = 0x%0.8p)",
489721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com          dpy, surface, attribute, value);
490721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com
491721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com    try
492721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com    {
493721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com        egl::Display *display = static_cast<egl::Display*>(dpy);
494192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        egl::Surface *eglSurface = (egl::Surface*)surface;
495721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com
496192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (!validateSurface(display, eglSurface))
497721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com        {
498721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com            return EGL_FALSE;
499721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com        }
500721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com
501721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com        if (surface == EGL_NO_SURFACE)
502721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com        {
503779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_SURFACE, EGL_FALSE);
504721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com        }
505721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com
506721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com        switch (attribute)
507721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com        {
508721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com          case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE:
5093c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com            {
51076d3e6e07b87d95baf43a0c40ec6f3df883fbf71daniel@transgaming.com                rx::SwapChain *swapchain = eglSurface->getSwapChain();
5113c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com                *value = (void*) (swapchain ? swapchain->getShareHandle() : NULL);
5123c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com            }
513721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com            break;
514721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com          default:
515779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_ATTRIBUTE, EGL_FALSE);
516721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com        }
517721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com
518779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(EGL_TRUE);
519721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com    }
520721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com    catch(std::bad_alloc&)
521721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com    {
522779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
523721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com    }
524721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com}
525721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com
5264f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLBoolean __stdcall eglBindAPI(EGLenum api)
5274f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
5280f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLenum api = 0x%X)", api);
5294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
5304f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
5314f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
5324f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        switch (api)
5334f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
5344f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_OPENGL_API:
5354f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_OPENVG_API:
536779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_PARAMETER, EGL_FALSE);   // Not supported by this implementation
5374f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          case EGL_OPENGL_ES_API:
5384f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            break;
5394f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com          default:
540779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_PARAMETER, EGL_FALSE);
5414f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
5424f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
5434f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::setCurrentAPI(api);
5444f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
545779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(EGL_TRUE);
5464f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
5474f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
5484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
549779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
5504f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
5514f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
5524f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
5534f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLenum __stdcall eglQueryAPI(void)
5544f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
5550f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("()");
5564f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
5574f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
5584f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
5594f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        EGLenum API = egl::getCurrentAPI();
5604f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
561779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(API);
5624f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
5634f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
5644f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
565779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
5664f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
5674f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
5684f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
5694f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLBoolean __stdcall eglWaitClient(void)
5704f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
5710f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("()");
5724f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
5734f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
5744f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
5754f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        UNIMPLEMENTED();   // FIXME
5764f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
577779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(0);
5784f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
5794f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
5804f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
581779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
5824f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
5834f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
5844f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
5854f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLBoolean __stdcall eglReleaseThread(void)
5864f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
5870f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("()");
5884f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
5894f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
5904f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
5914f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_CONTEXT, EGL_NO_SURFACE, EGL_NO_SURFACE);
5924f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
593779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(EGL_TRUE);
5944f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
5954f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
5964f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
597779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
5984f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
5994f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
6004f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
6014f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLSurface __stdcall eglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list)
6024f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
6030f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, EGLenum buftype = 0x%X, EGLClientBuffer buffer = 0x%0.8p, "
604b5b0616063ccb5c22a8f50339d47e134d6b9cd9adaniel@transgaming.com          "EGLConfig config = 0x%0.8p, const EGLint *attrib_list = 0x%0.8p)",
605b5b0616063ccb5c22a8f50339d47e134d6b9cd9adaniel@transgaming.com          dpy, buftype, buffer, config, attrib_list);
6064f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
6074f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
6084f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
6094f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
6104f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
611192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (!validateConfig(display, config))
6124f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
6134f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            return EGL_NO_SURFACE;
6144f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
6154f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
6164e29770792184805ad0b9e50ec6355e940fd22c4jbauman@chromium.org        if (buftype != EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE || !buffer)
6174e29770792184805ad0b9e50ec6355e940fd22c4jbauman@chromium.org        {
618779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
6194e29770792184805ad0b9e50ec6355e940fd22c4jbauman@chromium.org        }
6204f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
6214e29770792184805ad0b9e50ec6355e940fd22c4jbauman@chromium.org        return display->createOffscreenSurface(config, (HANDLE)buffer, attrib_list);
6224f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
6234f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
6244f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
625779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_NO_SURFACE);
6264f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
6274f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
6284f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
6294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLBoolean __stdcall eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
6304f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
6310f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint attribute = %d, EGLint value = %d)",
632b5b0616063ccb5c22a8f50339d47e134d6b9cd9adaniel@transgaming.com          dpy, surface, attribute, value);
6334f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
6344f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
6354f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
6364f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
637192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        egl::Surface *eglSurface = static_cast<egl::Surface*>(surface);
6384f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
639192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (!validateSurface(display, eglSurface))
6404f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
6414f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            return EGL_FALSE;
6424f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
6434f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
6444f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        UNIMPLEMENTED();   // FIXME
6454f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
646779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(EGL_TRUE);
6474f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
6484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
6494f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
650779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
6514f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
6524f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
6534f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
6544f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLBoolean __stdcall eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
6554f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
6560f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint buffer = %d)", dpy, surface, buffer);
6574f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
6584f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
6594f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
6604f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
661192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        egl::Surface *eglSurface = static_cast<egl::Surface*>(surface);
6624f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
663192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (!validateSurface(display, eglSurface))
6644f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
6654f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            return EGL_FALSE;
6664f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
6674f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
668ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org        if (buffer != EGL_BACK_BUFFER)
669ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org        {
670779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_PARAMETER, EGL_FALSE);
671ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org        }
672ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org
673192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (surface == EGL_NO_SURFACE || eglSurface->getWindowHandle())
674ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org        {
675779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_SURFACE, EGL_FALSE);
676ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org        }
677ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org
678192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (eglSurface->getBoundTexture())
679ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org        {
680779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_ACCESS, EGL_FALSE);
681ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org        }
682ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org
683192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (eglSurface->getTextureFormat() == EGL_NO_TEXTURE)
684ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org        {
685779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_MATCH, EGL_FALSE);
686ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org        }
6874f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
68864a0fb2a82fb54a9426591a73104068b79d1d50edaniel@transgaming.com        if (!glBindTexImage(eglSurface))
68964a0fb2a82fb54a9426591a73104068b79d1d50edaniel@transgaming.com        {
690779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_MATCH, EGL_FALSE);
69164a0fb2a82fb54a9426591a73104068b79d1d50edaniel@transgaming.com        }
692ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org
693779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(EGL_TRUE);
6944f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
6954f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
6964f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
697779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
6984f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
6994f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
7004f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
7014f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLBoolean __stdcall eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
7024f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
7030f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint buffer = %d)", dpy, surface, buffer);
7044f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
7054f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
7064f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
7074f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
708192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        egl::Surface *eglSurface = static_cast<egl::Surface*>(surface);
7094f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
710192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (!validateSurface(display, eglSurface))
7114f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
7124f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            return EGL_FALSE;
7134f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
7144f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
715ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org        if (buffer != EGL_BACK_BUFFER)
716ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org        {
717779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_PARAMETER, EGL_FALSE);
718ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org        }
719ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org
720192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (surface == EGL_NO_SURFACE || eglSurface->getWindowHandle())
721ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org        {
722779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_SURFACE, EGL_FALSE);
723ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org        }
724ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org
725192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (eglSurface->getTextureFormat() == EGL_NO_TEXTURE)
726ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org        {
727779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_MATCH, EGL_FALSE);
728ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org        }
7294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
730192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        gl::Texture2D *texture = eglSurface->getBoundTexture();
731ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org
732ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org        if (texture)
733ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org        {
734ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org            texture->releaseTexImage();
735ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org        }
736ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org
737779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(EGL_TRUE);
7384f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
7394f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
7404f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
741779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
7424f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
7434f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
7444f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
7454f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLBoolean __stdcall eglSwapInterval(EGLDisplay dpy, EGLint interval)
7464f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
7470f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, EGLint interval = %d)", dpy, interval);
7484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
7494f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
7504f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
7514f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
7524f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
753192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (!validateDisplay(display))
7544f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
7554f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            return EGL_FALSE;
7564f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
7574f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
7580db0d6c88fabd966d8bba2d3ff20d66d620863efapatrick@chromium.org        egl::Surface *draw_surface = static_cast<egl::Surface*>(egl::getCurrentDrawSurface());
7590db0d6c88fabd966d8bba2d3ff20d66d620863efapatrick@chromium.org
7600db0d6c88fabd966d8bba2d3ff20d66d620863efapatrick@chromium.org        if (draw_surface == NULL)
7610db0d6c88fabd966d8bba2d3ff20d66d620863efapatrick@chromium.org        {
762779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_SURFACE, EGL_FALSE);
7630db0d6c88fabd966d8bba2d3ff20d66d620863efapatrick@chromium.org        }
7640db0d6c88fabd966d8bba2d3ff20d66d620863efapatrick@chromium.org
7650db0d6c88fabd966d8bba2d3ff20d66d620863efapatrick@chromium.org        draw_surface->setSwapInterval(interval);
7664f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
767779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(EGL_TRUE);
7684f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
7694f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
7704f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
771779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
7724f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
7734f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
7744f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
7754f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLContext __stdcall eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list)
7764f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
7770f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, EGLConfig config = 0x%0.8p, EGLContext share_context = 0x%0.8p, "
778b5b0616063ccb5c22a8f50339d47e134d6b9cd9adaniel@transgaming.com          "const EGLint *attrib_list = 0x%0.8p)", dpy, config, share_context, attrib_list);
7794f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
7804f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
7814f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
78278477fc08592a456cd54ca0a1de3552af821fef2apatrick@chromium.org        // Get the requested client version (default is 1) and check it is two.
78378477fc08592a456cd54ca0a1de3552af821fef2apatrick@chromium.org        EGLint client_version = 1;
7844ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com        bool reset_notification = false;
7854ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com        bool robust_access = false;
7864ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com
78724e39699dd02c6b09d7f67ae740297a2a6c3e284apatrick@chromium.org        if (attrib_list)
78878477fc08592a456cd54ca0a1de3552af821fef2apatrick@chromium.org        {
78924e39699dd02c6b09d7f67ae740297a2a6c3e284apatrick@chromium.org            for (const EGLint* attribute = attrib_list; attribute[0] != EGL_NONE; attribute += 2)
79078477fc08592a456cd54ca0a1de3552af821fef2apatrick@chromium.org            {
7914ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com                switch (attribute[0])
79224e39699dd02c6b09d7f67ae740297a2a6c3e284apatrick@chromium.org                {
7934ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com                  case EGL_CONTEXT_CLIENT_VERSION:
79424e39699dd02c6b09d7f67ae740297a2a6c3e284apatrick@chromium.org                    client_version = attribute[1];
7954ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com                    break;
7964ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com                  case EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT:
7974ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com                    if (attribute[1] == EGL_TRUE)
7984ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com                    {
799779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com                        return egl::error(EGL_BAD_CONFIG, EGL_NO_CONTEXT);   // Unimplemented
800a1d8059d676046ff9a35e15341866f1e93944132apatrick@chromium.org                        // robust_access = true;
8014ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com                    }
8024ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com                    else if (attribute[1] != EGL_FALSE)
803779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com                        return egl::error(EGL_BAD_ATTRIBUTE, EGL_NO_CONTEXT);
8044ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com                    break;
8054ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com                  case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT:
8064ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com                    if (attribute[1] == EGL_LOSE_CONTEXT_ON_RESET_EXT)
8074ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com                        reset_notification = true;
8084ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com                    else if (attribute[1] != EGL_NO_RESET_NOTIFICATION_EXT)
809779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com                        return egl::error(EGL_BAD_ATTRIBUTE, EGL_NO_CONTEXT);
8104ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com                    break;
8114ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com                  default:
812779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com                    return egl::error(EGL_BAD_ATTRIBUTE, EGL_NO_CONTEXT);
81324e39699dd02c6b09d7f67ae740297a2a6c3e284apatrick@chromium.org                }
81478477fc08592a456cd54ca0a1de3552af821fef2apatrick@chromium.org            }
81578477fc08592a456cd54ca0a1de3552af821fef2apatrick@chromium.org        }
81678477fc08592a456cd54ca0a1de3552af821fef2apatrick@chromium.org
81778477fc08592a456cd54ca0a1de3552af821fef2apatrick@chromium.org        if (client_version != 2)
81878477fc08592a456cd54ca0a1de3552af821fef2apatrick@chromium.org        {
819779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_CONFIG, EGL_NO_CONTEXT);
82078477fc08592a456cd54ca0a1de3552af821fef2apatrick@chromium.org        }
82178477fc08592a456cd54ca0a1de3552af821fef2apatrick@chromium.org
822b4e0003292f829a0f88a14df4b02a785fcf2b45fJamie Madill        gl::Context *sharedContextPtr = (share_context != EGL_NO_CONTEXT ? static_cast<gl::Context*>(share_context) : NULL);
823b4e0003292f829a0f88a14df4b02a785fcf2b45fJamie Madill
824b4e0003292f829a0f88a14df4b02a785fcf2b45fJamie Madill        if (sharedContextPtr != NULL && sharedContextPtr->isResetNotificationEnabled() != reset_notification)
8254ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com        {
826779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_MATCH, EGL_NO_CONTEXT);
8274ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com        }
8284ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com
8294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
8304f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
831b4e0003292f829a0f88a14df4b02a785fcf2b45fJamie Madill        // Can not share contexts between displays
832b4e0003292f829a0f88a14df4b02a785fcf2b45fJamie Madill        if (sharedContextPtr != NULL && sharedContextPtr->getRenderer() != display->getRenderer())
833b4e0003292f829a0f88a14df4b02a785fcf2b45fJamie Madill        {
834b4e0003292f829a0f88a14df4b02a785fcf2b45fJamie Madill            return egl::error(EGL_BAD_MATCH, EGL_NO_CONTEXT);
835b4e0003292f829a0f88a14df4b02a785fcf2b45fJamie Madill        }
836b4e0003292f829a0f88a14df4b02a785fcf2b45fJamie Madill
837192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (!validateConfig(display, config))
8384f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
8394f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            return EGL_NO_CONTEXT;
8404f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
8414f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
8424ff960d9166a283d4dd6c072490a5437f05b9eb4daniel@transgaming.com        EGLContext context = display->createContext(config, static_cast<gl::Context*>(share_context), reset_notification, robust_access);
8434f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
844cf23c45fd5ab413269a097f0d8813d2ab8a304b9daniel@transgaming.com        if (context)
845779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::success(context);
846cf23c45fd5ab413269a097f0d8813d2ab8a304b9daniel@transgaming.com        else
847779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_CONTEXT_LOST, EGL_NO_CONTEXT);
8484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
8494f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
8504f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
851779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_NO_CONTEXT);
8524f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
8534f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
8544f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
8554f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLBoolean __stdcall eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
8564f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
8570f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, EGLContext ctx = 0x%0.8p)", dpy, ctx);
8584f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
8594f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
8604f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
8614f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
862192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        gl::Context *context = static_cast<gl::Context*>(ctx);
8634f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
864192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (!validateContext(display, context))
8654f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
8664f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            return EGL_FALSE;
8674f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
8684f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
8694f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        if (ctx == EGL_NO_CONTEXT)
8704f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
871779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_CONTEXT, EGL_FALSE);
8724f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
8734f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
874192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        display->destroyContext(context);
8754f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
876779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(EGL_TRUE);
8774f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
8784f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
8794f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
880779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
8814f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
8824f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
8834f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
8844f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLBoolean __stdcall eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx)
8854f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
8860f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface draw = 0x%0.8p, EGLSurface read = 0x%0.8p, EGLContext ctx = 0x%0.8p)",
887b5b0616063ccb5c22a8f50339d47e134d6b9cd9adaniel@transgaming.com          dpy, draw, read, ctx);
8884f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
8894f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
8904f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
8914f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
8924f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        gl::Context *context = static_cast<gl::Context*>(ctx);
893c6c6f0272dd81ae040d87e604894c6e81c7c6e1ddaniel@transgaming.com
894621ce053c1a3048c2357b8b070ca934ef5e3dabfdaniel@transgaming.com        if (ctx != EGL_NO_CONTEXT && !validateContext(display, context))
89509fcc9fe6a6247af02ca203a9df4ffb00f2ee003daniel@transgaming.com        {
89609fcc9fe6a6247af02ca203a9df4ffb00f2ee003daniel@transgaming.com            return EGL_FALSE;
89709fcc9fe6a6247af02ca203a9df4ffb00f2ee003daniel@transgaming.com        }
89809fcc9fe6a6247af02ca203a9df4ffb00f2ee003daniel@transgaming.com
899ba6944849acb31e9db7e1f157cdbaf3a249512eeShannon Woods        if (dpy != EGL_NO_DISPLAY)
900c6c6f0272dd81ae040d87e604894c6e81c7c6e1ddaniel@transgaming.com        {
901ba6944849acb31e9db7e1f157cdbaf3a249512eeShannon Woods            rx::Renderer *renderer = display->getRenderer();
902ba6944849acb31e9db7e1f157cdbaf3a249512eeShannon Woods            if (renderer->testDeviceLost(true))
903ba6944849acb31e9db7e1f157cdbaf3a249512eeShannon Woods            {
904ba6944849acb31e9db7e1f157cdbaf3a249512eeShannon Woods                return EGL_FALSE;
905ba6944849acb31e9db7e1f157cdbaf3a249512eeShannon Woods            }
9064f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
907ba6944849acb31e9db7e1f157cdbaf3a249512eeShannon Woods            if (renderer->isDeviceLost())
908ba6944849acb31e9db7e1f157cdbaf3a249512eeShannon Woods            {
909ba6944849acb31e9db7e1f157cdbaf3a249512eeShannon Woods                return egl::error(EGL_CONTEXT_LOST, EGL_FALSE);
910ba6944849acb31e9db7e1f157cdbaf3a249512eeShannon Woods            }
9114f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
9124f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
913192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if ((draw != EGL_NO_SURFACE && !validateSurface(display, static_cast<egl::Surface*>(draw))) ||
914192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org            (read != EGL_NO_SURFACE && !validateSurface(display, static_cast<egl::Surface*>(read))))
9154f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
9164f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            return EGL_FALSE;
9174f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
9184f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
9194f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        if (draw != read)
9204f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
9214f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            UNIMPLEMENTED();   // FIXME
9224f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
9234f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
924e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com        egl::setCurrentDisplay(dpy);
925e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com        egl::setCurrentDrawSurface(draw);
926e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com        egl::setCurrentReadSurface(read);
927e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com
9284f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        glMakeCurrent(context, display, static_cast<egl::Surface*>(draw));
9294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
930779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(EGL_TRUE);
9314f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
9324f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
9334f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
934779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
9354f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
9364f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
9374f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
9384f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLContext __stdcall eglGetCurrentContext(void)
9394f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
9400f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("()");
9414f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
9424f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
9434f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
9444f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        EGLContext context = glGetCurrentContext();
9454f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
946779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(context);
9474f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
9484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
9494f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
950779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_NO_CONTEXT);
9514f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
9524f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
9534f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
9544f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLSurface __stdcall eglGetCurrentSurface(EGLint readdraw)
9554f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
9560f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLint readdraw = %d)", readdraw);
9574f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
9584f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
9594f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
960e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com        if (readdraw == EGL_READ)
961e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com        {
962e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com            EGLSurface read = egl::getCurrentReadSurface();
963779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::success(read);
964e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com        }
965e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com        else if (readdraw == EGL_DRAW)
966e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com        {
967e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com            EGLSurface draw = egl::getCurrentDrawSurface();
968779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::success(draw);
969e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com        }
970e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com        else
971e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com        {
972779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
973e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com        }
9744f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
9754f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
9764f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
977779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_NO_SURFACE);
9784f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
9794f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
9804f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
9814f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLDisplay __stdcall eglGetCurrentDisplay(void)
9824f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
9830f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("()");
9844f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
9854f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
9864f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
987e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com        EGLDisplay dpy = egl::getCurrentDisplay();
9884f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
989779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(dpy);
9904f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
9914f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
9924f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
993779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_NO_DISPLAY);
9944f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
9954f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
9964f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
9974f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLBoolean __stdcall eglQueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value)
9984f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
9990f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, EGLContext ctx = 0x%0.8p, EGLint attribute = %d, EGLint *value = 0x%0.8p)",
1000b5b0616063ccb5c22a8f50339d47e134d6b9cd9adaniel@transgaming.com          dpy, ctx, attribute, value);
10014f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
10024f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
10034f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
10044f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
1005192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        gl::Context *context = static_cast<gl::Context*>(ctx);
10064f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1007192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (!validateContext(display, context))
10084f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
10094f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            return EGL_FALSE;
10104f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
10114f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
10124f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        UNIMPLEMENTED();   // FIXME
10134f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1014779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(0);
10154f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
10164f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
10174f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
1018779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
10194f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
10204f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
10214f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
10224f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLBoolean __stdcall eglWaitGL(void)
10234f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
10240f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("()");
10254f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
10264f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
10274f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
10284f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        UNIMPLEMENTED();   // FIXME
10294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1030779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(0);
10314f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
10324f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
10334f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
1034779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
10354f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
10364f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
10374f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
10384f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLBoolean __stdcall eglWaitNative(EGLint engine)
10394f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
10400f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLint engine = %d)", engine);
10414f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
10424f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
10434f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
10444f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        UNIMPLEMENTED();   // FIXME
10454f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1046779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(0);
10474f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
10484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
10494f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
1050779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
10514f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
10524f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
10534f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
10544f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLBoolean __stdcall eglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
10554f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
10560f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p)", dpy, surface);
10574f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
10584f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
10594f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
10604f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
1061192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        egl::Surface *eglSurface = (egl::Surface*)surface;
10624f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1063192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (!validateSurface(display, eglSurface))
10644f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
10654f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            return EGL_FALSE;
10664f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
10674f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1068621ce053c1a3048c2357b8b070ca934ef5e3dabfdaniel@transgaming.com        if (display->getRenderer()->isDeviceLost())
106909fcc9fe6a6247af02ca203a9df4ffb00f2ee003daniel@transgaming.com        {
1070779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_CONTEXT_LOST, EGL_FALSE);
107109fcc9fe6a6247af02ca203a9df4ffb00f2ee003daniel@transgaming.com        }
107209fcc9fe6a6247af02ca203a9df4ffb00f2ee003daniel@transgaming.com
10734f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        if (surface == EGL_NO_SURFACE)
10744f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
1075779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_SURFACE, EGL_FALSE);
10764f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
10774f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1078c6c6f0272dd81ae040d87e604894c6e81c7c6e1ddaniel@transgaming.com        if (eglSurface->swap())
1079c6c6f0272dd81ae040d87e604894c6e81c7c6e1ddaniel@transgaming.com        {
1080779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::success(EGL_TRUE);
1081c6c6f0272dd81ae040d87e604894c6e81c7c6e1ddaniel@transgaming.com        }
10824f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
10834f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
10844f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
1085779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
10864f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
10874f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
10884f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    return EGL_FALSE;
10894f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
10904f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
10914f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLBoolean __stdcall eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
10924f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
10930f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLNativePixmapType target = 0x%0.8p)", dpy, surface, target);
10944f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
10954f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
10964f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
10974f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        egl::Display *display = static_cast<egl::Display*>(dpy);
1098192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        egl::Surface *eglSurface = static_cast<egl::Surface*>(surface);
10994f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1100192a1810f140fd35c2da652b6bda4cadc60891e2apatrick@chromium.org        if (!validateSurface(display, eglSurface))
11014f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        {
11024f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            return EGL_FALSE;
11034f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
11044f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1105621ce053c1a3048c2357b8b070ca934ef5e3dabfdaniel@transgaming.com        if (display->getRenderer()->isDeviceLost())
110609fcc9fe6a6247af02ca203a9df4ffb00f2ee003daniel@transgaming.com        {
1107779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_CONTEXT_LOST, EGL_FALSE);
110809fcc9fe6a6247af02ca203a9df4ffb00f2ee003daniel@transgaming.com        }
110909fcc9fe6a6247af02ca203a9df4ffb00f2ee003daniel@transgaming.com
11104f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        UNIMPLEMENTED();   // FIXME
11114f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1112779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::success(0);
11134f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
11144f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
11154f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
1116779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
11174f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
11184f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
11194f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1120f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.orgEGLBoolean __stdcall eglPostSubBufferNV(EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height)
1121f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org{
1122f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org    EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint x = %d, EGLint y = %d, EGLint width = %d, EGLint height = %d)", dpy, surface, x, y, width, height);
1123f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org
1124f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org    try
1125f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org    {
11266409edb0ad2062b21f5ece1940cb4d5493b0431ddaniel@transgaming.com        if (x < 0 || y < 0 || width < 0 || height < 0)
11276409edb0ad2062b21f5ece1940cb4d5493b0431ddaniel@transgaming.com        {
1128779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_PARAMETER, EGL_FALSE);
11296409edb0ad2062b21f5ece1940cb4d5493b0431ddaniel@transgaming.com        }
11306409edb0ad2062b21f5ece1940cb4d5493b0431ddaniel@transgaming.com
1131f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org        egl::Display *display = static_cast<egl::Display*>(dpy);
1132f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org        egl::Surface *eglSurface = static_cast<egl::Surface*>(surface);
1133f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org
1134f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org        if (!validateSurface(display, eglSurface))
1135f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org        {
1136f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org            return EGL_FALSE;
1137f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org        }
1138f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org
1139621ce053c1a3048c2357b8b070ca934ef5e3dabfdaniel@transgaming.com        if (display->getRenderer()->isDeviceLost())
1140f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org        {
1141779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_CONTEXT_LOST, EGL_FALSE);
1142f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org        }
1143f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org
1144f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org        if (surface == EGL_NO_SURFACE)
1145f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org        {
1146779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::error(EGL_BAD_SURFACE, EGL_FALSE);
1147f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org        }
1148f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org
1149f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org        if (eglSurface->postSubBuffer(x, y, width, height))
1150f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org        {
1151779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return egl::success(EGL_TRUE);
1152f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org        }
1153f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org    }
1154f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org    catch(std::bad_alloc&)
1155f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org    {
1156779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, EGL_FALSE);
1157f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org    }
1158f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org
1159f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org    return EGL_FALSE;
1160f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org}
1161f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org
11624f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com__eglMustCastToProperFunctionPointerType __stdcall eglGetProcAddress(const char *procname)
11634f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
11640f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    EVENT("(const char *procname = \"%s\")", procname);
11654f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
11664f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    try
11674f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
1168ce3d0f2f386ee8d9e00ce99d114435b552f24224daniel@transgaming.com        struct Extension
1169ce3d0f2f386ee8d9e00ce99d114435b552f24224daniel@transgaming.com        {
1170ce3d0f2f386ee8d9e00ce99d114435b552f24224daniel@transgaming.com            const char *name;
1171ce3d0f2f386ee8d9e00ce99d114435b552f24224daniel@transgaming.com            __eglMustCastToProperFunctionPointerType address;
1172ce3d0f2f386ee8d9e00ce99d114435b552f24224daniel@transgaming.com        };
1173ce3d0f2f386ee8d9e00ce99d114435b552f24224daniel@transgaming.com
1174ce3d0f2f386ee8d9e00ce99d114435b552f24224daniel@transgaming.com        static const Extension eglExtensions[] =
1175ce3d0f2f386ee8d9e00ce99d114435b552f24224daniel@transgaming.com        {
1176721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com            {"eglQuerySurfacePointerANGLE", (__eglMustCastToProperFunctionPointerType)eglQuerySurfacePointerANGLE},
1177f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org            {"eglPostSubBufferNV", (__eglMustCastToProperFunctionPointerType)eglPostSubBufferNV},
1178ce3d0f2f386ee8d9e00ce99d114435b552f24224daniel@transgaming.com            {"", NULL},
1179ce3d0f2f386ee8d9e00ce99d114435b552f24224daniel@transgaming.com        };
1180ce3d0f2f386ee8d9e00ce99d114435b552f24224daniel@transgaming.com
1181d438fd497baeddedec135e7c8bfa4148e116b9a8shannon.woods@transgaming.com        for (unsigned int ext = 0; ext < ArraySize(eglExtensions); ext++)
1182ce3d0f2f386ee8d9e00ce99d114435b552f24224daniel@transgaming.com        {
1183ce3d0f2f386ee8d9e00ce99d114435b552f24224daniel@transgaming.com            if (strcmp(procname, eglExtensions[ext].name) == 0)
1184ce3d0f2f386ee8d9e00ce99d114435b552f24224daniel@transgaming.com            {
1185ce3d0f2f386ee8d9e00ce99d114435b552f24224daniel@transgaming.com                return (__eglMustCastToProperFunctionPointerType)eglExtensions[ext].address;
1186ce3d0f2f386ee8d9e00ce99d114435b552f24224daniel@transgaming.com            }
1187ce3d0f2f386ee8d9e00ce99d114435b552f24224daniel@transgaming.com        }
11884f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1189ce3d0f2f386ee8d9e00ce99d114435b552f24224daniel@transgaming.com        return glGetProcAddress(procname);
11904f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
11914f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    catch(std::bad_alloc&)
11924f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
1193779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com        return egl::error(EGL_BAD_ALLOC, (__eglMustCastToProperFunctionPointerType)NULL);
11944f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
11954f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
11964f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
1197