Edit

kc3-lang/angle/src/libANGLE/renderer/null/DisplayNULL.cpp

Branch :

  • Show log

    Commit

  • Author : Geoff Lang
    Date : 2021-09-28 11:31:50
    Hash : 20be5bed
    Message : Expose EGL_KHR_no_config_context on more backends. EGL_KHR_no_config_context can be exposed on any backend that supports EGL_ANGLE_flexible_surface_compatibility Bug: chromium:1253930 Change-Id: Iec75ce944fc463a8c476579234be77028f74113b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3190611 Reviewed-by: Peng Huang <penghuang@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org>

  • src/libANGLE/renderer/null/DisplayNULL.cpp
  • //
    // Copyright 2016 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    // DisplayNULL.cpp:
    //    Implements the class methods for DisplayNULL.
    //
    
    #include "libANGLE/renderer/null/DisplayNULL.h"
    
    #include "common/debug.h"
    
    #include "libANGLE/Display.h"
    #include "libANGLE/renderer/null/ContextNULL.h"
    #include "libANGLE/renderer/null/DeviceNULL.h"
    #include "libANGLE/renderer/null/ImageNULL.h"
    #include "libANGLE/renderer/null/SurfaceNULL.h"
    
    namespace rx
    {
    
    DisplayNULL::DisplayNULL(const egl::DisplayState &state) : DisplayImpl(state) {}
    
    DisplayNULL::~DisplayNULL() {}
    
    egl::Error DisplayNULL::initialize(egl::Display *display)
    {
        constexpr size_t kMaxTotalAllocationSize = 1 << 28;  // 256MB
        mAllocationTracker.reset(new AllocationTrackerNULL(kMaxTotalAllocationSize));
    
        return egl::NoError();
    }
    
    void DisplayNULL::terminate()
    {
        mAllocationTracker.reset();
    }
    
    egl::Error DisplayNULL::makeCurrent(egl::Display *display,
                                        egl::Surface *drawSurface,
                                        egl::Surface *readSurface,
                                        gl::Context *context)
    {
        // Ensure that the correct global DebugAnnotator is installed when the end2end tests change
        // the ANGLE back-end (done frequently).
        display->setGlobalDebugAnnotator();
    
        return egl::NoError();
    }
    
    egl::ConfigSet DisplayNULL::generateConfigs()
    {
        egl::Config config;
        config.renderTargetFormat    = GL_RGBA8;
        config.depthStencilFormat    = GL_DEPTH24_STENCIL8;
        config.bufferSize            = 32;
        config.redSize               = 8;
        config.greenSize             = 8;
        config.blueSize              = 8;
        config.alphaSize             = 8;
        config.alphaMaskSize         = 0;
        config.bindToTextureRGB      = EGL_TRUE;
        config.bindToTextureRGBA     = EGL_TRUE;
        config.colorBufferType       = EGL_RGB_BUFFER;
        config.configCaveat          = EGL_NONE;
        config.conformant            = EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT;
        config.depthSize             = 24;
        config.level                 = 0;
        config.matchNativePixmap     = EGL_NONE;
        config.maxPBufferWidth       = 0;
        config.maxPBufferHeight      = 0;
        config.maxPBufferPixels      = 0;
        config.maxSwapInterval       = 1;
        config.minSwapInterval       = 1;
        config.nativeRenderable      = EGL_TRUE;
        config.nativeVisualID        = 0;
        config.nativeVisualType      = EGL_NONE;
        config.renderableType        = EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT;
        config.sampleBuffers         = 0;
        config.samples               = 0;
        config.stencilSize           = 8;
        config.surfaceType           = EGL_WINDOW_BIT | EGL_PBUFFER_BIT;
        config.optimalOrientation    = 0;
        config.transparentType       = EGL_NONE;
        config.transparentRedValue   = 0;
        config.transparentGreenValue = 0;
        config.transparentBlueValue  = 0;
    
        egl::ConfigSet configSet;
        configSet.add(config);
        return configSet;
    }
    
    bool DisplayNULL::testDeviceLost()
    {
        return false;
    }
    
    egl::Error DisplayNULL::restoreLostDevice(const egl::Display *display)
    {
        return egl::NoError();
    }
    
    bool DisplayNULL::isValidNativeWindow(EGLNativeWindowType window) const
    {
        return true;
    }
    
    std::string DisplayNULL::getRendererDescription()
    {
        return "NULL";
    }
    
    std::string DisplayNULL::getVendorString()
    {
        return "NULL";
    }
    
    std::string DisplayNULL::getVersionString()
    {
        return std::string();
    }
    
    DeviceImpl *DisplayNULL::createDevice()
    {
        return new DeviceNULL();
    }
    
    egl::Error DisplayNULL::waitClient(const gl::Context *context)
    {
        return egl::NoError();
    }
    
    egl::Error DisplayNULL::waitNative(const gl::Context *context, EGLint engine)
    {
        return egl::NoError();
    }
    
    gl::Version DisplayNULL::getMaxSupportedESVersion() const
    {
        return gl::Version(3, 2);
    }
    
    gl::Version DisplayNULL::getMaxConformantESVersion() const
    {
        return getMaxSupportedESVersion();
    }
    
    SurfaceImpl *DisplayNULL::createWindowSurface(const egl::SurfaceState &state,
                                                  EGLNativeWindowType window,
                                                  const egl::AttributeMap &attribs)
    {
        return new SurfaceNULL(state);
    }
    
    SurfaceImpl *DisplayNULL::createPbufferSurface(const egl::SurfaceState &state,
                                                   const egl::AttributeMap &attribs)
    {
        return new SurfaceNULL(state);
    }
    
    SurfaceImpl *DisplayNULL::createPbufferFromClientBuffer(const egl::SurfaceState &state,
                                                            EGLenum buftype,
                                                            EGLClientBuffer buffer,
                                                            const egl::AttributeMap &attribs)
    {
        return new SurfaceNULL(state);
    }
    
    SurfaceImpl *DisplayNULL::createPixmapSurface(const egl::SurfaceState &state,
                                                  NativePixmapType nativePixmap,
                                                  const egl::AttributeMap &attribs)
    {
        return new SurfaceNULL(state);
    }
    
    ImageImpl *DisplayNULL::createImage(const egl::ImageState &state,
                                        const gl::Context *context,
                                        EGLenum target,
                                        const egl::AttributeMap &attribs)
    {
        return new ImageNULL(state);
    }
    
    rx::ContextImpl *DisplayNULL::createContext(const gl::State &state,
                                                gl::ErrorSet *errorSet,
                                                const egl::Config *configuration,
                                                const gl::Context *shareContext,
                                                const egl::AttributeMap &attribs)
    {
        return new ContextNULL(state, errorSet, mAllocationTracker.get());
    }
    
    StreamProducerImpl *DisplayNULL::createStreamProducerD3DTexture(
        egl::Stream::ConsumerType consumerType,
        const egl::AttributeMap &attribs)
    {
        UNIMPLEMENTED();
        return nullptr;
    }
    
    ShareGroupImpl *DisplayNULL::createShareGroup()
    {
        return new ShareGroupNULL();
    }
    
    void DisplayNULL::generateExtensions(egl::DisplayExtensions *outExtensions) const
    {
        outExtensions->createContextRobustness            = true;
        outExtensions->postSubBuffer                      = true;
        outExtensions->createContext                      = true;
        outExtensions->image                              = true;
        outExtensions->imageBase                          = true;
        outExtensions->glTexture2DImage                   = true;
        outExtensions->glTextureCubemapImage              = true;
        outExtensions->glTexture3DImage                   = true;
        outExtensions->glRenderbufferImage                = true;
        outExtensions->getAllProcAddresses                = true;
        outExtensions->flexibleSurfaceCompatibility       = true;
        outExtensions->noConfigContext                    = true;
        outExtensions->directComposition                  = true;
        outExtensions->createContextNoError               = true;
        outExtensions->createContextWebGLCompatibility    = true;
        outExtensions->createContextBindGeneratesResource = true;
        outExtensions->swapBuffersWithDamage              = true;
        outExtensions->pixelFormatFloat                   = true;
        outExtensions->surfacelessContext                 = true;
        outExtensions->displayTextureShareGroup           = true;
        outExtensions->displaySemaphoreShareGroup         = true;
        outExtensions->createContextClientArrays          = true;
        outExtensions->programCacheControlANGLE           = true;
        outExtensions->robustResourceInitializationANGLE  = true;
    }
    
    void DisplayNULL::generateCaps(egl::Caps *outCaps) const
    {
        outCaps->textureNPOT = true;
    }
    
    }  // namespace rx