isl/format: Add a get_num_channels helper
[mesa.git] / src / intel / isl / isl_format.c
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 DEALINGS
21 * IN THE SOFTWARE.
22 */
23
24 #include <assert.h>
25
26 #include "isl.h"
27
28 static inline bool
29 isl_format_has_channel_type(enum isl_format fmt, enum isl_base_type type)
30 {
31 const struct isl_format_layout *fmtl = isl_format_get_layout(fmt);
32
33 return fmtl->channels.r.type == type ||
34 fmtl->channels.g.type == type ||
35 fmtl->channels.b.type == type ||
36 fmtl->channels.a.type == type ||
37 fmtl->channels.l.type == type ||
38 fmtl->channels.i.type == type ||
39 fmtl->channels.p.type == type;
40 }
41
42 bool
43 isl_format_has_unorm_channel(enum isl_format fmt)
44 {
45 return isl_format_has_channel_type(fmt, ISL_UNORM);
46 }
47
48 bool
49 isl_format_has_snorm_channel(enum isl_format fmt)
50 {
51 return isl_format_has_channel_type(fmt, ISL_SNORM);
52 }
53
54 bool
55 isl_format_has_ufloat_channel(enum isl_format fmt)
56 {
57 return isl_format_has_channel_type(fmt, ISL_UFLOAT);
58 }
59
60 bool
61 isl_format_has_sfloat_channel(enum isl_format fmt)
62 {
63 return isl_format_has_channel_type(fmt, ISL_SFLOAT);
64 }
65
66 bool
67 isl_format_has_uint_channel(enum isl_format fmt)
68 {
69 return isl_format_has_channel_type(fmt, ISL_UINT);
70 }
71
72 bool
73 isl_format_has_sint_channel(enum isl_format fmt)
74 {
75 return isl_format_has_channel_type(fmt, ISL_SINT);
76 }
77
78 unsigned
79 isl_format_get_num_channels(enum isl_format fmt)
80 {
81 const struct isl_format_layout *fmtl = isl_format_get_layout(fmt);
82
83 assert(fmtl->channels.p.bits == 0);
84
85 return (fmtl->channels.r.bits > 0) +
86 (fmtl->channels.g.bits > 0) +
87 (fmtl->channels.b.bits > 0) +
88 (fmtl->channels.a.bits > 0) +
89 (fmtl->channels.l.bits > 0) +
90 (fmtl->channels.i.bits > 0);
91 }
92
93 enum isl_format
94 isl_format_rgb_to_rgba(enum isl_format rgb)
95 {
96 assert(isl_format_is_rgb(rgb));
97
98 switch (rgb) {
99 case ISL_FORMAT_R32G32B32_FLOAT: return ISL_FORMAT_R32G32B32A32_FLOAT;
100 case ISL_FORMAT_R32G32B32_SINT: return ISL_FORMAT_R32G32B32A32_SINT;
101 case ISL_FORMAT_R32G32B32_UINT: return ISL_FORMAT_R32G32B32A32_UINT;
102 case ISL_FORMAT_R32G32B32_UNORM: return ISL_FORMAT_R32G32B32A32_UNORM;
103 case ISL_FORMAT_R32G32B32_SNORM: return ISL_FORMAT_R32G32B32A32_SNORM;
104 case ISL_FORMAT_R32G32B32_SSCALED: return ISL_FORMAT_R32G32B32A32_SSCALED;
105 case ISL_FORMAT_R32G32B32_USCALED: return ISL_FORMAT_R32G32B32A32_USCALED;
106 case ISL_FORMAT_R32G32B32_SFIXED: return ISL_FORMAT_R32G32B32A32_SFIXED;
107 case ISL_FORMAT_R8G8B8_UNORM: return ISL_FORMAT_R8G8B8A8_UNORM;
108 case ISL_FORMAT_R8G8B8_SNORM: return ISL_FORMAT_R8G8B8A8_SNORM;
109 case ISL_FORMAT_R8G8B8_SSCALED: return ISL_FORMAT_R8G8B8A8_SSCALED;
110 case ISL_FORMAT_R8G8B8_USCALED: return ISL_FORMAT_R8G8B8A8_USCALED;
111 case ISL_FORMAT_R16G16B16_FLOAT: return ISL_FORMAT_R16G16B16A16_FLOAT;
112 case ISL_FORMAT_R16G16B16_UNORM: return ISL_FORMAT_R16G16B16A16_UNORM;
113 case ISL_FORMAT_R16G16B16_SNORM: return ISL_FORMAT_R16G16B16A16_SNORM;
114 case ISL_FORMAT_R16G16B16_SSCALED: return ISL_FORMAT_R16G16B16A16_SSCALED;
115 case ISL_FORMAT_R16G16B16_USCALED: return ISL_FORMAT_R16G16B16A16_USCALED;
116 case ISL_FORMAT_R8G8B8_UNORM_SRGB: return ISL_FORMAT_R8G8B8A8_UNORM_SRGB;
117 case ISL_FORMAT_R16G16B16_UINT: return ISL_FORMAT_R16G16B16A16_UINT;
118 case ISL_FORMAT_R16G16B16_SINT: return ISL_FORMAT_R16G16B16A16_SINT;
119 case ISL_FORMAT_R8G8B8_UINT: return ISL_FORMAT_R8G8B8A8_UINT;
120 case ISL_FORMAT_R8G8B8_SINT: return ISL_FORMAT_R8G8B8A8_SINT;
121 default:
122 return ISL_FORMAT_UNSUPPORTED;
123 }
124 }
125
126 enum isl_format
127 isl_format_rgb_to_rgbx(enum isl_format rgb)
128 {
129 assert(isl_format_is_rgb(rgb));
130
131 switch (rgb) {
132 case ISL_FORMAT_R32G32B32_FLOAT:
133 return ISL_FORMAT_R32G32B32X32_FLOAT;
134 case ISL_FORMAT_R16G16B16_UNORM:
135 return ISL_FORMAT_R16G16B16X16_UNORM;
136 case ISL_FORMAT_R16G16B16_FLOAT:
137 return ISL_FORMAT_R16G16B16X16_FLOAT;
138 case ISL_FORMAT_R8G8B8_UNORM:
139 return ISL_FORMAT_R8G8B8X8_UNORM;
140 case ISL_FORMAT_R8G8B8_UNORM_SRGB:
141 return ISL_FORMAT_R8G8B8X8_UNORM_SRGB;
142 default:
143 return ISL_FORMAT_UNSUPPORTED;
144 }
145 }