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 @@
#include "libANGLE/Framebuffer.h"
#include "libANGLE/Program.h"
#include "libANGLE/Renderbuffer.h"
#include "libANGLE/Shader.h"
namespace gl
{
......@@ -244,4 +245,34 @@ void QueryRenderbufferiv(const Renderbuffer *renderbuffer, GLenum pname, GLint *
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;
class Framebuffer;
class Program;
class Renderbuffer;
class Shader;
void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
GLenum attachment,
......@@ -26,6 +27,7 @@ void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params);
void QueryProgramiv(const Program *program, 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_
......@@ -368,6 +368,48 @@ bool ValidateGetRenderbufferParameterivBase(Context *context,
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
bool ValidTextureTarget(const ValidationContext *context, GLenum target)
......@@ -3897,4 +3939,34 @@ bool ValidateGetRenderbufferParameterivRobustANGLE(Context *context,
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
......@@ -351,6 +351,14 @@ bool ValidateGetRenderbufferParameterivRobustANGLE(Context *context,
GLsizei *length,
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.
extern const char *g_ExceedsMaxElementErrorMessage;
} // namespace gl
......
......@@ -1526,37 +1526,13 @@ void GL_APIENTRY GetShaderiv(GLuint shader, GLenum pname, GLint* params)
Context *context = GetValidGlobalContext();
if (context)
{
Shader *shaderObject = GetValidShader(context, shader);
if (!shaderObject)
if (!context->skipValidation() && !ValidateGetShaderiv(context, shader, pname, params))
{
return;
}
switch (pname)
{
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;
}
Shader *shaderObject = context->getShader(shader);
QueryShaderiv(shaderObject, pname, params);
}
}
......
......@@ -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, "
"GLint* params = 0x%0.8p)",
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,
......
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