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

Fixed fbo related validations

A few minor fixes: - In FramebufferRenderbuffer, if renderbuffer isn't 0, it must be a valid object. - In FramebufferTexture2D, I moved the isCompressed check AFTER the textarget validation, to avoid using an invalid textarget. - In GetFramebufferAttachmentParameteriv, not using GL_BACK, GL_DEPTH or GL_STENCIL for the default framebuffer should produce GL_INVALID_ENUM instead of GL_INVALID_OPERATION. - In GetFramebufferAttachmentParameteriv, when attachmentObjectType is GL_NONE, in ES3, the query for GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME should return 0. Change-Id: I913cadd5961fa473b54ddfe174772bb7270dfdc5 Reviewed-on: https://swiftshader-review.googlesource.com/4333Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 3e02f68f
...@@ -2134,6 +2134,18 @@ void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuff ...@@ -2134,6 +2134,18 @@ void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuff
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
// [OpenGL ES 2.0.25] Section 4.4.3 page 112
// [OpenGL ES 3.0.2] Section 4.4.2 page 201
// 'renderbuffer' must be either zero or the name of an existing renderbuffer object of
// type 'renderbuffertarget', otherwise an INVALID_OPERATION error is generated.
if(renderbuffer != 0)
{
if(!context->getRenderbuffer(renderbuffer))
{
return error(GL_INVALID_OPERATION);
}
}
egl::GLint clientVersion = context->getClientVersion(); egl::GLint clientVersion = context->getClientVersion();
switch(attachment) switch(attachment)
...@@ -2228,11 +2240,6 @@ void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GL ...@@ -2228,11 +2240,6 @@ void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GL
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(tex->isCompressed(textarget, level))
{
return error(GL_INVALID_OPERATION);
}
switch(textarget) switch(textarget)
{ {
case GL_TEXTURE_2D: case GL_TEXTURE_2D:
...@@ -2256,6 +2263,11 @@ void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GL ...@@ -2256,6 +2263,11 @@ void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GL
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
if(tex->isCompressed(textarget, level))
{
return error(GL_INVALID_OPERATION);
}
if((level != 0) && (context->getClientVersion() < 3)) if((level != 0) && (context->getClientVersion() < 3))
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
...@@ -2909,7 +2921,7 @@ void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenu ...@@ -2909,7 +2921,7 @@ void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenu
} }
// fall through // fall through
default: default:
return error(GL_INVALID_OPERATION); return error(GL_INVALID_ENUM);
} }
} }
...@@ -2930,7 +2942,7 @@ void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenu ...@@ -2930,7 +2942,7 @@ void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenu
} }
// fall through // fall through
default: default:
return error(GL_INVALID_OPERATION); return error(GL_INVALID_ENUM);
} }
} }
...@@ -3053,6 +3065,8 @@ void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenu ...@@ -3053,6 +3065,8 @@ void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenu
} }
else UNREACHABLE(attachmentType); else UNREACHABLE(attachmentType);
if(attachmentObjectType != GL_NONE)
{
switch(pname) switch(pname)
{ {
case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
...@@ -3167,6 +3181,41 @@ void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenu ...@@ -3167,6 +3181,41 @@ void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenu
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
} }
else
{
// ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
// is NONE, then querying any other pname will generate INVALID_ENUM.
// ES 3.0.2 spec pg 235 states that if the attachment type is none,
// GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
// INVALID_OPERATION for all other pnames
switch(pname)
{
case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
*params = GL_NONE;
break;
case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
*params = 0;
break;
default:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
else
{
return error(GL_INVALID_OPERATION);
}
}
}
}
} }
GLenum GetGraphicsResetStatusEXT(void) GLenum GetGraphicsResetStatusEXT(void)
......
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