diff --git a/gn/core.gni b/gn/core.gni index 186e5af454..358c3875c8 100644 --- a/gn/core.gni +++ b/gn/core.gni @@ -272,7 +272,6 @@ skia_core_sources = [ "$_src/core/SkScan_Antihair.cpp", "$_src/core/SkScan_Hairline.cpp", "$_src/core/SkScan_Path.cpp", - "$_src/core/SkScopeExit.h", "$_src/core/SkSemaphore.cpp", "$_src/core/SkSharedMutex.cpp", "$_src/core/SkSharedMutex.h", diff --git a/gn/pdf.gni b/gn/pdf.gni index 665e35c2f8..355c27a4a8 100644 --- a/gn/pdf.gni +++ b/gn/pdf.gni @@ -46,4 +46,5 @@ skia_pdf_sources = [ "$_src/pdf/SkPDFTypes.h", "$_src/pdf/SkPDFUtils.cpp", "$_src/pdf/SkPDFUtils.h", + "$_src/pdf/SkScopeExit.h", ] diff --git a/src/core/SkScopeExit.h b/src/pdf/SkScopeExit.h similarity index 59% rename from src/core/SkScopeExit.h rename to src/pdf/SkScopeExit.h index 95804e637a..5b7bcdc076 100644 --- a/src/core/SkScopeExit.h +++ b/src/pdf/SkScopeExit.h @@ -10,30 +10,6 @@ #include "SkTypes.h" -/** SkScopeExit calls a std:::function in its destructor. */ -class SkScopeExit { -public: - SkScopeExit(std::function f) : fFn(std::move(f)) {} - SkScopeExit(SkScopeExit&& that) : fFn(std::move(that.fFn)) {} - - ~SkScopeExit() { - if (fFn) { - fFn(); - } - } - - SkScopeExit& operator=(SkScopeExit&& that) { - fFn = std::move(that.fFn); - return *this; - } - -private: - std::function fFn; - - SkScopeExit( const SkScopeExit& ) = delete; - SkScopeExit& operator=(const SkScopeExit& ) = delete; -}; - /** * SK_AT_SCOPE_EXIT(stmt) evaluates stmt when the current scope ends. * @@ -47,7 +23,28 @@ private: * SkASSERT(x == 4); * } */ +template +class SkScopeExit { +public: + SkScopeExit(Fn f) : fFn(std::move(f)) {} + ~SkScopeExit() { fFn(); } + +private: + Fn fFn; + + SkScopeExit( const SkScopeExit& ) = delete; + SkScopeExit& operator=(const SkScopeExit& ) = delete; + SkScopeExit( SkScopeExit&&) = delete; + SkScopeExit& operator=( SkScopeExit&&) = delete; +}; + +template +inline SkScopeExit SkMakeScopeExit(Fn&& fn) { + return {std::move(fn)}; +} + #define SK_AT_SCOPE_EXIT(stmt) \ - SkScopeExit SK_MACRO_APPEND_LINE(at_scope_exit_)([&]() { stmt; }) + SK_UNUSED auto&& SK_MACRO_APPEND_LINE(at_scope_exit_) = \ + SkMakeScopeExit([&]() { stmt; }); #endif // SkScopeExit_DEFINED diff --git a/tests/ImageTest.cpp b/tests/ImageTest.cpp index d18e6a9674..30ae635c98 100644 --- a/tests/ImageTest.cpp +++ b/tests/ImageTest.cpp @@ -436,10 +436,10 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(SkImage_makeTextureImage, reporter, contextIn // Create a texture image. [context] { return create_gpu_image(context); }, // Create a texture image in a another GrContext. - [otherContextInfo] { - auto restore = otherContextInfo.testContext()->makeCurrentAndAutoRestore(); + [testContext, otherContextInfo] { + otherContextInfo.testContext()->makeCurrent(); sk_sp otherContextImage = create_gpu_image(otherContextInfo.grContext()); - otherContextInfo.grContext()->flush(); + testContext->makeCurrent(); return otherContextImage; } }; @@ -487,6 +487,7 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(SkImage_makeTextureImage, reporter, contextIn } } + testContext->makeCurrent(); context->flush(); } } @@ -1196,10 +1197,10 @@ DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(makeBackendTexture, reporter, ctxInfo) { { create_picture_image, true, false }, { [context] { return create_gpu_image(context); }, true, true }, // Create a texture image in a another GrContext. - { [otherContextInfo] { - auto restore = otherContextInfo.testContext()->makeCurrentAndAutoRestore(); + { [testContext, otherContextInfo] { + otherContextInfo.testContext()->makeCurrent(); sk_sp otherContextImage = create_gpu_image(otherContextInfo.grContext()); - otherContextInfo.grContext()->flush(); + testContext->makeCurrent(); return otherContextImage; }, false, false }, // Create an image that is too large to be texture backed. @@ -1231,6 +1232,7 @@ DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(makeBackendTexture, reporter, ctxInfo) { kExpectedState[testCase.fCanTakeDirectly]); } + testContext->makeCurrent(); context->flush(); } } diff --git a/tools/gpu/GrContextFactory.cpp b/tools/gpu/GrContextFactory.cpp index 00c4b65edc..21766db2b8 100644 --- a/tools/gpu/GrContextFactory.cpp +++ b/tools/gpu/GrContextFactory.cpp @@ -52,9 +52,8 @@ GrContextFactory::~GrContextFactory() { void GrContextFactory::destroyContexts() { for (Context& context : fContexts) { - SkScopeExit restore(nullptr); if (context.fTestContext) { - restore = context.fTestContext->makeCurrentAndAutoRestore(); + context.fTestContext->makeCurrent(); } if (!context.fGrContext->unique()) { context.fGrContext->releaseResourcesAndAbandonContext(); @@ -70,7 +69,7 @@ void GrContextFactory::abandonContexts() { for (Context& context : fContexts) { if (!context.fAbandoned) { if (context.fTestContext) { - auto restore = context.fTestContext->makeCurrentAndAutoRestore(); + context.fTestContext->makeCurrent(); context.fTestContext->testAbandon(); delete(context.fTestContext); context.fTestContext = nullptr; @@ -83,10 +82,9 @@ void GrContextFactory::abandonContexts() { void GrContextFactory::releaseResourcesAndAbandonContexts() { for (Context& context : fContexts) { - SkScopeExit restore(nullptr); if (!context.fAbandoned) { if (context.fTestContext) { - restore = context.fTestContext->makeCurrentAndAutoRestore(); + context.fTestContext->makeCurrent(); } context.fGrContext->releaseResourcesAndAbandonContext(); context.fAbandoned = true; @@ -239,7 +237,7 @@ ContextInfo GrContextFactory::getContextInfoInternal(ContextType type, ContextOv default: return ContextInfo(); } - + testCtx->makeCurrent(); SkASSERT(testCtx && testCtx->backend() == backend); GrContextOptions grOptions = fGlobalOptions; if (ContextOverrides::kDisableNVPR & overrides) { @@ -254,11 +252,7 @@ ContextInfo GrContextFactory::getContextInfoInternal(ContextType type, ContextOv if (ContextOverrides::kAvoidStencilBuffers & overrides) { grOptions.fAvoidStencilBuffers = true; } - sk_sp grCtx; - { - auto restore = testCtx->makeCurrentAndAutoRestore(); - grCtx = testCtx->makeGrContext(grOptions); - } + sk_sp grCtx = testCtx->makeGrContext(grOptions); if (!grCtx.get()) { return ContextInfo(); } @@ -288,7 +282,6 @@ ContextInfo GrContextFactory::getContextInfoInternal(ContextType type, ContextOv context.fShareContext = shareContext; context.fShareIndex = shareIndex; context.fOptions = grOptions; - context.fTestContext->makeCurrent(); return ContextInfo(context.fType, context.fTestContext, context.fGrContext, context.fOptions); } diff --git a/tools/gpu/TestContext.cpp b/tools/gpu/TestContext.cpp index f760cc7738..c80c4ea4df 100644 --- a/tools/gpu/TestContext.cpp +++ b/tools/gpu/TestContext.cpp @@ -37,15 +37,8 @@ sk_sp TestContext::makeGrContext(const GrContextOptions&) { void TestContext::makeCurrent() const { this->onPlatformMakeCurrent(); } -SkScopeExit TestContext::makeCurrentAndAutoRestore() const { - auto asr = SkScopeExit(this->onPlatformGetAutoContextRestore()); - this->makeCurrent(); - return asr; -} - void TestContext::swapBuffers() { this->onPlatformSwapBuffers(); } - void TestContext::waitOnSyncOrSwap() { if (!fFenceSync) { // Fallback on the platform SwapBuffers method for synchronization. This may have no effect. diff --git a/tools/gpu/TestContext.h b/tools/gpu/TestContext.h index 5b512db7ba..84794f3c34 100644 --- a/tools/gpu/TestContext.h +++ b/tools/gpu/TestContext.h @@ -9,11 +9,10 @@ #ifndef TestContext_DEFINED #define TestContext_DEFINED -#include "../private/SkTemplates.h" #include "FenceSync.h" #include "GrTypes.h" #include "SkRefCnt.h" -#include "SkScopeExit.h" +#include "../private/SkTemplates.h" class GrContext; struct GrContextOptions; @@ -46,18 +45,6 @@ public: void makeCurrent() const; - /** - * Like makeCurrent() but this returns an object that will restore the previous current - * context in its destructor. Useful to undo the effect making this current before returning to - * a caller that doesn't expect the current context to be changed underneath it. - * - * The returned object restores the current context of the same type (e.g. egl, glx, ...) in its - * destructor. It is undefined behavior if that context is destroyed before the destructor - * executes. If the concept of a current context doesn't make sense for this context type then - * the returned object's destructor is a no-op. - */ - SkScopeExit SK_WARN_UNUSED_RESULT makeCurrentAndAutoRestore() const; - virtual GrBackend backend() = 0; virtual GrBackendContext backendContext() = 0; @@ -107,14 +94,6 @@ protected: virtual void teardown(); virtual void onPlatformMakeCurrent() const = 0; - /** - * Subclasses should implement such that the returned function will cause the current context - * of this type to be made current again when it is called. It should additionally be the - * case that if "this" is already current when this is called, then "this" is destroyed (thereby - * setting the null context as current), and then the std::function is called the null context - * should remain current. - */ - virtual std::function onPlatformGetAutoContextRestore() const = 0; virtual void onPlatformSwapBuffers() const = 0; private: diff --git a/tools/gpu/gl/angle/GLTestContext_angle.cpp b/tools/gpu/gl/angle/GLTestContext_angle.cpp index 3b55c40bac..52cc5128da 100644 --- a/tools/gpu/gl/angle/GLTestContext_angle.cpp +++ b/tools/gpu/gl/angle/GLTestContext_angle.cpp @@ -34,16 +34,6 @@ struct Libs { void* fEGLLib; }; -std::function context_restorer() { - auto display = eglGetCurrentDisplay(); - auto dsurface = eglGetCurrentSurface(EGL_DRAW); - auto rsurface = eglGetCurrentSurface(EGL_READ); - auto context = eglGetCurrentContext(); - return [display, dsurface, rsurface, context] { - eglMakeCurrent(display, dsurface, rsurface, context); - }; -} - static GrGLFuncPtr angle_get_gl_proc(void* ctx, const char name[]) { const Libs* libs = reinterpret_cast(ctx); GrGLFuncPtr proc = (GrGLFuncPtr) GetProcedureAddress(libs->fGLLib, name); @@ -97,7 +87,6 @@ private: void destroyGLContext(); void onPlatformMakeCurrent() const override; - std::function onPlatformGetAutoContextRestore() const override; void onPlatformSwapBuffers() const override; GrGLFuncPtr onPlatformGetProcAddress(const char* name) const override; @@ -225,7 +214,6 @@ ANGLEGLContext::ANGLEGLContext(ANGLEBackend type, ANGLEContextVersion version, fSurface = eglCreatePbufferSurface(fDisplay, surfaceConfig, surfaceAttribs); - SkScopeExit restorer(context_restorer()); if (!eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { SkDebugf("Could not set the context."); this->destroyGLContext(); @@ -332,10 +320,7 @@ std::unique_ptr ANGLEGLContext::makeNew() const { void ANGLEGLContext::destroyGLContext() { if (EGL_NO_DISPLAY != fDisplay) { - if (eglGetCurrentContext() == fContext) { - // This will ensure that the context is immediately deleted. - eglMakeCurrent(fDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); - } + eglMakeCurrent(fDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); if (EGL_NO_CONTEXT != fContext) { eglDestroyContext(fDisplay, fContext); @@ -370,13 +355,6 @@ void ANGLEGLContext::onPlatformMakeCurrent() const { } } -std::function ANGLEGLContext::onPlatformGetAutoContextRestore() const { - if (eglGetCurrentContext() == fContext) { - return nullptr; - } - return context_restorer(); -} - void ANGLEGLContext::onPlatformSwapBuffers() const { if (!eglSwapBuffers(fDisplay, fSurface)) { SkDebugf("Could not complete eglSwapBuffers.\n"); diff --git a/tools/gpu/gl/command_buffer/GLTestContext_command_buffer.cpp b/tools/gpu/gl/command_buffer/GLTestContext_command_buffer.cpp index 18e150611a..54845fc28b 100644 --- a/tools/gpu/gl/command_buffer/GLTestContext_command_buffer.cpp +++ b/tools/gpu/gl/command_buffer/GLTestContext_command_buffer.cpp @@ -25,7 +25,6 @@ typedef void* EGLNativeDisplayType; typedef void* EGLNativeWindowType; typedef void (*__eglMustCastToProperFunctionPointerType)(void); #define EGL_FALSE 0 -#define EGL_TRUE 1 #define EGL_OPENGL_ES2_BIT 0x0004 #define EGL_CONTEXT_CLIENT_VERSION 0x3098 #define EGL_NO_SURFACE ((EGLSurface)0) @@ -46,8 +45,6 @@ typedef void (*__eglMustCastToProperFunctionPointerType)(void); #define EGL_NONE 0x3038 #define EGL_WIDTH 0x3057 #define EGL_HEIGHT 0x3056 -#define EGL_DRAW 0x3059 -#define EGL_READ 0x305A typedef EGLDisplay (*GetDisplayProc)(EGLNativeDisplayType display_id); typedef EGLBoolean (*InitializeProc)(EGLDisplay dpy, EGLint *major, EGLint *minor); @@ -80,37 +77,6 @@ static GetProcAddressProc gfGetProcAddress = nullptr; static void* gLibrary = nullptr; static bool gfFunctionsLoadedSuccessfully = false; -// The command buffer does not correctly implement eglGetCurrent. It always returns EGL_NO_. -// So we implement them ourselves and hook eglMakeCurrent to store the current values in TLS. -thread_local EGLDisplay gCurrDisplay = EGL_NO_DISPLAY; -thread_local EGLSurface gCurrReadSurface = EGL_NO_SURFACE; -thread_local EGLSurface gCurrDrawSurface = EGL_NO_SURFACE; -thread_local EGLContext gCurrContext = EGL_NO_CONTEXT; - -EGLDisplay fakeGetCurrentDisplay() { return gCurrDisplay; } -EGLSurface fakeGetCurrentSurface(EGLint readdraw) { - switch (readdraw) { - case EGL_DRAW: - return gCurrDrawSurface; - case EGL_READ: - return gCurrReadSurface; - default: - return EGL_NO_SURFACE; - } -} -EGLContext fakeGetCurrentContext() { return gCurrContext; } - -EGLBoolean hookedMakeCurrent(EGLDisplay display, EGLSurface draw, EGLSurface read, EGLContext ctx) { - if (gfFunctionsLoadedSuccessfully && EGL_TRUE == gfMakeCurrent(display, draw, read, ctx)) { - gCurrDisplay = display; - gCurrDrawSurface = draw; - gCurrReadSurface = read; - gCurrContext = ctx; - return EGL_TRUE; - } - return EGL_FALSE; -} - namespace { static void load_command_buffer_functions() { if (!gLibrary) { @@ -138,11 +104,12 @@ static void load_command_buffer_functions() { gfSwapBuffers = (SwapBuffersProc)GetProcedureAddress(gLibrary, "eglSwapBuffers"); gfGetProcAddress = (GetProcAddressProc)GetProcedureAddress(gLibrary, "eglGetProcAddress"); - gfFunctionsLoadedSuccessfully = - gfGetDisplay && gfInitialize && gfTerminate && gfChooseConfig && - gfCreateWindowSurface && gfCreatePbufferSurface && gfDestroySurface && - gfCreateContext && gfDestroyContext && gfMakeCurrent && gfSwapBuffers && - gfGetProcAddress; + gfFunctionsLoadedSuccessfully = gfGetDisplay && gfInitialize && gfTerminate && + gfChooseConfig && gfCreateWindowSurface && + gfCreatePbufferSurface && gfDestroySurface && + gfCreateContext && gfDestroyContext && gfMakeCurrent && + gfSwapBuffers && gfGetProcAddress; + } } } @@ -167,19 +134,6 @@ static const GrGLInterface* create_command_buffer_interface() { return GrGLAssembleGLESInterface(gLibrary, command_buffer_get_gl_proc); } -std::function context_restorer() { - if (!gfFunctionsLoadedSuccessfully) { - return nullptr; - } - auto display = fakeGetCurrentDisplay(); - auto dsurface = fakeGetCurrentSurface(EGL_DRAW); - auto rsurface = fakeGetCurrentSurface(EGL_READ); - auto context = fakeGetCurrentContext(); - return [display, dsurface, rsurface, context] { - hookedMakeCurrent(display, dsurface, rsurface, context); - }; -} - } // anonymous namespace namespace sk_gpu_test { @@ -250,8 +204,7 @@ CommandBufferGLTestContext::CommandBufferGLTestContext(CommandBufferGLTestContex return; } - SkScopeExit restorer(context_restorer()); - if (!hookedMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { + if (!gfMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { SkDebugf("Command Buffer: Could not make EGL context current.\n"); this->destroyGLContext(); return; @@ -284,19 +237,15 @@ void CommandBufferGLTestContext::destroyGLContext() { if (EGL_NO_DISPLAY == fDisplay) { return; } - bool wasCurrent = false; if (EGL_NO_CONTEXT != fContext) { - wasCurrent = fakeGetCurrentContext() == fContext; gfDestroyContext(fDisplay, fContext); fContext = EGL_NO_CONTEXT; } - if (wasCurrent) { - // Call MakeCurrent after destroying the context, so that the EGL implementation knows that - // the context is not used anymore after it is released from being current.This way the - // command buffer does not need to abandon the context before destruction, and no - // client-side errors are printed. - hookedMakeCurrent(fDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); - } + // Call MakeCurrent after destroying the context, so that the EGL implementation knows that + // the context is not used anymore after it is released from being current. This way + // command buffer does not need to abandon the context before destruction, and no + // client-side errors are printed. + gfMakeCurrent(fDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); if (EGL_NO_SURFACE != fSurface) { gfDestroySurface(fDisplay, fSurface); @@ -309,18 +258,11 @@ void CommandBufferGLTestContext::onPlatformMakeCurrent() const { if (!gfFunctionsLoadedSuccessfully) { return; } - if (!hookedMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { + if (!gfMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { SkDebugf("Command Buffer: Could not make EGL context current.\n"); } } -std::function CommandBufferGLTestContext::onPlatformGetAutoContextRestore() const { - if (!gfFunctionsLoadedSuccessfully || fakeGetCurrentContext() == fContext) { - return nullptr; - } - return context_restorer(); -} - void CommandBufferGLTestContext::onPlatformSwapBuffers() const { if (!gfFunctionsLoadedSuccessfully) { return; @@ -346,7 +288,7 @@ void CommandBufferGLTestContext::presentCommandBuffer() { } bool CommandBufferGLTestContext::makeCurrent() { - return hookedMakeCurrent(fDisplay, fSurface, fSurface, fContext) != EGL_FALSE; + return gfMakeCurrent(fDisplay, fSurface, fSurface, fContext) != EGL_FALSE; } int CommandBufferGLTestContext::getStencilBits() { diff --git a/tools/gpu/gl/command_buffer/GLTestContext_command_buffer.h b/tools/gpu/gl/command_buffer/GLTestContext_command_buffer.h index 6a631be8fb..7582f16351 100644 --- a/tools/gpu/gl/command_buffer/GLTestContext_command_buffer.h +++ b/tools/gpu/gl/command_buffer/GLTestContext_command_buffer.h @@ -42,8 +42,6 @@ private: void onPlatformMakeCurrent() const override; - std::function onPlatformGetAutoContextRestore() const override; - void onPlatformSwapBuffers() const override; GrGLFuncPtr onPlatformGetProcAddress(const char *name) const override; diff --git a/tools/gpu/gl/debug/DebugGLTestContext.cpp b/tools/gpu/gl/debug/DebugGLTestContext.cpp index e28a3a7f13..f16692e8e0 100644 --- a/tools/gpu/gl/debug/DebugGLTestContext.cpp +++ b/tools/gpu/gl/debug/DebugGLTestContext.cpp @@ -1203,7 +1203,6 @@ public: private: void onPlatformMakeCurrent() const override {} - std::function onPlatformGetAutoContextRestore() const override { return nullptr; } void onPlatformSwapBuffers() const override {} GrGLFuncPtr onPlatformGetProcAddress(const char*) const override { return nullptr; } }; diff --git a/tools/gpu/gl/egl/CreatePlatformGLTestContext_egl.cpp b/tools/gpu/gl/egl/CreatePlatformGLTestContext_egl.cpp index 7fa88c094a..74cadfcb62 100644 --- a/tools/gpu/gl/egl/CreatePlatformGLTestContext_egl.cpp +++ b/tools/gpu/gl/egl/CreatePlatformGLTestContext_egl.cpp @@ -39,16 +39,6 @@ private: typedef sk_gpu_test::FenceSync INHERITED; }; -std::function context_restorer() { - auto display = eglGetCurrentDisplay(); - auto dsurface = eglGetCurrentSurface(EGL_DRAW); - auto rsurface = eglGetCurrentSurface(EGL_READ); - auto context = eglGetCurrentContext(); - return [display, dsurface, rsurface, context] { - eglMakeCurrent(display, dsurface, rsurface, context); - }; -} - class EGLGLTestContext : public sk_gpu_test::GLTestContext { public: EGLGLTestContext(GrGLStandard forcedGpuAPI, EGLGLTestContext* shareContext); @@ -63,7 +53,6 @@ private: void destroyGLContext(); void onPlatformMakeCurrent() const override; - std::function onPlatformGetAutoContextRestore() const override; void onPlatformSwapBuffers() const override; GrGLFuncPtr onPlatformGetProcAddress(const char*) const override; @@ -179,7 +168,6 @@ EGLGLTestContext::EGLGLTestContext(GrGLStandard forcedGpuAPI, EGLGLTestContext* continue; } - SkScopeExit restorer(context_restorer()); if (!eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { SkDebugf("eglMakeCurrent failed. EGL Error: 0x%08x\n", eglGetError()); this->destroyGLContext(); @@ -211,11 +199,9 @@ EGLGLTestContext::~EGLGLTestContext() { void EGLGLTestContext::destroyGLContext() { if (fDisplay) { + eglMakeCurrent(fDisplay, 0, 0, 0); + if (fContext) { - if (eglGetCurrentContext() == fContext) { - // This will ensure that the context is immediately deleted. - eglMakeCurrent(fDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); - } eglDestroyContext(fDisplay, fContext); fContext = EGL_NO_CONTEXT; } @@ -298,13 +284,6 @@ void EGLGLTestContext::onPlatformMakeCurrent() const { } } -std::function EGLGLTestContext::onPlatformGetAutoContextRestore() const { - if (eglGetCurrentContext() == fContext) { - return nullptr; - } - return context_restorer(); -} - void EGLGLTestContext::onPlatformSwapBuffers() const { if (!eglSwapBuffers(fDisplay, fSurface)) { SkDebugf("Could not complete eglSwapBuffers.\n"); diff --git a/tools/gpu/gl/glx/CreatePlatformGLTestContext_glx.cpp b/tools/gpu/gl/glx/CreatePlatformGLTestContext_glx.cpp index cb1215261a..76b6d21661 100644 --- a/tools/gpu/gl/glx/CreatePlatformGLTestContext_glx.cpp +++ b/tools/gpu/gl/glx/CreatePlatformGLTestContext_glx.cpp @@ -51,13 +51,6 @@ static int ctxErrorHandler(Display *dpy, XErrorEvent *ev) { return 0; } -std::function context_restorer() { - auto display = glXGetCurrentDisplay(); - auto drawable = glXGetCurrentDrawable(); - auto context = glXGetCurrentContext(); - return [display, drawable, context] { glXMakeCurrent(display, drawable, context); }; -} - class GLXGLTestContext : public sk_gpu_test::GLTestContext { public: GLXGLTestContext(GrGLStandard forcedGpuAPI, GLXGLTestContext* shareList); @@ -69,7 +62,6 @@ private: GLXContext glxSharedContext); void onPlatformMakeCurrent() const override; - std::function onPlatformGetAutoContextRestore() const override; void onPlatformSwapBuffers() const override; GrGLFuncPtr onPlatformGetProcAddress(const char*) const override; @@ -222,7 +214,6 @@ GLXGLTestContext::GLXGLTestContext(GrGLStandard forcedGpuAPI, GLXGLTestContext* //SkDebugf("Direct GLX rendering context obtained.\n"); } - SkScopeExit restorer(context_restorer()); //SkDebugf("Making context current.\n"); if (!glXMakeCurrent(fDisplay, fGlxPixmap, fContext)) { SkDebugf("Could not set the context.\n"); @@ -254,11 +245,9 @@ GLXGLTestContext::~GLXGLTestContext() { void GLXGLTestContext::destroyGLContext() { if (fDisplay) { + glXMakeCurrent(fDisplay, 0, 0); + if (fContext) { - if (glXGetCurrentContext() == fContext) { - // This will ensure that the context is immediately deleted. - glXMakeContextCurrent(fDisplay, None, None, nullptr); - } glXDestroyContext(fDisplay, fContext); fContext = nullptr; } @@ -345,13 +334,6 @@ void GLXGLTestContext::onPlatformMakeCurrent() const { } } -std::function GLXGLTestContext::onPlatformGetAutoContextRestore() const { - if (glXGetCurrentContext() == fContext) { - return nullptr; - } - return context_restorer(); -} - void GLXGLTestContext::onPlatformSwapBuffers() const { glXSwapBuffers(fDisplay, fGlxPixmap); } diff --git a/tools/gpu/gl/iOS/CreatePlatformGLTestContext_iOS.mm b/tools/gpu/gl/iOS/CreatePlatformGLTestContext_iOS.mm index 65d2861483..e897e8c7c4 100644 --- a/tools/gpu/gl/iOS/CreatePlatformGLTestContext_iOS.mm +++ b/tools/gpu/gl/iOS/CreatePlatformGLTestContext_iOS.mm @@ -14,11 +14,6 @@ namespace { -std::function context_restorer() { - EAGLContext* context = [EAGLContext currentContext]; - return [context] { [EAGLContext setCurrentContext:context]; }; -} - class IOSGLTestContext : public sk_gpu_test::GLTestContext { public: IOSGLTestContext(IOSGLTestContext* shareContext); @@ -28,7 +23,6 @@ private: void destroyGLContext(); void onPlatformMakeCurrent() const override; - std::function onPlatformGetAutoContextRestore() const override; void onPlatformSwapBuffers() const override; GrGLFuncPtr onPlatformGetProcAddress(const char*) const override; @@ -47,7 +41,6 @@ IOSGLTestContext::IOSGLTestContext(IOSGLTestContext* shareContext) } else { fEAGLContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; } - SkScopeExit restorer(context_restorer()); [EAGLContext setCurrentContext:fEAGLContext]; sk_sp gl(GrGLCreateNativeInterface()); @@ -77,7 +70,6 @@ IOSGLTestContext::~IOSGLTestContext() { void IOSGLTestContext::destroyGLContext() { if (fEAGLContext) { if ([EAGLContext currentContext] == fEAGLContext) { - // This will ensure that the context is immediately deleted. [EAGLContext setCurrentContext:nil]; } fEAGLContext = nil; @@ -94,13 +86,6 @@ void IOSGLTestContext::onPlatformMakeCurrent() const { } } -std::function IOSGLTestContext::onPlatformGetAutoContextRestore() const { - if ([EAGLContext currentContext] == fEAGLContext) { - return nullptr; - } - return context_restorer(); -} - void IOSGLTestContext::onPlatformSwapBuffers() const { } GrGLFuncPtr IOSGLTestContext::onPlatformGetProcAddress(const char* procName) const { diff --git a/tools/gpu/gl/mac/CreatePlatformGLTestContext_mac.cpp b/tools/gpu/gl/mac/CreatePlatformGLTestContext_mac.cpp index 9f1c61e564..a94f503d48 100644 --- a/tools/gpu/gl/mac/CreatePlatformGLTestContext_mac.cpp +++ b/tools/gpu/gl/mac/CreatePlatformGLTestContext_mac.cpp @@ -14,12 +14,6 @@ #include namespace { - -std::function context_restorer() { - auto context = CGLGetCurrentContext(); - return [context] { CGLSetCurrentContext(context); }; -} - class MacGLTestContext : public sk_gpu_test::GLTestContext { public: MacGLTestContext(MacGLTestContext* shareContext); @@ -29,7 +23,6 @@ private: void destroyGLContext(); void onPlatformMakeCurrent() const override; - std::function onPlatformGetAutoContextRestore() const override; void onPlatformSwapBuffers() const override; GrGLFuncPtr onPlatformGetProcAddress(const char*) const override; @@ -65,7 +58,6 @@ MacGLTestContext::MacGLTestContext(MacGLTestContext* shareContext) return; } - SkScopeExit restorer(context_restorer()); CGLSetCurrentContext(fContext); sk_sp gl(GrGLCreateNativeInterface()); @@ -94,10 +86,6 @@ MacGLTestContext::~MacGLTestContext() { void MacGLTestContext::destroyGLContext() { if (fContext) { - if (CGLGetCurrentContext() == fContext) { - // This will ensure that the context is immediately deleted. - CGLSetCurrentContext(nullptr); - } CGLReleaseContext(fContext); fContext = nullptr; } @@ -110,13 +98,6 @@ void MacGLTestContext::onPlatformMakeCurrent() const { CGLSetCurrentContext(fContext); } -std::function MacGLTestContext::onPlatformGetAutoContextRestore() const { - if (CGLGetCurrentContext() == fContext) { - return nullptr; - } - return context_restorer(); -} - void MacGLTestContext::onPlatformSwapBuffers() const { CGLFlushDrawable(fContext); } diff --git a/tools/gpu/gl/null/NullGLTestContext.cpp b/tools/gpu/gl/null/NullGLTestContext.cpp index 9e7279b501..894de0709a 100644 --- a/tools/gpu/gl/null/NullGLTestContext.cpp +++ b/tools/gpu/gl/null/NullGLTestContext.cpp @@ -22,7 +22,6 @@ public: private: void onPlatformMakeCurrent() const override {} - std::function onPlatformGetAutoContextRestore() const override { return nullptr; } void onPlatformSwapBuffers() const override {} GrGLFuncPtr onPlatformGetProcAddress(const char*) const override { return nullptr; } }; diff --git a/tools/gpu/gl/win/CreatePlatformGLTestContext_win.cpp b/tools/gpu/gl/win/CreatePlatformGLTestContext_win.cpp index 5fc355a22a..0e97153794 100644 --- a/tools/gpu/gl/win/CreatePlatformGLTestContext_win.cpp +++ b/tools/gpu/gl/win/CreatePlatformGLTestContext_win.cpp @@ -16,12 +16,6 @@ namespace { -std::function context_restorer() { - auto glrc = wglGetCurrentContext(); - auto dc = wglGetCurrentDC(); - return [glrc, dc] { wglMakeCurrent(dc, glrc); }; -} - class WinGLTestContext : public sk_gpu_test::GLTestContext { public: WinGLTestContext(GrGLStandard forcedGpuAPI, WinGLTestContext* shareContext); @@ -31,7 +25,6 @@ private: void destroyGLContext(); void onPlatformMakeCurrent() const override; - std::function onPlatformGetAutoContextRestore() const override; void onPlatformSwapBuffers() const override; GrGLFuncPtr onPlatformGetProcAddress(const char* name) const override; @@ -120,7 +113,6 @@ WinGLTestContext::WinGLTestContext(GrGLStandard forcedGpuAPI, WinGLTestContext* glrc = fPbufferContext->getGLRC(); } - SkScopeExit restorer(context_restorer()); if (!(wglMakeCurrent(dc, glrc))) { SkDebugf("Could not set the context.\n"); this->destroyGLContext(); @@ -150,7 +142,6 @@ WinGLTestContext::~WinGLTestContext() { void WinGLTestContext::destroyGLContext() { SkSafeSetNull(fPbufferContext); if (fGlRenderContext) { - // This deletes the context immediately even if it is current. wglDeleteContext(fGlRenderContext); fGlRenderContext = 0; } @@ -181,13 +172,6 @@ void WinGLTestContext::onPlatformMakeCurrent() const { } } -std::function WinGLTestContext::onPlatformGetAutoContextRestore() const { - if (wglGetCurrentContext() == fGlRenderContext) { - return nullptr; - } - return context_restorer(); -} - void WinGLTestContext::onPlatformSwapBuffers() const { HDC dc; diff --git a/tools/gpu/mock/MockTestContext.cpp b/tools/gpu/mock/MockTestContext.cpp index 5cc5529dfe..68941ad4ef 100644 --- a/tools/gpu/mock/MockTestContext.cpp +++ b/tools/gpu/mock/MockTestContext.cpp @@ -34,7 +34,6 @@ public: protected: void teardown() override {} void onPlatformMakeCurrent() const override {} - std::function onPlatformGetAutoContextRestore() const override { return nullptr; } void onPlatformSwapBuffers() const override {} private: diff --git a/tools/gpu/mtl/MtlTestContext.mm b/tools/gpu/mtl/MtlTestContext.mm index 38755b2ef0..4014e2ba70 100644 --- a/tools/gpu/mtl/MtlTestContext.mm +++ b/tools/gpu/mtl/MtlTestContext.mm @@ -144,7 +144,6 @@ private: } void onPlatformMakeCurrent() const override {} - std::function onPlatformGetAutoContextRestore() const override { return nullptr; } void onPlatformSwapBuffers() const override {} id fDevice; diff --git a/tools/gpu/vk/VkTestContext.cpp b/tools/gpu/vk/VkTestContext.cpp index fa40c7374a..daaa55bfa0 100644 --- a/tools/gpu/vk/VkTestContext.cpp +++ b/tools/gpu/vk/VkTestContext.cpp @@ -154,7 +154,6 @@ private: } void onPlatformMakeCurrent() const override {} - std::function onPlatformGetAutoContextRestore() const override { return nullptr; } void onPlatformSwapBuffers() const override {} typedef sk_gpu_test::VkTestContext INHERITED;