1#include "ANGLETest.h"
2
3class DepthStencilFormatsTest : public ANGLETest
4{
5protected:
6    DepthStencilFormatsTest()
7    {
8        setWindowWidth(128);
9        setWindowHeight(128);
10        setConfigRedBits(8);
11        setConfigGreenBits(8);
12        setConfigBlueBits(8);
13        setConfigAlphaBits(8);
14        setClientVersion(2);
15    }
16
17    bool checkTexImageFormatSupport(GLenum format, GLenum type)
18    {
19        EXPECT_GL_NO_ERROR();
20
21        GLuint tex = 0;
22        glGenTextures(1, &tex);
23        glBindTexture(GL_TEXTURE_2D, tex);
24        glTexImage2D(GL_TEXTURE_2D, 0, format, 1, 1, 0, format, type, NULL);
25        glDeleteTextures(1, &tex);
26
27        return (glGetError() == GL_NO_ERROR);
28    }
29
30    bool checkTexStorageFormatSupport(GLenum internalFormat)
31    {
32        EXPECT_GL_NO_ERROR();
33
34        GLuint tex = 0;
35        glGenTextures(1, &tex);
36        glBindTexture(GL_TEXTURE_2D, tex);
37        glTexStorage2DEXT(GL_TEXTURE_2D, 1, internalFormat, 1, 1);
38        glDeleteTextures(1, &tex);
39
40        return (glGetError() == GL_NO_ERROR);
41    }
42
43    bool checkRenderbufferFormatSupport(GLenum internalFormat)
44    {
45        EXPECT_GL_NO_ERROR();
46
47        GLuint rb = 0;
48        glGenRenderbuffers(1, &rb);
49        glBindRenderbuffer(GL_RENDERBUFFER, rb);
50        glRenderbufferStorage(GL_RENDERBUFFER, internalFormat, 1, 1);
51        glDeleteRenderbuffers(1, &rb);
52
53        return (glGetError() == GL_NO_ERROR);
54    }
55
56    virtual void SetUp()
57    {
58        ANGLETest::SetUp();
59    }
60
61    virtual void TearDown()
62    {
63        ANGLETest::TearDown();
64    }
65};
66
67TEST_F(DepthStencilFormatsTest, DepthTexture)
68{
69    bool shouldHaveTextureSupport = extensionEnabled("GL_ANGLE_depth_texture");
70    EXPECT_EQ(shouldHaveTextureSupport, checkTexImageFormatSupport(GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT));
71    EXPECT_EQ(shouldHaveTextureSupport, checkTexImageFormatSupport(GL_DEPTH_COMPONENT, GL_UNSIGNED_INT));
72
73    if (extensionEnabled("GL_EXT_texture_storage"))
74    {
75        EXPECT_EQ(shouldHaveTextureSupport, checkTexStorageFormatSupport(GL_DEPTH_COMPONENT16));
76        EXPECT_EQ(shouldHaveTextureSupport, checkTexStorageFormatSupport(GL_DEPTH_COMPONENT32_OES));
77    }
78}
79
80TEST_F(DepthStencilFormatsTest, PackedDepthStencil)
81{
82    // Expected to fail in D3D9 if GL_OES_packed_depth_stencil is not present.
83    // Expected to fail in D3D11 if GL_OES_packed_depth_stencil or GL_ANGLE_depth_texture is not present.
84
85    bool shouldHaveRenderbufferSupport = extensionEnabled("GL_OES_packed_depth_stencil");
86    EXPECT_EQ(shouldHaveRenderbufferSupport, checkRenderbufferFormatSupport(GL_DEPTH24_STENCIL8_OES));
87
88    bool shouldHaveTextureSupport = extensionEnabled("GL_OES_packed_depth_stencil") &&
89                                    extensionEnabled("GL_ANGLE_depth_texture");
90    EXPECT_EQ(shouldHaveTextureSupport, checkTexImageFormatSupport(GL_DEPTH_STENCIL_OES, GL_UNSIGNED_INT_24_8_OES));
91
92    if (extensionEnabled("GL_EXT_texture_storage"))
93    {
94        EXPECT_EQ(shouldHaveTextureSupport, checkTexStorageFormatSupport(GL_DEPTH24_STENCIL8_OES));
95    }
96}
97