From: Eric Anholt Date: Tue, 20 Oct 2015 09:49:10 +0000 (+0100) Subject: vc4: Add limited support for ibfe/ubfe. X-Git-Tag: upstream/17.1.0~15214 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=85b946478c326df853926ed18bfbd898c0a514ef;p=platform%2Fupstream%2Fmesa.git vc4: Add limited support for ibfe/ubfe. This is just enough to cover our unpack modes, which will be used by some new NIR-based lowering in the next commit. --- diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c index 1b590a2..d3e856a 100644 --- a/src/gallium/drivers/vc4/vc4_program.c +++ b/src/gallium/drivers/vc4/vc4_program.c @@ -876,6 +876,40 @@ ntq_emit_pack_unorm_4x8(struct vc4_compile *c, nir_alu_instr *instr) *dest = result; } +/** Handles sign-extended bitfield extracts for 16 bits. */ +static struct qreg +ntq_emit_ibfe(struct vc4_compile *c, struct qreg base, struct qreg offset, + struct qreg bits) +{ + assert(bits.file == QFILE_UNIF && + c->uniform_contents[bits.index] == QUNIFORM_CONSTANT && + c->uniform_data[bits.index] == 16); + + assert(offset.file == QFILE_UNIF && + c->uniform_contents[offset.index] == QUNIFORM_CONSTANT); + int offset_bit = c->uniform_data[offset.index]; + assert(offset_bit % 16 == 0); + + return qir_UNPACK_16_I(c, base, offset_bit / 16); +} + +/** Handles unsigned bitfield extracts for 8 bits. */ +static struct qreg +ntq_emit_ubfe(struct vc4_compile *c, struct qreg base, struct qreg offset, + struct qreg bits) +{ + assert(bits.file == QFILE_UNIF && + c->uniform_contents[bits.index] == QUNIFORM_CONSTANT && + c->uniform_data[bits.index] == 8); + + assert(offset.file == QFILE_UNIF && + c->uniform_contents[offset.index] == QUNIFORM_CONSTANT); + int offset_bit = c->uniform_data[offset.index]; + assert(offset_bit % 8 == 0); + + return qir_UNPACK_8_I(c, base, offset_bit / 8); +} + static void ntq_emit_alu(struct vc4_compile *c, nir_alu_instr *instr) { @@ -1106,6 +1140,14 @@ ntq_emit_alu(struct vc4_compile *c, nir_alu_instr *instr) qir_SUB(c, qir_uniform_ui(c, 0), src[0])); break; + case nir_op_ibitfield_extract: + *dest = ntq_emit_ibfe(c, src[0], src[1], src[2]); + break; + + case nir_op_ubitfield_extract: + *dest = ntq_emit_ubfe(c, src[0], src[1], src[2]); + break; + default: fprintf(stderr, "unknown NIR ALU inst: "); nir_print_instr(&instr->instr, stderr);