On Fri, Dec 19, 2014 at 8:11 AM, David Heidelberg <da...@ixit.cz> wrote: > Same as ARL, just has extra rounding. > Useful for st/nine. > > Tested-by: Pavel Ondračka <pavel.ondra...@email.cz> > Reviewed-by: Marek Olšák <marek.ol...@amd.com> > Signed-off-by: David Heidelberg <da...@ixit.cz>
Reviewed-by: Alex Deucher <alexander.deuc...@amd.com> > --- > src/gallium/drivers/r300/compiler/r3xx_vertprog.c | 7 ++++--- > src/gallium/drivers/r300/compiler/radeon_opcodes.c | 7 +++++++ > src/gallium/drivers/r300/compiler/radeon_opcodes.h | 4 ++++ > src/gallium/drivers/r300/r300_tgsi_to_rc.c | 2 +- > 4 files changed, 16 insertions(+), 4 deletions(-) > > diff --git a/src/gallium/drivers/r300/compiler/r3xx_vertprog.c > b/src/gallium/drivers/r300/compiler/r3xx_vertprog.c > index fd4f6f4..2ff6db5 100644 > --- a/src/gallium/drivers/r300/compiler/r3xx_vertprog.c > +++ b/src/gallium/drivers/r300/compiler/r3xx_vertprog.c > @@ -405,6 +405,7 @@ static void translate_vertex_program(struct > radeon_compiler *c, void *user) > switch (vpi->Opcode) { > case RC_OPCODE_ADD: ei_vector2(compiler->code, VE_ADD, vpi, > inst); break; > case RC_OPCODE_ARL: ei_vector1(compiler->code, VE_FLT2FIX_DX, > vpi, inst); break; > + case RC_OPCODE_ARR: ei_vector1(compiler->code, > VE_FLT2FIX_DX_RND, vpi, inst); break; > case RC_OPCODE_COS: ei_math1(compiler->code, ME_COS, vpi, > inst); break; > case RC_OPCODE_DP4: ei_vector2(compiler->code, > VE_DOT_PRODUCT, vpi, inst); break; > case RC_OPCODE_DST: ei_vector2(compiler->code, > VE_DISTANCE_VECTOR, vpi, inst); break; > @@ -798,7 +799,7 @@ static void transform_negative_addressing(struct > r300_vertex_program_compiler *c > struct rc_instruction *inst, *add; > unsigned const_swizzle; > > - /* Transform ARL */ > + /* Transform ARL/ARR */ > add = rc_insert_new_instruction(&c->Base, arl->Prev); > add->U.I.Opcode = RC_OPCODE_ADD; > add->U.I.DstReg.File = RC_FILE_TEMPORARY; > @@ -833,7 +834,7 @@ static void rc_emulate_negative_addressing(struct > radeon_compiler *compiler, voi > for (inst = c->Base.Program.Instructions.Next; inst != > &c->Base.Program.Instructions; inst = inst->Next) { > const struct rc_opcode_info * opcode = > rc_get_opcode_info(inst->U.I.Opcode); > > - if (inst->U.I.Opcode == RC_OPCODE_ARL) { > + if (inst->U.I.Opcode == RC_OPCODE_ARL || inst->U.I.Opcode == > RC_OPCODE_ARR) { > if (lastARL != NULL && min_offset < 0) > transform_negative_addressing(c, lastARL, > inst, min_offset); > > @@ -847,7 +848,7 @@ static void rc_emulate_negative_addressing(struct > radeon_compiler *compiler, voi > inst->U.I.SrcReg[i].Index < 0) { > /* ARL must precede any indirect addressing. > */ > if (lastARL == NULL) { > - rc_error(&c->Base, "Vertex shader: > Found relative addressing without ARL."); > + rc_error(&c->Base, "Vertex shader: > Found relative addressing without ARL/ARR."); > return; > } > > diff --git a/src/gallium/drivers/r300/compiler/radeon_opcodes.c > b/src/gallium/drivers/r300/compiler/radeon_opcodes.c > index 916baa2..a251bbe 100644 > --- a/src/gallium/drivers/r300/compiler/radeon_opcodes.c > +++ b/src/gallium/drivers/r300/compiler/radeon_opcodes.c > @@ -60,6 +60,12 @@ struct rc_opcode_info rc_opcodes[MAX_RC_OPCODE] = { > .HasDstReg = 1 > }, > { > + .Opcode = RC_OPCODE_ARR, > + .Name = "ARR", > + .NumSrcRegs = 1, > + .HasDstReg = 1 > + }, > + { > .Opcode = RC_OPCODE_CEIL, > .Name = "CEIL", > .NumSrcRegs = 1, > @@ -546,6 +552,7 @@ void rc_compute_sources_for_writemask( > } else { > switch(opcode->Opcode) { > case RC_OPCODE_ARL: > + case RC_OPCODE_ARR: > srcmasks[0] |= RC_MASK_X; > break; > case RC_OPCODE_DP2: > diff --git a/src/gallium/drivers/r300/compiler/radeon_opcodes.h > b/src/gallium/drivers/r300/compiler/radeon_opcodes.h > index 0a70901..1c42505 100644 > --- a/src/gallium/drivers/r300/compiler/radeon_opcodes.h > +++ b/src/gallium/drivers/r300/compiler/radeon_opcodes.h > @@ -47,6 +47,10 @@ typedef enum { > * dst.x = floor(src.x), where dst must be an address register */ > RC_OPCODE_ARL, > > + /** special instruction: load address register with round > + * dst.x = round(src.x), where dst must be an address register */ > + RC_OPCODE_ARR, > + > /** vec4 instruction: dst.c = ceil(src0.c) */ > RC_OPCODE_CEIL, > > diff --git a/src/gallium/drivers/r300/r300_tgsi_to_rc.c > b/src/gallium/drivers/r300/r300_tgsi_to_rc.c > index b82cb3e..4d94941 100644 > --- a/src/gallium/drivers/r300/r300_tgsi_to_rc.c > +++ b/src/gallium/drivers/r300/r300_tgsi_to_rc.c > @@ -82,7 +82,7 @@ static unsigned translate_opcode(unsigned opcode) > /* case TGSI_OPCODE_UP2US: return RC_OPCODE_UP2US; */ > /* case TGSI_OPCODE_UP4B: return RC_OPCODE_UP4B; */ > /* case TGSI_OPCODE_UP4UB: return RC_OPCODE_UP4UB; */ > - /* case TGSI_OPCODE_ARR: return RC_OPCODE_ARR; */ > + case TGSI_OPCODE_ARR: return RC_OPCODE_ARR; > /* case TGSI_OPCODE_CAL: return RC_OPCODE_CAL; */ > /* case TGSI_OPCODE_RET: return RC_OPCODE_RET; */ > case TGSI_OPCODE_SSG: return RC_OPCODE_SSG; > -- > 2.1.3 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev