Edit

kc3-lang/angle/src/tests/gl_tests/RobustClientMemoryTest.cpp

Branch :

  • Show log

    Commit

  • Author : Geoff Lang
    Date : 2017-03-30 13:54:40
    Hash : e93dabaa
    Message : Output the number of columns and rows written for robust ReadPixels. BUG=angleproject:1354 Change-Id: Ib78f74d7b1a449468e2c477955f6795dc5dbc811 Reviewed-on: https://chromium-review.googlesource.com/463786 Reviewed-by: Corentin Wallez <cwallez@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org>

  • src/tests/gl_tests/RobustClientMemoryTest.cpp
  • //
    // Copyright 2016 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    
    // RobustClientMemoryTest.cpp : Tests of the GL_ANGLE_robust_client_memory extension.
    
    #include "test_utils/ANGLETest.h"
    
    #include "test_utils/gl_raii.h"
    
    namespace angle
    {
    
    constexpr GLsizei kWindowSize = 128;
    
    class RobustClientMemoryTest : public ANGLETest
    {
      protected:
        RobustClientMemoryTest()
        {
            setWindowWidth(kWindowSize);
            setWindowHeight(kWindowSize);
            setConfigRedBits(8);
            setConfigGreenBits(8);
            setConfigBlueBits(8);
            setConfigAlphaBits(8);
        }
    
        void SetUp() override
        {
            ANGLETest::SetUp();
    
            glGetBooleanvRobustANGLE = reinterpret_cast<PFNGLGETBOOLEANVROBUSTANGLE>(
                eglGetProcAddress("glGetBooleanvRobustANGLE"));
            glGetBufferParameterivRobustANGLE = reinterpret_cast<PFNGLGETBUFFERPARAMETERIVROBUSTANGLE>(
                eglGetProcAddress("glGetBufferParameterivRobustANGLE"));
            glGetFloatvRobustANGLE = reinterpret_cast<PFNGLGETFLOATVROBUSTANGLE>(
                eglGetProcAddress("glGetFloatvRobustANGLE"));
            glGetFramebufferAttachmentParameterivRobustANGLE =
                reinterpret_cast<PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVROBUSTANGLE>(
                    eglGetProcAddress("glGetFramebufferAttachmentParameterivRobustANGLE"));
            glGetIntegervRobustANGLE = reinterpret_cast<PFNGLGETINTEGERVROBUSTANGLE>(
                eglGetProcAddress("glGetIntegervRobustANGLE"));
            glGetProgramivRobustANGLE = reinterpret_cast<PFNGLGETPROGRAMIVROBUSTANGLE>(
                eglGetProcAddress("glGetProgramivRobustANGLE"));
            glGetRenderbufferParameterivRobustANGLE =
                reinterpret_cast<PFNGLGETRENDERBUFFERPARAMETERIVROBUSTANGLE>(
                    eglGetProcAddress("glGetRenderbufferParameterivRobustANGLE"));
            glGetShaderivRobustANGLE = reinterpret_cast<PFNGLGETSHADERIVROBUSTANGLE>(
                eglGetProcAddress("glGetShaderivRobustANGLE"));
            glGetTexParameterfvRobustANGLE = reinterpret_cast<PFNGLGETTEXPARAMETERFVROBUSTANGLE>(
                eglGetProcAddress("glGetTexParameterfvRobustANGLE"));
            glGetTexParameterivRobustANGLE = reinterpret_cast<PFNGLGETTEXPARAMETERIVROBUSTANGLE>(
                eglGetProcAddress("glGetTexParameterivRobustANGLE"));
            glGetUniformfvRobustANGLE = reinterpret_cast<PFNGLGETUNIFORMFVROBUSTANGLE>(
                eglGetProcAddress("glGetUniformfvRobustANGLE"));
            glGetUniformivRobustANGLE = reinterpret_cast<PFNGLGETUNIFORMIVROBUSTANGLE>(
                eglGetProcAddress("glGetUniformivRobustANGLE"));
            glGetVertexAttribfvRobustANGLE = reinterpret_cast<PFNGLGETVERTEXATTRIBFVROBUSTANGLE>(
                eglGetProcAddress("glGetVertexAttribfvRobustANGLE"));
            glGetVertexAttribivRobustANGLE = reinterpret_cast<PFNGLGETVERTEXATTRIBIVROBUSTANGLE>(
                eglGetProcAddress("glGetVertexAttribivRobustANGLE"));
            glGetVertexAttribPointervRobustANGLE =
                reinterpret_cast<PFNGLGETVERTEXATTRIBPOINTERVROBUSTANGLE>(
                    eglGetProcAddress("glGetVertexAttribPointervRobustANGLE"));
            glReadPixelsRobustANGLE = reinterpret_cast<PFNGLREADPIXELSROBUSTANGLE>(
                eglGetProcAddress("glReadPixelsRobustANGLE"));
            glTexImage2DRobustANGLE = reinterpret_cast<PFNGLTEXIMAGE2DROBUSTANGLE>(
                eglGetProcAddress("glTexImage2DRobustANGLE"));
            glTexParameterfvRobustANGLE = reinterpret_cast<PFNGLTEXPARAMETERFVROBUSTANGLE>(
                eglGetProcAddress("glTexParameterfvRobustANGLE"));
            glTexParameterivRobustANGLE = reinterpret_cast<PFNGLTEXPARAMETERIVROBUSTANGLE>(
                eglGetProcAddress("glTexParameterivRobustANGLE"));
            glTexSubImage2DRobustANGLE = reinterpret_cast<PFNGLTEXSUBIMAGE2DROBUSTANGLE>(
                eglGetProcAddress("glTexSubImage2DRobustANGLE"));
            glTexImage3DRobustANGLE = reinterpret_cast<PFNGLTEXIMAGE3DROBUSTANGLE>(
                eglGetProcAddress("glTexImage3DRobustANGLE"));
            glTexSubImage3DRobustANGLE = reinterpret_cast<PFNGLTEXSUBIMAGE3DROBUSTANGLE>(
                eglGetProcAddress("glTexSubImage3DRobustANGLE"));
            glGetQueryivRobustANGLE = reinterpret_cast<PFNGLGETQUERYIVROBUSTANGLE>(
                eglGetProcAddress("glGetQueryivRobustANGLE"));
            glGetQueryObjectuivRobustANGLE = reinterpret_cast<PFNGLGETQUERYOBJECTUIVROBUSTANGLE>(
                eglGetProcAddress("glGetQueryObjectuivRobustANGLE"));
            glGetBufferPointervRobustANGLE = reinterpret_cast<PFNGLGETBUFFERPOINTERVROBUSTANGLE>(
                eglGetProcAddress("glGetBufferPointervRobustANGLE"));
            glGetIntegeri_vRobustANGLE = reinterpret_cast<PFNGLGETINTEGERI_VROBUSTANGLE>(
                eglGetProcAddress("glGetIntegeri_vRobustANGLE"));
            glGetInternalformativRobustANGLE = reinterpret_cast<PFNGETINTERNALFORMATIVROBUSTANGLE>(
                eglGetProcAddress("glGetInternalformativRobustANGLE"));
            glGetVertexAttribIivRobustANGLE = reinterpret_cast<PFNGLGETVERTEXATTRIBIIVROBUSTANGLE>(
                eglGetProcAddress("glGetVertexAttribIivRobustANGLE"));
            glGetVertexAttribIuivRobustANGLE = reinterpret_cast<PFNGLGETVERTEXATTRIBIUIVROBUSTANGLE>(
                eglGetProcAddress("glGetVertexAttribIuivRobustANGLE"));
            glGetUniformuivRobustANGLE = reinterpret_cast<PFNGLGETUNIFORMUIVROBUSTANGLE>(
                eglGetProcAddress("glGetUniformuivRobustANGLE"));
            glGetActiveUniformBlockivRobustANGLE =
                reinterpret_cast<PFNGLGETACTIVEUNIFORMBLOCKIVROBUSTANGLE>(
                    eglGetProcAddress("glGetActiveUniformBlockivRobustANGLE"));
            glGetInteger64vRobustANGLE = reinterpret_cast<PFNGLGETINTEGER64VROBUSTANGLE>(
                eglGetProcAddress("glGetInteger64vRobustANGLE"));
            glGetInteger64i_vRobustANGLE = reinterpret_cast<PFNGLGETINTEGER64I_VROBUSTANGLE>(
                eglGetProcAddress("glGetInteger64i_vRobustANGLE"));
            glGetBufferParameteri64vRobustANGLE =
                reinterpret_cast<PFNGLGETBUFFERPARAMETERI64VROBUSTANGLE>(
                    eglGetProcAddress("glGetBufferParameteri64vRobustANGLE"));
            glSamplerParameterivRobustANGLE = reinterpret_cast<PFNGLSAMPLERPARAMETERIVROBUSTANGLE>(
                eglGetProcAddress("glSamplerParameterivRobustANGLE"));
            glSamplerParameterfvRobustANGLE = reinterpret_cast<PFNGLSAMPLERPARAMETERFVROBUSTANGLE>(
                eglGetProcAddress("glSamplerParameterfvRobustANGLE"));
            glGetSamplerParameterivRobustANGLE =
                reinterpret_cast<PFNGLGETSAMPLERPARAMETERIVROBUSTANGLE>(
                    eglGetProcAddress("glGetSamplerParameterivRobustANGLE"));
            glGetSamplerParameterfvRobustANGLE =
                reinterpret_cast<PFNGLGETSAMPLERPARAMETERFVROBUSTANGLE>(
                    eglGetProcAddress("glGetSamplerParameterfvRobustANGLE"));
            glGetFramebufferParameterivRobustANGLE =
                reinterpret_cast<PFNGLGETFRAMEBUFFERPARAMETERIVROBUSTANGLE>(
                    eglGetProcAddress("glGetFramebufferParameterivRobustANGLE"));
            glGetProgramInterfaceivRobustANGLE =
                reinterpret_cast<PFNGLGETPROGRAMINTERFACEIVROBUSTANGLE>(
                    eglGetProcAddress("glGetProgramInterfaceivRobustANGLE"));
            glGetBooleani_vRobustANGLE = reinterpret_cast<PFNGLGETBOOLEANI_VROBUSTANGLE>(
                eglGetProcAddress("glGetBooleani_vRobustANGLE"));
            glGetMultisamplefvRobustANGLE = reinterpret_cast<PFNGLGETMULTISAMPLEFVROBUSTANGLE>(
                eglGetProcAddress("glGetMultisamplefvRobustANGLE"));
            glGetTexLevelParameterivRobustANGLE =
                reinterpret_cast<PFNGLGETTEXLEVELPARAMETERIVROBUSTANGLE>(
                    eglGetProcAddress("glGetTexLevelParameterivRobustANGLE"));
            glGetTexLevelParameterfvRobustANGLE =
                reinterpret_cast<PFNGLGETTEXLEVELPARAMETERFVROBUSTANGLE>(
                    eglGetProcAddress("glGetTexLevelParameterfvRobustANGLE"));
            glGetPointervRobustANGLERobustANGLE =
                reinterpret_cast<PFNGLGETPOINTERVROBUSTANGLEROBUSTANGLE>(
                    eglGetProcAddress("glGetPointervRobustANGLERobustANGLE"));
            glReadnPixelsRobustANGLE = reinterpret_cast<PFNGLREADNPIXELSROBUSTANGLE>(
                eglGetProcAddress("glReadnPixelsRobustANGLE"));
            glGetnUniformfvRobustANGLE = reinterpret_cast<PFNGLGETNUNIFORMFVROBUSTANGLE>(
                eglGetProcAddress("glGetnUniformfvRobustANGLE"));
            glGetnUniformivRobustANGLE = reinterpret_cast<PFNGLGETNUNIFORMIVROBUSTANGLE>(
                eglGetProcAddress("glGetnUniformivRobustANGLE"));
            glGetnUniformuivRobustANGLE = reinterpret_cast<PFNGLGETNUNIFORMUIVROBUSTANGLE>(
                eglGetProcAddress("glGetnUniformuivRobustANGLE"));
            glTexParameterIivRobustANGLE = reinterpret_cast<PFNGLTEXPARAMETERIIVROBUSTANGLE>(
                eglGetProcAddress("glTexParameterIivRobustANGLE"));
            glTexParameterIuivRobustANGLE = reinterpret_cast<PFNGLTEXPARAMETERIUIVROBUSTANGLE>(
                eglGetProcAddress("glTexParameterIuivRobustANGLE"));
            glGetTexParameterIivRobustANGLE = reinterpret_cast<PFNGLGETTEXPARAMETERIIVROBUSTANGLE>(
                eglGetProcAddress("glGetTexParameterIivRobustANGLE"));
            glGetTexParameterIuivRobustANGLE = reinterpret_cast<PFNGLGETTEXPARAMETERIUIVROBUSTANGLE>(
                eglGetProcAddress("glGetTexParameterIuivRobustANGLE"));
            glSamplerParameterIivRobustANGLE = reinterpret_cast<PFNGLSAMPLERPARAMETERIIVROBUSTANGLE>(
                eglGetProcAddress("glSamplerParameterIivRobustANGLE"));
            glSamplerParameterIuivRobustANGLE = reinterpret_cast<PFNGLSAMPLERPARAMETERIUIVROBUSTANGLE>(
                eglGetProcAddress("glSamplerParameterIuivRobustANGLE"));
            glGetSamplerParameterIivRobustANGLE =
                reinterpret_cast<PFNGLGETSAMPLERPARAMETERIIVROBUSTANGLE>(
                    eglGetProcAddress("glGetSamplerParameterIivRobustANGLE"));
            glGetSamplerParameterIuivRobustANGLE =
                reinterpret_cast<PFNGLGETSAMPLERPARAMETERIUIVROBUSTANGLE>(
                    eglGetProcAddress("glGetSamplerParameterIuivRobustANGLE"));
            glGetQueryObjectivRobustANGLE = reinterpret_cast<PFNGLGETQUERYOBJECTIVROBUSTANGLE>(
                eglGetProcAddress("glGetQueryObjectivRobustANGLE"));
            glGetQueryObjecti64vRobustANGLE = reinterpret_cast<PFNGLGETQUERYOBJECTI64VROBUSTANGLE>(
                eglGetProcAddress("glGetQueryObjecti64vRobustANGLE"));
            glGetQueryObjectui64vRobustANGLE = reinterpret_cast<PFNGLGETQUERYOBJECTUI64VROBUSTANGLE>(
                eglGetProcAddress("glGetQueryObjectui64vRobustANGLE"));
        }
    
        void TearDown() override { ANGLETest::TearDown(); }
    
        bool extensionsPresent() const
        {
            if (!extensionEnabled("GL_ANGLE_robust_client_memory"))
            {
                std::cout << "Test skipped because GL_ANGLE_robust_client_memory is not available.";
                return false;
            }
    
            return true;
        }
    
        PFNGLGETBOOLEANVROBUSTANGLE glGetBooleanvRobustANGLE                   = nullptr;
        PFNGLGETBUFFERPARAMETERIVROBUSTANGLE glGetBufferParameterivRobustANGLE = nullptr;
        PFNGLGETFLOATVROBUSTANGLE glGetFloatvRobustANGLE                       = nullptr;
        PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVROBUSTANGLE
        glGetFramebufferAttachmentParameterivRobustANGLE                                   = nullptr;
        PFNGLGETINTEGERVROBUSTANGLE glGetIntegervRobustANGLE                               = nullptr;
        PFNGLGETPROGRAMIVROBUSTANGLE glGetProgramivRobustANGLE                             = nullptr;
        PFNGLGETRENDERBUFFERPARAMETERIVROBUSTANGLE glGetRenderbufferParameterivRobustANGLE = nullptr;
        PFNGLGETSHADERIVROBUSTANGLE glGetShaderivRobustANGLE                               = nullptr;
        PFNGLGETTEXPARAMETERFVROBUSTANGLE glGetTexParameterfvRobustANGLE                   = nullptr;
        PFNGLGETTEXPARAMETERIVROBUSTANGLE glGetTexParameterivRobustANGLE                   = nullptr;
        PFNGLGETUNIFORMFVROBUSTANGLE glGetUniformfvRobustANGLE                             = nullptr;
        PFNGLGETUNIFORMIVROBUSTANGLE glGetUniformivRobustANGLE                             = nullptr;
        PFNGLGETVERTEXATTRIBFVROBUSTANGLE glGetVertexAttribfvRobustANGLE                   = nullptr;
        PFNGLGETVERTEXATTRIBIVROBUSTANGLE glGetVertexAttribivRobustANGLE                   = nullptr;
        PFNGLGETVERTEXATTRIBPOINTERVROBUSTANGLE glGetVertexAttribPointervRobustANGLE       = nullptr;
        PFNGLREADPIXELSROBUSTANGLE glReadPixelsRobustANGLE                                 = nullptr;
        PFNGLTEXIMAGE2DROBUSTANGLE glTexImage2DRobustANGLE                                 = nullptr;
        PFNGLTEXPARAMETERFVROBUSTANGLE glTexParameterfvRobustANGLE                         = nullptr;
        PFNGLTEXPARAMETERIVROBUSTANGLE glTexParameterivRobustANGLE                         = nullptr;
        PFNGLTEXSUBIMAGE2DROBUSTANGLE glTexSubImage2DRobustANGLE                           = nullptr;
        PFNGLTEXIMAGE3DROBUSTANGLE glTexImage3DRobustANGLE                                 = nullptr;
        PFNGLTEXSUBIMAGE3DROBUSTANGLE glTexSubImage3DRobustANGLE                           = nullptr;
        PFNGLGETQUERYIVROBUSTANGLE glGetQueryivRobustANGLE                                 = nullptr;
        PFNGLGETQUERYOBJECTUIVROBUSTANGLE glGetQueryObjectuivRobustANGLE                   = nullptr;
        PFNGLGETBUFFERPOINTERVROBUSTANGLE glGetBufferPointervRobustANGLE                   = nullptr;
        PFNGLGETINTEGERI_VROBUSTANGLE glGetIntegeri_vRobustANGLE                           = nullptr;
        PFNGETINTERNALFORMATIVROBUSTANGLE glGetInternalformativRobustANGLE                 = nullptr;
        PFNGLGETVERTEXATTRIBIIVROBUSTANGLE glGetVertexAttribIivRobustANGLE                 = nullptr;
        PFNGLGETVERTEXATTRIBIUIVROBUSTANGLE glGetVertexAttribIuivRobustANGLE               = nullptr;
        PFNGLGETUNIFORMUIVROBUSTANGLE glGetUniformuivRobustANGLE                           = nullptr;
        PFNGLGETACTIVEUNIFORMBLOCKIVROBUSTANGLE glGetActiveUniformBlockivRobustANGLE       = nullptr;
        PFNGLGETINTEGER64VROBUSTANGLE glGetInteger64vRobustANGLE                           = nullptr;
        PFNGLGETINTEGER64I_VROBUSTANGLE glGetInteger64i_vRobustANGLE                       = nullptr;
        PFNGLGETBUFFERPARAMETERI64VROBUSTANGLE glGetBufferParameteri64vRobustANGLE         = nullptr;
        PFNGLSAMPLERPARAMETERIVROBUSTANGLE glSamplerParameterivRobustANGLE                 = nullptr;
        PFNGLSAMPLERPARAMETERFVROBUSTANGLE glSamplerParameterfvRobustANGLE                 = nullptr;
        PFNGLGETSAMPLERPARAMETERIVROBUSTANGLE glGetSamplerParameterivRobustANGLE           = nullptr;
        PFNGLGETSAMPLERPARAMETERFVROBUSTANGLE glGetSamplerParameterfvRobustANGLE           = nullptr;
        PFNGLGETFRAMEBUFFERPARAMETERIVROBUSTANGLE glGetFramebufferParameterivRobustANGLE   = nullptr;
        PFNGLGETPROGRAMINTERFACEIVROBUSTANGLE glGetProgramInterfaceivRobustANGLE           = nullptr;
        PFNGLGETBOOLEANI_VROBUSTANGLE glGetBooleani_vRobustANGLE                           = nullptr;
        PFNGLGETMULTISAMPLEFVROBUSTANGLE glGetMultisamplefvRobustANGLE                     = nullptr;
        PFNGLGETTEXLEVELPARAMETERIVROBUSTANGLE glGetTexLevelParameterivRobustANGLE         = nullptr;
        PFNGLGETTEXLEVELPARAMETERFVROBUSTANGLE glGetTexLevelParameterfvRobustANGLE         = nullptr;
        PFNGLGETPOINTERVROBUSTANGLEROBUSTANGLE glGetPointervRobustANGLERobustANGLE         = nullptr;
        PFNGLREADNPIXELSROBUSTANGLE glReadnPixelsRobustANGLE                               = nullptr;
        PFNGLGETNUNIFORMFVROBUSTANGLE glGetnUniformfvRobustANGLE                           = nullptr;
        PFNGLGETNUNIFORMIVROBUSTANGLE glGetnUniformivRobustANGLE                           = nullptr;
        PFNGLGETNUNIFORMUIVROBUSTANGLE glGetnUniformuivRobustANGLE                         = nullptr;
        PFNGLTEXPARAMETERIIVROBUSTANGLE glTexParameterIivRobustANGLE                       = nullptr;
        PFNGLTEXPARAMETERIUIVROBUSTANGLE glTexParameterIuivRobustANGLE                     = nullptr;
        PFNGLGETTEXPARAMETERIIVROBUSTANGLE glGetTexParameterIivRobustANGLE                 = nullptr;
        PFNGLGETTEXPARAMETERIUIVROBUSTANGLE glGetTexParameterIuivRobustANGLE               = nullptr;
        PFNGLSAMPLERPARAMETERIIVROBUSTANGLE glSamplerParameterIivRobustANGLE               = nullptr;
        PFNGLSAMPLERPARAMETERIUIVROBUSTANGLE glSamplerParameterIuivRobustANGLE             = nullptr;
        PFNGLGETSAMPLERPARAMETERIIVROBUSTANGLE glGetSamplerParameterIivRobustANGLE         = nullptr;
        PFNGLGETSAMPLERPARAMETERIUIVROBUSTANGLE glGetSamplerParameterIuivRobustANGLE       = nullptr;
        PFNGLGETQUERYOBJECTIVROBUSTANGLE glGetQueryObjectivRobustANGLE                     = nullptr;
        PFNGLGETQUERYOBJECTI64VROBUSTANGLE glGetQueryObjecti64vRobustANGLE                 = nullptr;
        PFNGLGETQUERYOBJECTUI64VROBUSTANGLE glGetQueryObjectui64vRobustANGLE               = nullptr;
    };
    
    // Test basic usage and validation of glGetIntegervRobustANGLE
    TEST_P(RobustClientMemoryTest, GetInteger)
    {
        if (!extensionsPresent())
        {
            return;
        }
    
        // Verify that the robust and regular entry points return the same values
        GLint resultRobust;
        GLsizei length;
        glGetIntegervRobustANGLE(GL_MAX_VERTEX_ATTRIBS, 1, &length, &resultRobust);
        EXPECT_GL_NO_ERROR();
        EXPECT_EQ(1, length);
    
        GLint resultRegular;
        glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &resultRegular);
        EXPECT_GL_NO_ERROR();
        EXPECT_EQ(resultRegular, resultRobust);
    
        // Query a dynamic value
        GLint numCompressedFormats;
        glGetIntegervRobustANGLE(GL_NUM_COMPRESSED_TEXTURE_FORMATS, 1, &length, &numCompressedFormats);
        ASSERT_GL_NO_ERROR();
        EXPECT_EQ(1, length);
    
        if (numCompressedFormats > 0)
        {
            std::vector<GLint> resultBuf(numCompressedFormats * 2, 0);
    
            // Test when the bufSize is too low
            glGetIntegervRobustANGLE(GL_COMPRESSED_TEXTURE_FORMATS, numCompressedFormats - 1, &length,
                                     resultBuf.data());
            EXPECT_GL_ERROR(GL_INVALID_OPERATION);
            EXPECT_TRUE(std::all_of(resultBuf.begin(), resultBuf.end(),
                                    [](GLint value) { return value == 0; }));
    
            // Make sure the GL doesn't touch the end of the buffer
            glGetIntegervRobustANGLE(GL_COMPRESSED_TEXTURE_FORMATS,
                                     static_cast<GLsizei>(resultBuf.size()), &length, resultBuf.data());
            EXPECT_GL_NO_ERROR();
            EXPECT_EQ(numCompressedFormats, length);
            EXPECT_TRUE(std::none_of(resultBuf.begin(), resultBuf.begin() + length,
                                     [](GLint value) { return value == 0; }));
            EXPECT_TRUE(std::all_of(resultBuf.begin() + length, resultBuf.end(),
                                    [](GLint value) { return value == 0; }));
        }
    
        // Test with null length
        glGetIntegervRobustANGLE(GL_MAX_VARYING_VECTORS, 1, nullptr, &resultRobust);
        EXPECT_GL_NO_ERROR();
    
        glGetIntegervRobustANGLE(GL_MAX_VIEWPORT_DIMS, 1, nullptr, &resultRobust);
        EXPECT_GL_ERROR(GL_INVALID_OPERATION);
    
        GLint maxViewportDims[2];
        glGetIntegervRobustANGLE(GL_MAX_VIEWPORT_DIMS, 2, nullptr, maxViewportDims);
        EXPECT_GL_NO_ERROR();
    }
    
    // Test basic usage and validation of glTexImage2DRobustANGLE
    TEST_P(RobustClientMemoryTest, TexImage2D)
    {
        if (!extensionsPresent())
        {
            return;
        }
        GLTexture tex;
        glBindTexture(GL_TEXTURE_2D, tex.get());
    
        GLsizei dataDimension = 1024;
        std::vector<GLubyte> rgbaData(dataDimension * dataDimension * 4);
    
        // Test the regular case
        glTexImage2DRobustANGLE(GL_TEXTURE_2D, 0, GL_RGBA, dataDimension, dataDimension, 0, GL_RGBA,
                                GL_UNSIGNED_BYTE, static_cast<GLsizei>(rgbaData.size()),
                                rgbaData.data());
        EXPECT_GL_NO_ERROR();
    
        // Test with a data size that is too small
        glTexImage2DRobustANGLE(GL_TEXTURE_2D, 0, GL_RGBA, dataDimension, dataDimension, 0, GL_RGBA,
                                GL_UNSIGNED_BYTE, static_cast<GLsizei>(rgbaData.size()) / 2,
                                rgbaData.data());
        EXPECT_GL_ERROR(GL_INVALID_OPERATION);
    
        if (getClientMajorVersion() >= 3)
        {
            // Set an unpack parameter that would cause the driver to read past the end of the buffer
            glPixelStorei(GL_UNPACK_ROW_LENGTH, dataDimension + 1);
            glTexImage2DRobustANGLE(GL_TEXTURE_2D, 0, GL_RGBA, dataDimension, dataDimension, 0, GL_RGBA,
                                    GL_UNSIGNED_BYTE, static_cast<GLsizei>(rgbaData.size()),
                                    rgbaData.data());
            EXPECT_GL_ERROR(GL_INVALID_OPERATION);
        }
    }
    
    // Test basic usage and validation of glReadPixelsRobustANGLE
    TEST_P(RobustClientMemoryTest, ReadPixels)
    {
        if (!extensionsPresent())
        {
            return;
        }
    
        // TODO(ynovikov): Looks like a driver bug on Intel HD 530 http://anglebug.com/1877
        if (IsLinux() && IsIntel() && IsDesktopOpenGL())
        {
            std::cout << "Test skipped on Intel OpenGL on Linux." << std::endl;
            return;
        }
    
        GLsizei dataDimension = 16;
        std::vector<GLubyte> rgbaData(dataDimension * dataDimension * 4);
    
        // Test the regular case
        GLsizei length = 0;
        GLsizei width  = 0;
        GLsizei height = 0;
        glReadPixelsRobustANGLE(0, 0, dataDimension, dataDimension, GL_RGBA, GL_UNSIGNED_BYTE,
                                static_cast<GLsizei>(rgbaData.size()), &length, &width, &height,
                                rgbaData.data());
        EXPECT_GL_NO_ERROR();
        EXPECT_EQ(static_cast<GLsizei>(rgbaData.size()), length);
        EXPECT_EQ(dataDimension, width);
        EXPECT_EQ(dataDimension, height);
    
        // Test a case that would be partially clipped
        glReadPixelsRobustANGLE(-1, kWindowSize - dataDimension + 3, dataDimension, dataDimension,
                                GL_RGBA, GL_UNSIGNED_BYTE, static_cast<GLsizei>(rgbaData.size()),
                                &length, &width, &height, rgbaData.data());
        EXPECT_GL_NO_ERROR();
        EXPECT_EQ(static_cast<GLsizei>(rgbaData.size()), length);
        EXPECT_EQ(dataDimension - 1, width);
        EXPECT_EQ(dataDimension - 3, height);
    
        // Test with a data size that is too small
        glReadPixelsRobustANGLE(0, 0, dataDimension, dataDimension, GL_RGBA, GL_UNSIGNED_BYTE,
                                static_cast<GLsizei>(rgbaData.size()) - 1, &length, nullptr, nullptr,
                                rgbaData.data());
        EXPECT_GL_ERROR(GL_INVALID_OPERATION);
    
        if (getClientMajorVersion() >= 3)
        {
            // Set a pack parameter that would cause the driver to write past the end of the buffer
            glPixelStorei(GL_PACK_ROW_LENGTH, dataDimension + 1);
            glReadPixelsRobustANGLE(0, 0, dataDimension, dataDimension, GL_RGBA, GL_UNSIGNED_BYTE,
                                    static_cast<GLsizei>(rgbaData.size()), &length, nullptr, nullptr,
                                    rgbaData.data());
            EXPECT_GL_ERROR(GL_INVALID_OPERATION);
        }
    }
    
    // Use this to select which configurations (e.g. which renderer, which GLES major version) these
    // tests should be run against.
    ANGLE_INSTANTIATE_TEST(RobustClientMemoryTest,
                           ES2_D3D9(),
                           ES2_D3D11(),
                           ES3_D3D11(),
                           ES2_D3D11_FL9_3(),
                           ES2_OPENGL(),
                           ES3_OPENGL(),
                           ES2_OPENGLES(),
                           ES3_OPENGLES());
    
    }  // namespace