[Mesa-dev] [PATCH 4/5] gallivm: enable fetch for integer opcodes.
Dave Airlie
airlied at gmail.com
Mon Feb 6 07:46:43 PST 2012
From: Dave Airlie <airlied at redhat.com>
The infers the type of data required using the opcode,
and casts the input to the appropriate type.
So far this only handles non-indirect constant and temporaries.
Signed-off-by: Dave Airlie <airlied at redhat.com>
---
src/gallium/auxiliary/gallivm/lp_bld_tgsi.c | 4 +-
src/gallium/auxiliary/gallivm/lp_bld_tgsi.h | 3 +-
src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c | 4 ++
src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c | 47 +++++++++++++++++++++--
4 files changed, 52 insertions(+), 6 deletions(-)
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.c
index 261301c..7b701f1 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.c
@@ -38,6 +38,7 @@
#include "tgsi/tgsi_parse.h"
#include "tgsi/tgsi_util.h"
#include "util/u_memory.h"
+#include "util/u_format.h"
/* The user is responsible for freeing list->instructions */
unsigned lp_bld_tgsi_list_init(struct lp_build_tgsi_context * bld_base)
@@ -298,6 +299,7 @@ lp_build_emit_fetch(
const struct tgsi_full_src_register *reg = &inst->Src[src_op];
unsigned swizzle;
LLVMValueRef res;
+ enum util_format_type stype = tgsi_opcode_infer_src_type(inst->Instruction.Opcode);
if (chan_index == LP_CHAN_ALL) {
swizzle = ~0;
@@ -312,7 +314,7 @@ lp_build_emit_fetch(
assert(reg->Register.Index <= bld_base->info->file_max[reg->Register.File]);
if (bld_base->emit_fetch_funcs[reg->Register.File]) {
- res = bld_base->emit_fetch_funcs[reg->Register.File](bld_base, reg,
+ res = bld_base->emit_fetch_funcs[reg->Register.File](bld_base, reg, stype,
swizzle);
} else {
assert(0 && "invalid src register in emit_fetch()");
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
index a320d94..c620910 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
@@ -273,7 +273,8 @@ struct lp_build_tgsi_context;
typedef LLVMValueRef (*lp_build_emit_fetch_fn)(struct lp_build_tgsi_context *,
const struct tgsi_full_src_register *,
- unsigned);
+ const unsigned,
+ const unsigned);
struct lp_build_tgsi_context
{
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c
index 0f98fa8..5e929b3 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c
@@ -101,6 +101,7 @@ static LLVMValueRef
emit_fetch_constant(
struct lp_build_tgsi_context * bld_base,
const struct tgsi_full_src_register * reg,
+ const unsigned stype,
const unsigned swizzle)
{
struct lp_build_tgsi_aos_context * bld = lp_aos_context(bld_base);
@@ -171,6 +172,7 @@ static LLVMValueRef
emit_fetch_immediate(
struct lp_build_tgsi_context * bld_base,
const struct tgsi_full_src_register * reg,
+ const unsigned stype,
const unsigned swizzle)
{
struct lp_build_tgsi_aos_context * bld = lp_aos_context(bld_base);
@@ -183,6 +185,7 @@ static LLVMValueRef
emit_fetch_input(
struct lp_build_tgsi_context * bld_base,
const struct tgsi_full_src_register * reg,
+ const unsigned stype,
const unsigned swizzle)
{
struct lp_build_tgsi_aos_context * bld = lp_aos_context(bld_base);
@@ -196,6 +199,7 @@ static LLVMValueRef
emit_fetch_temporary(
struct lp_build_tgsi_context * bld_base,
const struct tgsi_full_src_register * reg,
+ const unsigned stype,
const unsigned swizzle)
{
struct lp_build_tgsi_aos_context * bld = lp_aos_context(bld_base);
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
index 45b0980..17c5d83 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
@@ -519,10 +519,31 @@ get_indirect_index(struct lp_build_tgsi_soa_context *bld,
return index;
}
+static struct lp_build_context *
+stype_to_fetch(struct lp_build_tgsi_context * bld_base, const unsigned stype)
+{
+ struct lp_build_context *bld_fetch;
+
+ switch (stype) {
+ case UTIL_FORMAT_TYPE_FLOAT:
+ case UTIL_FORMAT_TYPE_VOID:
+ bld_fetch = &bld_base->base;
+ break;
+ case UTIL_FORMAT_TYPE_UNSIGNED:
+ bld_fetch = &bld_base->uintbld;
+ break;
+ case UTIL_FORMAT_TYPE_SIGNED:
+ bld_fetch = &bld_base->intbld;
+ break;
+ }
+ return bld_fetch;
+}
+
static LLVMValueRef
emit_fetch_constant(
struct lp_build_tgsi_context * bld_base,
const struct tgsi_full_src_register * reg,
+ const unsigned stype,
const unsigned swizzle)
{
struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
@@ -530,7 +551,8 @@ emit_fetch_constant(
LLVMBuilderRef builder = gallivm->builder;
struct lp_build_context *uint_bld = &bld->uint_bld;
LLVMValueRef indirect_index = NULL;
-
+ struct lp_build_context *fetch_bld = stype_to_fetch(bld_base, stype);
+
/* XXX: Handle fetching xyzw components as a vector */
assert(swizzle != ~0);
@@ -561,9 +583,16 @@ emit_fetch_constant(
scalar_ptr = LLVMBuildGEP(builder, bld->consts_ptr,
&index, 1, "");
- scalar = LLVMBuildLoad(builder, scalar_ptr, "");
- return lp_build_broadcast_scalar(&bld->bld_base.base, scalar);
+ if (stype != UTIL_FORMAT_TYPE_FLOAT && stype != UTIL_FORMAT_TYPE_VOID) {
+ LLVMTypeRef ivtype = LLVMPointerType(LLVMInt32TypeInContext(gallivm->context), 0);
+ LLVMValueRef temp_ptr;
+ temp_ptr = LLVMBuildBitCast(builder, scalar_ptr, ivtype, "");
+ scalar = LLVMBuildLoad(builder, temp_ptr, "");
+ } else
+ scalar = LLVMBuildLoad(builder, scalar_ptr, "");
+
+ return lp_build_broadcast_scalar(fetch_bld, scalar);
}
}
@@ -571,6 +600,7 @@ static LLVMValueRef
emit_fetch_immediate(
struct lp_build_tgsi_context * bld_base,
const struct tgsi_full_src_register * reg,
+ const unsigned stype,
const unsigned swizzle)
{
struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
@@ -583,6 +613,7 @@ static LLVMValueRef
emit_fetch_input(
struct lp_build_tgsi_context * bld_base,
const struct tgsi_full_src_register * reg,
+ const unsigned stype,
const unsigned swizzle)
{
struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
@@ -640,6 +671,7 @@ static LLVMValueRef
emit_fetch_temporary(
struct lp_build_tgsi_context * bld_base,
const struct tgsi_full_src_register * reg,
+ const unsigned stype,
const unsigned swizzle)
{
struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
@@ -681,7 +713,13 @@ emit_fetch_temporary(
}
else {
LLVMValueRef temp_ptr;
- temp_ptr = lp_get_temp_ptr_soa(bld, reg->Register.Index, swizzle);
+ if (stype != UTIL_FORMAT_TYPE_FLOAT && stype != UTIL_FORMAT_TYPE_VOID) {
+ LLVMTypeRef itype = LLVMPointerType(LLVMVectorType(LLVMInt32TypeInContext(gallivm->context), 4), 0);
+ LLVMValueRef tint_ptr = lp_get_temp_ptr_soa(bld, reg->Register.Index,
+ swizzle);
+ temp_ptr = LLVMBuildBitCast(builder, tint_ptr, itype, "");
+ } else
+ temp_ptr = lp_get_temp_ptr_soa(bld, reg->Register.Index, swizzle);
res = LLVMBuildLoad(builder, temp_ptr, "");
if (!res)
return bld->bld_base.base.undef;
@@ -694,6 +732,7 @@ static LLVMValueRef
emit_fetch_system_value(
struct lp_build_tgsi_context * bld_base,
const struct tgsi_full_src_register * reg,
+ const unsigned stype,
const unsigned swizzle)
{
struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
--
1.7.7.6
More information about the mesa-dev
mailing list