gallium: add LDEXP TGSI instruction and corresponding cap
Reviewed-by: Marek Olšák <marek.olsak@amd.com> Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de>
This commit is contained in:
parent
2b0bfc51de
commit
cad959d901
|
@ -134,6 +134,7 @@ gallivm_get_shader_param(enum pipe_shader_cap param)
|
|||
return 1;
|
||||
case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
|
||||
case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
|
||||
|
|
|
@ -1453,6 +1453,17 @@ micro_pow(
|
|||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
micro_ldexp(union tgsi_exec_channel *dst,
|
||||
const union tgsi_exec_channel *src0,
|
||||
const union tgsi_exec_channel *src1)
|
||||
{
|
||||
dst->f[0] = ldexpf(src0->f[0], src1->i[0]);
|
||||
dst->f[1] = ldexpf(src0->f[1], src1->i[1]);
|
||||
dst->f[2] = ldexpf(src0->f[2], src1->i[2]);
|
||||
dst->f[3] = ldexpf(src0->f[3], src1->i[3]);
|
||||
}
|
||||
|
||||
static void
|
||||
micro_sub(union tgsi_exec_channel *dst,
|
||||
const union tgsi_exec_channel *src0,
|
||||
|
@ -5082,6 +5093,10 @@ exec_instruction(
|
|||
exec_scalar_binary(mach, inst, micro_pow, TGSI_EXEC_DATA_FLOAT, TGSI_EXEC_DATA_FLOAT);
|
||||
break;
|
||||
|
||||
case TGSI_OPCODE_LDEXP:
|
||||
exec_scalar_binary(mach, inst, micro_ldexp, TGSI_EXEC_DATA_FLOAT, TGSI_EXEC_DATA_INT);
|
||||
break;
|
||||
|
||||
case TGSI_OPCODE_COS:
|
||||
exec_scalar_unary(mach, inst, micro_cos, TGSI_EXEC_DATA_FLOAT, TGSI_EXEC_DATA_FLOAT);
|
||||
break;
|
||||
|
|
|
@ -534,6 +534,7 @@ tgsi_exec_get_shader_param(enum pipe_shader_cap param)
|
|||
case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
|
||||
return 1;
|
||||
case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
|
||||
return 1;
|
||||
case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
|
||||
|
|
|
@ -244,7 +244,8 @@ tgsi_opcode_infer_type( uint opcode )
|
|||
enum tgsi_opcode_type
|
||||
tgsi_opcode_infer_src_type(uint opcode, uint src_idx)
|
||||
{
|
||||
if (src_idx == 1 && opcode == TGSI_OPCODE_DLDEXP)
|
||||
if (src_idx == 1 &&
|
||||
(opcode == TGSI_OPCODE_DLDEXP || opcode == TGSI_OPCODE_LDEXP))
|
||||
return TGSI_TYPE_SIGNED;
|
||||
|
||||
switch (opcode) {
|
||||
|
|
|
@ -19,7 +19,7 @@ OPCODE(1, 2, OTHR, TEX_LZ, .is_tex = 1)
|
|||
OPCODE(1, 3, COMP, LRP)
|
||||
OPCODE(1, 3, COMP, FMA)
|
||||
OPCODE(1, 1, REPL, SQRT)
|
||||
OPCODE_GAP(21) /* removed */
|
||||
OPCODE(1, 2, COMP, LDEXP)
|
||||
OPCODE(1, 1, COMP, F2U64)
|
||||
OPCODE(1, 1, COMP, F2I64)
|
||||
OPCODE(1, 1, COMP, FRC)
|
||||
|
|
|
@ -485,6 +485,7 @@ MOV OUT[0], CONST[0][3] # copy vector 3 of constbuf 0
|
|||
is supported. If it is, DTRUNC/DCEIL/DFLR/DROUND opcodes may be used.
|
||||
* ``PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED``: Whether DFRACEXP and
|
||||
DLDEXP are supported.
|
||||
* ``PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED``: Whether LDEXP is supported.
|
||||
* ``PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED``: Whether FMA and DFMA (doubles only)
|
||||
are supported.
|
||||
* ``PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE``: Whether the driver doesn't
|
||||
|
|
|
@ -351,6 +351,18 @@ This instruction replicates its result.
|
|||
dst = src0.x^{src1.x}
|
||||
|
||||
|
||||
.. opcode:: LDEXP - Multiply Number by Integral Power of 2
|
||||
|
||||
src1 is an integer.
|
||||
|
||||
.. math::
|
||||
|
||||
dst.x = src0.x * 2^{src1.x}
|
||||
dst.y = src0.y * 2^{src1.y}
|
||||
dst.z = src0.z * 2^{src1.z}
|
||||
dst.w = src0.w * 2^{src1.w}
|
||||
|
||||
|
||||
.. opcode:: COS - Cosine
|
||||
|
||||
This instruction replicates its result.
|
||||
|
|
|
@ -442,6 +442,7 @@ etna_screen_get_shader_param(struct pipe_screen *pscreen,
|
|||
return 4096;
|
||||
case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
|
||||
return false;
|
||||
|
|
|
@ -518,6 +518,7 @@ fd_screen_get_shader_param(struct pipe_screen *pscreen,
|
|||
case PIPE_SHADER_CAP_SUBROUTINES:
|
||||
case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
|
||||
return 0;
|
||||
|
|
|
@ -165,6 +165,7 @@ i915_get_shader_param(struct pipe_screen *screen,
|
|||
return I915_TEX_UNITS;
|
||||
case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
|
||||
return 0;
|
||||
|
|
|
@ -318,6 +318,7 @@ nv30_screen_get_shader_param(struct pipe_screen *pscreen,
|
|||
case PIPE_SHADER_CAP_FP16:
|
||||
case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
|
||||
case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
|
||||
|
@ -367,6 +368,7 @@ nv30_screen_get_shader_param(struct pipe_screen *pscreen,
|
|||
case PIPE_SHADER_CAP_FP16:
|
||||
case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
|
||||
case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
|
||||
|
|
|
@ -363,6 +363,7 @@ nv50_screen_get_shader_param(struct pipe_screen *pscreen,
|
|||
return 32;
|
||||
case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
|
||||
case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
|
||||
|
|
|
@ -403,6 +403,7 @@ nvc0_screen_get_shader_param(struct pipe_screen *pscreen,
|
|||
case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS:
|
||||
return 1;
|
||||
case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
|
||||
case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD:
|
||||
case PIPE_SHADER_CAP_INT64_ATOMICS:
|
||||
|
|
|
@ -358,6 +358,7 @@ static int r300_get_shader_param(struct pipe_screen *pscreen,
|
|||
case PIPE_SHADER_CAP_FP16:
|
||||
case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
|
||||
case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
|
||||
|
@ -421,6 +422,7 @@ static int r300_get_shader_param(struct pipe_screen *pscreen,
|
|||
case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
|
||||
case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
|
||||
case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
|
||||
|
|
|
@ -596,6 +596,7 @@ static int r600_get_shader_param(struct pipe_screen* pscreen,
|
|||
return 0;
|
||||
case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
|
||||
case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
|
||||
case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD:
|
||||
|
|
|
@ -768,6 +768,7 @@ static int si_get_shader_param(struct pipe_screen* pscreen,
|
|||
case PIPE_SHADER_CAP_SUBROUTINES:
|
||||
case PIPE_SHADER_CAP_SUPPORTED_IRS:
|
||||
case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
|
|
|
@ -533,6 +533,7 @@ vgpu9_get_shader_param(struct pipe_screen *screen,
|
|||
return 0;
|
||||
case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
|
||||
case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
|
||||
|
@ -597,6 +598,7 @@ vgpu9_get_shader_param(struct pipe_screen *screen,
|
|||
return 0;
|
||||
case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
|
||||
case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
|
||||
|
@ -694,6 +696,7 @@ vgpu10_get_shader_param(struct pipe_screen *screen,
|
|||
return 0;
|
||||
case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
|
||||
case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
|
||||
|
|
|
@ -411,6 +411,7 @@ vc4_screen_get_shader_param(struct pipe_screen *pscreen,
|
|||
case PIPE_SHADER_CAP_FP16:
|
||||
case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
|
||||
case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
|
||||
return 0;
|
||||
|
|
|
@ -848,6 +848,7 @@ enum pipe_shader_cap
|
|||
PIPE_SHADER_CAP_MAX_SHADER_IMAGES,
|
||||
PIPE_SHADER_CAP_LOWER_IF_THRESHOLD,
|
||||
PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS,
|
||||
PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED,
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -359,7 +359,7 @@ struct tgsi_property_data {
|
|||
#define TGSI_OPCODE_LRP 18
|
||||
#define TGSI_OPCODE_FMA 19
|
||||
#define TGSI_OPCODE_SQRT 20
|
||||
/* gap */
|
||||
#define TGSI_OPCODE_LDEXP 21
|
||||
#define TGSI_OPCODE_F2U64 22
|
||||
#define TGSI_OPCODE_F2I64 23
|
||||
#define TGSI_OPCODE_FRC 24
|
||||
|
|
Loading…
Reference in New Issue