Edit

kc3-lang/angle/tests/angle_tests/FramebufferFormatsTest.cpp

Branch :

  • Show log

    Commit

  • Author : Geoff Lang
    Date : 2014-06-05 14:19:16
    Hash : b6a673a0
    Message : Report zero bit sizes for channels that shouldn't exist. If the actual format has more channels than the internal format of a framebuffer, bits counts greater than zero will be returned for channels that should not exist. While it is not against the spec to return more bits than exist in the format, it can be confusing for users or break tests. get*Bits will now only return greater than zero bit counts when the format should have the given channel. Since this is the only location that we return information about the "real" internal format we're using, it's safe to only make the modifications here. BUG=angle:653 Change-Id: I43ef4c6290c8c70737d579d7e9a2dd30d653330b Reviewed-on: https://chromium-review.googlesource.com/202594 Reviewed-by: Jamie Madill <jmadill@chromium.org> Tested-by: Geoff Lang <geofflang@chromium.org>

  • tests/angle_tests/FramebufferFormatsTest.cpp
  • #include "ANGLETest.h"
    
    class FramebufferFormatsTest : public ANGLETest
    {
    protected:
        FramebufferFormatsTest()
        {
            setWindowWidth(128);
            setWindowHeight(128);
            setConfigRedBits(8);
            setConfigGreenBits(8);
            setConfigBlueBits(8);
            setConfigAlphaBits(8);
        }
    
        void checkBitCount(GLuint fbo, GLenum channel, GLint minBits)
        {
            glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    
            GLint bits = 0;
            glGetIntegerv(channel, &bits);
    
            if (minBits == 0)
            {
                EXPECT_EQ(minBits, bits);
            }
            else
            {
                EXPECT_GE(bits, minBits);
            }
        }
    
        void testBitCounts(GLuint fbo, GLint minRedBits, GLint minGreenBits, GLint minBlueBits,
                           GLint minAlphaBits, GLint minDepthBits, GLint minStencilBits)
        {
            checkBitCount(fbo, GL_RED_BITS, minRedBits);
            checkBitCount(fbo, GL_GREEN_BITS, minGreenBits);
            checkBitCount(fbo, GL_BLUE_BITS, minBlueBits);
            checkBitCount(fbo, GL_ALPHA_BITS, minAlphaBits);
            checkBitCount(fbo, GL_DEPTH_BITS, minDepthBits);
            checkBitCount(fbo, GL_STENCIL_BITS, minStencilBits);
        }
    
        void testTextureFormat(GLenum internalFormat, GLint minRedBits, GLint minGreenBits, GLint minBlueBits,
                               GLint minAlphaBits)
        {
            GLuint tex = 0;
            glGenTextures(1, &tex);
            glBindTexture(GL_TEXTURE_2D, tex);
            glTexStorage2DEXT(GL_TEXTURE_2D, 1, internalFormat, 1, 1);
    
            GLuint fbo = 0;
            glGenFramebuffers(1, &fbo);
            glBindFramebuffer(GL_FRAMEBUFFER, fbo);
            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
    
            testBitCounts(fbo, minRedBits, minGreenBits, minBlueBits, minAlphaBits, 0, 0);
    
            glDeleteTextures(1, &tex);
            glDeleteFramebuffers(1, &fbo);
        }
    
        virtual void SetUp()
        {
            ANGLETest::SetUp();
        }
    
        virtual void TearDown()
        {
            ANGLETest::TearDown();
        }
    };
    
    TEST_F(FramebufferFormatsTest, rgba4)
    {
        testTextureFormat(GL_RGBA4, 4, 4, 4, 4);
    }
    
    TEST_F(FramebufferFormatsTest, rgb565)
    {
        testTextureFormat(GL_RGB565, 5, 6, 5, 0);
    }
    
    TEST_F(FramebufferFormatsTest, rgb8)
    {
        testTextureFormat(GL_RGB8_OES, 8, 8, 8, 0);
    }
    
    TEST_F(FramebufferFormatsTest, bgra8)
    {
        testTextureFormat(GL_BGRA8_EXT, 8, 8, 8, 8);
    }
    
    TEST_F(FramebufferFormatsTest, rgba8)
    {
        testTextureFormat(GL_RGBA8_OES, 8, 8, 8, 8);
    }