gallium/tgsi: add support for 64-bit integer immediates.
This adds support to TGSI for 64-bit integer immediates. Reviewed-by: Marek Olšák <marek.olsak@amd.com> Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com> Reviewed-by: Roland Scheidegger <sroland@vmware.com> Reviewed-by: Edward O'Callaghan <funfunctor@folklore1984.net> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
6e1a34d545
commit
3985e6c044
|
@ -254,6 +254,20 @@ dump_imm_data(struct tgsi_iterate_context *iter,
|
|||
i++;
|
||||
break;
|
||||
}
|
||||
case TGSI_IMM_INT64: {
|
||||
union di d;
|
||||
d.i = data[i].Uint | (uint64_t)data[i+1].Uint << 32;
|
||||
UID( d.i );
|
||||
i++;
|
||||
break;
|
||||
}
|
||||
case TGSI_IMM_UINT64: {
|
||||
union di d;
|
||||
d.ui = data[i].Uint | (uint64_t)data[i+1].Uint << 32;
|
||||
UID( d.ui );
|
||||
i++;
|
||||
break;
|
||||
}
|
||||
case TGSI_IMM_FLOAT32:
|
||||
if (ctx->dump_float_as_hex)
|
||||
HFLT( data[i].Float );
|
||||
|
|
|
@ -77,6 +77,8 @@
|
|||
union tgsi_double_channel {
|
||||
double d[TGSI_QUAD_SIZE];
|
||||
unsigned u[TGSI_QUAD_SIZE][2];
|
||||
uint64_t u64[TGSI_QUAD_SIZE];
|
||||
int64_t i64[TGSI_QUAD_SIZE];
|
||||
};
|
||||
|
||||
struct tgsi_double_vector {
|
||||
|
|
|
@ -155,12 +155,14 @@ tgsi_parse_token(
|
|||
break;
|
||||
|
||||
case TGSI_IMM_UINT32:
|
||||
case TGSI_IMM_UINT64:
|
||||
for (i = 0; i < imm_count; i++) {
|
||||
next_token(ctx, &imm->u[i].Uint);
|
||||
}
|
||||
break;
|
||||
|
||||
case TGSI_IMM_INT32:
|
||||
case TGSI_IMM_INT64:
|
||||
for (i = 0; i < imm_count; i++) {
|
||||
next_token(ctx, &imm->u[i].Int);
|
||||
}
|
||||
|
|
|
@ -295,6 +295,42 @@ static boolean parse_double( const char **pcur, uint32_t *val0, uint32_t *val1)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean parse_int64( const char **pcur, uint32_t *val0, uint32_t *val1)
|
||||
{
|
||||
const char *cur = *pcur;
|
||||
union {
|
||||
int64_t i64val;
|
||||
uint32_t uval[2];
|
||||
} v;
|
||||
|
||||
v.i64val = strtoll(cur, (char**)pcur, 0);
|
||||
if (*pcur == cur)
|
||||
return FALSE;
|
||||
|
||||
*val0 = v.uval[0];
|
||||
*val1 = v.uval[1];
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean parse_uint64( const char **pcur, uint32_t *val0, uint32_t *val1)
|
||||
{
|
||||
const char *cur = *pcur;
|
||||
union {
|
||||
uint64_t u64val;
|
||||
uint32_t uval[2];
|
||||
} v;
|
||||
|
||||
v.u64val = strtoull(cur, (char**)pcur, 0);
|
||||
if (*pcur == cur)
|
||||
return FALSE;
|
||||
|
||||
*val0 = v.uval[0];
|
||||
*val1 = v.uval[1];
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
struct translate_ctx
|
||||
{
|
||||
const char *text;
|
||||
|
@ -1228,6 +1264,14 @@ static boolean parse_immediate_data(struct translate_ctx *ctx, unsigned type,
|
|||
ret = parse_double(&ctx->cur, &values[i].Uint, &values[i+1].Uint);
|
||||
i++;
|
||||
break;
|
||||
case TGSI_IMM_INT64:
|
||||
ret = parse_int64(&ctx->cur, &values[i].Uint, &values[i+1].Uint);
|
||||
i++;
|
||||
break;
|
||||
case TGSI_IMM_UINT64:
|
||||
ret = parse_uint64(&ctx->cur, &values[i].Uint, &values[i+1].Uint);
|
||||
i++;
|
||||
break;
|
||||
case TGSI_IMM_FLOAT32:
|
||||
ret = parse_float(&ctx->cur, &values[i].Float);
|
||||
break;
|
||||
|
|
|
@ -792,7 +792,9 @@ match_or_expand_immediate( const unsigned *v,
|
|||
unsigned nr2 = *pnr2;
|
||||
unsigned i, j;
|
||||
|
||||
if (type == TGSI_IMM_FLOAT64)
|
||||
if (type == TGSI_IMM_FLOAT64 ||
|
||||
type == TGSI_IMM_UINT64 ||
|
||||
type == TGSI_IMM_INT64)
|
||||
return match_or_expand_immediate64(v, type, nr, v2, pnr2, swizzle);
|
||||
|
||||
*swizzle = 0;
|
||||
|
@ -871,7 +873,9 @@ out:
|
|||
/* Make sure that all referenced elements are from this immediate.
|
||||
* Has the effect of making size-one immediates into scalars.
|
||||
*/
|
||||
if (type == TGSI_IMM_FLOAT64) {
|
||||
if (type == TGSI_IMM_FLOAT64 ||
|
||||
type == TGSI_IMM_UINT64 ||
|
||||
type == TGSI_IMM_INT64) {
|
||||
for (j = nr; j < 4; j+=2) {
|
||||
swizzle |= (swizzle & 0xf) << (j * 2);
|
||||
}
|
||||
|
@ -971,6 +975,43 @@ ureg_DECL_immediate_int( struct ureg_program *ureg,
|
|||
return decl_immediate(ureg, (const unsigned *)v, nr, TGSI_IMM_INT32);
|
||||
}
|
||||
|
||||
struct ureg_src
|
||||
ureg_DECL_immediate_uint64( struct ureg_program *ureg,
|
||||
const uint64_t *v,
|
||||
unsigned nr )
|
||||
{
|
||||
union {
|
||||
unsigned u[4];
|
||||
uint64_t u64[2];
|
||||
} fu;
|
||||
unsigned int i;
|
||||
|
||||
assert((nr / 2) < 3);
|
||||
for (i = 0; i < nr / 2; i++) {
|
||||
fu.u64[i] = v[i];
|
||||
}
|
||||
|
||||
return decl_immediate(ureg, fu.u, nr, TGSI_IMM_UINT64);
|
||||
}
|
||||
|
||||
struct ureg_src
|
||||
ureg_DECL_immediate_int64( struct ureg_program *ureg,
|
||||
const int64_t *v,
|
||||
unsigned nr )
|
||||
{
|
||||
union {
|
||||
unsigned u[4];
|
||||
int64_t i64[2];
|
||||
} fu;
|
||||
unsigned int i;
|
||||
|
||||
assert((nr / 2) < 3);
|
||||
for (i = 0; i < nr / 2; i++) {
|
||||
fu.i64[i] = v[i];
|
||||
}
|
||||
|
||||
return decl_immediate(ureg, fu.u, nr, TGSI_IMM_INT64);
|
||||
}
|
||||
|
||||
void
|
||||
ureg_emit_src( struct ureg_program *ureg,
|
||||
|
|
|
@ -271,6 +271,16 @@ ureg_DECL_immediate_int( struct ureg_program *,
|
|||
const int *v,
|
||||
unsigned nr );
|
||||
|
||||
struct ureg_src
|
||||
ureg_DECL_immediate_uint64( struct ureg_program *,
|
||||
const uint64_t *v,
|
||||
unsigned nr );
|
||||
|
||||
struct ureg_src
|
||||
ureg_DECL_immediate_int64( struct ureg_program *,
|
||||
const int64_t *v,
|
||||
unsigned nr );
|
||||
|
||||
void
|
||||
ureg_DECL_constant2D(struct ureg_program *ureg,
|
||||
unsigned first,
|
||||
|
|
|
@ -245,6 +245,8 @@ enum tgsi_imm_type {
|
|||
TGSI_IMM_UINT32,
|
||||
TGSI_IMM_INT32,
|
||||
TGSI_IMM_FLOAT64,
|
||||
TGSI_IMM_UINT64,
|
||||
TGSI_IMM_INT64,
|
||||
};
|
||||
|
||||
struct tgsi_immediate
|
||||
|
|
Loading…
Reference in New Issue