gallivm: refactor a bit the cache access in view of LLVM opaque pointers
authorMihai Preda <mhpreda@gmail.com>
Fri, 1 Jul 2022 09:52:25 +0000 (12:52 +0300)
committerMarge Bot <emma+marge@anholt.net>
Sat, 23 Jul 2022 17:34:08 +0000 (17:34 +0000)
LLVM 15 requires transition to opaque pointers; factorize a bit the cache
memthods to help this transition.

Reviewed-by: Brian Paul <brianp@vmware.com>
Acked-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17650>

src/gallium/auxiliary/gallivm/lp_bld_format.c
src/gallium/auxiliary/gallivm/lp_bld_format.h
src/gallium/auxiliary/gallivm/lp_bld_format_s3tc.c

index d26485e..796277f 100644 (file)
 
 #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
@@ -39,11 +54,12 @@ lp_build_format_cache_type(struct gallivm_state *gallivm)
    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);
index 0ed1dca..74a625d 100644 (file)
@@ -68,7 +68,7 @@ struct lp_build_format_cache
 };
 
 
-enum {
+enum cache_member {
    LP_BUILD_FORMAT_CACHE_MEMBER_DATA = 0,
    LP_BUILD_FORMAT_CACHE_MEMBER_TAGS,
 #if LP_BUILD_FORMAT_CACHE_DEBUG
@@ -83,7 +83,10 @@ LLVMTypeRef
 lp_build_format_cache_type(struct gallivm_state *gallivm);
 
 LLVMTypeRef
-lp_build_format_cache_member_data_type(struct gallivm_state *gallivm);
+lp_build_format_cache_member_type(struct gallivm_state *gallivm, enum cache_member member);
+
+LLVMTypeRef
+lp_build_format_cache_elem_type(struct gallivm_state *gallivm, enum cache_member member);
 
 /*
  * AoS
index 5d91c77..fe44841 100644 (file)
@@ -1150,35 +1150,39 @@ s3tc_store_cached_block(struct gallivm_state *gallivm,
 }
 
 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