gallivm: refactor a bit the cache access in view of LLVM opaque pointers

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>
This commit is contained in:
Mihai Preda 2022-07-01 12:52:25 +03:00 committed by Marge Bot
parent b549394992
commit 8c4aef2abb
3 changed files with 51 additions and 28 deletions

View file

@ -28,9 +28,24 @@
#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);

View 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

View file

@ -1149,36 +1149,40 @@ s3tc_store_cached_block(struct gallivm_state *gallivm,
}
}
static LLVMValueRef
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, member);
indices[2] = index;
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)
{
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[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");
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