[Beignet] [PATCH] GBE: fixed a prediction bug in typed write instruction.

Zhigang Gong zhigang.gong at linux.intel.com
Tue May 14 23:48:01 PDT 2013


Hi Lv Meng,

I finally identified the bug in write_image function, and this patch is to
fix it. It is based on my prveious sampler/image v2 patch. Please apply
those patchses at first, then apply this one and try it with you program.
Please tell me the result. Thanks.


> -----Original Message-----
> From:
> beignet-bounces+zhigang.gong=linux.intel.com at lists.freedesktop.org
> [mailto:beignet-bounces+zhigang.gong=linux.intel.com at lists.freedesktop.
> org] On Behalf Of Zhigang Gong
> Sent: Wednesday, May 15, 2013 12:48 PM
> To: beignet at lists.freedesktop.org
> Cc: Zhigang Gong
> Subject: [Beignet] [PATCH] GBE: fixed a prediction bug in typed write
> instruction.
> 
> We need to put the header initialization and the LOD initialization to no
> mask and no predication state. For all the other parts, we need to enable
> mask and use the current predication state and need to set the quater
> control properly. Otherwise, when write_image is called in a
> condition-branch block, it will trigger this bug and doesn't write data
out
> correctly.
> 
> Signed-off-by: Zhigang Gong <zhigang.gong at linux.intel.com>
> ---
>  backend/src/backend/gen_context.cpp | 16 ++++++++++------
> backend/src/backend/gen_encoder.cpp |  2 --
>  2 files changed, 10 insertions(+), 8 deletions(-)
> 
> diff --git a/backend/src/backend/gen_context.cpp
> b/backend/src/backend/gen_context.cpp
> index cacc3e3..9158a33 100644
> --- a/backend/src/backend/gen_context.cpp
> +++ b/backend/src/backend/gen_context.cpp
> @@ -303,7 +303,6 @@ namespace gbe
>      if (insn.src(8).reg() != 0)
>        p->MOV(GenRegister::f8grf(nr + (simdWidth/4), 0), wcoord);
>      p->SAMPLE(dst, msgPayload, false, bti, sampler, simdWidth, -1, 0);
> -
>      p->pop();
>    }
> 
> @@ -329,13 +328,17 @@ namespace gbe
>      // prepare mesg desc and move to a0.0.
>      // desc = bti | (msg_type << 14) | (header_present << 19))
>      // prepare header, we need to enable all the 8 planes.
> -    p->MOV(GenRegister::ud8grf(nr, 7), GenRegister::immud(0xff));
> -    // Typed write only support SIMD8.
> +    p->MOV(GenRegister::ud8grf(nr, 7), GenRegister::immud(0xffff));
>      p->curr.execWidth = 8;
> +    // Typed write only support SIMD8.
>      // Prepare message payload U + V + R(ignored) + LOD(0) + RGBA.
> -    // XXX currently only support U32 surface type with RGBA.
> +    // Currently, we don't support non-zero lod, so we clear all lod to
> +    // zero for both quarters thus save one instruction here.
> +    // Thus we must put this instruction in noMask and no predication
> state.
>      p->MOV(GenRegister::ud8grf(nr + 4, 0), GenRegister::immud(0));
> //LOD
> -
> +    p->pop();
> +    p->push();
> +    p->curr.execWidth = 8;
>      // TYPED WRITE send instruction only support SIMD8, if we are
> SIMD16, we
>      // need to call it twice.
>      uint32_t quarterNum = (simdWidth == 8) ? 1 : 2; @@ -346,6 +349,8
> @@ namespace gbe
> 
> GenRegister::retype(GenRegister::QnPhysical(src, quarter), src.type))
> #define QUARTER_MOV1(dst_nr, src)
> p->MOV(GenRegister::retype(GenRegister::ud8grf(dst_nr, 0), src.type), \
> 
> GenRegister::retype(GenRegister::QnPhysical(src,quarter), src.type))
> +      if (quarter == 1)
> +        p->curr.quarterControl = GEN_COMPRESSION_Q2;
>        QUARTER_MOV0(nr + 1, ucoord);
>        QUARTER_MOV0(nr + 2, vcoord);
>        if (insn.src(3 + insn.extra.elem).reg() != 0) @@ -357,7 +362,6 @@
> namespace gbe  #undef QUARTER_MOV
>        p->TYPED_WRITE(header, true, bti);
>      }
> -
>      p->pop();
>    }
> 
> diff --git a/backend/src/backend/gen_encoder.cpp
> b/backend/src/backend/gen_encoder.cpp
> index 4688e2c..d6c34fb 100644
> --- a/backend/src/backend/gen_encoder.cpp
> +++ b/backend/src/backend/gen_encoder.cpp
> @@ -851,7 +851,6 @@ namespace gbe
>       uint32_t simd_mode = (simdWidth == 16) ?
>                              GEN_SAMPLER_SIMD_MODE_SIMD16 :
> GEN_SAMPLER_SIMD_MODE_SIMD8;
>       GenInstruction *insn = this->next(GEN_OPCODE_SEND);
> -     insn->header.predicate_control = 0; /* XXX */
>       this->setHeader(insn);
>       this->setDst(insn, dest);
>       this->setSrc0(insn, msg);
> @@ -866,7 +865,6 @@ namespace gbe
>       GenInstruction *insn = this->next(GEN_OPCODE_SEND);
>       uint32_t msg_type = GEN_TYPED_WRITE;
>       uint32_t msg_length = header_present ? 9 : 8;
> -     insn->header.predicate_control = 0; /* XXX */
>       this->setHeader(insn);
>       this->setDst(insn, GenRegister::retype(GenRegister::null(),
> GEN_TYPE_UD));
>       this->setSrc0(insn, msg);
> --
> 1.7.11.7
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet



More information about the Beignet mailing list