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/libEGL/libEGL.cpp b/src/OpenGL/libEGL/libEGL.cpp
index 5944efd..55ee224 100644
--- a/src/OpenGL/libEGL/libEGL.cpp
+++ b/src/OpenGL/libEGL/libEGL.cpp
@@ -203,6 +203,7 @@
"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 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 "
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 39e8c96..6233e8f 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -749,16 +749,32 @@
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 @@
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 @@
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 @@
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 @@
case GL_DEPTH_BITS:
{
Framebuffer *framebuffer = getDrawFramebuffer();
- Renderbuffer *depthbuffer = framebuffer->getDepthbuffer();
+ Renderbuffer *depthbuffer = framebuffer ? framebuffer->getDepthbuffer() : nullptr;
if(depthbuffer)
{
@@ -2072,7 +2102,7 @@
case GL_STENCIL_BITS:
{
Framebuffer *framebuffer = getDrawFramebuffer();
- Renderbuffer *stencilbuffer = framebuffer->getStencilbuffer();
+ Renderbuffer *stencilbuffer = framebuffer ? framebuffer->getStencilbuffer() : nullptr;
if(stencilbuffer)
{
@@ -2147,7 +2177,8 @@
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 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
"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 8fb198f..34b3db0 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -628,6 +628,11 @@
framebuffer = context->getDrawFramebuffer();
}
+ if(!framebuffer)
+ {
+ return GL_FRAMEBUFFER_UNDEFINED_OES;
+ }
+
return framebuffer->completeness();
}
@@ -956,7 +961,7 @@
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 @@
{
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 @@
es2::Framebuffer *framebuffer = context->getFramebuffer(framebufferName);
+ if(!framebuffer)
+ {
+ return error(GL_INVALID_OPERATION);
+ }
+
GLenum attachmentType;
GLuint attachmentHandle;
GLint attachmentLayer;
@@ -6359,7 +6369,7 @@
{
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 a985793..e048749 100644
--- a/src/OpenGL/libGLESv2/libGLESv3.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -471,7 +471,7 @@
{
es2::Framebuffer *framebuffer = context->getReadFramebuffer();
- if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
+ if(!framebuffer || (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE))
{
return error(GL_INVALID_FRAMEBUFFER_OPERATION);
}