[Beignet] [PATCH] GBE: fix an image related bugs.

Yang, Rong R rong.r.yang at intel.com
Sun Mar 15 20:16:03 PDT 2015


LGTM, thanks.

> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> Zhigang Gong
> Sent: Monday, March 16, 2015 09:42
> To: beignet at lists.freedesktop.org
> Cc: Gong, Zhigang
> Subject: [Beignet] [PATCH] GBE: fix an image related bugs.
> 
> The bug was introduces when we removed the hacky invalid register. Now
> we will not pass in a fixed count of coordinates for the typed_write
> instruction.
> 
> Signed-off-by: Zhigang Gong <zhigang.gong at intel.com>
> ---
>  backend/src/backend/gen_insn_selection.cpp | 13 +++++++------
>  backend/src/ir/instruction.cpp             | 28 +++++++++++++++++-----------
>  2 files changed, 24 insertions(+), 17 deletions(-)
> 
> diff --git a/backend/src/backend/gen_insn_selection.cpp
> b/backend/src/backend/gen_insn_selection.cpp
> index 2b166b1..c240261 100644
> --- a/backend/src/backend/gen_insn_selection.cpp
> +++ b/backend/src/backend/gen_insn_selection.cpp
> @@ -4411,19 +4411,20 @@ namespace gbe
>            msgs[i] = sel.selReg(sel.reg(FAMILY_DWORD), TYPE_U32);
>        } else {
>          uint32_t valueID = 0;
> -        msgs[0] = sel.selReg(sel.reg(FAMILY_DWORD), TYPE_U32);
> -        for(uint32_t msgID = 1; msgID < 1 + dim; msgID++, valueID++)
> +        uint32_t msgID = 0;
> +        msgs[msgID++] = sel.selReg(sel.reg(FAMILY_DWORD), TYPE_U32);
> +        for(; msgID < 1 + dim; msgID++, valueID++)
>            msgs[msgID] = sel.selReg(insn.getSrc(msgID - 1), insn.getCoordType());
> 
>          // fake v.
>          if (dim < 2)
> -          msgs[2] = sel.selReg(sel.reg(FAMILY_DWORD), TYPE_U32);
> +          msgs[msgID++] = sel.selReg(sel.reg(FAMILY_DWORD), TYPE_U32);
>          // fake w.
>          if (dim < 3)
> -          msgs[3] = sel.selReg(sel.reg(FAMILY_DWORD), TYPE_U32);
> +          msgs[msgID++] = sel.selReg(sel.reg(FAMILY_DWORD), TYPE_U32);
>          // LOD.
> -        msgs[4] = sel.selReg(sel.reg(FAMILY_DWORD), TYPE_U32);
> -        for(uint32_t msgID = dim + 2; valueID < insn.getSrcNum(); msgID++,
> valueID++)
> +        msgs[msgID++] = sel.selReg(sel.reg(FAMILY_DWORD), TYPE_U32);
> +        for(; valueID < insn.getSrcNum(); msgID++, valueID++)
>            msgs[msgID] = sel.selReg(insn.getSrc(valueID), insn.getSrcType());
>        }
> 
> diff --git a/backend/src/ir/instruction.cpp b/backend/src/ir/instruction.cpp
> index a2bc875..797552f 100644
> --- a/backend/src/ir/instruction.cpp
> +++ b/backend/src/ir/instruction.cpp
> @@ -522,10 +522,13 @@ namespace ir {
>          this->outOpcode(out);
>          out << "." << this->getDstType()
>              << "." << this->getSrcType()
> -            << " surface id " << (int)this->getImageIndex()
> -            << " coord u %" << this->getSrc(fn, 0)
> -            << " coord v %" << this->getSrc(fn, 1)
> -            << " coord w %" << this->getSrc(fn, 2)
> +            << " surface id " << (int)this->getImageIndex();
> +        out << " coord u %" << this->getSrc(fn, 0);
> +        if (srcNum >= 2)
> +          out << " coord v %" << this->getSrc(fn, 1);
> +        if (srcNum >= 3)
> +          out << " coord w %" << this->getSrc(fn, 2);
> +        out
>              << " %" << this->getDst(fn, 0)
>              << " %" << this->getDst(fn, 1)
>              << " %" << this->getDst(fn, 2) @@ -567,15 +570,18 @@ namespace ir {
>        INLINE bool wellFormed(const Function &fn, std::string &why) const;
>        INLINE void out(std::ostream &out, const Function &fn) const {
>          this->outOpcode(out);
> +        uint32_t srcID = 0;
>          out << "." << this->getSrcType()
>              << " surface id " << (int)this->getImageIndex()
> -            << " coord u %" << this->getSrc(fn, 0)
> -            << " coord v %" << this->getSrc(fn, 1)
> -            << " coord w %" << this->getSrc(fn, 2)
> -            << " %" << this->getSrc(fn, 3)
> -            << " %" << this->getSrc(fn, 4)
> -            << " %" << this->getSrc(fn, 5)
> -            << " %" << this->getSrc(fn, 6);
> +            << " coord u %" << this->getSrc(fn, srcID++);
> +        if (srcNum >= 6)
> +          out << " coord v %" << this->getSrc(fn, srcID++);
> +        if (srcNum >= 7)
> +          out << " coord w %" << this->getSrc(fn, srcID++);
> +        out   << " %" << this->getSrc(fn, srcID++);
> +        out   << " %" << this->getSrc(fn, srcID++);
> +        out   << " %" << this->getSrc(fn, srcID++);
> +        out   << " %" << this->getSrc(fn, srcID++);
>        }
> 
>        Tuple src;
> --
> 1.9.1
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list