OSDN Git Service

Expose surfaceless context extension strings
authorAlexis Hetu <sugoi@google.com>
Thu, 22 Mar 2018 12:29:31 +0000 (08:29 -0400)
committerAlexis Hétu <sugoi@google.com>
Tue, 27 Mar 2018 18:52:56 +0000 (18:52 +0000)
It seems like SwiftShader already supports surfaceless contexts properly in
eglMakeCurrent, so we might as well expose the extension strings.

Change-Id: I3c1b85296c46536df9a8bd754856d825307181d0
Reviewed-on: https://swiftshader-review.googlesource.com/17948
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
src/OpenGL/libEGL/libEGL.cpp
src/OpenGL/libGLES_CM/Context.cpp
src/OpenGL/libGLES_CM/libGLES_CM.cpp
src/OpenGL/libGLESv2/Context.cpp
src/OpenGL/libGLESv2/libGLESv2.cpp
src/OpenGL/libGLESv2/libGLESv3.cpp

index 5944efd..55ee224 100644 (file)
@@ -203,6 +203,7 @@ const char *QueryString(EGLDisplay dpy, EGLint name)
                               "EGL_KHR_gl_renderbuffer_image "
                               "EGL_KHR_fence_sync "
                               "EGL_KHR_image_base "
+                              "EGL_KHR_surfaceless_context "
                               "EGL_ANDROID_framebuffer_target "
                               "EGL_ANDROID_recordable");
        case EGL_VENDOR:
index 31351b3..28b0592 100644 (file)
@@ -292,20 +292,20 @@ void Context::makeCurrent(gl::Surface *surface)
        {
                mState.viewportX = 0;
                mState.viewportY = 0;
-               mState.viewportWidth = surface->getWidth();
-               mState.viewportHeight = surface->getHeight();
+               mState.viewportWidth = surface ? surface->getWidth() : 0;
+               mState.viewportHeight = surface ? surface->getHeight() : 0;
 
                mState.scissorX = 0;
                mState.scissorY = 0;
-               mState.scissorWidth = surface->getWidth();
-               mState.scissorHeight = surface->getHeight();
+               mState.scissorWidth = surface ? surface->getWidth() : 0;
+               mState.scissorHeight = surface ? surface->getHeight() : 0;
 
                mHasBeenCurrent = true;
        }
 
        // Wrap the existing resources into GL objects and assign them to the '0' names
-       egl::Image *defaultRenderTarget = surface->getRenderTarget();
-       egl::Image *depthStencil = surface->getDepthStencil();
+       egl::Image *defaultRenderTarget = surface ? surface->getRenderTarget() : nullptr;
+       egl::Image *depthStencil = surface ? surface->getDepthStencil() : nullptr;
 
        Colorbuffer *colorbufferZero = new Colorbuffer(defaultRenderTarget);
        DepthStencilbuffer *depthStencilbufferZero = new DepthStencilbuffer(depthStencil);
@@ -1245,7 +1245,7 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
                        Framebuffer *framebuffer = getFramebuffer();
                        int width, height, samples;
 
-                       if(framebuffer->completeness(width, height, samples) == GL_FRAMEBUFFER_COMPLETE_OES)
+                       if(framebuffer && (framebuffer->completeness(width, height, samples) == GL_FRAMEBUFFER_COMPLETE_OES))
                        {
                                switch(pname)
                                {
@@ -1273,13 +1273,27 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
        case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:
                {
                        Framebuffer *framebuffer = getFramebuffer();
-                       *params = framebuffer->getImplementationColorReadType();
+                       if(framebuffer)
+                       {
+                               *params = framebuffer->getImplementationColorReadType();
+                       }
+                       else
+                       {
+                               return error(GL_INVALID_OPERATION, true);
+                       }
                }
                break;
        case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:
                {
                        Framebuffer *framebuffer = getFramebuffer();
-                       *params = framebuffer->getImplementationColorReadFormat();
+                       if(framebuffer)
+                       {
+                               *params = framebuffer->getImplementationColorReadFormat();
+                       }
+                       else
+                       {
+                               return error(GL_INVALID_OPERATION, true);
+                       }
                }
                break;
        case GL_MAX_VIEWPORT_DIMS:
@@ -1317,7 +1331,7 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
        case GL_ALPHA_BITS:
                {
                        Framebuffer *framebuffer = getFramebuffer();
-                       Renderbuffer *colorbuffer = framebuffer->getColorbuffer();
+                       Renderbuffer *colorbuffer = framebuffer ? framebuffer->getColorbuffer() : nullptr;
 
                        if(colorbuffer)
                        {
@@ -1338,7 +1352,7 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
        case GL_DEPTH_BITS:
                {
                        Framebuffer *framebuffer = getFramebuffer();
-                       Renderbuffer *depthbuffer = framebuffer->getDepthbuffer();
+                       Renderbuffer *depthbuffer = framebuffer ? framebuffer->getDepthbuffer() : nullptr;
 
                        if(depthbuffer)
                        {
@@ -1353,7 +1367,7 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
        case GL_STENCIL_BITS:
                {
                        Framebuffer *framebuffer = getFramebuffer();
-                       Renderbuffer *stencilbuffer = framebuffer->getStencilbuffer();
+                       Renderbuffer *stencilbuffer = framebuffer ? framebuffer->getStencilbuffer() : nullptr;
 
                        if(stencilbuffer)
                        {
@@ -2392,7 +2406,7 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
        Framebuffer *framebuffer = getFramebuffer();
        int framebufferWidth, framebufferHeight, framebufferSamples;
 
-       if(framebuffer->completeness(framebufferWidth, framebufferHeight, framebufferSamples) != GL_FRAMEBUFFER_COMPLETE_OES)
+       if(!framebuffer || (framebuffer->completeness(framebufferWidth, framebufferHeight, framebufferSamples) != GL_FRAMEBUFFER_COMPLETE_OES))
        {
                return error(GL_INVALID_FRAMEBUFFER_OPERATION_OES);
        }
@@ -2787,7 +2801,12 @@ void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void *
 void Context::drawTexture(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height)
 {
        es1::Framebuffer *framebuffer = getFramebuffer();
-       es1::Renderbuffer *renderbuffer = framebuffer->getColorbuffer();
+       es1::Renderbuffer *renderbuffer = framebuffer ? framebuffer->getColorbuffer() : nullptr;
+       if(!renderbuffer)
+       {
+               return;
+       }
+
        float targetWidth = (float)renderbuffer->getWidth();
        float targetHeight = (float)renderbuffer->getHeight();
        float x0 = 2.0f * x / targetWidth - 1.0f;
index 49eae83..b1f5e80 100644 (file)
@@ -448,6 +448,11 @@ GLenum CheckFramebufferStatusOES(GLenum target)
        {
                es1::Framebuffer *framebuffer = context->getFramebuffer();
 
+               if(!framebuffer)
+               {
+                       return GL_FRAMEBUFFER_UNDEFINED_OES;
+               }
+
                return framebuffer->completeness();
        }
 
@@ -837,7 +842,7 @@ void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x,
 
                es1::Framebuffer *framebuffer = context->getFramebuffer();
 
-               if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE_OES)
+               if(!framebuffer || (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE_OES))
                {
                        return error(GL_INVALID_FRAMEBUFFER_OPERATION_OES);
                }
@@ -964,10 +969,9 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
 
        if(context)
        {
-
                es1::Framebuffer *framebuffer = context->getFramebuffer();
 
-               if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE_OES)
+               if(!framebuffer || (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE_OES))
                {
                        return error(GL_INVALID_FRAMEBUFFER_OPERATION_OES);
                }
@@ -2071,6 +2075,11 @@ void GetFramebufferAttachmentParameterivOES(GLenum target, GLenum attachment, GL
 
                es1::Framebuffer *framebuffer = context->getFramebuffer();
 
+               if(!framebuffer)
+               {
+                       return error(GL_INVALID_OPERATION);
+               }
+
                GLenum attachmentType;
                GLuint attachmentHandle;
                switch(attachment)
@@ -2265,6 +2274,7 @@ const GLubyte* GetString(GLenum name)
                        "GL_OES_rgb8_rgba8 "
                        "GL_OES_stencil8 "
                        "GL_OES_stencil_wrap "
+                       "GL_OES_surfaceless_context "
                        "GL_OES_texture_mirrored_repeat "
                        "GL_OES_texture_npot "
                        "GL_EXT_blend_minmax "
index 39e8c96..6233e8f 100644 (file)
@@ -749,16 +749,32 @@ GLuint Context::getRenderbufferName() const
 
 void Context::setFramebufferReadBuffer(GLuint buf)
 {
-       getReadFramebuffer()->setReadBuffer(buf);
+       Framebuffer *framebuffer = getReadFramebuffer();
+
+       if(framebuffer)
+       {
+               framebuffer->setReadBuffer(buf);
+       }
+       else
+       {
+               return error(GL_INVALID_OPERATION);
+       }
 }
 
 void Context::setFramebufferDrawBuffers(GLsizei n, const GLenum *bufs)
 {
        Framebuffer *drawFramebuffer = getDrawFramebuffer();
 
-       for(int i = 0; i < MAX_COLOR_ATTACHMENTS; i++)
+       if(drawFramebuffer)
        {
-               drawFramebuffer->setDrawBuffer(i, (i < n) ? bufs[i] : GL_NONE);
+               for(int i = 0; i < MAX_COLOR_ATTACHMENTS; i++)
+               {
+                       drawFramebuffer->setDrawBuffer(i, (i < n) ? bufs[i] : GL_NONE);
+               }
+       }
+       else
+       {
+               return error(GL_INVALID_OPERATION);
        }
 }
 
@@ -1964,7 +1980,7 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
                        Framebuffer *framebuffer = getDrawFramebuffer();
                        int width, height, samples;
 
-                       if(framebuffer->completeness(width, height, samples) == GL_FRAMEBUFFER_COMPLETE)
+                       if(framebuffer && (framebuffer->completeness(width, height, samples) == GL_FRAMEBUFFER_COMPLETE))
                        {
                                switch(pname)
                                {
@@ -1992,13 +2008,27 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
        case GL_IMPLEMENTATION_COLOR_READ_TYPE:
                {
                        Framebuffer *framebuffer = getReadFramebuffer();
-                       *params = framebuffer->getImplementationColorReadType();
+                       if(framebuffer)
+                       {
+                               *params = framebuffer->getImplementationColorReadType();
+                       }
+                       else
+                       {
+                               return error(GL_INVALID_OPERATION, true);
+                       }
                }
                return true;
        case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
                {
                        Framebuffer *framebuffer = getReadFramebuffer();
-                       *params = framebuffer->getImplementationColorReadFormat();
+                       if(framebuffer)
+                       {
+                               *params = framebuffer->getImplementationColorReadFormat();
+                       }
+                       else
+                       {
+                               return error(GL_INVALID_OPERATION, true);
+                       }
                }
                return true;
        case GL_MAX_VIEWPORT_DIMS:
@@ -2036,7 +2066,7 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
        case GL_ALPHA_BITS:
                {
                        Framebuffer *framebuffer = getDrawFramebuffer();
-                       Renderbuffer *colorbuffer = framebuffer->getColorbuffer(0);
+                       Renderbuffer *colorbuffer = framebuffer ? framebuffer->getColorbuffer(0) : nullptr;
 
                        if(colorbuffer)
                        {
@@ -2057,7 +2087,7 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
        case GL_DEPTH_BITS:
                {
                        Framebuffer *framebuffer = getDrawFramebuffer();
-                       Renderbuffer *depthbuffer = framebuffer->getDepthbuffer();
+                       Renderbuffer *depthbuffer = framebuffer ? framebuffer->getDepthbuffer() : nullptr;
 
                        if(depthbuffer)
                        {
@@ -2072,7 +2102,7 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
        case GL_STENCIL_BITS:
                {
                        Framebuffer *framebuffer = getDrawFramebuffer();
-                       Renderbuffer *stencilbuffer = framebuffer->getStencilbuffer();
+                       Renderbuffer *stencilbuffer = framebuffer ? framebuffer->getStencilbuffer() : nullptr;
 
                        if(stencilbuffer)
                        {
@@ -2147,7 +2177,8 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
        case GL_DRAW_BUFFER15:
                if((pname - GL_DRAW_BUFFER0) < MAX_DRAW_BUFFERS)
                {
-                       *params = getDrawFramebuffer()->getDrawBuffer(pname - GL_DRAW_BUFFER0);
+                       Framebuffer* framebuffer = getDrawFramebuffer();
+                       *params = framebuffer ? framebuffer->getDrawBuffer(pname - GL_DRAW_BUFFER0) : GL_NONE;
                }
                else
                {
@@ -2301,7 +2332,10 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
                        // should be a 0 sized array, so don't write to params
                        return true;
                case GL_READ_BUFFER:
-                       *params = getReadFramebuffer()->getReadBuffer();
+                       {
+                               Framebuffer* framebuffer = getReadFramebuffer();
+                               *params = framebuffer ? framebuffer->getReadBuffer() : GL_NONE;
+                       }
                        return true;
                case GL_SAMPLER_BINDING:
                        *params = mState.sampler[mState.activeSampler].name();
@@ -2721,7 +2755,7 @@ bool Context::applyRenderTarget()
        Framebuffer *framebuffer = getDrawFramebuffer();
        int width, height, samples;
 
-       if(!framebuffer || framebuffer->completeness(width, height, samples) != GL_FRAMEBUFFER_COMPLETE)
+       if(!framebuffer || (framebuffer->completeness(width, height, samples) != GL_FRAMEBUFFER_COMPLETE))
        {
                return error(GL_INVALID_FRAMEBUFFER_OPERATION, false);
        }
@@ -3285,7 +3319,7 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum
        Framebuffer *framebuffer = getReadFramebuffer();
        int framebufferWidth, framebufferHeight, framebufferSamples;
 
-       if(framebuffer->completeness(framebufferWidth, framebufferHeight, framebufferSamples) != GL_FRAMEBUFFER_COMPLETE)
+       if(!framebuffer || (framebuffer->completeness(framebufferWidth, framebufferHeight, framebufferSamples) != GL_FRAMEBUFFER_COMPLETE))
        {
                return error(GL_INVALID_FRAMEBUFFER_OPERATION);
        }
@@ -3354,7 +3388,7 @@ void Context::clear(GLbitfield mask)
 
        Framebuffer *framebuffer = getDrawFramebuffer();
 
-       if(!framebuffer || framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
+       if(!framebuffer || (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE))
        {
                return error(GL_INVALID_FRAMEBUFFER_OPERATION);
        }
@@ -3399,6 +3433,10 @@ void Context::clearColorBuffer(GLint drawbuffer, void *value, sw::Format format)
        if(rgbaMask && !mState.rasterizerDiscardEnabled)
        {
                Framebuffer *framebuffer = getDrawFramebuffer();
+               if(!framebuffer)
+               {
+                       return error(GL_INVALID_FRAMEBUFFER_OPERATION);
+               }
                egl::Image *colorbuffer = framebuffer->getRenderTarget(drawbuffer);
 
                if(colorbuffer)
@@ -3437,6 +3475,10 @@ void Context::clearDepthBuffer(const GLfloat value)
        if(mState.depthMask && !mState.rasterizerDiscardEnabled)
        {
                Framebuffer *framebuffer = getDrawFramebuffer();
+               if(!framebuffer)
+               {
+                       return error(GL_INVALID_FRAMEBUFFER_OPERATION);
+               }
                egl::Image *depthbuffer = framebuffer->getDepthBuffer();
 
                if(depthbuffer)
@@ -3461,6 +3503,10 @@ void Context::clearStencilBuffer(const GLint value)
        if(mState.stencilWritemask && !mState.rasterizerDiscardEnabled)
        {
                Framebuffer *framebuffer = getDrawFramebuffer();
+               if(!framebuffer)
+               {
+                       return error(GL_INVALID_FRAMEBUFFER_OPERATION);
+               }
                egl::Image *stencilbuffer = framebuffer->getStencilBuffer();
 
                if(stencilbuffer)
@@ -3946,8 +3992,8 @@ void Context::blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1
        int readBufferWidth, readBufferHeight, readBufferSamples;
        int drawBufferWidth, drawBufferHeight, drawBufferSamples;
 
-       if(!readFramebuffer || readFramebuffer->completeness(readBufferWidth, readBufferHeight, readBufferSamples) != GL_FRAMEBUFFER_COMPLETE ||
-          !drawFramebuffer || drawFramebuffer->completeness(drawBufferWidth, drawBufferHeight, drawBufferSamples) != GL_FRAMEBUFFER_COMPLETE)
+       if(!readFramebuffer || (readFramebuffer->completeness(readBufferWidth, readBufferHeight, readBufferSamples) != GL_FRAMEBUFFER_COMPLETE) ||
+          !drawFramebuffer || (drawFramebuffer->completeness(drawBufferWidth, drawBufferHeight, drawBufferSamples) != GL_FRAMEBUFFER_COMPLETE))
        {
                return error(GL_INVALID_FRAMEBUFFER_OPERATION);
        }
@@ -4387,6 +4433,7 @@ const GLubyte *Context::getExtensions(GLuint index, GLuint *numExt) const
                "GL_OES_packed_depth_stencil",
                "GL_OES_rgb8_rgba8",
                "GL_OES_standard_derivatives",
+               "GL_OES_surfaceless_context",
                "GL_OES_texture_float",
                "GL_OES_texture_float_linear",
                "GL_OES_texture_half_float",
index 8fb198f..34b3db0 100644 (file)
@@ -628,6 +628,11 @@ GLenum CheckFramebufferStatus(GLenum target)
                        framebuffer = context->getDrawFramebuffer();
                }
 
+               if(!framebuffer)
+               {
+                       return GL_FRAMEBUFFER_UNDEFINED_OES;
+               }
+
                return framebuffer->completeness();
        }
 
@@ -956,7 +961,7 @@ void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x,
 
                es2::Framebuffer *framebuffer = context->getReadFramebuffer();
 
-               if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
+               if(!framebuffer || (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE))
                {
                        return error(GL_INVALID_FRAMEBUFFER_OPERATION);
                }
@@ -1067,7 +1072,7 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
        {
                es2::Framebuffer *framebuffer = context->getReadFramebuffer();
 
-               if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
+               if(!framebuffer || (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE))
                {
                        return error(GL_INVALID_FRAMEBUFFER_OPERATION);
                }
@@ -2776,6 +2781,11 @@ void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenu
 
                es2::Framebuffer *framebuffer = context->getFramebuffer(framebufferName);
 
+               if(!framebuffer)
+               {
+                       return error(GL_INVALID_OPERATION);
+               }
+
                GLenum attachmentType;
                GLuint attachmentHandle;
                GLint attachmentLayer;
@@ -6359,7 +6369,7 @@ void CopyTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffs
        {
                es2::Framebuffer *framebuffer = context->getReadFramebuffer();
 
-               if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
+               if(!framebuffer || (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE))
                {
                        return error(GL_INVALID_FRAMEBUFFER_OPERATION);
                }
index a985793..e048749 100644 (file)
@@ -471,7 +471,7 @@ GL_APICALL void GL_APIENTRY glCopyTexSubImage3D(GLenum target, GLint level, GLin
        {
                es2::Framebuffer *framebuffer = context->getReadFramebuffer();
 
-               if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
+               if(!framebuffer || (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE))
                {
                        return error(GL_INVALID_FRAMEBUFFER_OPERATION);
                }