Commit 5cd502b4 by Alexis Hetu Committed by Alexis Hétu

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/17948Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 2638f820
......@@ -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:
......
......@@ -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;
......
......@@ -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 "
......
......@@ -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",
......
......@@ -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);
}
......
......@@ -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);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment