Merge remote-tracking branch 'public/master' into vulkan
[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 bool
29 isl_format_has_uint_channel(enum isl_format fmt)
30 {
31 const struct isl_format_layout *fmtl = isl_format_get_layout(fmt);
32
33 return fmtl->channels.r.type == ISL_UINT ||
34 fmtl->channels.g.type == ISL_UINT ||
35 fmtl->channels.b.type == ISL_UINT ||
36 fmtl->channels.a.type == ISL_UINT ||
37 fmtl->channels.l.type == ISL_UINT ||
38 fmtl->channels.i.type == ISL_UINT ||
39 fmtl->channels.p.type == ISL_UINT;
40 }
41
42 bool
43 isl_format_has_sint_channel(enum isl_format fmt)
44 {
45 const struct isl_format_layout *fmtl = isl_format_get_layout(fmt);
46
47 return fmtl->channels.r.type == ISL_SINT ||
48 fmtl->channels.g.type == ISL_SINT ||
49 fmtl->channels.b.type == ISL_SINT ||
50 fmtl->channels.a.type == ISL_SINT ||
51 fmtl->channels.l.type == ISL_SINT ||
52 fmtl->channels.i.type == ISL_SINT ||
53 fmtl->channels.p.type == ISL_SINT;
54 }
55
56 enum isl_format
57 isl_format_rgb_to_rgba(enum isl_format rgb)
58 {
59 assert(isl_format_is_rgb(rgb));
60
61 switch (rgb) {
62 case ISL_FORMAT_R32G32B32_FLOAT: return ISL_FORMAT_R32G32B32A32_FLOAT;
63 case ISL_FORMAT_R32G32B32_SINT: return ISL_FORMAT_R32G32B32A32_SINT;
64 case ISL_FORMAT_R32G32B32_UINT: return ISL_FORMAT_R32G32B32A32_UINT;
65 case ISL_FORMAT_R32G32B32_UNORM: return ISL_FORMAT_R32G32B32A32_UNORM;
66 case ISL_FORMAT_R32G32B32_SNORM: return ISL_FORMAT_R32G32B32A32_SNORM;
67 case ISL_FORMAT_R32G32B32_SSCALED: return ISL_FORMAT_R32G32B32A32_SSCALED;
68 case ISL_FORMAT_R32G32B32_USCALED: return ISL_FORMAT_R32G32B32A32_USCALED;
69 case ISL_FORMAT_R32G32B32_SFIXED: return ISL_FORMAT_R32G32B32A32_SFIXED;
70 case ISL_FORMAT_R8G8B8_UNORM: return ISL_FORMAT_R8G8B8A8_UNORM;
71 case ISL_FORMAT_R8G8B8_SNORM: return ISL_FORMAT_R8G8B8A8_SNORM;
72 case ISL_FORMAT_R8G8B8_SSCALED: return ISL_FORMAT_R8G8B8A8_SSCALED;
73 case ISL_FORMAT_R8G8B8_USCALED: return ISL_FORMAT_R8G8B8A8_USCALED;
74 case ISL_FORMAT_R16G16B16_FLOAT: return ISL_FORMAT_R16G16B16A16_FLOAT;
75 case ISL_FORMAT_R16G16B16_UNORM: return ISL_FORMAT_R16G16B16A16_UNORM;
76 case ISL_FORMAT_R16G16B16_SNORM: return ISL_FORMAT_R16G16B16A16_SNORM;
77 case ISL_FORMAT_R16G16B16_SSCALED: return ISL_FORMAT_R16G16B16A16_SSCALED;
78 case ISL_FORMAT_R16G16B16_USCALED: return ISL_FORMAT_R16G16B16A16_USCALED;
79 case ISL_FORMAT_R8G8B8_UNORM_SRGB: return ISL_FORMAT_R8G8B8A8_UNORM_SRGB;
80 case ISL_FORMAT_R16G16B16_UINT: return ISL_FORMAT_R16G16B16A16_UINT;
81 case ISL_FORMAT_R16G16B16_SINT: return ISL_FORMAT_R16G16B16A16_SINT;
82 case ISL_FORMAT_R8G8B8_UINT: return ISL_FORMAT_R8G8B8A8_UINT;
83 case ISL_FORMAT_R8G8B8_SINT: return ISL_FORMAT_R8G8B8A8_SINT;
84 default:
85 return ISL_FORMAT_UNSUPPORTED;
86 }
87 }
88
89 enum isl_format
90 isl_format_rgb_to_rgbx(enum isl_format rgb)
91 {
92 assert(isl_format_is_rgb(rgb));
93
94 switch (rgb) {
95 case ISL_FORMAT_R32G32B32_FLOAT:
96 return ISL_FORMAT_R32G32B32X32_FLOAT;
97 case ISL_FORMAT_R16G16B16_UNORM:
98 return ISL_FORMAT_R16G16B16X16_UNORM;
99 case ISL_FORMAT_R16G16B16_FLOAT:
100 return ISL_FORMAT_R16G16B16X16_FLOAT;
101 case ISL_FORMAT_R8G8B8_UNORM:
102 return ISL_FORMAT_R8G8B8X8_UNORM;
103 case ISL_FORMAT_R8G8B8_UNORM_SRGB:
104 return ISL_FORMAT_R8G8B8X8_UNORM_SRGB;
105 default:
106 return ISL_FORMAT_UNSUPPORTED;
107 }
108 }