[Mesa-dev] [PATCH v2 10/24] nv50/ir: re-introduce TGSI lowering pass for images
Samuel Pitoiset
samuel.pitoiset at gmail.com
Tue Apr 26 15:48:08 UTC 2016
On 04/26/2016 03:13 AM, Ilia Mirkin wrote:
> On Mon, Apr 25, 2016 at 4:14 PM, Samuel Pitoiset
> <samuel.pitoiset at gmail.com> wrote:
>> This is loosely based on the previous lowering pass wrote by calim
>> four years ago. I did clean the code and fixed some issues.
>>
>> v2: drop .raw code which is unused for now
>>
>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>> ---
>> .../drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp | 97 +++++++++++++++++++++-
>> 1 file changed, 94 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
>> index dc08ad3..1194f60 100644
>> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
>> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
>> @@ -1449,7 +1449,7 @@ private:
>> void handleUserClipPlanes();
>>
>> // Symbol *getResourceBase(int r);
>> - // void getResourceCoords(std::vector<Value *>&, int r, int s);
>> + void getImageCoords(std::vector<Value *>&, int r, int s);
>>
>> void handleLOAD(Value *dst0[4]);
>> void handleSTORE();
>> @@ -2255,7 +2255,7 @@ Converter::getResourceCoords(std::vector<Value *> &coords, int r, int s)
>> coords[0] = mkOp1v(OP_MOV, TYPE_U32, getScratch(4, FILE_ADDRESS),
>> coords[0]);
>> }
>> -
>> +*/
>> static inline int
>> partitionLoadStore(uint8_t comp[2], uint8_t size[2], uint8_t mask)
>> {
>> @@ -2280,7 +2280,30 @@ partitionLoadStore(uint8_t comp[2], uint8_t size[2], uint8_t mask)
>> }
>> return n + 1;
>> }
>> -*/
>> +
>> +static inline nv50_ir::TexTarget
>> +getImageTarget(const tgsi::Source *code, int r)
>> +{
>> + return tgsi::translateTexture(code->images.at(r).target);
>> +}
>> +
>> +static inline const nv50_ir::TexInstruction::ImgFormatDesc *
>> +getImageFormat(const tgsi::Source *code, int r)
>> +{
>> + return &nv50_ir::TexInstruction::formatTable[
>> + tgsi::translateImgFormat(code->images.at(r).format)];
>> +}
>> +
>> +void
>> +Converter::getImageCoords(std::vector<Value *> &coords, int r, int s)
>> +{
>> + TexInstruction::Target t =
>> + TexInstruction::Target(getImageTarget(code, r));
>> + const int arg = t.getDim() + (t.isArray() || t.isCube());
>> +
>> + for (int c = 0; c < arg; ++c)
>> + coords.push_back(fetchSrc(s, c));
>> +}
>>
>> // For raw loads, granularity is 4 byte.
>> // Usage of the texture read mask on OP_SULDP is not allowed.
>> @@ -2314,6 +2337,33 @@ Converter::handleLOAD(Value *dst0[4])
>> ld->setIndirect(0, 1, fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, 0));
>> }
>> break;
>> + case TGSI_FILE_IMAGE: {
>> + assert(!code->images[r].raw);
>> +
>> + getImageCoords(off, r, 1);
>> + def.resize(4);
>> +
>> + for (c = 0; c < 4; ++c) {
>> + if (!dst0[c] || tgsi.getSrc(0).getSwizzle(c) != (TGSI_SWIZZLE_X + c))
>> + def[c] = getScratch();
>> + else
>> + def[c] = dst0[c];
>> + }
>> +
>> + TexInstruction *ld =
>> + mkTex(OP_SULDP, getImageTarget(code, r), code->images[r].slot, 0,
>> + def, off);
>> + ld->tex.mask = tgsi.getDst(0).getMask();
>> + ld->tex.format = getImageFormat(code, r);
>> + ld->cache = tgsi.getCacheMode();
>> + if (tgsi.getSrc(0).isIndirect(0))
>> + ld->setIndirectR(fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, NULL));
>> +
>> + FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi)
>> + if (dst0[c] != def[c])
>> + mkMov(dst0[c], def[tgsi.getSrc(0).getSwizzle(c)]);
>> + }
>> + break;
>> default:
>> assert(!"Unsupported srcFile for LOAD");
>> }
>> @@ -2420,6 +2470,24 @@ Converter::handleSTORE()
>> st->setIndirect(0, 1, fetchSrc(tgsi.getDst(0).getIndirect(0), 0, 0));
>> }
>> break;
>> + case TGSI_FILE_IMAGE: {
>> + assert(!code->images[r].raw);
>> +
>> + getImageCoords(off, r, 0);
>> + src = off;
>> +
>> + FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi)
>> + src.push_back(fetchSrc(1, c));
>> +
>> + TexInstruction *st =
>> + mkTex(OP_SUSTP, getImageTarget(code, r), code->images[r].slot,
>> + 0, dummy, src);
>> + st->tex.mask = tgsi.getDst(0).getMask();
>> + st->cache = tgsi.getCacheMode();
>> + if (tgsi.getSrc(0).isIndirect(0))
>> + st->setIndirectR(fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, NULL));
>
> Erm.... are you sure? I think these should be talking about
> getDst(0).isIndirect(0). For stores, the image is in the dst, no?
This is a copy-paste error.
>
>> + }
>> + break;
>> default:
>> assert(!"Unsupported dstFile for STORE");
>> }
>> @@ -2518,6 +2586,29 @@ Converter::handleATOM(Value *dst0[4], DataType ty, uint16_t subOp)
>> if (dst0[c])
>> dst0[c] = dst; // not equal to rDst so handleInstruction will do mkMov
>> break;
>> + case TGSI_FILE_IMAGE: {
>> + assert(!code->images[r].raw);
>> +
>> + getImageCoords(srcv, r, 1);
>> + defv.push_back(dst);
>> + srcv.push_back(fetchSrc(2, 0));
>> +
>> + if (subOp == NV50_IR_SUBOP_ATOM_CAS)
>> + srcv.push_back(fetchSrc(3, 0));
>> +
>> + TexInstruction *tex = mkTex(OP_SUREDP, getImageTarget(code, r),
>> + code->images[r].slot, 0, defv, srcv);
>> + tex->subOp = subOp;
>> + tex->tex.mask = 1;
>> + tex->setType(ty);
>> + if (tgsi.getSrc(0).isIndirect(0))
>> + tex->setIndirectR(fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, NULL));
>> +
>> + for (int c = 0; c < 4; ++c)
>> + if (dst0[c])
>> + dst0[c] = dst; // not equal to rDst so handleInstruction will do mkMov
>> + }
>> + break;
>> default:
>> assert(!"Unsupported srcFile for ATOM");
>> }
>> --
>> 2.8.0
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
--
-Samuel
More information about the mesa-dev
mailing list