1 /**************************************************************************
3 * Copyright 2009 VMware, Inc.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 **************************************************************************/
28 #ifndef LP_BLD_FORMAT_H
29 #define LP_BLD_FORMAT_H
34 * Pixel format helpers.
37 #include "gallivm/lp_bld.h"
38 #include "gallivm/lp_bld_init.h"
40 #include "pipe/p_format.h"
42 struct util_format_description
;
44 struct lp_build_context
;
47 #define LP_BUILD_FORMAT_CACHE_DEBUG 0
51 * Optional block cache to be used when unpacking big pixel blocks.
52 * Must be a power of 2
55 #define LP_BUILD_FORMAT_CACHE_SIZE 128
58 * Note: cache_data needs 16 byte alignment.
60 struct lp_build_format_cache
62 PIPE_ALIGN_VAR(16) uint32_t cache_data
[LP_BUILD_FORMAT_CACHE_SIZE
][4][4];
63 uint64_t cache_tags
[LP_BUILD_FORMAT_CACHE_SIZE
];
64 #if LP_BUILD_FORMAT_CACHE_DEBUG
65 uint64_t cache_access_total
;
66 uint64_t cache_access_miss
;
72 LP_BUILD_FORMAT_CACHE_MEMBER_DATA
= 0,
73 LP_BUILD_FORMAT_CACHE_MEMBER_TAGS
,
74 #if LP_BUILD_FORMAT_CACHE_DEBUG
75 LP_BUILD_FORMAT_CACHE_MEMBER_ACCESS_TOTAL
,
76 LP_BUILD_FORMAT_CACHE_MEMBER_ACCESS_MISS
,
78 LP_BUILD_FORMAT_CACHE_MEMBER_COUNT
83 lp_build_format_cache_type(struct gallivm_state
*gallivm
);
91 lp_build_format_swizzle_aos(const struct util_format_description
*desc
,
92 struct lp_build_context
*bld
,
93 LLVMValueRef unswizzled
);
96 lp_build_pack_rgba_aos(struct gallivm_state
*gallivm
,
97 const struct util_format_description
*desc
,
101 lp_build_fetch_rgba_aos(struct gallivm_state
*gallivm
,
102 const struct util_format_description
*format_desc
,
105 LLVMValueRef base_ptr
,
112 lp_build_fetch_rgba_aos_array(struct gallivm_state
*gallivm
,
113 const struct util_format_description
*format_desc
,
115 LLVMValueRef base_ptr
,
116 LLVMValueRef offset
);
124 lp_build_format_swizzle_soa(const struct util_format_description
*format_desc
,
125 struct lp_build_context
*bld
,
126 const LLVMValueRef unswizzled
[4],
127 LLVMValueRef swizzled_out
[4]);
130 lp_build_unpack_rgba_soa(struct gallivm_state
*gallivm
,
131 const struct util_format_description
*format_desc
,
134 LLVMValueRef rgba_out
[4]);
137 lp_build_rgba8_to_fi32_soa(struct gallivm_state
*gallivm
,
138 struct lp_type dst_type
,
143 lp_build_fetch_rgba_soa(struct gallivm_state
*gallivm
,
144 const struct util_format_description
*format_desc
,
147 LLVMValueRef base_ptr
,
148 LLVMValueRef offsets
,
152 LLVMValueRef rgba_out
[4]);
155 lp_build_store_rgba_soa(struct gallivm_state
*gallivm
,
156 const struct util_format_description
*format_desc
,
158 LLVMValueRef exec_mask
,
159 LLVMValueRef base_ptr
,
161 LLVMValueRef out_of_bounds
,
162 const LLVMValueRef rgba_in
[4]);
169 lp_build_fetch_subsampled_rgba_aos(struct gallivm_state
*gallivm
,
170 const struct util_format_description
*format_desc
,
172 LLVMValueRef base_ptr
,
183 lp_build_fetch_s3tc_rgba_aos(struct gallivm_state
*gallivm
,
184 const struct util_format_description
*format_desc
,
186 LLVMValueRef base_ptr
,
194 * special float formats
198 lp_build_float_to_smallfloat(struct gallivm_state
*gallivm
,
199 struct lp_type i32_type
,
201 unsigned mantissa_bits
,
202 unsigned exponent_bits
,
203 unsigned mantissa_start
,
207 lp_build_smallfloat_to_float(struct gallivm_state
*gallivm
,
208 struct lp_type f32_type
,
210 unsigned mantissa_bits
,
211 unsigned exponent_bits
,
212 unsigned mantissa_start
,
216 lp_build_float_to_r11g11b10(struct gallivm_state
*gallivm
,
217 const LLVMValueRef
*src
);
220 lp_build_r11g11b10_to_float(struct gallivm_state
*gallivm
,
225 lp_build_rgb9e5_to_float(struct gallivm_state
*gallivm
,
230 lp_build_float_to_srgb_packed(struct gallivm_state
*gallivm
,
231 const struct util_format_description
*dst_fmt
,
232 struct lp_type src_type
,
236 lp_build_srgb_to_linear(struct gallivm_state
*gallivm
,
237 struct lp_type src_type
,
242 #endif /* !LP_BLD_FORMAT_H */