Merge "Correctly set error code" into studio-1.0-dev
automerge: 7b26ed5
* commit '7b26ed51415fc2e4536c6841a37c3b5ff2f143ac':
Correctly set error code
diff --git a/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp b/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp
index 780555e..7f4cd4f 100644
--- a/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp
+++ b/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp
@@ -1143,7 +1143,10 @@
FramebufferData *fbData = (FramebufferData *)fbObj.Ptr();
GLenum target;
GLuint name = fbData->getAttachment(attachment, &target, NULL);
- SET_ERROR_IF(!name && pname != GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_INVALID_ENUM);
+ if (!name) {
+ SET_ERROR_IF(pname != GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE &&
+ pname != GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, GL_INVALID_ENUM);
+ }
if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) {
if (target == GL_TEXTURE_2D) {
*params = GL_TEXTURE;
@@ -1152,6 +1155,8 @@
else if (target == GL_RENDERBUFFER) {
*params = GL_RENDERBUFFER;
return;
+ } else {
+ *params = GL_NONE;
}
}
else if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) {
@@ -1500,10 +1505,15 @@
return -1;
}
-
+static bool s_invalidVertexAttribIndex(GLuint index) {
+ GLint param=0;
+ glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, ¶m);
+ return (param < 0 || index >= (GLuint)param);
+}
GL_APICALL void GL_APIENTRY glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params){
GET_CTX_V2();
+ SET_ERROR_IF(s_invalidVertexAttribIndex(index), GL_INVALID_VALUE);
const GLESpointer* p = ctx->getPointer(index);
if(p) {
switch(pname){
@@ -1545,6 +1555,7 @@
GL_APICALL void GL_APIENTRY glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params){
GET_CTX_V2();
+ SET_ERROR_IF(s_invalidVertexAttribIndex(index), GL_INVALID_VALUE);
const GLESpointer* p = ctx->getPointer(index);
if(p) {
switch(pname){
@@ -1621,7 +1632,8 @@
GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer(GLuint framebuffer){
GET_CTX_RET(GL_FALSE)
if(framebuffer && ctx->shareGroup().Ptr()){
- return ctx->shareGroup()->isObject(FRAMEBUFFER,framebuffer) ? GL_TRUE :GL_FALSE;
+ return (ctx->shareGroup()->isObject(FRAMEBUFFER,framebuffer) &&
+ ctx->getFramebufferBinding() == framebuffer) ? GL_TRUE :GL_FALSE;
}
return GL_FALSE;
}
@@ -1629,7 +1641,8 @@
GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer(GLuint renderbuffer){
GET_CTX_RET(GL_FALSE)
if(renderbuffer && ctx->shareGroup().Ptr()){
- return ctx->shareGroup()->isObject(RENDERBUFFER,renderbuffer) ? GL_TRUE :GL_FALSE;
+ return (ctx->shareGroup()->isObject(RENDERBUFFER,renderbuffer) &&
+ ctx->getRenderbufferBinding() == renderbuffer) ? GL_TRUE :GL_FALSE;
}
return GL_FALSE;
}
@@ -1721,7 +1734,9 @@
GL_APICALL void GL_APIENTRY glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels){
GET_CTX();
SET_ERROR_IF(!(GLESv2Validate::readPixelFrmt(format) && GLESv2Validate::pixelType(ctx,type)),GL_INVALID_ENUM);
+ SET_ERROR_IF((width < 0 || height < 0),GL_INVALID_VALUE);
SET_ERROR_IF(!(GLESv2Validate::pixelOp(format,type)),GL_INVALID_OPERATION);
+ SET_ERROR_IF(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE, GL_INVALID_FRAMEBUFFER_OPERATION);
ctx->dispatcher().glReadPixels(x,y,width,height,format,type,pixels);
}
@@ -1837,6 +1852,14 @@
GL_APICALL void GL_APIENTRY glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass){
GET_CTX();
+ switch (face) {
+ case GL_FRONT:
+ case GL_BACK:
+ case GL_FRONT_AND_BACK:
+ break;
+ default:
+ SET_ERROR_IF(1, GL_INVALID_ENUM);
+ }
ctx->dispatcher().glStencilOp(fail,zfail,zpass);
}
diff --git a/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Validate.cpp b/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Validate.cpp
index 3f00428..b711317 100644
--- a/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Validate.cpp
+++ b/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Validate.cpp
@@ -113,6 +113,7 @@
bool GLESv2Validate::readPixelFrmt(GLenum format){
switch(format) {
case GL_ALPHA:
+ case GL_LUMINANCE_ALPHA:
case GL_RGB:
case GL_RGBA:
return true;