Expose surfaceless context extension strings 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>
diff --git a/src/OpenGL/libGLES_CM/Context.cpp b/src/OpenGL/libGLES_CM/Context.cpp index 31351b3..28b0592 100644 --- a/src/OpenGL/libGLES_CM/Context.cpp +++ b/src/OpenGL/libGLES_CM/Context.cpp
@@ -292,20 +292,20 @@ { 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 @@ 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 @@ 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 @@ case GL_ALPHA_BITS: { Framebuffer *framebuffer = getFramebuffer(); - Renderbuffer *colorbuffer = framebuffer->getColorbuffer(); + Renderbuffer *colorbuffer = framebuffer ? framebuffer->getColorbuffer() : nullptr; if(colorbuffer) { @@ -1338,7 +1352,7 @@ case GL_DEPTH_BITS: { Framebuffer *framebuffer = getFramebuffer(); - Renderbuffer *depthbuffer = framebuffer->getDepthbuffer(); + Renderbuffer *depthbuffer = framebuffer ? framebuffer->getDepthbuffer() : nullptr; if(depthbuffer) { @@ -1353,7 +1367,7 @@ case GL_STENCIL_BITS: { Framebuffer *framebuffer = getFramebuffer(); - Renderbuffer *stencilbuffer = framebuffer->getStencilbuffer(); + Renderbuffer *stencilbuffer = framebuffer ? framebuffer->getStencilbuffer() : nullptr; if(stencilbuffer) { @@ -2392,7 +2406,7 @@ 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::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 49eae83..b1f5e80 100644 --- a/src/OpenGL/libGLES_CM/libGLES_CM.cpp +++ b/src/OpenGL/libGLES_CM/libGLES_CM.cpp
@@ -448,6 +448,11 @@ { es1::Framebuffer *framebuffer = context->getFramebuffer(); + if(!framebuffer) + { + return GL_FRAMEBUFFER_UNDEFINED_OES; + } + return framebuffer->completeness(); } @@ -837,7 +842,7 @@ 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 @@ 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 @@ es1::Framebuffer *framebuffer = context->getFramebuffer(); + if(!framebuffer) + { + return error(GL_INVALID_OPERATION); + } + GLenum attachmentType; GLuint attachmentHandle; switch(attachment) @@ -2265,6 +2274,7 @@ "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 "