Path: blob/main_old/src/libGLESv2/egl_ext_stubs.cpp
1693 views
//1// Copyright 2020 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//5// egl_ext_stubs.cpp: Stubs for EXT extension entry points.6//78#include "libGLESv2/egl_ext_stubs_autogen.h"910#include "libANGLE/Device.h"11#include "libANGLE/Display.h"12#include "libANGLE/EGLSync.h"13#include "libANGLE/Surface.h"14#include "libANGLE/Thread.h"15#include "libANGLE/queryutils.h"16#include "libANGLE/validationEGL.h"17#include "libGLESv2/global_state.h"1819namespace egl20{21EGLint ClientWaitSyncKHR(Thread *thread,22Display *display,23Sync *syncObject,24EGLint flags,25EGLTimeKHR timeout)26{27ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglClientWaitSync",28GetDisplayIfValid(display), EGL_FALSE);29gl::Context *currentContext = thread->getContext();30EGLint syncStatus = EGL_FALSE;31ANGLE_EGL_TRY_RETURN(32thread, syncObject->clientWait(display, currentContext, flags, timeout, &syncStatus),33"eglClientWaitSync", GetSyncIfValid(display, syncObject), EGL_FALSE);3435thread->setSuccess();36return syncStatus;37}3839EGLImageKHR CreateImageKHR(Thread *thread,40Display *display,41gl::Context *context,42EGLenum target,43EGLClientBuffer buffer,44const AttributeMap &attributes)45{46ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreateImageKHR",47GetDisplayIfValid(display), EGL_NO_IMAGE);48Image *image = nullptr;49ANGLE_EGL_TRY_RETURN(thread, display->createImage(context, target, buffer, attributes, &image),50"", GetDisplayIfValid(display), EGL_NO_IMAGE);5152thread->setSuccess();53return static_cast<EGLImage>(image);54}5556EGLClientBuffer CreateNativeClientBufferANDROID(Thread *thread, const AttributeMap &attribMap)57{58EGLClientBuffer eglClientBuffer = nullptr;59ANGLE_EGL_TRY_RETURN(thread,60egl::Display::CreateNativeClientBuffer(attribMap, &eglClientBuffer),61"eglCreateNativeClientBufferANDROID", nullptr, nullptr);6263thread->setSuccess();64return eglClientBuffer;65}6667EGLSurface CreatePlatformPixmapSurfaceEXT(Thread *thread,68Display *display,69Config *configPacked,70void *native_pixmap,71const AttributeMap &attributes)72{73ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreatePlatformPixmapSurfaceEXT",74GetDisplayIfValid(display), EGL_NO_SURFACE);75thread->setError(EGL_BAD_DISPLAY, "eglCreatePlatformPixmapSurfaceEXT",76GetDisplayIfValid(display), "CreatePlatformPixmapSurfaceEXT unimplemented.");77return EGL_NO_SURFACE;78}7980EGLSurface CreatePlatformWindowSurfaceEXT(Thread *thread,81Display *display,82Config *configPacked,83void *native_window,84const AttributeMap &attributes)85{86ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreatePlatformWindowSurfaceEXT",87GetDisplayIfValid(display), EGL_NO_SURFACE);88thread->setError(EGL_BAD_DISPLAY, "eglCreatePlatformWindowSurfaceEXT",89GetDisplayIfValid(display), "CreatePlatformWindowSurfaceEXT unimplemented.");90return EGL_NO_SURFACE;91}9293EGLStreamKHR CreateStreamKHR(Thread *thread, Display *display, const AttributeMap &attributes)94{95ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreateStreamKHR",96GetDisplayIfValid(display), EGL_NO_STREAM_KHR);97Stream *stream;98ANGLE_EGL_TRY_RETURN(thread, display->createStream(attributes, &stream), "eglCreateStreamKHR",99GetDisplayIfValid(display), EGL_NO_STREAM_KHR);100101thread->setSuccess();102return static_cast<EGLStreamKHR>(stream);103}104105EGLSyncKHR CreateSyncKHR(Thread *thread,106Display *display,107EGLenum type,108const AttributeMap &attributes)109{110ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreateSyncKHR",111GetDisplayIfValid(display), EGL_NO_SYNC);112egl::Sync *syncObject = nullptr;113ANGLE_EGL_TRY_RETURN(thread,114display->createSync(thread->getContext(), type, attributes, &syncObject),115"eglCreateSyncKHR", GetDisplayIfValid(display), EGL_NO_SYNC);116117thread->setSuccess();118return static_cast<EGLSync>(syncObject);119}120121EGLint DebugMessageControlKHR(Thread *thread,122EGLDEBUGPROCKHR callback,123const AttributeMap &attributes)124{125Debug *debug = GetDebug();126debug->setCallback(callback, attributes);127128thread->setSuccess();129return EGL_SUCCESS;130}131132EGLBoolean DestroyImageKHR(Thread *thread, Display *display, Image *img)133{134ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglDestroyImageKHR",135GetDisplayIfValid(display), EGL_FALSE);136display->destroyImage(img);137138thread->setSuccess();139return EGL_TRUE;140}141142EGLBoolean DestroyStreamKHR(Thread *thread, Display *display, Stream *streamObject)143{144ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglDestroyStreamKHR",145GetDisplayIfValid(display), EGL_FALSE);146display->destroyStream(streamObject);147148thread->setSuccess();149return EGL_TRUE;150}151152EGLBoolean DestroySyncKHR(Thread *thread, Display *display, Sync *syncObject)153{154ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglDestroySync",155GetDisplayIfValid(display), EGL_FALSE);156display->destroySync(syncObject);157158thread->setSuccess();159return EGL_TRUE;160}161162EGLint DupNativeFenceFDANDROID(Thread *thread, Display *display, Sync *syncObject)163{164ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglDupNativeFenceFDANDROID",165GetDisplayIfValid(display), EGL_NO_NATIVE_FENCE_FD_ANDROID);166EGLint result = EGL_NO_NATIVE_FENCE_FD_ANDROID;167ANGLE_EGL_TRY_RETURN(thread, syncObject->dupNativeFenceFD(display, &result),168"eglDupNativeFenceFDANDROID", GetSyncIfValid(display, syncObject),169EGL_NO_NATIVE_FENCE_FD_ANDROID);170171thread->setSuccess();172return result;173}174175EGLClientBuffer GetNativeClientBufferANDROID(Thread *thread, const struct AHardwareBuffer *buffer)176{177thread->setSuccess();178return egl::Display::GetNativeClientBuffer(buffer);179}180181EGLDisplay GetPlatformDisplayEXT(Thread *thread,182EGLenum platform,183void *native_display,184const AttributeMap &attribMap)185{186if (platform == EGL_PLATFORM_ANGLE_ANGLE)187{188return egl::Display::GetDisplayFromNativeDisplay(189gl::bitCast<EGLNativeDisplayType>(native_display), attribMap);190}191else if (platform == EGL_PLATFORM_DEVICE_EXT)192{193Device *eglDevice = static_cast<Device *>(native_display);194return egl::Display::GetDisplayFromDevice(eglDevice, attribMap);195}196else197{198UNREACHABLE();199return EGL_NO_DISPLAY;200}201}202203EGLBoolean GetSyncAttribKHR(Thread *thread,204Display *display,205Sync *syncObject,206EGLint attribute,207EGLint *value)208{209ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglGetSyncAttrib",210GetDisplayIfValid(display), EGL_FALSE);211ANGLE_EGL_TRY_RETURN(thread, GetSyncAttrib(display, syncObject, attribute, value),212"eglGetSyncAttrib", GetSyncIfValid(display, syncObject), EGL_FALSE);213214thread->setSuccess();215return EGL_TRUE;216}217218EGLint LabelObjectKHR(Thread *thread,219Display *display,220ObjectType objectTypePacked,221EGLObjectKHR object,222EGLLabelKHR label)223{224LabeledObject *labeledObject =225GetLabeledObjectIfValid(thread, display, objectTypePacked, object);226ASSERT(labeledObject != nullptr);227labeledObject->setLabel(label);228229thread->setSuccess();230return EGL_SUCCESS;231}232233EGLBoolean PostSubBufferNV(Thread *thread,234Display *display,235Surface *eglSurface,236EGLint x,237EGLint y,238EGLint width,239EGLint height)240{241ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglPostSubBufferNV",242GetDisplayIfValid(display), EGL_FALSE);243Error error = eglSurface->postSubBuffer(thread->getContext(), x, y, width, height);244if (error.isError())245{246thread->setError(error, "eglPostSubBufferNV", GetSurfaceIfValid(display, eglSurface));247return EGL_FALSE;248}249250thread->setSuccess();251return EGL_TRUE;252}253254EGLBoolean PresentationTimeANDROID(Thread *thread,255Display *display,256Surface *eglSurface,257EGLnsecsANDROID time)258{259ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglPresentationTimeANDROID",260GetDisplayIfValid(display), EGL_FALSE);261ANGLE_EGL_TRY_RETURN(thread, eglSurface->setPresentationTime(time),262"eglPresentationTimeANDROID", GetSurfaceIfValid(display, eglSurface),263EGL_FALSE);264265return EGL_TRUE;266}267268EGLBoolean GetCompositorTimingSupportedANDROID(Thread *thread,269Display *display,270Surface *eglSurface,271CompositorTiming nameInternal)272{273thread->setSuccess();274return eglSurface->getSupportedCompositorTimings().test(nameInternal);275}276277EGLBoolean GetCompositorTimingANDROID(Thread *thread,278Display *display,279Surface *eglSurface,280EGLint numTimestamps,281const EGLint *names,282EGLnsecsANDROID *values)283{284ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglGetCompositorTimingANDROIDD",285GetDisplayIfValid(display), EGL_FALSE);286ANGLE_EGL_TRY_RETURN(thread, eglSurface->getCompositorTiming(numTimestamps, names, values),287"eglGetCompositorTimingANDROIDD", GetSurfaceIfValid(display, eglSurface),288EGL_FALSE);289290thread->setSuccess();291return EGL_TRUE;292}293294EGLBoolean GetNextFrameIdANDROID(Thread *thread,295Display *display,296Surface *eglSurface,297EGLuint64KHR *frameId)298{299ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglGetNextFrameIdANDROID",300GetDisplayIfValid(display), EGL_FALSE);301ANGLE_EGL_TRY_RETURN(thread, eglSurface->getNextFrameId(frameId), "eglGetNextFrameIdANDROID",302GetSurfaceIfValid(display, eglSurface), EGL_FALSE);303304thread->setSuccess();305return EGL_TRUE;306}307308EGLBoolean GetFrameTimestampSupportedANDROID(Thread *thread,309Display *display,310Surface *eglSurface,311Timestamp timestampInternal)312{313ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryTimestampSupportedANDROID",314GetDisplayIfValid(display), EGL_FALSE);315thread->setSuccess();316return eglSurface->getSupportedTimestamps().test(timestampInternal);317}318319EGLBoolean GetFrameTimestampsANDROID(Thread *thread,320Display *display,321Surface *eglSurface,322EGLuint64KHR frameId,323EGLint numTimestamps,324const EGLint *timestamps,325EGLnsecsANDROID *values)326{327ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglGetFrameTimestampsANDROID",328GetDisplayIfValid(display), EGL_FALSE);329ANGLE_EGL_TRY_RETURN(330thread, eglSurface->getFrameTimestamps(frameId, numTimestamps, timestamps, values),331"eglGetFrameTimestampsANDROID", GetSurfaceIfValid(display, eglSurface), EGL_FALSE);332333thread->setSuccess();334return EGL_TRUE;335}336337EGLBoolean QueryDebugKHR(Thread *thread, EGLint attribute, EGLAttrib *value)338{339Debug *debug = GetDebug();340switch (attribute)341{342case EGL_DEBUG_MSG_CRITICAL_KHR:343case EGL_DEBUG_MSG_ERROR_KHR:344case EGL_DEBUG_MSG_WARN_KHR:345case EGL_DEBUG_MSG_INFO_KHR:346*value = debug->isMessageTypeEnabled(FromEGLenum<MessageType>(attribute)) ? EGL_TRUE347: EGL_FALSE;348break;349case EGL_DEBUG_CALLBACK_KHR:350*value = reinterpret_cast<EGLAttrib>(debug->getCallback());351break;352353default:354UNREACHABLE();355}356357thread->setSuccess();358return EGL_TRUE;359}360361EGLBoolean QueryDeviceAttribEXT(Thread *thread, Device *dev, EGLint attribute, EGLAttrib *value)362{363ANGLE_EGL_TRY_RETURN(thread, dev->getAttribute(attribute, value), "eglQueryDeviceAttribEXT",364GetDeviceIfValid(dev), EGL_FALSE);365366thread->setSuccess();367return EGL_TRUE;368}369370const char *QueryDeviceStringEXT(Thread *thread, Device *dev, EGLint name)371{372egl::Display *owningDisplay = dev->getOwningDisplay();373ANGLE_EGL_TRY_RETURN(thread, owningDisplay->prepareForCall(), "eglQueryDeviceStringEXT",374GetDisplayIfValid(owningDisplay), EGL_FALSE);375const char *result;376switch (name)377{378case EGL_EXTENSIONS:379result = dev->getExtensionString().c_str();380break;381default:382thread->setError(EglBadDevice(), "eglQueryDeviceStringEXT", GetDeviceIfValid(dev));383return nullptr;384}385386thread->setSuccess();387return result;388}389390EGLBoolean QueryDisplayAttribEXT(Thread *thread,391Display *display,392EGLint attribute,393EGLAttrib *value)394{395ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryDisplayAttribEXT",396GetDisplayIfValid(display), EGL_FALSE);397*value = display->queryAttrib(attribute);398thread->setSuccess();399return EGL_TRUE;400}401402EGLBoolean QueryStreamKHR(Thread *thread,403Display *display,404Stream *streamObject,405EGLenum attribute,406EGLint *value)407{408ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryStreamKHR",409GetDisplayIfValid(display), EGL_FALSE);410switch (attribute)411{412case EGL_STREAM_STATE_KHR:413*value = streamObject->getState();414break;415case EGL_CONSUMER_LATENCY_USEC_KHR:416*value = streamObject->getConsumerLatency();417break;418case EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR:419*value = streamObject->getConsumerAcquireTimeout();420break;421default:422UNREACHABLE();423}424425thread->setSuccess();426return EGL_TRUE;427}428429EGLBoolean QueryStreamu64KHR(Thread *thread,430Display *display,431Stream *streamObject,432EGLenum attribute,433EGLuint64KHR *value)434{435ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryStreamu64KHR",436GetDisplayIfValid(display), EGL_FALSE);437switch (attribute)438{439case EGL_PRODUCER_FRAME_KHR:440*value = streamObject->getProducerFrame();441break;442case EGL_CONSUMER_FRAME_KHR:443*value = streamObject->getConsumerFrame();444break;445default:446UNREACHABLE();447}448449thread->setSuccess();450return EGL_TRUE;451}452453EGLBoolean QuerySurfacePointerANGLE(Thread *thread,454Display *display,455Surface *eglSurface,456EGLint attribute,457void **value)458{459ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQuerySurfacePointerANGLE",460GetDisplayIfValid(display), EGL_FALSE);461Error error = eglSurface->querySurfacePointerANGLE(attribute, value);462if (error.isError())463{464thread->setError(error, "eglQuerySurfacePointerANGLE",465GetSurfaceIfValid(display, eglSurface));466return EGL_FALSE;467}468469thread->setSuccess();470return EGL_TRUE;471}472473void SetBlobCacheFuncsANDROID(Thread *thread,474Display *display,475EGLSetBlobFuncANDROID set,476EGLGetBlobFuncANDROID get)477{478ANGLE_EGL_TRY(thread, display->prepareForCall(), "eglSetBlobCacheFuncsANDROID",479GetDisplayIfValid(display));480thread->setSuccess();481display->setBlobCacheFuncs(set, get);482}483484EGLBoolean SignalSyncKHR(Thread *thread, Display *display, Sync *syncObject, EGLenum mode)485{486gl::Context *currentContext = thread->getContext();487ANGLE_EGL_TRY_RETURN(thread, syncObject->signal(display, currentContext, mode),488"eglSignalSyncKHR", GetSyncIfValid(display, syncObject), EGL_FALSE);489490thread->setSuccess();491return EGL_TRUE;492}493494EGLBoolean StreamAttribKHR(Thread *thread,495Display *display,496Stream *streamObject,497EGLenum attribute,498EGLint value)499{500ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglStreamAttribKHR",501GetDisplayIfValid(display), EGL_FALSE);502switch (attribute)503{504case EGL_CONSUMER_LATENCY_USEC_KHR:505streamObject->setConsumerLatency(value);506break;507case EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR:508streamObject->setConsumerAcquireTimeout(value);509break;510default:511UNREACHABLE();512}513514thread->setSuccess();515return EGL_TRUE;516}517518EGLBoolean StreamConsumerAcquireKHR(Thread *thread, Display *display, Stream *streamObject)519{520ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglStreamConsumerAcquireKHR",521GetDisplayIfValid(display), EGL_FALSE);522ANGLE_EGL_TRY_RETURN(thread, streamObject->consumerAcquire(thread->getContext()),523"eglStreamConsumerAcquireKHR", GetStreamIfValid(display, streamObject),524EGL_FALSE);525thread->setSuccess();526return EGL_TRUE;527}528529EGLBoolean StreamConsumerGLTextureExternalKHR(Thread *thread,530Display *display,531Stream *streamObject)532{533ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglStreamConsumerGLTextureExternalKHR",534GetDisplayIfValid(display), EGL_FALSE);535ANGLE_EGL_TRY_RETURN(536thread, streamObject->createConsumerGLTextureExternal(AttributeMap(), thread->getContext()),537"eglStreamConsumerGLTextureExternalKHR", GetStreamIfValid(display, streamObject),538EGL_FALSE);539thread->setSuccess();540return EGL_TRUE;541}542543EGLBoolean StreamConsumerGLTextureExternalAttribsNV(Thread *thread,544Display *display,545Stream *streamObject,546const AttributeMap &attributes)547{548ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(),549"eglStreamConsumerGLTextureExternalAttribsNV", GetDisplayIfValid(display),550EGL_FALSE);551552gl::Context *context = gl::GetValidGlobalContext();553ANGLE_EGL_TRY_RETURN(thread, streamObject->createConsumerGLTextureExternal(attributes, context),554"eglStreamConsumerGLTextureExternalAttribsNV",555GetStreamIfValid(display, streamObject), EGL_FALSE);556thread->setSuccess();557return EGL_TRUE;558}559560EGLBoolean StreamConsumerReleaseKHR(Thread *thread, Display *display, Stream *streamObject)561{562ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglStreamConsumerReleaseKHR",563GetDisplayIfValid(display), EGL_FALSE);564565gl::Context *context = gl::GetValidGlobalContext();566ANGLE_EGL_TRY_RETURN(thread, streamObject->consumerRelease(context),567"eglStreamConsumerReleaseKHR", GetStreamIfValid(display, streamObject),568EGL_FALSE);569thread->setSuccess();570return EGL_TRUE;571}572573EGLBoolean SwapBuffersWithDamageKHR(Thread *thread,574Display *display,575Surface *eglSurface,576const EGLint *rects,577EGLint n_rects)578{579ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglSwapBuffersWithDamageEXT",580GetDisplayIfValid(display), EGL_FALSE);581ANGLE_EGL_TRY_RETURN(thread, eglSurface->swapWithDamage(thread->getContext(), rects, n_rects),582"eglSwapBuffersWithDamageEXT", GetSurfaceIfValid(display, eglSurface),583EGL_FALSE);584585thread->setSuccess();586return EGL_TRUE;587}588589EGLint WaitSyncKHR(Thread *thread, Display *display, Sync *syncObject, EGLint flags)590{591ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglWaitSync",592GetDisplayIfValid(display), EGL_FALSE);593gl::Context *currentContext = thread->getContext();594ANGLE_EGL_TRY_RETURN(thread, syncObject->serverWait(display, currentContext, flags),595"eglWaitSync", GetSyncIfValid(display, syncObject), EGL_FALSE);596597thread->setSuccess();598return EGL_TRUE;599}600601EGLDeviceEXT CreateDeviceANGLE(Thread *thread,602EGLint device_type,603void *native_device,604const EGLAttrib *attrib_list)605{606Device *device = nullptr;607ANGLE_EGL_TRY_RETURN(thread, Device::CreateDevice(device_type, native_device, &device),608"eglCreateDeviceANGLE", GetThreadIfValid(thread), EGL_NO_DEVICE_EXT);609610thread->setSuccess();611return device;612}613614EGLBoolean ReleaseDeviceANGLE(Thread *thread, Device *dev)615{616SafeDelete(dev);617618thread->setSuccess();619return EGL_TRUE;620}621622EGLBoolean CreateStreamProducerD3DTextureANGLE(Thread *thread,623Display *display,624Stream *streamObject,625const AttributeMap &attributes)626{627ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(),628"eglCreateStreamProducerD3DTextureANGLE", GetDisplayIfValid(display),629EGL_FALSE);630ANGLE_EGL_TRY_RETURN(thread, streamObject->createProducerD3D11Texture(attributes),631"eglCreateStreamProducerD3DTextureANGLE",632GetStreamIfValid(display, streamObject), EGL_FALSE);633thread->setSuccess();634return EGL_TRUE;635}636637EGLBoolean StreamPostD3DTextureANGLE(Thread *thread,638Display *display,639Stream *streamObject,640void *texture,641const AttributeMap &attributes)642{643ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglStreamPostD3DTextureANGLE",644GetDisplayIfValid(display), EGL_FALSE);645ANGLE_EGL_TRY_RETURN(thread, streamObject->postD3D11Texture(texture, attributes),646"eglStreamPostD3DTextureANGLE", GetStreamIfValid(display, streamObject),647EGL_FALSE);648thread->setSuccess();649return EGL_TRUE;650}651652EGLBoolean GetMscRateANGLE(Thread *thread,653Display *display,654Surface *eglSurface,655EGLint *numerator,656EGLint *denominator)657{658ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglGetMscRateANGLE",659GetDisplayIfValid(display), EGL_FALSE);660ANGLE_EGL_TRY_RETURN(thread, eglSurface->getMscRate(numerator, denominator),661"eglGetMscRateANGLE", GetSurfaceIfValid(display, eglSurface), EGL_FALSE);662663thread->setSuccess();664return EGL_TRUE;665}666667EGLBoolean GetSyncValuesCHROMIUM(Thread *thread,668Display *display,669Surface *eglSurface,670EGLuint64KHR *ust,671EGLuint64KHR *msc,672EGLuint64KHR *sbc)673{674ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglGetSyncValuesCHROMIUM",675GetDisplayIfValid(display), EGL_FALSE);676ANGLE_EGL_TRY_RETURN(thread, eglSurface->getSyncValues(ust, msc, sbc),677"eglGetSyncValuesCHROMIUM", GetSurfaceIfValid(display, eglSurface),678EGL_FALSE);679680thread->setSuccess();681return EGL_TRUE;682}683684EGLint ProgramCacheGetAttribANGLE(Thread *thread, Display *display, EGLenum attrib)685{686ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglProgramCacheGetAttribANGLE",687GetDisplayIfValid(display), 0);688thread->setSuccess();689return display->programCacheGetAttrib(attrib);690}691692void ProgramCacheQueryANGLE(Thread *thread,693Display *display,694EGLint index,695void *key,696EGLint *keysize,697void *binary,698EGLint *binarysize)699{700ANGLE_EGL_TRY(thread, display->prepareForCall(), "eglProgramCacheQueryANGLE",701GetDisplayIfValid(display));702ANGLE_EGL_TRY(thread, display->programCacheQuery(index, key, keysize, binary, binarysize),703"eglProgramCacheQueryANGLE", GetDisplayIfValid(display));704705thread->setSuccess();706}707708void ProgramCachePopulateANGLE(Thread *thread,709Display *display,710const void *key,711EGLint keysize,712const void *binary,713EGLint binarysize)714{715ANGLE_EGL_TRY(thread, display->prepareForCall(), "eglProgramCachePopulateANGLE",716GetDisplayIfValid(display));717ANGLE_EGL_TRY(thread, display->programCachePopulate(key, keysize, binary, binarysize),718"eglProgramCachePopulateANGLE", GetDisplayIfValid(display));719720thread->setSuccess();721}722723EGLint ProgramCacheResizeANGLE(Thread *thread, Display *display, EGLint limit, EGLint mode)724{725ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglProgramCacheResizeANGLE",726GetDisplayIfValid(display), 0);727thread->setSuccess();728return display->programCacheResize(limit, mode);729}730731const char *QueryStringiANGLE(Thread *thread, Display *display, EGLint name, EGLint index)732{733ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryStringiANGLE",734GetDisplayIfValid(display), nullptr);735thread->setSuccess();736return display->queryStringi(name, index);737}738739EGLBoolean SwapBuffersWithFrameTokenANGLE(Thread *thread,740Display *display,741Surface *eglSurface,742EGLFrameTokenANGLE frametoken)743{744ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglSwapBuffersWithFrameTokenANGLE",745GetDisplayIfValid(display), EGL_FALSE);746ANGLE_EGL_TRY_RETURN(thread, eglSurface->swapWithFrameToken(thread->getContext(), frametoken),747"eglSwapBuffersWithFrameTokenANGLE", GetDisplayIfValid(display),748EGL_FALSE);749750thread->setSuccess();751return EGL_TRUE;752}753754void ReleaseHighPowerGPUANGLE(Thread *thread, Display *display, gl::Context *context)755{756ANGLE_EGL_TRY(thread, display->prepareForCall(), "eglReleaseHighPowerGPUANGLE",757GetDisplayIfValid(display));758ANGLE_EGL_TRY(thread, context->releaseHighPowerGPU(), "eglReleaseHighPowerGPUANGLE",759GetDisplayIfValid(display));760761thread->setSuccess();762}763764void ReacquireHighPowerGPUANGLE(Thread *thread, Display *display, gl::Context *context)765{766ANGLE_EGL_TRY(thread, display->prepareForCall(), "eglReacquireHighPowerGPUANGLE",767GetDisplayIfValid(display));768ANGLE_EGL_TRY(thread, context->reacquireHighPowerGPU(), "eglReacquireHighPowerGPUANGLE",769GetDisplayIfValid(display));770771thread->setSuccess();772}773774void HandleGPUSwitchANGLE(Thread *thread, Display *display)775{776ANGLE_EGL_TRY(thread, display->prepareForCall(), "eglHandleGPUSwitchANGLE",777GetDisplayIfValid(display));778ANGLE_EGL_TRY(thread, display->handleGPUSwitch(), "eglHandleGPUSwitchANGLE",779GetDisplayIfValid(display));780781thread->setSuccess();782}783784EGLBoolean QueryDisplayAttribANGLE(Thread *thread,785Display *display,786EGLint attribute,787EGLAttrib *value)788{789ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryDisplayAttribEXT",790GetDisplayIfValid(display), EGL_FALSE);791*value = display->queryAttrib(attribute);792thread->setSuccess();793return EGL_TRUE;794}795} // namespace egl796797798