isl/format: Add more isl_format_has_type_channel functions
[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 enum isl_format
79 isl_format_rgb_to_rgba(enum isl_format rgb)
80 {
81 assert(isl_format_is_rgb(rgb));
82
83 switch (rgb) {
84 case ISL_FORMAT_R32G32B32_FLOAT: return ISL_FORMAT_R32G32B32A32_FLOAT;
85 case ISL_FORMAT_R32G32B32_SINT: return ISL_FORMAT_R32G32B32A32_SINT;
86 case ISL_FORMAT_R32G32B32_UINT: return ISL_FORMAT_R32G32B32A32_UINT;
87 case ISL_FORMAT_R32G32B32_UNORM: return ISL_FORMAT_R32G32B32A32_UNORM;
88 case ISL_FORMAT_R32G32B32_SNORM: return ISL_FORMAT_R32G32B32A32_SNORM;
89 case ISL_FORMAT_R32G32B32_SSCALED: return ISL_FORMAT_R32G32B32A32_SSCALED;
90 case ISL_FORMAT_R32G32B32_USCALED: return ISL_FORMAT_R32G32B32A32_USCALED;
91 case ISL_FORMAT_R32G32B32_SFIXED: return ISL_FORMAT_R32G32B32A32_SFIXED;
92 case ISL_FORMAT_R8G8B8_UNORM: return ISL_FORMAT_R8G8B8A8_UNORM;
93 case ISL_FORMAT_R8G8B8_SNORM: return ISL_FORMAT_R8G8B8A8_SNORM;
94 case ISL_FORMAT_R8G8B8_SSCALED: return ISL_FORMAT_R8G8B8A8_SSCALED;
95 case ISL_FORMAT_R8G8B8_USCALED: return ISL_FORMAT_R8G8B8A8_USCALED;
96 case ISL_FORMAT_R16G16B16_FLOAT: return ISL_FORMAT_R16G16B16A16_FLOAT;
97 case ISL_FORMAT_R16G16B16_UNORM: return ISL_FORMAT_R16G16B16A16_UNORM;
98 case ISL_FORMAT_R16G16B16_SNORM: return ISL_FORMAT_R16G16B16A16_SNORM;
99 case ISL_FORMAT_R16G16B16_SSCALED: return ISL_FORMAT_R16G16B16A16_SSCALED;
100 case ISL_FORMAT_R16G16B16_USCALED: return ISL_FORMAT_R16G16B16A16_USCALED;
101 case ISL_FORMAT_R8G8B8_UNORM_SRGB: return ISL_FORMAT_R8G8B8A8_UNORM_SRGB;
102 case ISL_FORMAT_R16G16B16_UINT: return ISL_FORMAT_R16G16B16A16_UINT;
103 case ISL_FORMAT_R16G16B16_SINT: return ISL_FORMAT_R16G16B16A16_SINT;
104 case ISL_FORMAT_R8G8B8_UINT: return ISL_FORMAT_R8G8B8A8_UINT;
105 case ISL_FORMAT_R8G8B8_SINT: return ISL_FORMAT_R8G8B8A8_SINT;
106 default:
107 return ISL_FORMAT_UNSUPPORTED;
108 }
109 }
110
111 enum isl_format
112 isl_format_rgb_to_rgbx(enum isl_format rgb)
113 {
114 assert(isl_format_is_rgb(rgb));
115
116 switch (rgb) {
117 case ISL_FORMAT_R32G32B32_FLOAT:
118 return ISL_FORMAT_R32G32B32X32_FLOAT;
119 case ISL_FORMAT_R16G16B16_UNORM:
120 return ISL_FORMAT_R16G16B16X16_UNORM;
121 case ISL_FORMAT_R16G16B16_FLOAT:
122 return ISL_FORMAT_R16G16B16X16_FLOAT;
123 case ISL_FORMAT_R8G8B8_UNORM:
124 return ISL_FORMAT_R8G8B8X8_UNORM;
125 case ISL_FORMAT_R8G8B8_UNORM_SRGB:
126 return ISL_FORMAT_R8G8B8X8_UNORM_SRGB;
127 default:
128 return ISL_FORMAT_UNSUPPORTED;
129 }
130 }