#include "lp_bld_format.h"
-LLVMTypeRef lp_build_format_cache_member_data_type(struct gallivm_state *gallivm)
-{
- return LLVMArrayType(LLVMInt32TypeInContext(gallivm->context), LP_BUILD_FORMAT_CACHE_SIZE * 16);
+LLVMTypeRef lp_build_format_cache_elem_type(struct gallivm_state *gallivm, enum cache_member member) {
+ assert(member == LP_BUILD_FORMAT_CACHE_MEMBER_DATA || member == LP_BUILD_FORMAT_CACHE_MEMBER_TAGS);
+ switch (member) {
+ case LP_BUILD_FORMAT_CACHE_MEMBER_DATA:
+ return LLVMInt32TypeInContext(gallivm->context);
+ case LP_BUILD_FORMAT_CACHE_MEMBER_TAGS:
+ return LLVMInt64TypeInContext(gallivm->context);
+ default:
+ unreachable("lp_build_format_cache_elem_type unhandled member type");
+ }
+}
+
+LLVMTypeRef lp_build_format_cache_member_type(struct gallivm_state *gallivm, enum cache_member member) {
+ assert(member == LP_BUILD_FORMAT_CACHE_MEMBER_DATA || member == LP_BUILD_FORMAT_CACHE_MEMBER_TAGS);
+ unsigned elem_count =
+ member == LP_BUILD_FORMAT_CACHE_MEMBER_DATA ? LP_BUILD_FORMAT_CACHE_SIZE * 16 :
+ member == LP_BUILD_FORMAT_CACHE_MEMBER_TAGS ? LP_BUILD_FORMAT_CACHE_SIZE : 0;
+ return LLVMArrayType(lp_build_format_cache_elem_type(gallivm, member), elem_count);
}
LLVMTypeRef
LLVMTypeRef elem_types[LP_BUILD_FORMAT_CACHE_MEMBER_COUNT];
LLVMTypeRef s;
- elem_types[LP_BUILD_FORMAT_CACHE_MEMBER_DATA] = lp_build_format_cache_member_data_type(gallivm);
+ int members[] = {LP_BUILD_FORMAT_CACHE_MEMBER_DATA, LP_BUILD_FORMAT_CACHE_MEMBER_TAGS};
+ for (int i = 0; i < ARRAY_SIZE(members); ++i) {
+ int member = members[i];
+ elem_types[member] = lp_build_format_cache_member_type(gallivm, member);
+ }
- elem_types[LP_BUILD_FORMAT_CACHE_MEMBER_TAGS] =
- LLVMArrayType(LLVMInt64TypeInContext(gallivm->context),
- LP_BUILD_FORMAT_CACHE_SIZE);
#if LP_BUILD_FORMAT_CACHE_DEBUG
elem_types[LP_BUILD_FORMAT_CACHE_MEMBER_ACCESS_TOTAL] =
LLVMInt64TypeInContext(gallivm->context);
}
static LLVMValueRef
-s3tc_lookup_cached_pixel(struct gallivm_state *gallivm,
- LLVMValueRef cache,
- LLVMValueRef index)
-{
+lookup_cache_member(struct gallivm_state *gallivm, LLVMValueRef cache, enum cache_member member, LLVMValueRef index) {
+ assert(member == LP_BUILD_FORMAT_CACHE_MEMBER_DATA || member == LP_BUILD_FORMAT_CACHE_MEMBER_TAGS);
LLVMBuilderRef builder = gallivm->builder;
LLVMValueRef member_ptr, indices[3];
indices[0] = lp_build_const_int32(gallivm, 0);
- indices[1] = lp_build_const_int32(gallivm, LP_BUILD_FORMAT_CACHE_MEMBER_DATA);
+ indices[1] = lp_build_const_int32(gallivm, member);
indices[2] = index;
- member_ptr = LLVMBuildGEP2(builder, lp_build_format_cache_type(gallivm), cache, indices, ARRAY_SIZE(indices), "");
- return LLVMBuildLoad2(builder, lp_build_format_cache_member_data_type(gallivm), member_ptr, "cache_data");
+ const char *name =
+ member == LP_BUILD_FORMAT_CACHE_MEMBER_DATA ? "cache_data" :
+ member == LP_BUILD_FORMAT_CACHE_MEMBER_TAGS ? "tag_data" : "";
+
+ member_ptr = LLVMBuildGEP2(builder, lp_build_format_cache_type(gallivm),
+ cache, indices, ARRAY_SIZE(indices), "cache_gep");
+
+ return LLVMBuildLoad2(builder, lp_build_format_cache_elem_type(gallivm, member), member_ptr, name);
+}
+
+static LLVMValueRef
+s3tc_lookup_cached_pixel(struct gallivm_state *gallivm,
+ LLVMValueRef cache,
+ LLVMValueRef index)
+{
+ return lookup_cache_member(gallivm, cache, LP_BUILD_FORMAT_CACHE_MEMBER_DATA, index);
}
static LLVMValueRef
s3tc_lookup_tag_data(struct gallivm_state *gallivm,
- LLVMValueRef ptr,
+ LLVMValueRef cache,
LLVMValueRef index)
{
- LLVMBuilderRef builder = gallivm->builder;
- LLVMValueRef member_ptr, indices[3];
-
- indices[0] = lp_build_const_int32(gallivm, 0);
- indices[1] = lp_build_const_int32(gallivm, LP_BUILD_FORMAT_CACHE_MEMBER_TAGS);
- indices[2] = index;
- LLVMTypeRef tag_type = LLVMInt64TypeInContext(gallivm->context);
- member_ptr = LLVMBuildGEP(builder, ptr, indices, ARRAY_SIZE(indices), "");
- return LLVMBuildLoad2(builder, tag_type, member_ptr, "tag_data");
+ return lookup_cache_member(gallivm, cache, LP_BUILD_FORMAT_CACHE_MEMBER_TAGS, index);
}
#if LP_BUILD_FORMAT_CACHE_DEBUG