mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 05:18:08 +02:00
tgsi/ureg: add support for output array declarations
This commit is contained in:
parent
1fa6c99e24
commit
a015b3952f
4 changed files with 78 additions and 31 deletions
|
|
@ -123,8 +123,11 @@ struct ureg_program
|
|||
unsigned semantic_name;
|
||||
unsigned semantic_index;
|
||||
unsigned usage_mask; /* = TGSI_WRITEMASK_* */
|
||||
unsigned first;
|
||||
unsigned last;
|
||||
unsigned array_id;
|
||||
} output[UREG_MAX_OUTPUT];
|
||||
unsigned nr_outputs;
|
||||
unsigned nr_outputs, nr_output_regs;
|
||||
|
||||
struct {
|
||||
union {
|
||||
|
|
@ -332,10 +335,12 @@ ureg_DECL_system_value(struct ureg_program *ureg,
|
|||
|
||||
|
||||
struct ureg_dst
|
||||
ureg_DECL_output_masked( struct ureg_program *ureg,
|
||||
unsigned name,
|
||||
unsigned index,
|
||||
unsigned usage_mask )
|
||||
ureg_DECL_output_masked(struct ureg_program *ureg,
|
||||
unsigned name,
|
||||
unsigned index,
|
||||
unsigned usage_mask,
|
||||
unsigned array_id,
|
||||
unsigned array_size)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
|
|
@ -343,7 +348,8 @@ ureg_DECL_output_masked( struct ureg_program *ureg,
|
|||
|
||||
for (i = 0; i < ureg->nr_outputs; i++) {
|
||||
if (ureg->output[i].semantic_name == name &&
|
||||
ureg->output[i].semantic_index == index) {
|
||||
ureg->output[i].semantic_index == index) {
|
||||
assert(ureg->output[i].array_id == array_id);
|
||||
ureg->output[i].usage_mask |= usage_mask;
|
||||
goto out;
|
||||
}
|
||||
|
|
@ -353,6 +359,10 @@ ureg_DECL_output_masked( struct ureg_program *ureg,
|
|||
ureg->output[i].semantic_name = name;
|
||||
ureg->output[i].semantic_index = index;
|
||||
ureg->output[i].usage_mask = usage_mask;
|
||||
ureg->output[i].first = ureg->nr_output_regs;
|
||||
ureg->output[i].last = ureg->nr_output_regs + array_size - 1;
|
||||
ureg->output[i].array_id = array_id;
|
||||
ureg->nr_output_regs += array_size;
|
||||
ureg->nr_outputs++;
|
||||
}
|
||||
else {
|
||||
|
|
@ -360,16 +370,30 @@ ureg_DECL_output_masked( struct ureg_program *ureg,
|
|||
}
|
||||
|
||||
out:
|
||||
return ureg_dst_register( TGSI_FILE_OUTPUT, i );
|
||||
return ureg_dst_array_register(TGSI_FILE_OUTPUT, ureg->output[i].first,
|
||||
array_id);
|
||||
}
|
||||
|
||||
|
||||
struct ureg_dst
|
||||
ureg_DECL_output( struct ureg_program *ureg,
|
||||
unsigned name,
|
||||
unsigned index )
|
||||
ureg_DECL_output(struct ureg_program *ureg,
|
||||
unsigned name,
|
||||
unsigned index)
|
||||
{
|
||||
return ureg_DECL_output_masked(ureg, name, index, TGSI_WRITEMASK_XYZW);
|
||||
return ureg_DECL_output_masked(ureg, name, index, TGSI_WRITEMASK_XYZW,
|
||||
0, 1);
|
||||
}
|
||||
|
||||
struct ureg_dst
|
||||
ureg_DECL_output_array(struct ureg_program *ureg,
|
||||
unsigned semantic_name,
|
||||
unsigned semantic_index,
|
||||
unsigned array_id,
|
||||
unsigned array_size)
|
||||
{
|
||||
return ureg_DECL_output_masked(ureg, semantic_name, semantic_index,
|
||||
TGSI_WRITEMASK_XYZW,
|
||||
array_id, array_size);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1516,10 +1540,12 @@ static void emit_decls( struct ureg_program *ureg )
|
|||
for (i = 0; i < ureg->nr_outputs; i++) {
|
||||
emit_decl_semantic(ureg,
|
||||
TGSI_FILE_OUTPUT,
|
||||
i, i,
|
||||
ureg->output[i].first,
|
||||
ureg->output[i].last,
|
||||
ureg->output[i].semantic_name,
|
||||
ureg->output[i].semantic_index,
|
||||
ureg->output[i].usage_mask, 0);
|
||||
ureg->output[i].usage_mask,
|
||||
ureg->output[i].array_id);
|
||||
}
|
||||
|
||||
for (i = 0; i < ureg->nr_samplers; i++) {
|
||||
|
|
|
|||
|
|
@ -222,15 +222,24 @@ ureg_DECL_system_value(struct ureg_program *,
|
|||
unsigned semantic_index);
|
||||
|
||||
struct ureg_dst
|
||||
ureg_DECL_output_masked( struct ureg_program *,
|
||||
unsigned semantic_name,
|
||||
unsigned semantic_index,
|
||||
unsigned usage_mask );
|
||||
ureg_DECL_output_masked(struct ureg_program *,
|
||||
unsigned semantic_name,
|
||||
unsigned semantic_index,
|
||||
unsigned usage_mask,
|
||||
unsigned array_id,
|
||||
unsigned array_size);
|
||||
|
||||
struct ureg_dst
|
||||
ureg_DECL_output( struct ureg_program *,
|
||||
unsigned semantic_name,
|
||||
unsigned semantic_index );
|
||||
ureg_DECL_output(struct ureg_program *,
|
||||
unsigned semantic_name,
|
||||
unsigned semantic_index);
|
||||
|
||||
struct ureg_dst
|
||||
ureg_DECL_output_array(struct ureg_program *ureg,
|
||||
unsigned semantic_name,
|
||||
unsigned semantic_index,
|
||||
unsigned array_id,
|
||||
unsigned array_size);
|
||||
|
||||
struct ureg_src
|
||||
ureg_DECL_immediate( struct ureg_program *,
|
||||
|
|
@ -1175,14 +1184,14 @@ ureg_src_array_offset(struct ureg_src reg, int offset)
|
|||
static INLINE struct ureg_dst
|
||||
ureg_dst_array_offset( struct ureg_dst reg, int offset )
|
||||
{
|
||||
assert(reg.File == TGSI_FILE_TEMPORARY);
|
||||
reg.Index += offset;
|
||||
return reg;
|
||||
}
|
||||
|
||||
static INLINE struct ureg_dst
|
||||
ureg_dst_register( unsigned file,
|
||||
unsigned index )
|
||||
ureg_dst_array_register(unsigned file,
|
||||
unsigned index,
|
||||
unsigned array_id)
|
||||
{
|
||||
struct ureg_dst dst;
|
||||
|
||||
|
|
@ -1206,11 +1215,18 @@ ureg_dst_register( unsigned file,
|
|||
dst.DimIndFile = TGSI_FILE_NULL;
|
||||
dst.DimIndIndex = 0;
|
||||
dst.DimIndSwizzle = 0;
|
||||
dst.ArrayID = 0;
|
||||
dst.ArrayID = array_id;
|
||||
|
||||
return dst;
|
||||
}
|
||||
|
||||
static INLINE struct ureg_dst
|
||||
ureg_dst_register(unsigned file,
|
||||
unsigned index)
|
||||
{
|
||||
return ureg_dst_array_register(file, index, 0);
|
||||
}
|
||||
|
||||
static INLINE struct ureg_dst
|
||||
ureg_dst( struct ureg_src src )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -422,13 +422,15 @@ nine_ff_build_vs(struct NineDevice9 *device, struct vs_build_ctx *vs)
|
|||
oCol[1] = ureg_saturate(ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 1));
|
||||
|
||||
if (key->vertexpointsize || key->pointscale) {
|
||||
oPsz = ureg_DECL_output_masked(ureg, TGSI_SEMANTIC_PSIZE, 0, TGSI_WRITEMASK_X);
|
||||
oPsz = ureg_DECL_output_masked(ureg, TGSI_SEMANTIC_PSIZE, 0,
|
||||
TGSI_WRITEMASK_X, 0, 1);
|
||||
oPsz = ureg_writemask(oPsz, TGSI_WRITEMASK_X);
|
||||
}
|
||||
if (key->fog_mode) {
|
||||
/* We apply fog to the vertex colors, oFog is for programmable shaders only ?
|
||||
*/
|
||||
oFog = ureg_DECL_output_masked(ureg, TGSI_SEMANTIC_FOG, 0, TGSI_WRITEMASK_X);
|
||||
oFog = ureg_DECL_output_masked(ureg, TGSI_SEMANTIC_FOG, 0,
|
||||
TGSI_WRITEMASK_X, 0, 1);
|
||||
oFog = ureg_writemask(oFog, TGSI_WRITEMASK_X);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1098,7 +1098,7 @@ _tx_dst_param(struct shader_translator *tx, const struct sm1_dst_param *param)
|
|||
if (ureg_dst_is_undef(tx->regs.oDepth))
|
||||
tx->regs.oDepth =
|
||||
ureg_DECL_output_masked(tx->ureg, TGSI_SEMANTIC_POSITION, 0,
|
||||
TGSI_WRITEMASK_Z);
|
||||
TGSI_WRITEMASK_Z, 0, 1);
|
||||
dst = tx->regs.oDepth; /* XXX: must write .z component */
|
||||
break;
|
||||
case D3DSPR_PREDICATE:
|
||||
|
|
@ -1966,7 +1966,7 @@ DECL_SPECIAL(DCL)
|
|||
tx->info->position_t = TRUE;
|
||||
assert(sem.reg.idx < Elements(tx->regs.o));
|
||||
tx->regs.o[sem.reg.idx] = ureg_DECL_output_masked(
|
||||
ureg, tgsi.Name, tgsi.Index, sem.reg.mask);
|
||||
ureg, tgsi.Name, tgsi.Index, sem.reg.mask, 0, 1);
|
||||
|
||||
if (tgsi.Name == TGSI_SEMANTIC_PSIZE)
|
||||
tx->regs.oPts = tx->regs.o[sem.reg.idx];
|
||||
|
|
@ -1984,7 +1984,8 @@ DECL_SPECIAL(DCL)
|
|||
if (!is_input && 0) { /* declare in COLOROUT/DEPTHOUT case */
|
||||
/* FragColor or FragDepth */
|
||||
assert(sem.reg.mask != 0);
|
||||
ureg_DECL_output_masked(ureg, tgsi.Name, tgsi.Index, sem.reg.mask);
|
||||
ureg_DECL_output_masked(ureg, tgsi.Name, tgsi.Index, sem.reg.mask,
|
||||
0, 1);
|
||||
}
|
||||
}
|
||||
return D3D_OK;
|
||||
|
|
@ -2312,7 +2313,8 @@ DECL_SPECIAL(TEXM3x2DEPTH)
|
|||
ureg_CMP(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_X), ureg_negate(ureg_abs(ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_Y))),
|
||||
ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_X), ureg_imm1f(ureg, 1.0f));
|
||||
/* replace the depth for depth testing with the result */
|
||||
tx->regs.oDepth = ureg_DECL_output_masked(ureg, TGSI_SEMANTIC_POSITION, 0, TGSI_WRITEMASK_Z);
|
||||
tx->regs.oDepth = ureg_DECL_output_masked(ureg, TGSI_SEMANTIC_POSITION, 0,
|
||||
TGSI_WRITEMASK_Z, 0, 1);
|
||||
ureg_MOV(ureg, tx->regs.oDepth, ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_X));
|
||||
/* note that we write nothing to the destination, since it's disallowed to use it afterward */
|
||||
return D3D_OK;
|
||||
|
|
@ -2410,7 +2412,8 @@ DECL_SPECIAL(TEXDEPTH)
|
|||
ureg_CMP(ureg, ureg_writemask(r5, TGSI_WRITEMASK_X), ureg_negate(ureg_abs(r5g)),
|
||||
r5r, ureg_imm1f(ureg, 1.0f));
|
||||
/* replace the depth for depth testing with the result */
|
||||
tx->regs.oDepth = ureg_DECL_output_masked(ureg, TGSI_SEMANTIC_POSITION, 0, TGSI_WRITEMASK_Z);
|
||||
tx->regs.oDepth = ureg_DECL_output_masked(ureg, TGSI_SEMANTIC_POSITION, 0,
|
||||
TGSI_WRITEMASK_Z, 0, 1);
|
||||
ureg_MOV(ureg, tx->regs.oDepth, r5r);
|
||||
|
||||
return D3D_OK;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue