From 5cd502b4ba6b04f5b2e50c19e94c75f472b620c6 Mon Sep 17 00:00:00 2001 From: Alexis Hetu Date: Thu, 22 Mar 2018 08:29:31 -0400 Subject: [PATCH] Expose surfaceless context extension strings MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Nicolas Capens --- src/OpenGL/libEGL/libEGL.cpp | 1 + src/OpenGL/libGLES_CM/Context.cpp | 47 ++++++++++++++------- src/OpenGL/libGLES_CM/libGLES_CM.cpp | 16 ++++++-- src/OpenGL/libGLESv2/Context.cpp | 79 ++++++++++++++++++++++++++++-------- src/OpenGL/libGLESv2/libGLESv2.cpp | 16 ++++++-- src/OpenGL/libGLESv2/libGLESv3.cpp | 2 +- 6 files changed, 124 insertions(+), 37 deletions(-) diff --git a/src/OpenGL/libEGL/libEGL.cpp b/src/OpenGL/libEGL/libEGL.cpp index 5944efd00..55ee224e5 100644 --- a/src/OpenGL/libEGL/libEGL.cpp +++ b/src/OpenGL/libEGL/libEGL.cpp @@ -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: diff --git a/src/OpenGL/libGLES_CM/Context.cpp b/src/OpenGL/libGLES_CM/Context.cpp index 31351b395..28b0592d9 100644 --- a/src/OpenGL/libGLES_CM/Context.cpp +++ b/src/OpenGL/libGLES_CM/Context.cpp @@ -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; diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.cpp b/src/OpenGL/libGLES_CM/libGLES_CM.cpp index 49eae8326..b1f5e80b6 100644 --- a/src/OpenGL/libGLES_CM/libGLES_CM.cpp +++ b/src/OpenGL/libGLES_CM/libGLES_CM.cpp @@ -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 " diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp index 39e8c9640..6233e8f7f 100644 --- a/src/OpenGL/libGLESv2/Context.cpp +++ b/src/OpenGL/libGLESv2/Context.cpp @@ -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 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 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 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 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 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 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 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", diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp index 8fb198f61..34b3db0d1 100644 --- a/src/OpenGL/libGLESv2/libGLESv2.cpp +++ b/src/OpenGL/libGLESv2/libGLESv2.cpp @@ -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); } diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp index a98579398..e04874916 100644 --- a/src/OpenGL/libGLESv2/libGLESv3.cpp +++ b/src/OpenGL/libGLESv2/libGLESv3.cpp @@ -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); } -- 2.11.0