Commit d7d0ed32 by Geoff Lang Committed by Commit Bot

Implement robust GetShaderiv entry points.

BUG=angleproject:1354 Change-Id: I994b7a596b5b67fadbd91ad0d64054c792523200 Reviewed-on: https://chromium-review.googlesource.com/395111 Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent f2f6f65f
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "libANGLE/Framebuffer.h" #include "libANGLE/Framebuffer.h"
#include "libANGLE/Program.h" #include "libANGLE/Program.h"
#include "libANGLE/Renderbuffer.h" #include "libANGLE/Renderbuffer.h"
#include "libANGLE/Shader.h"
namespace gl namespace gl
{ {
...@@ -244,4 +245,34 @@ void QueryRenderbufferiv(const Renderbuffer *renderbuffer, GLenum pname, GLint * ...@@ -244,4 +245,34 @@ void QueryRenderbufferiv(const Renderbuffer *renderbuffer, GLenum pname, GLint *
break; break;
} }
} }
void QueryShaderiv(const Shader *shader, GLenum pname, GLint *params)
{
ASSERT(shader != nullptr);
switch (pname)
{
case GL_SHADER_TYPE:
*params = shader->getType();
return;
case GL_DELETE_STATUS:
*params = shader->isFlaggedForDeletion();
return;
case GL_COMPILE_STATUS:
*params = shader->isCompiled() ? GL_TRUE : GL_FALSE;
return;
case GL_INFO_LOG_LENGTH:
*params = shader->getInfoLogLength();
return;
case GL_SHADER_SOURCE_LENGTH:
*params = shader->getSourceLength();
return;
case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
*params = shader->getTranslatedSourceWithDebugInfoLength();
return;
default:
UNREACHABLE();
break;
}
}
} }
...@@ -18,6 +18,7 @@ class Buffer; ...@@ -18,6 +18,7 @@ class Buffer;
class Framebuffer; class Framebuffer;
class Program; class Program;
class Renderbuffer; class Renderbuffer;
class Shader;
void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer, void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
GLenum attachment, GLenum attachment,
...@@ -26,6 +27,7 @@ void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer, ...@@ -26,6 +27,7 @@ void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params); void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params);
void QueryProgramiv(const Program *program, GLenum pname, GLint *params); void QueryProgramiv(const Program *program, GLenum pname, GLint *params);
void QueryRenderbufferiv(const Renderbuffer *renderbuffer, GLenum pname, GLint *params); void QueryRenderbufferiv(const Renderbuffer *renderbuffer, GLenum pname, GLint *params);
void QueryShaderiv(const Shader *shader, GLenum pname, GLint *params);
} }
#endif // LIBANGLE_QUERYUTILS_H_ #endif // LIBANGLE_QUERYUTILS_H_
...@@ -368,6 +368,48 @@ bool ValidateGetRenderbufferParameterivBase(Context *context, ...@@ -368,6 +368,48 @@ bool ValidateGetRenderbufferParameterivBase(Context *context,
return true; return true;
} }
bool ValidateGetShaderivBase(Context *context, GLuint shader, GLenum pname, GLsizei *length)
{
if (length)
{
*length = 0;
}
if (GetValidShader(context, shader) == nullptr)
{
return false;
}
switch (pname)
{
case GL_SHADER_TYPE:
case GL_DELETE_STATUS:
case GL_COMPILE_STATUS:
case GL_INFO_LOG_LENGTH:
case GL_SHADER_SOURCE_LENGTH:
break;
case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
if (!context->getExtensions().translatedShaderSource)
{
context->handleError(
Error(GL_INVALID_ENUM, "GL_ANGLE_translated_shader_source is not enabled."));
return false;
}
break;
default:
context->handleError(Error(GL_INVALID_ENUM, "Unknown pname."));
return false;
}
if (length)
{
*length = 1;
}
return true;
}
} // anonymous namespace } // anonymous namespace
bool ValidTextureTarget(const ValidationContext *context, GLenum target) bool ValidTextureTarget(const ValidationContext *context, GLenum target)
...@@ -3897,4 +3939,34 @@ bool ValidateGetRenderbufferParameterivRobustANGLE(Context *context, ...@@ -3897,4 +3939,34 @@ bool ValidateGetRenderbufferParameterivRobustANGLE(Context *context,
return true; return true;
} }
bool ValidateGetShaderiv(Context *context, GLuint shader, GLenum pname, GLint *params)
{
return ValidateGetShaderivBase(context, shader, pname, nullptr);
}
bool ValidateGetShaderivRobustANGLE(Context *context,
GLuint shader,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLint *params)
{
if (!ValidateRobustEntryPoint(context, bufSize))
{
return false;
}
if (!ValidateGetShaderivBase(context, shader, pname, length))
{
return false;
}
if (!ValidateRobustBufferSize(context, bufSize, *length))
{
return false;
}
return true;
}
} // namespace gl } // namespace gl
...@@ -351,6 +351,14 @@ bool ValidateGetRenderbufferParameterivRobustANGLE(Context *context, ...@@ -351,6 +351,14 @@ bool ValidateGetRenderbufferParameterivRobustANGLE(Context *context,
GLsizei *length, GLsizei *length,
GLint *params); GLint *params);
bool ValidateGetShaderiv(Context *context, GLuint shader, GLenum pname, GLint *params);
bool ValidateGetShaderivRobustANGLE(Context *context,
GLuint shader,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLint *params);
// Error messages shared here for use in testing. // Error messages shared here for use in testing.
extern const char *g_ExceedsMaxElementErrorMessage; extern const char *g_ExceedsMaxElementErrorMessage;
} // namespace gl } // namespace gl
......
...@@ -1526,37 +1526,13 @@ void GL_APIENTRY GetShaderiv(GLuint shader, GLenum pname, GLint* params) ...@@ -1526,37 +1526,13 @@ void GL_APIENTRY GetShaderiv(GLuint shader, GLenum pname, GLint* params)
Context *context = GetValidGlobalContext(); Context *context = GetValidGlobalContext();
if (context) if (context)
{ {
Shader *shaderObject = GetValidShader(context, shader); if (!context->skipValidation() && !ValidateGetShaderiv(context, shader, pname, params))
if (!shaderObject)
{ {
return; return;
} }
switch (pname) Shader *shaderObject = context->getShader(shader);
{ QueryShaderiv(shaderObject, pname, params);
case GL_SHADER_TYPE:
*params = shaderObject->getType();
return;
case GL_DELETE_STATUS:
*params = shaderObject->isFlaggedForDeletion();
return;
case GL_COMPILE_STATUS:
*params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
return;
case GL_INFO_LOG_LENGTH:
*params = shaderObject->getInfoLogLength();
return;
case GL_SHADER_SOURCE_LENGTH:
*params = shaderObject->getSourceLength();
return;
case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
*params = shaderObject->getTranslatedSourceWithDebugInfoLength();
return;
default:
context->handleError(Error(GL_INVALID_ENUM));
return;
}
} }
} }
......
...@@ -2196,7 +2196,20 @@ GetShaderivRobustANGLE(GLuint shader, GLenum pname, GLsizei bufSize, GLsizei *le ...@@ -2196,7 +2196,20 @@ GetShaderivRobustANGLE(GLuint shader, GLenum pname, GLsizei bufSize, GLsizei *le
"(GLuint shader = %d, GLenum pname = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, " "(GLuint shader = %d, GLenum pname = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, "
"GLint* params = 0x%0.8p)", "GLint* params = 0x%0.8p)",
shader, pname, bufSize, length, params); shader, pname, bufSize, length, params);
UNIMPLEMENTED();
Context *context = GetValidGlobalContext();
if (context)
{
GLsizei numParams = 0;
if (!ValidateGetShaderivRobustANGLE(context, shader, pname, bufSize, &numParams, params))
{
return;
}
Shader *shaderObject = context->getShader(shader);
QueryShaderiv(shaderObject, pname, params);
SetRobustLengthParam(length, numParams);
}
} }
ANGLE_EXPORT void GL_APIENTRY GetTexParameterfvRobustANGLE(GLenum target, ANGLE_EXPORT void GL_APIENTRY GetTexParameterfvRobustANGLE(GLenum target,
......
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