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