am c6ede2aa: am 7bdff532: am 9252e819: Remove tessellation.user_defined_io.per_patch...
[platform/upstream/VK-GL-CTS.git] / framework / common / tcuPixelFormat.hpp
1 #ifndef _TCUPIXELFORMAT_HPP
2 #define _TCUPIXELFORMAT_HPP
3 /*-------------------------------------------------------------------------
4  * drawElements Quality Program Tester Core
5  * ----------------------------------------
6  *
7  * Copyright 2014 The Android Open Source Project
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  *//*!
22  * \file
23  * \brief Pixel format descriptor.
24  *//*--------------------------------------------------------------------*/
25
26 #include "tcuDefs.hpp"
27 #include "tcuRGBA.hpp"
28
29 namespace tcu
30 {
31
32 /*--------------------------------------------------------------------*//*!
33  * \brief Fixed-point render target pixel format
34  *//*--------------------------------------------------------------------*/
35 struct PixelFormat
36 {
37         int redBits;
38         int greenBits;
39         int blueBits;
40         int alphaBits;
41
42         PixelFormat (int red, int green, int blue, int alpha)
43                 : redBits(red)
44                 , greenBits(green)
45                 , blueBits(blue)
46                 , alphaBits(alpha)
47         {
48         }
49
50         PixelFormat (void)
51                 : redBits(0)
52                 , greenBits(0)
53                 , blueBits(0)
54                 , alphaBits(0)
55         {
56         }
57
58         /*--------------------------------------------------------------------*//*!
59          * \brief Get default threshold for per-pixel comparison for this format
60          *
61          * Per-channel threshold is 2^(8-bits). If alpha channel bits are zero,
62          * threshold for that channel is 0.
63          *//*--------------------------------------------------------------------*/
64         inline RGBA getColorThreshold (void) const
65         {
66                 return RGBA(
67                         1 << (8 - redBits),
68                         1 << (8 - greenBits),
69                         1 << (8 - blueBits),
70                         (alphaBits > 0) ? (1 << (8 - alphaBits)) : 0);
71         }
72
73         static inline int convertChannel (int val, int bits)
74         {
75                 if (bits == 1)
76                         return (val & 0x80) ? 0xff : 0;
77                 else
78                 {
79                         DE_ASSERT(deInRange32(bits, 4, 8));
80                         int c = val >> (8-bits);
81                         return (c << (8-bits)) | (c >> (2*bits-8));
82                 }
83         }
84
85         /*--------------------------------------------------------------------*//*!
86          * \brief Emulate reduced bit depth
87          *
88          * The color value bit depth is reduced and converted back. The lowest
89          * bits are filled by replicating the upper bits.
90          *//*--------------------------------------------------------------------*/
91         inline RGBA convertColor (const RGBA& col) const
92         {
93                 return RGBA(convertChannel(col.getRed(),        redBits),
94                                         convertChannel(col.getGreen(),  greenBits),
95                                         convertChannel(col.getBlue(),   blueBits),
96                                         alphaBits ? convertChannel(col.getAlpha(), alphaBits) : 0xff);
97         }
98
99         inline bool operator== (const PixelFormat& other) const
100         {
101                 return redBits          == other.redBits        &&
102                            greenBits    == other.greenBits      &&
103                            blueBits             == other.blueBits       &&
104                            alphaBits    == other.alphaBits;
105         }
106
107         inline bool operator!= (const PixelFormat& other) const
108         {
109                 return !(*this == other);
110         }
111 } DE_WARN_UNUSED_TYPE;
112
113 } // namespace tcu
114
115 #endif // _TCUPIXELFORMAT_HPP