mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 13:58:04 +02:00
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:
parent
b549394992
commit
8c4aef2abb
3 changed files with 51 additions and 28 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue