[Mesa-dev] [PATCH] nvc0/ir: add ld lock/st unlock emission on GK104

Ilia Mirkin imirkin at alum.mit.edu
Mon Feb 22 17:41:26 UTC 2016


On Sun, Feb 21, 2016 at 9:28 AM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
>  .../drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp  | 35 +++++++++++++++-------
>  1 file changed, 25 insertions(+), 10 deletions(-)
>
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp
> index 7042246..8e6dfad 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp
> @@ -1781,11 +1781,14 @@ CodeEmitterNVC0::emitSTORE(const Instruction *i)
>     case FILE_MEMORY_GLOBAL: opc = 0x90000000; break;
>     case FILE_MEMORY_LOCAL:  opc = 0xc8000000; break;
>     case FILE_MEMORY_SHARED:
> -      opc = 0xc8000000;
> -      if (i->subOp == NV50_IR_SUBOP_STORE_UNLOCKED)
> -         opc |= (1 << 26);
> -      else
> -         opc |= (1 << 24);
> +      if (i->subOp == NV50_IR_SUBOP_STORE_UNLOCKED) {
> +         if (targ->getChipset() >= NVISA_GK104_CHIPSET)
> +            opc = 0xb8000000;
> +         else
> +            opc = 0xcc000000;
> +      } else {
> +         opc = 0xc9000000;
> +      }
>        break;
>     default:
>        assert(!"invalid memory file");
> @@ -1795,6 +1798,15 @@ CodeEmitterNVC0::emitSTORE(const Instruction *i)
>     code[0] = 0x00000005;
>     code[1] = opc;
>
> +   if (targ->getChipset() >= NVISA_GK104_CHIPSET) {
> +      // Unlocked store on shared memory can fail.
> +      if (i->src(0).getFile() == FILE_MEMORY_SHARED &&
> +          i->subOp == NV50_IR_SUBOP_STORE_UNLOCKED) {
> +         assert(i->defExists(0));
> +         defId(i->def(0), 8);
> +      }
> +   }
> +
>     setAddressByFile(i->src(0));
>     srcId(i->src(1), 14);
>     srcId(i->src(0).getIndirect(0), 20);
> @@ -1818,11 +1830,14 @@ CodeEmitterNVC0::emitLOAD(const Instruction *i)
>     case FILE_MEMORY_GLOBAL: opc = 0x80000000; break;
>     case FILE_MEMORY_LOCAL:  opc = 0xc0000000; break;
>     case FILE_MEMORY_SHARED:
> -      opc = 0xc0000000;
> -      if (i->subOp == NV50_IR_SUBOP_LOAD_LOCKED)
> -         opc |= (1 << 26);
> -      else
> -         opc |= (1 << 24);
> +      if (i->subOp == NV50_IR_SUBOP_LOAD_LOCKED) {
> +         if (targ->getChipset() >= NVISA_GK104_CHIPSET)
> +            opc = 0xa8000000;
> +         else
> +            opc = 0xc4000000;
> +      } else {
> +         opc = 0xc1000000;
> +      }
>        break;
>     case FILE_MEMORY_CONST:
>        if (!i->src(0).isIndirect(0) && typeSizeof(i->dType) == 4) {

I think this is a problem with your earlier patches, not this one, but
I would have expected load locked to emit its pdst somewhere as well.
It doesn't seem to do that. Good thing it's usually $p0 :)

With that fixed [with a separate patch, probably Cc'd to 11.2 stable], this is

Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>

  -ilia


More information about the mesa-dev mailing list