• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright © 2015 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  */
23 
24 /**
25  * \name mesa_formats.cpp
26  *
27  * Verify that all mesa formats are handled in certain functions and that
28  * the format info table is sane.
29  *
30  */
31 
32 #include <gtest/gtest.h>
33 
34 #include "main/formats.h"
35 #include "main/glformats.h"
36 
37 /**
38  * Debug/test: check that all uncompressed formats are handled in the
39  * _mesa_uncompressed_format_to_type_and_comps() function. When new pixel
40  * formats are added to Mesa, that function needs to be updated.
41  */
TEST(MesaFormatsTest,FormatTypeAndComps)42 TEST(MesaFormatsTest, FormatTypeAndComps)
43 {
44    for (int fi = MESA_FORMAT_NONE + 1; fi < MESA_FORMAT_COUNT; ++fi) {
45       mesa_format f = (mesa_format) fi;
46       SCOPED_TRACE(_mesa_get_format_name(f));
47 
48       if (!_mesa_get_format_name(f))
49          continue;
50 
51       /* This function will emit a problem/warning if the format is
52        * not handled.
53        */
54       if (!_mesa_is_format_compressed(f)) {
55          GLenum datatype = 0;
56          GLuint comps = 0;
57 
58          /* If the datatype is zero, the format was not handled */
59          _mesa_uncompressed_format_to_type_and_comps(f, &datatype, &comps);
60          EXPECT_NE(datatype, (GLenum)0);
61       }
62 
63    }
64 }
65 
66 /**
67  * Do sanity checking of the format info table.
68  */
TEST(MesaFormatsTest,FormatSanity)69 TEST(MesaFormatsTest, FormatSanity)
70 {
71    for (int fi = 0; fi < MESA_FORMAT_COUNT; ++fi) {
72       mesa_format f = (mesa_format) fi;
73       SCOPED_TRACE(_mesa_get_format_name(f));
74       if (!_mesa_get_format_name(f))
75          continue;
76 
77       GLenum datatype = _mesa_get_format_datatype(f);
78       GLint r = _mesa_get_format_bits(f, GL_RED_BITS);
79       GLint g = _mesa_get_format_bits(f, GL_GREEN_BITS);
80       GLint b = _mesa_get_format_bits(f, GL_BLUE_BITS);
81       GLint a = _mesa_get_format_bits(f, GL_ALPHA_BITS);
82       GLint l = _mesa_get_format_bits(f, GL_TEXTURE_LUMINANCE_SIZE);
83       GLint i = _mesa_get_format_bits(f, GL_TEXTURE_INTENSITY_SIZE);
84 
85       /* Note: Z32_FLOAT_X24S8 has datatype of GL_NONE */
86       EXPECT_TRUE(datatype == GL_NONE ||
87                   datatype == GL_UNSIGNED_NORMALIZED ||
88                   datatype == GL_SIGNED_NORMALIZED ||
89                   datatype == GL_UNSIGNED_INT ||
90                   datatype == GL_INT ||
91                   datatype == GL_FLOAT);
92 
93       if (r > 0 && !_mesa_is_format_compressed(f)) {
94          GLint bytes = _mesa_get_format_bytes(f);
95          EXPECT_LE((r+g+b+a) / 8, bytes);
96       }
97 
98       /* Determines if the base format has a channel [rgba] or property [li].
99       * >  indicates existance
100       * == indicates non-existance
101       */
102       #define HAS_PROP(rop,gop,bop,aop,lop,iop) \
103          do { \
104             EXPECT_TRUE(r rop 0); \
105             EXPECT_TRUE(g gop 0); \
106             EXPECT_TRUE(b bop 0); \
107             EXPECT_TRUE(a aop 0); \
108             EXPECT_TRUE(l lop 0); \
109             EXPECT_TRUE(i iop 0); \
110          } while(0)
111 
112       switch (_mesa_get_format_base_format(f)) {
113       case GL_RGBA:
114          HAS_PROP(>,>,>,>,==,==);
115          break;
116       case GL_RGB:
117          HAS_PROP(>,>,>,==,==,==);
118          break;
119       case GL_RG:
120          HAS_PROP(>,>,==,==,==,==);
121          break;
122       case GL_RED:
123          HAS_PROP(>,==,==,==,==,==);
124          break;
125       case GL_LUMINANCE:
126          HAS_PROP(==,==,==,==,>,==);
127          break;
128       case GL_INTENSITY:
129          HAS_PROP(==,==,==,==,==,>);
130          break;
131       default:
132          break;
133       }
134 
135       #undef HAS_PROP
136 
137    }
138 }
139 
TEST(MesaFormatsTest,IntensityToRed)140 TEST(MesaFormatsTest, IntensityToRed)
141 {
142    EXPECT_EQ(_mesa_get_intensity_format_red(MESA_FORMAT_I_UNORM8),
143              MESA_FORMAT_R_UNORM8);
144    EXPECT_EQ(_mesa_get_intensity_format_red(MESA_FORMAT_I_SINT32),
145              MESA_FORMAT_R_SINT32);
146    EXPECT_EQ(_mesa_get_intensity_format_red(MESA_FORMAT_R8G8B8A8_UNORM),
147              MESA_FORMAT_R8G8B8A8_UNORM);
148 }
149 
fffat_wrap(GLenum format,GLenum type)150 static mesa_format fffat_wrap(GLenum format, GLenum type)
151 {
152    uint32_t f = _mesa_format_from_format_and_type(format, type);
153    if (_mesa_format_is_mesa_array_format(f))
154       f = _mesa_format_from_array_format((mesa_array_format)f);
155    return (mesa_format)f;
156 }
157 
TEST(MesaFormatsTest,FormatFromFormatAndType)158 TEST(MesaFormatsTest, FormatFromFormatAndType)
159 {
160    EXPECT_EQ(fffat_wrap(GL_RGBA, GL_SHORT),
161              MESA_FORMAT_RGBA_SNORM16);
162    EXPECT_EQ(fffat_wrap(GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT),
163              MESA_FORMAT_Z_UNORM16);
164    EXPECT_EQ(fffat_wrap(GL_STENCIL_INDEX, GL_UNSIGNED_BYTE),
165              MESA_FORMAT_S_UINT8);
166 
167    /* Should return an array format, but not a proper MESA_FORMAT. */
168    EXPECT_TRUE(_mesa_format_is_mesa_array_format(_mesa_format_from_format_and_type(GL_DEPTH_COMPONENT,
169                                                                                    GL_BYTE)));
170 }
171 
TEST(MesaFormatsTest,FormatMatchesFormatAndType)172 TEST(MesaFormatsTest, FormatMatchesFormatAndType)
173 {
174    EXPECT_TRUE(_mesa_format_matches_format_and_type(MESA_FORMAT_RGBA_UNORM16,
175                                                     GL_RGBA,
176                                                     GL_UNSIGNED_SHORT, false,
177                                                     NULL));
178    EXPECT_TRUE(_mesa_format_matches_format_and_type(MESA_FORMAT_S_UINT8,
179                                                     GL_STENCIL_INDEX,
180                                                     GL_UNSIGNED_BYTE, false,
181                                                     NULL));
182    EXPECT_TRUE(_mesa_format_matches_format_and_type(MESA_FORMAT_Z_UNORM16,
183                                                     GL_DEPTH_COMPONENT,
184                                                     GL_UNSIGNED_SHORT, false,
185                                                     NULL));
186 }
187