1#include "ANGLETest.h"
2
3class FramebufferFormatsTest : public ANGLETest
4{
5protected:
6    FramebufferFormatsTest()
7    {
8        setWindowWidth(128);
9        setWindowHeight(128);
10        setConfigRedBits(8);
11        setConfigGreenBits(8);
12        setConfigBlueBits(8);
13        setConfigAlphaBits(8);
14    }
15
16    void checkBitCount(GLuint fbo, GLenum channel, GLint minBits)
17    {
18        glBindFramebuffer(GL_FRAMEBUFFER, fbo);
19
20        GLint bits = 0;
21        glGetIntegerv(channel, &bits);
22
23        if (minBits == 0)
24        {
25            EXPECT_EQ(minBits, bits);
26        }
27        else
28        {
29            EXPECT_GE(bits, minBits);
30        }
31    }
32
33    void testBitCounts(GLuint fbo, GLint minRedBits, GLint minGreenBits, GLint minBlueBits,
34                       GLint minAlphaBits, GLint minDepthBits, GLint minStencilBits)
35    {
36        checkBitCount(fbo, GL_RED_BITS, minRedBits);
37        checkBitCount(fbo, GL_GREEN_BITS, minGreenBits);
38        checkBitCount(fbo, GL_BLUE_BITS, minBlueBits);
39        checkBitCount(fbo, GL_ALPHA_BITS, minAlphaBits);
40        checkBitCount(fbo, GL_DEPTH_BITS, minDepthBits);
41        checkBitCount(fbo, GL_STENCIL_BITS, minStencilBits);
42    }
43
44    void testTextureFormat(GLenum internalFormat, GLint minRedBits, GLint minGreenBits, GLint minBlueBits,
45                           GLint minAlphaBits)
46    {
47        GLuint tex = 0;
48        glGenTextures(1, &tex);
49        glBindTexture(GL_TEXTURE_2D, tex);
50        glTexStorage2DEXT(GL_TEXTURE_2D, 1, internalFormat, 1, 1);
51
52        GLuint fbo = 0;
53        glGenFramebuffers(1, &fbo);
54        glBindFramebuffer(GL_FRAMEBUFFER, fbo);
55        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
56
57        testBitCounts(fbo, minRedBits, minGreenBits, minBlueBits, minAlphaBits, 0, 0);
58
59        glDeleteTextures(1, &tex);
60        glDeleteFramebuffers(1, &fbo);
61    }
62
63    virtual void SetUp()
64    {
65        ANGLETest::SetUp();
66    }
67
68    virtual void TearDown()
69    {
70        ANGLETest::TearDown();
71    }
72};
73
74TEST_F(FramebufferFormatsTest, RGBA4)
75{
76    testTextureFormat(GL_RGBA4, 4, 4, 4, 4);
77}
78
79TEST_F(FramebufferFormatsTest, RGB565)
80{
81    testTextureFormat(GL_RGB565, 5, 6, 5, 0);
82}
83
84TEST_F(FramebufferFormatsTest, RGB8)
85{
86    testTextureFormat(GL_RGB8_OES, 8, 8, 8, 0);
87}
88
89TEST_F(FramebufferFormatsTest, BGRA8)
90{
91    testTextureFormat(GL_BGRA8_EXT, 8, 8, 8, 8);
92}
93
94TEST_F(FramebufferFormatsTest, RGBA8)
95{
96    testTextureFormat(GL_RGBA8_OES, 8, 8, 8, 8);
97}
98
99